source: other-projects/playing-in-the-street/summer-2013/trunk/Playing-in-the-Street-WPF/Content/Web/mrdoob-three.js-4862f5f/src/extras/animation/AnimationHandler.js@ 28897

Last change on this file since 28897 was 28897, checked in by davidb, 10 years ago

GUI front-end to server base plus web page content

File size: 4.4 KB
Line 
1/**
2 * @author mikael emtinger / http://gomo.se/
3 */
4
5THREE.AnimationHandler = (function() {
6
7 var playing = [];
8 var library = {};
9 var that = {};
10
11
12 //--- update ---
13
14 that.update = function( deltaTimeMS ) {
15
16 for( var i = 0; i < playing.length; i ++ )
17 playing[ i ].update( deltaTimeMS );
18
19 };
20
21
22 //--- add ---
23
24 that.addToUpdate = function( animation ) {
25
26 if ( playing.indexOf( animation ) === -1 )
27 playing.push( animation );
28
29 };
30
31
32 //--- remove ---
33
34 that.removeFromUpdate = function( animation ) {
35
36 var index = playing.indexOf( animation );
37
38 if( index !== -1 )
39 playing.splice( index, 1 );
40
41 };
42
43
44 //--- add ---
45
46 that.add = function( data ) {
47
48 if ( library[ data.name ] !== undefined )
49 console.log( "THREE.AnimationHandler.add: Warning! " + data.name + " already exists in library. Overwriting." );
50
51 library[ data.name ] = data;
52 initData( data );
53
54 };
55
56
57 //--- get ---
58
59 that.get = function( name ) {
60
61 if ( typeof name === "string" ) {
62
63 if ( library[ name ] ) {
64
65 return library[ name ];
66
67 } else {
68
69 console.log( "THREE.AnimationHandler.get: Couldn't find animation " + name );
70 return null;
71
72 }
73
74 } else {
75
76 // todo: add simple tween library
77
78 }
79
80 };
81
82 //--- parse ---
83
84 that.parse = function( root ) {
85
86 // setup hierarchy
87
88 var hierarchy = [];
89
90 if ( root instanceof THREE.SkinnedMesh ) {
91
92 for( var b = 0; b < root.bones.length; b++ ) {
93
94 hierarchy.push( root.bones[ b ] );
95
96 }
97
98 } else {
99
100 parseRecurseHierarchy( root, hierarchy );
101
102 }
103
104 return hierarchy;
105
106 };
107
108 var parseRecurseHierarchy = function( root, hierarchy ) {
109
110 hierarchy.push( root );
111
112 for( var c = 0; c < root.children.length; c++ )
113 parseRecurseHierarchy( root.children[ c ], hierarchy );
114
115 }
116
117
118 //--- init data ---
119
120 var initData = function( data ) {
121
122 if( data.initialized === true )
123 return;
124
125
126 // loop through all keys
127
128 for( var h = 0; h < data.hierarchy.length; h ++ ) {
129
130 for( var k = 0; k < data.hierarchy[ h ].keys.length; k ++ ) {
131
132 // remove minus times
133
134 if( data.hierarchy[ h ].keys[ k ].time < 0 )
135 data.hierarchy[ h ].keys[ k ].time = 0;
136
137
138 // create quaternions
139
140 if( data.hierarchy[ h ].keys[ k ].rot !== undefined &&
141 !( data.hierarchy[ h ].keys[ k ].rot instanceof THREE.Quaternion ) ) {
142
143 var quat = data.hierarchy[ h ].keys[ k ].rot;
144 data.hierarchy[ h ].keys[ k ].rot = new THREE.Quaternion( quat[0], quat[1], quat[2], quat[3] );
145
146 }
147
148 }
149
150
151 // prepare morph target keys
152
153 if( data.hierarchy[ h ].keys.length && data.hierarchy[ h ].keys[ 0 ].morphTargets !== undefined ) {
154
155 // get all used
156
157 var usedMorphTargets = {};
158
159 for ( var k = 0; k < data.hierarchy[ h ].keys.length; k ++ ) {
160
161 for ( var m = 0; m < data.hierarchy[ h ].keys[ k ].morphTargets.length; m ++ ) {
162
163 var morphTargetName = data.hierarchy[ h ].keys[ k ].morphTargets[ m ];
164 usedMorphTargets[ morphTargetName ] = -1;
165
166 }
167
168 }
169
170 data.hierarchy[ h ].usedMorphTargets = usedMorphTargets;
171
172
173 // set all used on all frames
174
175 for ( var k = 0; k < data.hierarchy[ h ].keys.length; k ++ ) {
176
177 var influences = {};
178
179 for ( var morphTargetName in usedMorphTargets ) {
180
181 for ( var m = 0; m < data.hierarchy[ h ].keys[ k ].morphTargets.length; m ++ ) {
182
183 if ( data.hierarchy[ h ].keys[ k ].morphTargets[ m ] === morphTargetName ) {
184
185 influences[ morphTargetName ] = data.hierarchy[ h ].keys[ k ].morphTargetsInfluences[ m ];
186 break;
187
188 }
189
190 }
191
192 if ( m === data.hierarchy[ h ].keys[ k ].morphTargets.length ) {
193
194 influences[ morphTargetName ] = 0;
195
196 }
197
198 }
199
200 data.hierarchy[ h ].keys[ k ].morphTargetsInfluences = influences;
201
202 }
203
204 }
205
206
207 // remove all keys that are on the same time
208
209 for ( var k = 1; k < data.hierarchy[ h ].keys.length; k ++ ) {
210
211 if ( data.hierarchy[ h ].keys[ k ].time === data.hierarchy[ h ].keys[ k - 1 ].time ) {
212
213 data.hierarchy[ h ].keys.splice( k, 1 );
214 k --;
215
216 }
217
218 }
219
220
221 // set index
222
223 for ( var k = 0; k < data.hierarchy[ h ].keys.length; k ++ ) {
224
225 data.hierarchy[ h ].keys[ k ].index = k;
226
227 }
228
229 }
230
231
232 // JIT
233
234 var lengthInFrames = parseInt( data.length * data.fps, 10 );
235
236 data.JIT = {};
237 data.JIT.hierarchy = [];
238
239 for( var h = 0; h < data.hierarchy.length; h ++ )
240 data.JIT.hierarchy.push( new Array( lengthInFrames ) );
241
242
243 // done
244
245 data.initialized = true;
246
247 };
248
249
250 // interpolation types
251
252 that.LINEAR = 0;
253 that.CATMULLROM = 1;
254 that.CATMULLROM_FORWARD = 2;
255
256 return that;
257
258}());
Note: See TracBrowser for help on using the repository browser.