LUADOC - Farming Simulator 19

ShaderPlaneEffect

Description
Copyright (C) GIANTS Software GmbH, Confidential, All Rights Reserved.
Parent
Effect
Functions

getIsFullyVisible

Description
Definition
getIsFullyVisible()
Code
229function ShaderPlaneEffect:getIsFullyVisible()
230 return math.abs(self.fadeCur[1]-self.fadeX[2]) < 0.05 and math.abs(self.fadeCur[2] - self.fadeY[2]) < 0.05
231end

isRunning

Description
Definition
isRunning()
Code
149function ShaderPlaneEffect:isRunning()
150 return self.state == ShaderPlaneEffect.STATE_TURNING_OFF or self.state == ShaderPlaneEffect.STATE_TURNING_ON or self.state == ShaderPlaneEffect.STATE_ON
151end

loadEffectAttributes

Description
Definition
loadEffectAttributes()
Code
30function ShaderPlaneEffect:loadEffectAttributes(xmlFile, key, node, i3dNode, i3dMapping)
31 if not ShaderPlaneEffect:superClass().loadEffectAttributes(self, xmlFile, key, node, i3dNode, i3dMapping) then
32 return false
33 end
34
35 self.fadeInTime = Utils.getNoNil(Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLFloat, node, "fadeInTime"), Effect.getValue(xmlFile, key, getXMLFloat, node, "fadeTime")), 1) * 1000
36 self.fadeOutTime = Utils.getNoNil(Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLFloat, node, "fadeOutTime"), Effect.getValue(xmlFile, key, getXMLFloat, node, "fadeTime")), 1) * 1000
37 self.planeFadeTime = math.max(self.planeFadeTime, self.fadeInTime, self.fadeOutTime)
38 self.startDelay = Utils.getNoNil(Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLFloat, node, "startDelay"), Effect.getValue(xmlFile, key, getXMLFloat, node, "delay")), 0) * 1000
39 self.stopDelay = Utils.getNoNil(Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLFloat, node, "stopDelay"), Effect.getValue(xmlFile, key, getXMLFloat, node, "delay")), 0) * 1000
40 self.currentDelay = self.startDelay
41 self.alwaysVisibile = Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLBool, node, "alwaysVisibile"), false)
42 self.showOnFirstUse = Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLBool, node, "showOnFirstUse"), false)
43 local defaultFillType = Effect.getValue(xmlFile, key, getXMLString, node, "defaultFillType")
44 if defaultFillType ~= nil then
45 self.defaultFillType = g_fillTypeManager:getFillTypeIndexByName(defaultFillType)
46 end
47 self.dynamicFillType = Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLBool, node, "dynamicFillType"), true)
48 self.materialTypeId = Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLInt, node, "materialTypeId"), 1)
49 self.materialType = Effect.getValue(xmlFile, key, getXMLString, node, "materialType")
50 self.alignToWorldY = Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLBool, node, "alignToWorldY"), false)
51 self.alignXAxisToWorldY = Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLBool, node, "alignXAxisToWorldY"), false)
52
53 if not self.dynamicFillType then
54 self:setFillType(nil, true)
55 end
56
57 self.fadeXDistance = { Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLFloat, node, "fadeXMinDistance"), -1.58), Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLFloat, node, "fadeXMaxDistance"), 4.18)}
58 self.useDistance = Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLBool, node, "useDistance"), true)
59 self.extraDistance = Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLFloat, node, "extraDistance"), -0.25)
60
61 self.extraDistanceNode = I3DUtil.indexToObject(Utils.getNoNil(node, self.rootNodes), Effect.getValue(xmlFile, key, getXMLString, node, "extraDistanceNode"), i3dMapping)
62
63 self.fadeScale = Effect.getValue(xmlFile, key, getXMLFloat, node, "fadeScale")
64 self.uvSpeed = Effect.getValue(xmlFile, key, getXMLFloat, node, "uvSpeed")
65
66 self.fadeX = {-1, 1}
67 self.fadeY = {-1, 1}
68 self.fadeCur = {-1, 1}
69 self.fadeDir = {1, 1}
70
71 self.offset = 0
72 self.hasValidMaterial = true
73
74 setShaderParameter(self.node, "fadeProgress", -1.0, 1.0, 0.0, 0.0, false)
75
76 if self.alignXAxisToWorldY then
77 self.worldYReferenceFrame = createTransformGroup("worldYReferenceFrame")
78 link(getParent(self.node), self.worldYReferenceFrame)
79 setTranslation(self.worldYReferenceFrame, getTranslation(self.node))
80 setRotation(self.worldYReferenceFrame, getRotation(self.node))
81 end
82
83 return true
84end

new

Description
Definition
new()
Code
15function ShaderPlaneEffect:new(customMt)
16 if customMt == nil then
17 customMt = ShaderPlaneEffect_mt
18 end
19
20 local self = Effect:new(customMt)
21
22 self.state = ShaderPlaneEffect.STATE_OFF
23 self.planeFadeTime = 0
24
25 return self
26end

reset

Description
Definition
reset()
Code
181function ShaderPlaneEffect:reset()
182 self.fadeCur = {-1, 1}
183 self.fadeDir = {1, -1}
184 setShaderParameter(self.node, "fadeProgress", self.fadeCur[1], self.fadeCur[2], 0.0, 0.0, false )
185 setVisibility(self.node, false)
186
187 self.state = ShaderPlaneEffect.STATE_OFF
188end

setDelays

Description
Definition
setDelays()
Code
235function ShaderPlaneEffect:setDelays(startDelay, stopDelay)
236 if self.state == ShaderPlaneEffect.STATE_TURNING_ON then
237 self.currentDelay = math.max(0, self.currentDelay + (startDelay-self.startDelay))
238 elseif self.state == ShaderPlaneEffect.STATE_TURNING_OFF then
239 self.currentDelay = math.max(0, self.currentDelay + (stopDelay-self.stopDelay))
240 end
241
242 self.startDelay = startDelay
243 self.stopDelay = stopDelay
244end

setDistance

Description
Definition
setDistance()
Code
254function ShaderPlaneEffect:setDistance(distance)
255 if self.useDistance then
256 distance = distance + self.extraDistance
257
258 if self.extraDistanceNode ~= nil then
259 local _, y, _ = localToLocal(self.node, self.extraDistanceNode, 0, 0, 0)
260 distance = distance + y
261 end
262
263 local percent = (distance-self.fadeXDistance[1])/(self.fadeXDistance[2]-self.fadeXDistance[1])
264
265 self.fadeX[2] = 2 * percent - 1
266 end
267end

setFillType

Description
Definition
setFillType()
Code
192function ShaderPlaneEffect:setFillType(fillType, force)
193 local success = true
194 if (self.dynamicFillType and self.lastFillType ~= fillType) or force then
195 if self.materialType ~= nil and self.materialTypeId ~= nil then
196 local material = g_materialManager:getMaterial(fillType, self.materialType, self.materialTypeId)
197 if material == nil and self.defaultFillType ~= nil then
198 material = g_materialManager:getMaterial(self.defaultFillType, self.materialType, self.materialTypeId)
199 end
200 self.hasValidMaterial = material ~= nil
201 if material ~= nil then
202 if self.materialType == "smoke" and self.materialTypeId == 1 then
203 -- add object mask for smoke effects to avoid depth map issues with reflectionmaps
204 setObjectMask(self.node, 16711807)
205 end
206 setMaterial(self.node, material, 0)
207
208 if self.fadeScale ~= nil then
209 local x, y, z, _ = getShaderParameter(self.node, "vSpeedFrequencyAmplitudeFadescale")
210 setShaderParameter(self.node, "vSpeedFrequencyAmplitudeFadescale", x, y, z, self.fadeScale, false)
211 end
212
213 if self.uvSpeed ~= nil then
214 local x, _, z, w = getShaderParameter(self.node, "UVScaleSpeed")
215 setShaderParameter(self.node, "UVScaleSpeed", x, self.uvSpeed, z, w, false)
216 end
217 else
218 success = false
219 end
220 end
221 self.lastFillType = fillType
222 end
223
224 return success
225end

setOffset

Description
Definition
setOffset()
Code
248function ShaderPlaneEffect:setOffset(offset)
249 self.offset = offset
250end

start

Description
Definition
start()
Code
155function ShaderPlaneEffect:start()
156 if self.state ~= ShaderPlaneEffect.STATE_TURNING_ON and self.state ~= ShaderPlaneEffect.STATE_ON then
157 self.state = ShaderPlaneEffect.STATE_TURNING_ON
158 self.fadeCur = {-1, 1}
159 self.fadeDir = {1, 1}
160 self.currentDelay = self.startDelay
161 return true
162 end
163 return false
164end

stop

Description
Definition
stop()
Code
168function ShaderPlaneEffect:stop()
169 if self.state ~= ShaderPlaneEffect.STATE_TURNING_OFF and self.state ~= ShaderPlaneEffect.STATE_OFF then
170 self.state = ShaderPlaneEffect.STATE_TURNING_OFF
171 --self.fadeCur = {1, 1} -- dismiss this to make effect look better in shovels when not tipping constantly
172 self.fadeDir = {1, -1}
173 self.currentDelay = self.stopDelay
174 return true
175 end
176 return false
177end

update

Description
Definition
update()
Code
88function ShaderPlaneEffect:update(dt)
89 ShaderPlaneEffect:superClass().update(self, dt)
90
91 local isRunning = false
92
93 self.currentDelay = self.currentDelay - dt
94 if self.currentDelay <= 0 then
95 local fadeTime = self.fadeInTime
96 if self.state == ShaderPlaneEffect.STATE_TURNING_OFF then
97 fadeTime = self.fadeOutTime
98 end
99 local valueX = self.fadeCur[1] + (math.abs(self.fadeX[1]-self.fadeX[2]) * (dt / fadeTime))*self.fadeDir[1]
100 local valueY = self.fadeCur[2] + (math.abs(self.fadeY[1]-self.fadeY[2]) * (dt / fadeTime))*self.fadeDir[2]
101 self.fadeCur[1] = MathUtil.clamp(valueX, self.fadeX[1], self.fadeX[2])
102 self.fadeCur[2] = MathUtil.clamp(valueY, self.fadeY[1], self.fadeY[2])
103
104 setShaderParameter(self.node, "fadeProgress", self.fadeCur[1], self.fadeCur[2], 0.0, 0.0, false)
105
106 if self.showOnFirstUse then
107 if self.hasValidMaterial then
108 setVisibility(self.node, true)
109 end
110 else
111 local isVisible = true
112 if self.state == ShaderPlaneEffect.STATE_TURNING_OFF then
113 isVisible = not (self.fadeCur[1] == self.fadeX[2] and self.fadeCur[2] == self.fadeY[1])
114 end
115 setVisibility(self.node, isVisible and self.hasValidMaterial) -- self.fadeCur[1] ~= self.fadeX[2] or self.fadeCur[2] ~= self.fadeY[1])
116 end
117
118 if not ((self.state == ShaderPlaneEffect.STATE_TURNING_ON and self.fadeCur[1] == self.fadeX[2] and self.fadeCur[2] == self.fadeY[2]) or
119 (self.state == ShaderPlaneEffect.STATE_TURNING_OFF and self.fadeCur[1] == self.fadeX[2] and self.fadeCur[2] == self.fadeY[1]))
120 then
121 isRunning = true
122 end
123 else
124 isRunning = true
125 end
126
127 if self.alignXAxisToWorldY then
128 local _, dy, dz = worldDirectionToLocal(self.worldYReferenceFrame, 0, 1, 0)
129 local alpha = math.atan2(dz, dy)
130 local _, ry, rz = getRotation(self.node)
131 setRotation(self.node, alpha, ry, rz)
132 end
133
134 if self.alignToWorldY then
135 I3DUtil.setWorldDirection(self.node, 0, 0, 1, 0, 1, 0)
136 end
137
138 if not isRunning then
139 if self.state == ShaderPlaneEffect.STATE_TURNING_ON then
140 self.state = ShaderPlaneEffect.STATE_ON
141 elseif self.state == ShaderPlaneEffect.STATE_TURNING_OFF then
142 self.state = ShaderPlaneEffect.STATE_OFF
143 end
144 end
145end