LUADOC - Farming Simulator 19

PhysicsObject

Description
Class for physics objects
Parent
Object
Functions

addChildsToNodeObject

Description
Add childs to node object
Definition
addChildsToNodeObject(integer nodeId)
Arguments
integernodeIdid of node
Code
297function PhysicsObject:addChildsToNodeObject(nodeId)
298 for i=0,getNumOfChildren(nodeId)-1 do
299 self:addChildsToNodeObject(getChildAt(nodeId, i))
300 end
301 local rigidBodyType = getRigidBodyType(nodeId)
302 if rigidBodyType ~= "NoRigidBody" then
303 g_currentMission:addNodeObject(nodeId, self)
304
305 if self.isServer then
306 addWakeUpReport(nodeId, "onPhysicObjectWakeUpCallback", self)
307 end
308 end
309end

delete

Description
Deleting physics object
Definition
delete()
Code
30function PhysicsObject:delete()
31 self:removeWakeUpReports(self.nodeId)
32 g_currentMission:removeNodeObject(self.nodeId)
33 delete(self.nodeId)
34 self.nodeId = 0
35 PhysicsObject:superClass().delete(self)
36end

getAllowsAutoDelete

Description
Get allows auto delete
Definition
getAllowsAutoDelete()
Return Values
booleanallowsAutoDeleteallows auto delete
Code
41function PhysicsObject:getAllowsAutoDelete()
42 return true
43end

getDefaultRigidBodyType

Description
Get default rigid body type
Definition
getDefaultRigidBodyType()
Return Values
stringrigidBodyTyperigid body type
Code
286function PhysicsObject:getDefaultRigidBodyType()
287 if self.isServer then
288 return "Dynamic"
289 else
290 return "Kinematic"
291 end
292end

getUpdatePriority

Description
Get update priority
Definition
getUpdatePriority(float skipCount, float x, float y, float z, float coeff, table connection)
Arguments
floatskipCountskip count
floatxx position
floatyy position
floatzz position
floatcoeffcoeff
tableconnectionconnection
Return Values
floatprioritypriority
Code
241function PhysicsObject:getUpdatePriority(skipCount, x, y, z, coeff, connection)
242 local x1, y1, z1 = getWorldTranslation(self.nodeId)
243 local dist = math.sqrt((x1-x)*(x1-x) + (y1-y)*(y1-y) + (z1-z)*(z1-z))
244 local clipDist = math.min(getClipDistance(self.nodeId)*coeff, self.forcedClipDistance)
245 return (1-dist/clipDist)* 0.8 + 0.5*skipCount * 0.2
246end

loadOnCreate

Description
Load on create
Definition
loadOnCreate(integer nodeId)
Arguments
integernodeIdnode id
Code
48function PhysicsObject:loadOnCreate(nodeId)
49 self:setNodeId(nodeId)
50 if not self.isServer then
51 self:onGhostRemove()
52 end
53end

new

Description
Creating physics object
Definition
new(boolean isServer, boolean isClient, table customMt)
Arguments
booleanisServeris server
booleanisClientis client
tablecustomMtcustomMt
Return Values
tableinstanceInstance of object
Code
15function PhysicsObject:new(isServer, isClient, customMt)
16
17 local self = Object:new(isServer, isClient, customMt or PhysicsObject_mt)
18
19 self.nodeId = 0
20 self.networkTimeInterpolator = InterpolationTime:new(1.2)
21 self.forcedClipDistance = 60
22
23 self.physicsObjectDirtyFlag = self:getNextDirtyFlag()
24
25 return self
26end

onGhostAdd

Description
On ghost add
Definition
onGhostAdd()
Code
257function PhysicsObject:onGhostAdd()
258 setVisibility(self.nodeId, true)
259 addToPhysics(self.nodeId)
260end

onGhostRemove

Description
On ghost remove
Definition
onGhostRemove()
Code
250function PhysicsObject:onGhostRemove()
251 setVisibility(self.nodeId, false)
252 removeFromPhysics(self.nodeId)
253end

readStream

Description
Called on client side on join
Definition
readStream(integer streamId, table connection)
Arguments
integerstreamIdstream ID
tableconnectionconnection
Code
81function PhysicsObject:readStream(streamId, connection)
82 assert(self.nodeId ~= 0)
83 if connection:getIsServer() then
84 local paramsXZ = g_currentMission.vehicleXZPosCompressionParams
85 local paramsY = g_currentMission.vehicleYPosCompressionParams
86 local x = NetworkUtil.readCompressedWorldPosition(streamId, paramsXZ)
87 local y = NetworkUtil.readCompressedWorldPosition(streamId, paramsY)
88 local z = NetworkUtil.readCompressedWorldPosition(streamId, paramsXZ)
89 local xRot = NetworkUtil.readCompressedAngle(streamId)
90 local yRot = NetworkUtil.readCompressedAngle(streamId)
91 local zRot = NetworkUtil.readCompressedAngle(streamId)
92
93 local quatX, quatY, quatZ, quatW = mathEulerToQuaternion(xRot,yRot,zRot)
94 self:setWorldPositionQuaternion(x, y, z, quatX, quatY, quatZ, quatW, true)
95
96 self.networkTimeInterpolator:reset()
97 end
98end

readUpdateStream

Description
Called on client side on update
Definition
readUpdateStream(integer streamId, integer timestamp, table connection)
Arguments
integerstreamIdstream ID
integertimestamptimestamp
tableconnectionconnection
Code
124function PhysicsObject:readUpdateStream(streamId, timestamp, connection)
125 if connection:getIsServer() then
126 if streamReadBool(streamId) then
127 local paramsXZ = g_currentMission.vehicleXZPosCompressionParams
128 local paramsY = g_currentMission.vehicleYPosCompressionParams
129 local x = NetworkUtil.readCompressedWorldPosition(streamId, paramsXZ)
130 local y = NetworkUtil.readCompressedWorldPosition(streamId, paramsY)
131 local z = NetworkUtil.readCompressedWorldPosition(streamId, paramsXZ)
132 local xRot = NetworkUtil.readCompressedAngle(streamId)
133 local yRot = NetworkUtil.readCompressedAngle(streamId)
134 local zRot = NetworkUtil.readCompressedAngle(streamId)
135
136 local quatX, quatY, quatZ, quatW = mathEulerToQuaternion(xRot,yRot,zRot)
137 self.positionInterpolator:setTargetPosition(x, y, z)
138 self.quaternionInterpolator:setTargetQuaternion(quatX, quatY, quatZ, quatW)
139 self.networkTimeInterpolator:startNewPhaseNetwork()
140 end
141 end
142end

setNodeId

Description
Set node id
Definition
setNodeId(integer nodeId)
Arguments
integernodeIdnode Id
Code
58function PhysicsObject:setNodeId(nodeId)
59 self.nodeId = nodeId
60 setRigidBodyType(self.nodeId, self:getDefaultRigidBodyType())
61 addToPhysics(self.nodeId)
62
63 local x, y, z = getTranslation(self.nodeId)
64 local xRot, yRot, zRot = getRotation(self.nodeId)
65 self.sendPosX, self.sendPosY, self.sendPosZ = x, y, z
66 self.sendRotX, self.sendRotY, self.sendRotZ = xRot, yRot, zRot
67
68 if not self.isServer then
69 local quatX, quatY, quatZ, quatW = mathEulerToQuaternion(xRot, yRot, zRot)
70 self.positionInterpolator = InterpolatorPosition:new(x, y, z)
71 self.quaternionInterpolator = InterpolatorQuaternion:new(quatX, quatY, quatZ, quatW)
72 end
73
74 self:addChildsToNodeObject(self.nodeId)
75end

setWorldPositionQuaternion

Description
Set pose
Definition
setWorldPositionQuaternion(float x, float y, float z, float xRot, float yRot, float zRot, float w_rot)
Arguments
floatxx position
floatyz position
floatzz position
floatxRotx rotation
floatyRoty rotation
floatzRotz rotation
floatw_rotw rotation
Code
271function PhysicsObject:setWorldPositionQuaternion(x, y, z, quatX, quatY, quatZ, quatW, changeInterp)
272 if not self.isServer then
273 if changeInterp then
274 self.positionInterpolator:setPosition(x, y, z)
275 self.quaternionInterpolator:setQuaternion(quatX, quatY, quatZ, quatW)
276 end
277 end
278
279 setTranslation(self.nodeId, x, y, z)
280 setQuaternion(self.nodeId, quatX, quatY, quatZ, quatW)
281end

testScope

Description
Test scope
Definition
testScope(float x, float y, float z, float coeff)
Arguments
floatxx position
floatyy position
floatzz position
floatcoeffcoeff
Return Values
booleaninScopein scope
Code
221function PhysicsObject:testScope(x,y,z, coeff)
222 local x1, y1, z1 = getWorldTranslation(self.nodeId)
223 local dist = (x1-x)*(x1-x) + (y1-y)*(y1-y) + (z1-z)*(z1-z)
224 local clipDist = math.min(getClipDistance(self.nodeId)*coeff, self.forcedClipDistance)
225 if dist < clipDist*clipDist then
226 return true
227 else
228 return false
229 end
230end

update

Description
Update
Definition
update(float dt)
Arguments
floatdttime since last call in ms
Code
168function PhysicsObject:update(dt)
169 if not self.isServer then
170 self.networkTimeInterpolator:update(dt)
171 local interpolationAlpha = self.networkTimeInterpolator:getAlpha()
172 local posX, posY, posZ = self.positionInterpolator:getInterpolatedValues(interpolationAlpha)
173 local quatX, quatY, quatZ, quatW = self.quaternionInterpolator:getInterpolatedValues(interpolationAlpha)
174 self:setWorldPositionQuaternion(posX, posY, posZ, quatX, quatY, quatZ, quatW, false)
175
176 if self.networkTimeInterpolator:isInterpolating() then
177 self:raiseActive()
178 end
179 else
180 if not getIsSleeping(self.nodeId) then
181 self:raiseActive()
182 end
183 end
184end

updateMove

Description
Update move
Definition
updateMove()
Return Values
booleanhasMovedhas moved
Code
190function PhysicsObject:updateMove()
191 local x, y, z = getTranslation(self.nodeId)
192 local xRot, yRot, zRot = getRotation(self.nodeId)
193 local hasMoved = math.abs(self.sendPosX-x)>0.005 or math.abs(self.sendPosY-y)>0.005 or math.abs(self.sendPosZ-z)>0.005 or
194 math.abs(self.sendRotX-xRot)>0.02 or math.abs(self.sendRotY-yRot)>0.02 or math.abs(self.sendRotZ-zRot)>0.02
195
196 if hasMoved then
197 self:raiseDirtyFlags(self.physicsObjectDirtyFlag)
198 self.sendPosX, self.sendPosY, self.sendPosZ = x, y ,z
199 self.sendRotX, self.sendRotY, self.sendRotZ = xRot, yRot, zRot
200 end
201
202 return hasMoved
203end

updateTick

Description
updateTick
Definition
updateTick(float dt)
Arguments
floatdttime since last call in ms
Code
208function PhysicsObject:updateTick(dt)
209 if self.isServer then
210 self:updateMove()
211 end
212end

writeStream

Description
Called on server side on join
Definition
writeStream(integer streamId, table connection)
Arguments
integerstreamIdstream ID
tableconnectionconnection
Code
104function PhysicsObject:writeStream(streamId, connection)
105 if not connection:getIsServer() then
106 local x,y,z = getTranslation(self.nodeId)
107 local xRot,yRot,zRot = getRotation(self.nodeId)
108 local paramsXZ = g_currentMission.vehicleXZPosCompressionParams
109 local paramsY = g_currentMission.vehicleYPosCompressionParams
110 NetworkUtil.writeCompressedWorldPosition(streamId, x, paramsXZ)
111 NetworkUtil.writeCompressedWorldPosition(streamId, y, paramsY)
112 NetworkUtil.writeCompressedWorldPosition(streamId, z, paramsXZ)
113 NetworkUtil.writeCompressedAngle(streamId, xRot)
114 NetworkUtil.writeCompressedAngle(streamId, yRot)
115 NetworkUtil.writeCompressedAngle(streamId, zRot)
116 end
117end

writeUpdateStream

Description
Called on server side on update
Definition
writeUpdateStream(integer streamId, table connection, integer dirtyMask)
Arguments
integerstreamIdstream ID
tableconnectionconnection
integerdirtyMaskdirty mask
Code
149function PhysicsObject:writeUpdateStream(streamId, connection, dirtyMask)
150 if not connection:getIsServer() then
151 if streamWriteBool(streamId, bitAND(dirtyMask, self.physicsObjectDirtyFlag) ~= 0) then
152 local paramsXZ = g_currentMission.vehicleXZPosCompressionParams
153 local paramsY = g_currentMission.vehicleYPosCompressionParams
154 NetworkUtil.writeCompressedWorldPosition(streamId, self.sendPosX, paramsXZ)
155 NetworkUtil.writeCompressedWorldPosition(streamId, self.sendPosY, paramsY)
156 NetworkUtil.writeCompressedWorldPosition(streamId, self.sendPosZ, paramsXZ)
157
158 NetworkUtil.writeCompressedAngle(streamId, self.sendRotX)
159 NetworkUtil.writeCompressedAngle(streamId, self.sendRotY)
160 NetworkUtil.writeCompressedAngle(streamId, self.sendRotZ)
161 end
162 end
163end