AnimationUtils.js 2.9 KB

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