30 | function 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 |
84 | end |
192 | function 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 |
225 | end |
88 | function 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 |
145 | end |