AnimationUtils.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /**
  2. * @author tschw
  3. * @author Ben Houston / http://clara.io/
  4. * @author David Sarno / http://lighthaus.us/
  5. */
  6. var AnimationUtils = {
  7. // same as Array.prototype.slice, but also works on typed arrays
  8. arraySlice: function ( array, from, to ) {
  9. if ( AnimationUtils.isTypedArray( array ) ) {
  10. // in ios9 array.subarray(from, undefined) will return empty array
  11. // but array.subarray(from) or array.subarray(from, len) is correct
  12. return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) );
  13. }
  14. return array.slice( from, to );
  15. },
  16. // converts an array to a specific type
  17. convertArray: function ( array, type, forceClone ) {
  18. if ( ! array || // let 'undefined' and 'null' pass
  19. ! forceClone && array.constructor === type ) return array;
  20. if ( typeof type.BYTES_PER_ELEMENT === 'number' ) {
  21. return new type( array ); // create typed array
  22. }
  23. return Array.prototype.slice.call( array ); // create Array
  24. },
  25. isTypedArray: function ( object ) {
  26. return ArrayBuffer.isView( object ) &&
  27. ! ( object instanceof DataView );
  28. },
  29. // returns an array by which times and values can be sorted
  30. getKeyframeOrder: function ( times ) {
  31. function compareTime( i, j ) {
  32. return times[ i ] - times[ j ];
  33. }
  34. var n = times.length;
  35. var result = new Array( n );
  36. for ( var i = 0; i !== n; ++ i ) result[ i ] = i;
  37. result.sort( compareTime );
  38. return result;
  39. },
  40. // uses the array previously returned by 'getKeyframeOrder' to sort data
  41. sortedArray: function ( values, stride, order ) {
  42. var nValues = values.length;
  43. var result = new values.constructor( nValues );
  44. for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {
  45. var srcOffset = order[ i ] * stride;
  46. for ( var j = 0; j !== stride; ++ j ) {
  47. result[ dstOffset ++ ] = values[ srcOffset + j ];
  48. }
  49. }
  50. return result;
  51. },
  52. // function for parsing AOS keyframe formats
  53. flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) {
  54. var i = 1, key = jsonKeys[ 0 ];
  55. while ( key !== undefined && key[ valuePropertyName ] === undefined ) {
  56. key = jsonKeys[ i ++ ];
  57. }
  58. if ( key === undefined ) return; // no data
  59. var value = key[ valuePropertyName ];
  60. if ( value === undefined ) return; // no data
  61. if ( Array.isArray( value ) ) {
  62. do {
  63. value = key[ valuePropertyName ];
  64. if ( value !== undefined ) {
  65. times.push( key.time );
  66. values.push.apply( values, value ); // push all elements
  67. }
  68. key = jsonKeys[ i ++ ];
  69. } while ( key !== undefined );
  70. } else if ( value.toArray !== undefined ) {
  71. // ...assume THREE.Math-ish
  72. do {
  73. value = key[ valuePropertyName ];
  74. if ( value !== undefined ) {
  75. times.push( key.time );
  76. value.toArray( values, values.length );
  77. }
  78. key = jsonKeys[ i ++ ];
  79. } while ( key !== undefined );
  80. } else {
  81. // otherwise push as-is
  82. do {
  83. value = key[ valuePropertyName ];
  84. if ( value !== undefined ) {
  85. times.push( key.time );
  86. values.push( value );
  87. }
  88. key = jsonKeys[ i ++ ];
  89. } while ( key !== undefined );
  90. }
  91. }
  92. };
  93. export { AnimationUtils };