Browse Source

WebGLRenderer: Removed morphTargets allocations.

Mr.doob 8 years ago
parent
commit
08eac781fe
1 changed files with 38 additions and 24 deletions
  1. 38 24
      src/renderers/WebGLRenderer.js

+ 38 - 24
src/renderers/WebGLRenderer.js

@@ -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;
 
 			}