123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- /**
- * @author mrdoob / http://mrdoob.com/
- */
- function absNumericalSort( a, b ) {
- return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );
- }
- function WebGLMorphtargets( gl ) {
- var influencesList = {};
- var morphInfluences = new Float32Array( 8 );
- function update( object, geometry, material, program ) {
- var objectInfluences = object.morphTargetInfluences;
- var length = objectInfluences.length;
- var influences = influencesList[ geometry.id ];
- if ( influences === undefined ) {
- // initialise list
- influences = [];
- for ( var i = 0; i < length; i ++ ) {
- influences[ i ] = [ i, 0 ];
- }
- influencesList[ geometry.id ] = influences;
- }
- var morphTargets = material.morphTargets && geometry.morphAttributes.position;
- var morphNormals = material.morphNormals && geometry.morphAttributes.normal;
- // Remove current morphAttributes
- for ( var i = 0; i < length; i ++ ) {
- var influence = influences[ i ];
- if ( influence[ 1 ] !== 0 ) {
- if ( morphTargets ) geometry.removeAttribute( 'morphTarget' + i );
- if ( morphNormals ) geometry.removeAttribute( 'morphNormal' + i );
- }
- }
- // Collect influences
- for ( var i = 0; i < length; i ++ ) {
- var influence = influences[ i ];
- influence[ 0 ] = i;
- influence[ 1 ] = objectInfluences[ i ];
- }
- influences.sort( absNumericalSort );
- // Add morphAttributes
- for ( var i = 0; i < 8; i ++ ) {
- var influence = influences[ i ];
- if ( influence ) {
- var index = influence[ 0 ];
- var value = influence[ 1 ];
- if ( value ) {
- if ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] );
- if ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] );
- morphInfluences[ i ] = value;
- continue;
- }
- }
- morphInfluences[ i ] = 0;
- }
- program.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );
- }
- return {
- update: update
- }
- }
- export { WebGLMorphtargets };
|