Quellcode durchsuchen

DirectGeometry: Rescued MorphTargets.

Mr.doob vor 10 Jahren
Ursprung
Commit
3b59e21755
2 geänderte Dateien mit 78 neuen und 33 gelöschten Zeilen
  1. 17 27
      src/core/BufferGeometry.js
  2. 61 6
      src/core/DirectGeometry.js

+ 17 - 27
src/core/BufferGeometry.js

@@ -170,53 +170,43 @@ THREE.BufferGeometry.prototype = {
 
 		} else if ( object instanceof THREE.Mesh ) {
 
-			if ( geometry instanceof THREE.DirectGeometry ) {
-
-				this.fromDirectGeometry( geometry );
-
-			} else if ( geometry instanceof THREE.Geometry ) {
+			if ( geometry instanceof THREE.Geometry ) {
 
 				this.fromGeometry( geometry );
 
-			}
+				// skinning
 
-			// skinning
+				if ( object instanceof THREE.SkinnedMesh ) {
 
-			if ( object instanceof THREE.SkinnedMesh ) {
+					/*
+					var skinIndices = new THREE.Float32Attribute( geometry.skinIndices.length * 4, 4 );
+					var skinWeights = new THREE.Float32Attribute( geometry.skinWeights.length * 4, 4 );
 
-				/*
-				var skinIndices = new THREE.Float32Attribute( geometry.skinIndices.length * 4, 4 );
-				var skinWeights = new THREE.Float32Attribute( geometry.skinWeights.length * 4, 4 );
+					this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );
+					this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );
+					*/
 
-				this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );
-				this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );
-				*/
-
-			}
-
-			// morphs
+				}
 
-			if ( object.morphTargetInfluences !== undefined ) {
+				// morphs
 
-				/*
-				var morphTargets = geometry.morphTargets;
+				if ( object.morphTargetInfluences !== undefined ) {
 
-				if ( morphTargets.length > 0 ) {
+					var morphTargets = geometry.__directGeometry.morphTargets;
 
 					for ( var i = 0, l = morphTargets.length; i < l; i ++ ) {
 
 						var morphTarget = morphTargets[ i ];
 
-						var attribute = new THREE.Float32Attribute( morphTarget.vertices.length * 3, 3 );
+						var attribute = new THREE.Float32Attribute( morphTarget.length * 3, 3 );
 
-						this.morphAttributes.push( attribute.copyVector3sArray( morphTarget.vertices ) );
+						this.morphAttributes.push( attribute.copyVector3sArray( morphTarget ) );
 
 					}
 
-				}
-				*/
+					// TODO normals, colors
 
-				// TODO normals, colors
+				}
 
 			}
 

+ 61 - 6
src/core/DirectGeometry.js

@@ -18,6 +18,10 @@ THREE.DirectGeometry = function () {
 	this.uvs = [];
 	this.uvs2 = [];
 
+	this.morphTargets = [];
+	this.morphColors = [];
+	this.morphNormals = [];
+
 	// this.lineDistances = [];
 
 	this.boundingBox = null;
@@ -65,6 +69,37 @@ THREE.DirectGeometry.prototype = {
 		var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;
 		var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;
 
+		// morphs
+
+		var morphTargets = geometry.morphTargets;
+		var morphTargetsLength = morphTargets.length;
+
+		for ( var i = 0; i < morphTargetsLength; i ++ ) {
+
+			this.morphTargets[ i ] = [];
+
+		}
+
+		var morphNormals = geometry.morphNormals;
+		var morphNormalsLength = morphNormals.length;
+
+		for ( var i = 0; i < morphNormalsLength; i ++ ) {
+
+			this.morphNormals[ i ] = [];
+
+		}
+
+		var morphColors = geometry.morphColors;
+		var morphColorsLength = morphColors.length;
+
+		for ( var i = 0; i < morphColorsLength; i ++ ) {
+
+			this.morphColors[ i ] = [];
+
+		}
+
+		//
+
 		for ( var i = 0; i < faces.length; i ++ ) {
 
 			var face = faces[ i ];
@@ -135,6 +170,32 @@ THREE.DirectGeometry.prototype = {
 
 			}
 
+			// morphs
+
+			for ( var j = 0; j < morphTargetsLength; j ++ ) {
+
+				var morph = morphTargets[ j ].vertices;
+
+				this.morphTargets[ j ].push( morph[ face.a ], morph[ face.b ], morph[ face.c ] );
+
+			}
+
+			for ( var j = 0; j < morphNormalsLength; j ++ ) {
+
+				var morph = morphNormals[ j ].normals;
+
+				this.morphNormals[ j ].push( morph[ face.a ], morph[ face.b ], morph[ face.c ] );
+
+			}
+
+			for ( var j = 0; j < morphColorsLength; j ++ ) {
+
+				var morph = morphColors[ j ].colors;
+
+				this.morphColors[ j ].push( morph[ face.a ], morph[ face.b ], morph[ face.c ] );
+
+			}
+
 		}
 
 		this.verticesNeedUpdate = geometry.verticesNeedUpdate;
@@ -145,14 +206,8 @@ THREE.DirectGeometry.prototype = {
 		return this;
 
 		/*
-		if ( geometry.morphTargets ) this.morphTargets = geometry.morphTargets.slice( 0 );
-		if ( geometry.morphColors ) this.morphColors = geometry.morphColors.slice( 0 );
-		if ( geometry.morphNormals ) this.morphNormals = geometry.morphNormals.slice( 0 );
-
 		if ( geometry.skinIndices ) this.skinIndices = geometry.skinIndices.slice( 0 );
 		if ( geometry.skinWeights ) this.skinWeights = geometry.skinWeights.slice( 0 );
-
-		return this;
 		*/
 
 	},