WebGLMorphtargets.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. function absNumericalSort( a, b ) {
  5. return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );
  6. }
  7. function WebGLMorphtargets( gl ) {
  8. var influencesList = {};
  9. var morphInfluences = new Float32Array( 8 );
  10. function update( object, geometry, material, program ) {
  11. var objectInfluences = object.morphTargetInfluences;
  12. var length = objectInfluences.length;
  13. var influences = influencesList[ geometry.id ];
  14. if ( influences === undefined ) {
  15. // initialise list
  16. influences = [];
  17. for ( var i = 0; i < length; i ++ ) {
  18. influences[ i ] = [ i, 0 ];
  19. }
  20. influencesList[ geometry.id ] = influences;
  21. }
  22. var morphTargets = material.morphTargets && geometry.morphAttributes.position;
  23. var morphNormals = material.morphNormals && geometry.morphAttributes.normal;
  24. // Remove current morphAttributes
  25. for ( var i = 0; i < length; i ++ ) {
  26. var influence = influences[ i ];
  27. if ( influence[ 1 ] !== 0 ) {
  28. if ( morphTargets ) geometry.removeAttribute( 'morphTarget' + i );
  29. if ( morphNormals ) geometry.removeAttribute( 'morphNormal' + i );
  30. }
  31. }
  32. // Collect influences
  33. for ( var i = 0; i < length; i ++ ) {
  34. var influence = influences[ i ];
  35. influence[ 0 ] = i;
  36. influence[ 1 ] = objectInfluences[ i ];
  37. }
  38. influences.sort( absNumericalSort );
  39. // Add morphAttributes
  40. for ( var i = 0; i < 8; i ++ ) {
  41. var influence = influences[ i ];
  42. if ( influence ) {
  43. var index = influence[ 0 ];
  44. var value = influence[ 1 ];
  45. if ( value ) {
  46. if ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] );
  47. if ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] );
  48. morphInfluences[ i ] = value;
  49. continue;
  50. }
  51. }
  52. morphInfluences[ i ] = 0;
  53. }
  54. program.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );
  55. }
  56. return {
  57. update: update
  58. }
  59. }
  60. export { WebGLMorphtargets };