UNPKG

3.16 kBJavaScriptView Raw
1/**
2 * @author tschw
3 * @author Ben Houston / http://clara.io/
4 * @author David Sarno / http://lighthaus.us/
5 */
6
7var AnimationUtils = {
8
9 // same as Array.prototype.slice, but also works on typed arrays
10 arraySlice: function ( array, from, to ) {
11
12 if ( AnimationUtils.isTypedArray( array ) ) {
13
14 // in ios9 array.subarray(from, undefined) will return empty array
15 // but array.subarray(from) or array.subarray(from, len) is correct
16 return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) );
17
18 }
19
20 return array.slice( from, to );
21
22 },
23
24 // converts an array to a specific type
25 convertArray: function ( array, type, forceClone ) {
26
27 if ( ! array || // let 'undefined' and 'null' pass
28 ! forceClone && array.constructor === type ) return array;
29
30 if ( typeof type.BYTES_PER_ELEMENT === 'number' ) {
31
32 return new type( array ); // create typed array
33
34 }
35
36 return Array.prototype.slice.call( array ); // create Array
37
38 },
39
40 isTypedArray: function ( object ) {
41
42 return ArrayBuffer.isView( object ) &&
43 ! ( object instanceof DataView );
44
45 },
46
47 // returns an array by which times and values can be sorted
48 getKeyframeOrder: function ( times ) {
49
50 function compareTime( i, j ) {
51
52 return times[ i ] - times[ j ];
53
54 }
55
56 var n = times.length;
57 var result = new Array( n );
58 for ( var i = 0; i !== n; ++ i ) result[ i ] = i;
59
60 result.sort( compareTime );
61
62 return result;
63
64 },
65
66 // uses the array previously returned by 'getKeyframeOrder' to sort data
67 sortedArray: function ( values, stride, order ) {
68
69 var nValues = values.length;
70 var result = new values.constructor( nValues );
71
72 for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {
73
74 var srcOffset = order[ i ] * stride;
75
76 for ( var j = 0; j !== stride; ++ j ) {
77
78 result[ dstOffset ++ ] = values[ srcOffset + j ];
79
80 }
81
82 }
83
84 return result;
85
86 },
87
88 // function for parsing AOS keyframe formats
89 flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) {
90
91 var i = 1, key = jsonKeys[ 0 ];
92
93 while ( key !== undefined && key[ valuePropertyName ] === undefined ) {
94
95 key = jsonKeys[ i ++ ];
96
97 }
98
99 if ( key === undefined ) return; // no data
100
101 var value = key[ valuePropertyName ];
102 if ( value === undefined ) return; // no data
103
104 if ( Array.isArray( value ) ) {
105
106 do {
107
108 value = key[ valuePropertyName ];
109
110 if ( value !== undefined ) {
111
112 times.push( key.time );
113 values.push.apply( values, value ); // push all elements
114
115 }
116
117 key = jsonKeys[ i ++ ];
118
119 } while ( key !== undefined );
120
121 } else if ( value.toArray !== undefined ) {
122
123 // ...assume THREE.Math-ish
124
125 do {
126
127 value = key[ valuePropertyName ];
128
129 if ( value !== undefined ) {
130
131 times.push( key.time );
132 value.toArray( values, values.length );
133
134 }
135
136 key = jsonKeys[ i ++ ];
137
138 } while ( key !== undefined );
139
140 } else {
141
142 // otherwise push as-is
143
144 do {
145
146 value = key[ valuePropertyName ];
147
148 if ( value !== undefined ) {
149
150 times.push( key.time );
151 values.push( value );
152
153 }
154
155 key = jsonKeys[ i ++ ];
156
157 } while ( key !== undefined );
158
159 }
160
161 }
162
163};
164
165
166export { AnimationUtils };