2
0
Эх сурвалжийг харах

WebGLRenderer: Morph (vertex)normals working again.

Mr.doob 10 жил өмнө
parent
commit
a00b6be297

+ 5 - 7
src/core/BufferGeometry.js

@@ -342,10 +342,10 @@ THREE.BufferGeometry.prototype = {
 
 		// morphs
 
-		if ( geometry.morphTargets.length > 0 ) {
+		for ( var name in geometry.morphTargets ) {
 
-			var position = [];
-			var morphTargets = geometry.morphTargets;
+			var array = [];
+			var morphTargets = geometry.morphTargets[ name ];
 
 			for ( var i = 0, l = morphTargets.length; i < l; i ++ ) {
 
@@ -353,13 +353,11 @@ THREE.BufferGeometry.prototype = {
 
 				var attribute = new THREE.Float32Attribute( morphTarget.length * 3, 3 );
 
-				position.push( attribute.copyVector3sArray( morphTarget ) );
+				array.push( attribute.copyVector3sArray( morphTarget ) );
 
 			}
 
-			this.morphAttributes.position = position;
-
-			// TODO normals, colors
+			this.morphAttributes[ name ] = array;
 
 		}
 

+ 10 - 26
src/core/DirectGeometry.js

@@ -19,9 +19,7 @@ THREE.DirectGeometry = function () {
 	this.uvs2 = [];
 	this.tangents = [];
 
-	this.morphTargets = [];
-	this.morphColors = [];
-	this.morphNormals = [];
+	this.morphTargets = { position: [], normal: [] };
 
 	this.skinWeights = [];
 	this.skinIndices = [];
@@ -86,27 +84,22 @@ THREE.DirectGeometry.prototype = {
 		var morphTargets = geometry.morphTargets;
 		var morphTargetsLength = morphTargets.length;
 
+		var morphTargetsPosition = this.morphTargets.position;
+
 		for ( var i = 0; i < morphTargetsLength; i ++ ) {
 
-			this.morphTargets[ i ] = [];
+			morphTargetsPosition[ i ] = [];
 
 		}
 
 		var morphNormals = geometry.morphNormals;
 		var morphNormalsLength = morphNormals.length;
 
-		for ( var i = 0; i < morphNormalsLength; i ++ ) {
-
-			this.morphNormals[ i ] = [];
+		var morphTargetsNormal = this.morphTargets.normal;
 
-		}
-
-		var morphColors = geometry.morphColors;
-		var morphColorsLength = morphColors.length;
-
-		for ( var i = 0; i < morphColorsLength; i ++ ) {
+		for ( var i = 0; i < morphNormalsLength; i ++ ) {
 
-			this.morphColors[ i ] = [];
+			morphTargetsNormal[ i ] = [];
 
 		}
 
@@ -214,26 +207,17 @@ THREE.DirectGeometry.prototype = {
 
 				var morphTarget = morphTargets[ j ].vertices;
 
-				this.morphTargets[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );
+				morphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );
 
 			}
-			/*
+
 			for ( var j = 0; j < morphNormalsLength; j ++ ) {
 
 				var morphNormal = morphNormals[ j ].vertexNormals[ i ];
 
-				this.morphNormals[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );
-
-			}
-
-			for ( var j = 0; j < morphColorsLength; j ++ ) {
-
-				var morphColor = morphColors[ j ].colors;
-
-				this.morphColors[ j ].push( morphColor[ face.a ], morphColor[ face.b ], morphColor[ face.c ] );
+				morphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );
 
 			}
-			*/
 
 			// skins
 

+ 7 - 3
src/renderers/WebGLRenderer.js

@@ -912,6 +912,8 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 			}
 
+			var morphAttributes = geometry.morphAttributes;
+
 			for ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {
 
 				var influence = activeInfluences[ i ];
@@ -919,13 +921,15 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 				if ( influence[ 0 ] !== 0 ) {
 
-					var attribute = geometry.morphAttributes.position[ influence[ 1 ] ];
+					var index = influence[ 1 ];
 
-					geometry.addAttribute( 'morphTarget' + i, attribute );
+					if ( material.morphTargets === true ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );
+					if ( material.morphNormals === true ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );
 
 				} else {
 
-					geometry.removeAttribute( 'morphTarget' + i );
+					if ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );
+					if ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );
 
 				}