diff --git a/examples/js/loaders/FBXLoader.js b/examples/js/loaders/FBXLoader.js index a427a60018cecdf4fccd702a95dadde02af99ee6..b43bde6c92e3a338d70de16441db6861dabcb6ee 100644 --- a/examples/js/loaders/FBXLoader.js +++ b/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 ) {