30 | function RotorSpreader:load(savegame) |
31 | |
32 | self.animation = {}; |
33 | self.animation.state = RotorSpreader.STATE_DISABLED; |
34 | self.animation.startWeight = 1; |
35 | self.animation.runWeight = 0; |
36 | self.animation.endWeight = 0; |
37 | self.animation.crossFadeTime = 200; |
38 | self.animation.runThreshold = 0.9; |
39 | |
40 | self.animation.rootNode = Utils.indexToObject(self.components, getXMLString(self.xmlFile, "vehicle.rotorAnimation#rootNode")); |
41 | if self.animation.rootNode ~= nil then |
42 | self.animation.startClipSpeed = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.rotorAnimation#startClipSpeed", 1)); |
43 | self.animation.runClipSpeed = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.rotorAnimation#runClipSpeed", 1)); |
44 | self.animation.endClipSpeed = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.rotorAnimation#endClipSpeed", 1)); |
45 | self.animation.animCharSet = getAnimCharacterSet(self.animation.rootNode); |
46 | if self.animation.animCharSet ~= 0 then |
47 | local startClip = getAnimClipIndex(self.animation.animCharSet, getXMLString(self.xmlFile, "vehicle.rotorAnimation#startClip")); |
48 | local runClip = getAnimClipIndex(self.animation.animCharSet, getXMLString(self.xmlFile, "vehicle.rotorAnimation#runClip")); |
49 | local endClip = getAnimClipIndex(self.animation.animCharSet, getXMLString(self.xmlFile, "vehicle.rotorAnimation#endClip")); |
50 | assignAnimTrackClip(self.animation.animCharSet, 0, startClip); |
51 | assignAnimTrackClip(self.animation.animCharSet, 1, runClip); |
52 | assignAnimTrackClip(self.animation.animCharSet, 2, endClip); |
53 | self.animation.startDuration = getAnimClipDuration(self.animation.animCharSet, startClip); |
54 | self.animation.runDuration = getAnimClipDuration(self.animation.animCharSet, runClip); |
55 | self.animation.endDuration = getAnimClipDuration(self.animation.animCharSet, endClip); |
56 | setAnimTrackSpeedScale(self.animation.animCharSet, 0, self.animation.startClipSpeed); |
57 | setAnimTrackSpeedScale(self.animation.animCharSet, 1, self.animation.runClipSpeed); |
58 | setAnimTrackSpeedScale(self.animation.animCharSet, 2, self.animation.endClipSpeed); |
59 | setAnimTrackLoopState(self.animation.animCharSet, 0, false); |
60 | setAnimTrackLoopState(self.animation.animCharSet, 1, true); |
61 | setAnimTrackLoopState(self.animation.animCharSet, 2, false); |
62 | setAnimTrackTime(self.animation.animCharSet, 0, 0); |
63 | setAnimTrackTime(self.animation.animCharSet, 1, 0); |
64 | setAnimTrackTime(self.animation.animCharSet, 2, 0); |
65 | setAnimTrackBlendWeight(self.animation.animCharSet, 0, self.animation.startWeight); |
66 | setAnimTrackBlendWeight(self.animation.animCharSet, 1, self.animation.runWeight); |
67 | setAnimTrackBlendWeight(self.animation.animCharSet, 2, self.animation.endWeight); |
68 | end; |
69 | self.initializeAnimation = true; |
70 | self.isAnimationRunning = false; |
71 | end |
72 | end; |
86 | function RotorSpreader:update(dt) |
87 | if self.animation.rootNode == nil or self.animation.animCharSet == 0 then |
88 | return; |
89 | end |
90 | |
91 | if self.initializeAnimation then |
92 | enableAnimTrack(self.animation.animCharSet, 0); |
93 | setAnimTrackTime(self.animation.animCharSet, 0, 0, true); |
94 | disableAnimTrack(self.animation.animCharSet, 0); |
95 | self.initializeAnimation = false; |
96 | end; |
97 | |
98 | if self.animation.state ~= RotorSpreader.STATE_DISABLED then |
99 | if self.animation.state == RotorSpreader.STATE_STARTING then |
100 | self.animation.startWeight = math.min(self.animation.startWeight + dt/self.animation.crossFadeTime, 1); |
101 | self.animation.endWeight = 1-self.animation.startWeight; |
102 | |
103 | if getAnimTrackTime(self.animation.animCharSet, 0) >= self.animation.startDuration then |
104 | self.animation.runWeight = 1; |
105 | self.animation.startWeight = 0; |
106 | self.animation.endWeight = 0; |
107 | setAnimTrackTime(self.animation.animCharSet, 0, 0); |
108 | setAnimTrackTime(self.animation.animCharSet, 1, 0); |
109 | enableAnimTrack(self.animation.animCharSet, 1); |
110 | disableAnimTrack(self.animation.animCharSet, 0); |
111 | self.animation.state = RotorSpreader.STATE_RUNNING; |
112 | end; |
113 | elseif self.animation.state == RotorSpreader.STATE_STOP then |
114 | local runTime = getAnimTrackTime(self.animation.animCharSet, 1); |
115 | if runTime >= self.animation.runDuration*self.animation.runThreshold then |
116 | setAnimTrackTime(self.animation.animCharSet, 2, 0); |
117 | enableAnimTrack(self.animation.animCharSet, 2); |
118 | self.animation.state = RotorSpreader.STATE_STOPPING |
119 | end; |
120 | elseif self.animation.state == RotorSpreader.STATE_STOPPING then |
121 | self.animation.endWeight = math.min(self.animation.endWeight + dt/self.animation.crossFadeTime, 1); |
122 | self.animation.runWeight = 1-self.animation.endWeight; |
123 | |
124 | if getAnimTrackTime(self.animation.animCharSet, 2) >= self.animation.endDuration then |
125 | disableAnimTrack(self.animation.animCharSet, 2); |
126 | disableAnimTrack(self.animation.animCharSet, 1); |
127 | self.animation.state = RotorSpreader.STATE_DISABLED; |
128 | self.animation.runWeight = 0; |
129 | end; |
130 | end; |
131 | setAnimTrackBlendWeight(self.animation.animCharSet, 0, self.animation.startWeight); |
132 | setAnimTrackBlendWeight(self.animation.animCharSet, 1, self.animation.runWeight); |
133 | setAnimTrackBlendWeight(self.animation.animCharSet, 2, self.animation.endWeight); |
134 | end; |
135 | end; |