Spaces:
Running
Running
/** | |
* @author tschw | |
* @author Ben Houston / http://clara.io/ | |
* @author David Sarno / http://lighthaus.us/ | |
*/ | |
var AnimationUtils = { | |
// same as Array.prototype.slice, but also works on typed arrays | |
arraySlice: function ( array, from, to ) { | |
if ( AnimationUtils.isTypedArray( array ) ) { | |
// in ios9 array.subarray(from, undefined) will return empty array | |
// but array.subarray(from) or array.subarray(from, len) is correct | |
return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) ); | |
} | |
return array.slice( from, to ); | |
}, | |
// converts an array to a specific type | |
convertArray: function ( array, type, forceClone ) { | |
if ( ! array || // let 'undefined' and 'null' pass | |
! forceClone && array.constructor === type ) return array; | |
if ( typeof type.BYTES_PER_ELEMENT === 'number' ) { | |
return new type( array ); // create typed array | |
} | |
return Array.prototype.slice.call( array ); // create Array | |
}, | |
isTypedArray: function ( object ) { | |
return ArrayBuffer.isView( object ) && | |
! ( object instanceof DataView ); | |
}, | |
// returns an array by which times and values can be sorted | |
getKeyframeOrder: function ( times ) { | |
function compareTime( i, j ) { | |
return times[ i ] - times[ j ]; | |
} | |
var n = times.length; | |
var result = new Array( n ); | |
for ( var i = 0; i !== n; ++ i ) result[ i ] = i; | |
result.sort( compareTime ); | |
return result; | |
}, | |
// uses the array previously returned by 'getKeyframeOrder' to sort data | |
sortedArray: function ( values, stride, order ) { | |
var nValues = values.length; | |
var result = new values.constructor( nValues ); | |
for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) { | |
var srcOffset = order[ i ] * stride; | |
for ( var j = 0; j !== stride; ++ j ) { | |
result[ dstOffset ++ ] = values[ srcOffset + j ]; | |
} | |
} | |
return result; | |
}, | |
// function for parsing AOS keyframe formats | |
flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) { | |
var i = 1, key = jsonKeys[ 0 ]; | |
while ( key !== undefined && key[ valuePropertyName ] === undefined ) { | |
key = jsonKeys[ i ++ ]; | |
} | |
if ( key === undefined ) return; // no data | |
var value = key[ valuePropertyName ]; | |
if ( value === undefined ) return; // no data | |
if ( Array.isArray( value ) ) { | |
do { | |
value = key[ valuePropertyName ]; | |
if ( value !== undefined ) { | |
times.push( key.time ); | |
values.push.apply( values, value ); // push all elements | |
} | |
key = jsonKeys[ i ++ ]; | |
} while ( key !== undefined ); | |
} else if ( value.toArray !== undefined ) { | |
// ...assume THREE.Math-ish | |
do { | |
value = key[ valuePropertyName ]; | |
if ( value !== undefined ) { | |
times.push( key.time ); | |
value.toArray( values, values.length ); | |
} | |
key = jsonKeys[ i ++ ]; | |
} while ( key !== undefined ); | |
} else { | |
// otherwise push as-is | |
do { | |
value = key[ valuePropertyName ]; | |
if ( value !== undefined ) { | |
times.push( key.time ); | |
values.push( value ); | |
} | |
key = jsonKeys[ i ++ ]; | |
} while ( key !== undefined ); | |
} | |
} | |
}; | |
export { AnimationUtils }; | |