1 | /**
|
---|
2 | * @author mikael emtinger / http://gomo.se/
|
---|
3 | */
|
---|
4 |
|
---|
5 | THREE.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 | }());
|
---|