32 | function CutterEffect:loadEffectAttributes(xmlFile, key, node, i3dNode, i3dMapping) |
33 | local isThreshing = Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLBool, node, "isThreshing"), true) |
34 | local effectTypeName = Effect.getValue(xmlFile, key, getXMLString, node, "effectType") |
35 | local effectType = g_cutterEffectManager:getCutterEffectTypeByName(effectTypeName) |
36 | |
37 | self.linkNode = I3DUtil.indexToObject(Utils.getNoNil(node, self.rootNodes), Effect.getValue(xmlFile, key, getXMLString, node, "linkNode"), i3dMapping) |
38 | self.growthStateNodes = {} |
39 | local effects = g_cutterEffectManager:getCutterEffects(self.fruitTypeIndex, effectType, isThreshing) |
40 | if effects ~= nil then |
41 | self.node = createTransformGroup("effects") |
42 | link(self.linkNode, self.node) |
43 | setTranslation(self.node, 0, 0, 0) |
44 | setRotation(self.node, 0, 0, 0) |
45 | |
46 | local loadedEffects = {} |
47 | |
48 | for growthState, effect in pairs(effects) do |
49 | local currentEffect = loadedEffects[effect] |
50 | if currentEffect == nil then |
51 | currentEffect = clone(effect, false, false, true) |
52 | setTranslation(currentEffect, 0, 0, 0) |
53 | setScale(currentEffect, 1, 1, 1) |
54 | setRotation(currentEffect, 0, 0, 0) |
55 | link(self.node, currentEffect) |
56 | setVisibility(currentEffect, false) |
57 | |
58 | local lengthAndRadius = StringUtil.getVectorNFromString(Effect.getValue(xmlFile, key, getXMLString, node, "lengthAndRadius"), 4) |
59 | if lengthAndRadius ~= nil then |
60 | setShaderParameter(currentEffect, "lengthAndRadius", lengthAndRadius[1], lengthAndRadius[2], lengthAndRadius[3], lengthAndRadius[4], false) |
61 | end |
62 | loadedEffects[effect] = currentEffect |
63 | end |
64 | |
65 | self.growthStateNodes[growthState] = currentEffect |
66 | end |
67 | else |
68 | local fruitType = g_fruitTypeManager:getFruitTypeByIndex(self.fruitTypeIndex) |
69 | print("Warning: Could not load cutter effect '"..effectTypeName.."' (Threshing: "..tostring(isThreshing)..") for fruitType '"..fruitType.name.."'!") |
70 | end |
71 | |
72 | self.speedScale = Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLFloat, node, "speedScale"), 0.002) |
73 | self.changeSpeedScale = Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLFloat, node, "changeSpeedScale"), self.speedScale) |
74 | self.useInterpolation = Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLBool, node, "useInterpolation"), false) |
75 | self.useMaxValue = Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLBool, node, "useMaxValue"), false) |
76 | self.minOffset = Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLFloat, node, "minOffset"), 0) |
77 | self.offset = Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLFloat, node, "offset"), 0) |
78 | self.currentOffset = 0 |
79 | self.effectMinValue = 0 |
80 | self.effectMaxValue = 0 |
81 | self.effectAlpha = 1 |
82 | |
83 | return true |
84 | end |
97 | function CutterEffect:update(dt) |
98 | CutterEffect:superClass().update(self, dt) |
99 | |
100 | self.currentOffset = (self.currentOffset + dt * self.speedScale) |
101 | |
102 | if self.useInterpolation then |
103 | if self.useMaxValue then |
104 | self.effectMinValue = math.min(self.effectMinValue+self.changeSpeedScale*dt, -self.maxValue, 0) |
105 | else |
106 | self.effectMinValue = math.min(self.effectMinValue+self.changeSpeedScale*dt, self.minValue, 0) |
107 | end |
108 | else |
109 | if self.minValue < 0 then |
110 | self.effectMinValue = math.max(self.effectMinValue - self.changeSpeedScale*dt, self.minValue) |
111 | else |
112 | self.effectMinValue = math.min(self.effectMinValue + self.changeSpeedScale*dt, self.minValue) |
113 | end |
114 | if self.maxValue < 0 then |
115 | self.effectMaxValue = math.max(self.effectMaxValue - self.changeSpeedScale*dt, self.maxValue) |
116 | else |
117 | self.effectMaxValue = math.min(self.effectMaxValue + self.changeSpeedScale*dt, self.maxValue) |
118 | end |
119 | end |
120 | |
121 | if VehicleDebug.state == VehicleDebug.DEBUG_ATTRIBUTES then |
122 | local x1,y1,z1 = localToWorld(self.growthStateNodes[self.currentGrowthState], self.minValue, 0, 0) |
123 | local x2,y2,z2 = localToWorld(self.growthStateNodes[self.currentGrowthState], self.maxValue, 0, 0) |
124 | drawDebugLine(x1,y1,z1, 0, 1, 0, x1, y1+2, z1, 0, 1, 0) |
125 | drawDebugLine(x2,y2,z2, 0, 1, 0, x2, y2+2, z2, 0, 1, 0) |
126 | end |
127 | |
128 | if self.effectMinValue == 0 and self.effectMaxValue == 0 then |
129 | self.effectAlpha = 0 |
130 | else |
131 | self.effectAlpha = MathUtil.clamp(self.effectAlpha + dt*0.0025, 0, 1) |
132 | end |
133 | |
134 | if self.growthStateNodes[self.currentGrowthState] ~= nil then |
135 | setVisibility(self.growthStateNodes[self.currentGrowthState], self.effectAlpha ~= 0) |
136 | setShaderParameter(self.growthStateNodes[self.currentGrowthState], "scrollPosition", self.currentOffset, self.effectAlpha, self.minOffset + self.effectMinValue, self.effectMaxValue, false) |
137 | end |
138 | end |