Browse Source

added empty genMorphGeo function

Lewy Blue 7 years ago
parent
commit
ac5cfd1615
1 changed files with 47 additions and 14 deletions
  1. 47 14
      examples/js/loaders/FBXLoader.js

+ 47 - 14
examples/js/loaders/FBXLoader.js

@@ -104,7 +104,6 @@
 			var textures = parseTextures( FBXTree, new THREE.TextureLoader( this.manager ).setPath( resourceDirectory ), images, connections );
 			var materials = parseMaterials( FBXTree, textures, connections );
 			var deformers = parseDeformers( FBXTree, connections );
-			console.log( 'deformers', deformers );
 			var geometryMap = parseGeometries( FBXTree, connections, deformers );
 			var sceneGraph = parseScene( FBXTree, connections, deformers.skeletons, geometryMap, materials );
 
@@ -595,11 +594,15 @@
 
 				} else if ( deformerNode.attrType === 'BlendShape' ) {
 
-					var morphTarget = parseMorphTargets( relationships, deformerNode, DeformerNodes, connections, FBXTree );
+					var morphTarget = {
+						id: nodeID,
+					};
+
+					morphTarget.rawTargets = parseMorphTargets( relationships, deformerNode, DeformerNodes, connections, FBXTree );
 					morphTarget.id = nodeID;
 
 					if ( relationships.parents.length > 1 ) console.warn( 'THREE.FBXLoader: morph target attached to more than one geometry is not supported.' );
-					morphTarget.parentID = relationships.parents[ 0 ].ID;
+					morphTarget.parentGeoID = relationships.parents[ 0 ].ID;
 
 					morphTargets[ nodeID ] = morphTarget;
 
@@ -709,7 +712,6 @@
 
 	}
 
-
 	// Parse nodes in FBXTree.Objects.Geometry
 	function parseGeometries( FBXTree, connections, deformers ) {
 
@@ -719,8 +721,6 @@
 
 			var geometryNodes = FBXTree.Objects.Geometry;
 
-
-
 			for ( var nodeID in geometryNodes ) {
 
 				var relationships = connections.get( parseInt( nodeID ) );
@@ -753,7 +753,6 @@
 
 	}
 
-
 	// Parse single node mesh geometry in FBXTree.Objects.Geometry
 	function parseMeshGeometry( FBXTree, relationships, geometryNode, deformers ) {
 
@@ -819,11 +818,47 @@
 
 	}
 
+	function addMorphTargets( FBXTree, parentGeo, morphTarget, preTransform ) {
+
+		if ( morphTarget === null ) return;
+
+		parentGeo.morphAttributes.position = [];
+		parentGeo.morphAttributes.normal = [];
+
+		morphTarget.rawTargets.forEach( function ( rawTarget, index ) {
+
+			var geoNode = FBXTree.Objects.Geometry[ rawTarget.geoID ];
+
+			if ( geoNode !== undefined ) {
+
+				genMorphGeometry( parentGeo, geoNode, preTransform, index );
+
+			}
+
+		} );
+
+	}
+
+	// a morph geometry is similar to a normal geometry, and the node is also included
+	// in FBXTree.Objects.Geometry, however it can only have attributes for position, normal
+	// and a special attribute Index defining which vertices of the original geometry
+	// it controls
+	function genMorphGeometry( parentGeo, geoNode, preTransform ) {
+
+		var vertexPositions = ( geoNode.Vertices !== undefined ) ? geoNode.Vertices.a : [];
+		var normalsPositions = ( geoNode.Normals !== undefined ) ? geoNode.Normals.a : [];
+		var indices = ( geoNode.Indexes !== undefined ) ? geoNode.Indexes.a : [];
+
+	}
+
 	// Generate a THREE.BufferGeometry from a node in FBXTree.Objects.Geometry
-	function genGeometry( FBXTree, geometryNode, skeleton, morphTarget, preTransform ) {
+	function genGeometry( FBXTree, geometryNode, skeleton, morphTarget, preTransform, calledFrom ) {
+
+		var geo = new THREE.BufferGeometry();
+		if ( geometryNode.attrName ) geo.name = geometryNode.attrName;
 
-		var vertexPositions = geometryNode.Vertices.a;
-		var vertexIndices = geometryNode.PolygonVertexIndex.a;
+		var vertexPositions = ( geometryNode.Vertices !== undefined ) ? geometryNode.Vertices.a : [];
+		var vertexIndices = ( geometryNode.PolygonVertexIndex !== undefined ) ? geometryNode.PolygonVertexIndex.a : [];
 
 		// create arrays to hold the final data used to build the buffergeometry
 		var vertexBuffer = [];
@@ -1166,9 +1201,6 @@
 
 		} );
 
-		var geo = new THREE.BufferGeometry();
-		geo.name = geometryNode.name;
-
 		var positionAttribute = new THREE.Float32BufferAttribute( vertexBuffer, 3 );
 
 		preTransform.applyToBufferAttribute( positionAttribute );
@@ -1262,11 +1294,12 @@
 
 		}
 
+		addMorphTargets( FBXTree, geo, morphTarget, preTransform );
+
 		return geo;
 
 	}
 
-
 	// Parse normal from FBXTree.Objects.Geometry.LayerElementNormal if it exists
 	function getNormals( NormalNode ) {