Spaces:
Running
Running
| /** | |
| * @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 }; | |