Browse Source

WebGLRenderer: Refactored morph targets handling.

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

+ 42 - 24
src/renderers/WebGLRenderer.js

@@ -687,24 +687,50 @@ function WebGLRenderer( parameters ) {
 
 		if ( objectInfluences !== undefined ) {
 
+			var length = objectInfluences.length;
+
 			var influences = influencesList[ geometry.id ];
 
 			if ( influences === undefined ) {
 
-				influencesList[ geometry.id ] = influences = new Array( objectInfluences.length );
+				// initialise list
+
+				influences = [];
+
+				for ( var i = 0; i < length; i ++ ) {
+
+					influences[ i ] = [ i, 0 ];
+
+				}
+
+				influencesList[ geometry.id ] = influences;
 
 			}
 
-			for ( var i = 0, l = objectInfluences.length; i < l; i ++ ) {
+			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 === undefined ) {
+				if ( influence[ 1 ] !== 0 ) {
 
-					influences[ i ] = influence = new Array( 2 );
+					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 ];
 
@@ -712,36 +738,28 @@ function WebGLRenderer( parameters ) {
 
 			influences.sort( absNumericalSort );
 
-			var morphTargets = material.morphTargets && geometry.morphAttributes.position;
-			var morphNormals = material.morphNormals && geometry.morphAttributes.normal;
-
-			for ( var i = 0, l = Math.min( influences.length, 8 ); i < l; i ++ ) {
+			// Add morphAttributes
 
-				var morphTargetId = 'morphTarget' + i;
-				var morphNormalId = 'morphNormal' + i;
+			for ( var i = 0; i < 8; i ++ ) {
 
 				var influence = influences[ i ];
 
-				var index = influence[ 0 ];
-				var value = influence[ 1 ];
+				if ( influence ) {
 
-				if ( value !== 0 ) {
+					var index = influence[ 0 ];
+					var value = influence[ 1 ];
 
-					if ( morphTargets ) geometry.addAttribute( morphTargetId, morphTargets[ index ] );
-					if ( morphNormals ) geometry.addAttribute( morphNormalId, morphNormals[ index ] );
+					if ( value ) {
 
-				} else {
+						if ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] );
+						if ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] );
 
-					if ( morphTargets ) geometry.removeAttribute( morphTargetId );
-					if ( morphNormals ) geometry.removeAttribute( morphNormalId );
+						morphInfluences[ i ] = value;
+						continue;
 
-				}
-
-				morphInfluences[ i ] = value;
-
-			}
+					}
 
-			for ( var i = Math.min( influences.length, 8 ), il = morphInfluences.length; i < il; i ++ ) {
+				}
 
 				morphInfluences[ i ] = 0;