|
@@ -657,9 +657,11 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
};
|
|
|
|
|
|
+ var influencesList = {};
|
|
|
+
|
|
|
function absNumericalSort( a, b ) {
|
|
|
|
|
|
- return Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] );
|
|
|
+ return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -681,55 +683,67 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
// morph targets
|
|
|
|
|
|
- var morphTargetInfluences = object.morphTargetInfluences;
|
|
|
-
|
|
|
- if ( morphTargetInfluences !== undefined ) {
|
|
|
+ var objectInfluences = object.morphTargetInfluences;
|
|
|
|
|
|
- // TODO Remove allocations
|
|
|
+ if ( objectInfluences !== undefined ) {
|
|
|
|
|
|
- var activeInfluences = [];
|
|
|
+ var influences = influencesList[ geometry.id ];
|
|
|
|
|
|
- for ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {
|
|
|
+ if ( influences === undefined ) {
|
|
|
|
|
|
- var influence = morphTargetInfluences[ i ];
|
|
|
- activeInfluences.push( [ influence, i ] );
|
|
|
+ influencesList[ geometry.id ] = influences = new Array( objectInfluences.length );
|
|
|
|
|
|
}
|
|
|
|
|
|
- activeInfluences.sort( absNumericalSort );
|
|
|
+ for ( var i = 0, l = objectInfluences.length; i < l; i ++ ) {
|
|
|
+
|
|
|
+ var influence = influences[ i ];
|
|
|
|
|
|
- if ( activeInfluences.length > 8 ) {
|
|
|
+ if ( influence === undefined ) {
|
|
|
|
|
|
- activeInfluences.length = 8;
|
|
|
+ influences[ i ] = influence = new Array( 2 );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ influence[ 0 ] = i;
|
|
|
+ influence[ 1 ] = objectInfluences[ i ];
|
|
|
|
|
|
}
|
|
|
|
|
|
- var morphAttributes = geometry.morphAttributes;
|
|
|
+ influences.sort( absNumericalSort );
|
|
|
+
|
|
|
+ var morphTargets = material.morphTargets && geometry.morphAttributes.position;
|
|
|
+ var morphNormals = material.morphNormals && geometry.morphAttributes.normal;
|
|
|
|
|
|
- for ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {
|
|
|
+ for ( var i = 0, l = Math.min( influences.length, 8 ); i < l; i ++ ) {
|
|
|
|
|
|
- var influence = activeInfluences[ i ];
|
|
|
- morphInfluences[ i ] = influence[ 0 ];
|
|
|
+ var morphTargetId = 'morphTarget' + i;
|
|
|
+ var morphNormalId = 'morphNormal' + i;
|
|
|
|
|
|
- if ( influence[ 0 ] !== 0 ) {
|
|
|
+ var influence = influences[ i ];
|
|
|
|
|
|
- var index = influence[ 1 ];
|
|
|
+ var index = influence[ 0 ];
|
|
|
+ var value = influence[ 1 ];
|
|
|
|
|
|
- if ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );
|
|
|
- if ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );
|
|
|
+ if ( value !== 0 ) {
|
|
|
+
|
|
|
+ if ( morphTargets ) geometry.addAttribute( morphTargetId, morphTargets[ index ] );
|
|
|
+ if ( morphNormals ) geometry.addAttribute( morphNormalId, morphNormals[ index ] );
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- if ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );
|
|
|
- if ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );
|
|
|
+ if ( morphTargets ) geometry.removeAttribute( morphTargetId );
|
|
|
+ if ( morphNormals ) geometry.removeAttribute( morphNormalId );
|
|
|
|
|
|
}
|
|
|
|
|
|
+ morphInfluences[ i ] = value;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- for ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) {
|
|
|
+ for ( var i = Math.min( influences.length, 8 ), il = morphInfluences.length; i < il; i ++ ) {
|
|
|
|
|
|
- morphInfluences[ i ] = 0.0;
|
|
|
+ morphInfluences[ i ] = 0;
|
|
|
|
|
|
}
|
|
|
|