未验证 提交 f4c960c6 编写于 作者: M Mr.doob 提交者: GitHub

Merge pull request #16991 from looeee/fbxloader_morphtargets_fix

FBXLoader: load multiple morph targets
......@@ -1529,7 +1529,7 @@ THREE.FBXLoader = ( function () {
parseMeshGeometry: function ( relationships, geoNode, deformers ) {
var skeletons = deformers.skeletons;
var morphTargets = deformers.morphTargets;
var morphTargets = [];
var modelNodes = relationships.parents.map( function ( parent ) {
......@@ -1548,13 +1548,15 @@ THREE.FBXLoader = ( function () {
}, null );
var morphTarget = relationships.children.reduce( function ( morphTarget, child ) {
relationships.children.forEach( function( child ) {
if ( morphTargets[ child.ID ] !== undefined ) morphTarget = morphTargets[ child.ID ];
if ( deformers.morphTargets[ child.ID ] !== undefined ) {
return morphTarget;
morphTargets.push( deformers.morphTargets[ child.ID ] );
}, null );
}
} );
// Assume one model and get the preRotation from that
// if there is more than one model associated with the geometry this may cause problems
......@@ -1571,12 +1573,12 @@ THREE.FBXLoader = ( function () {
var transform = generateTransform( transformData );
return this.genGeometry( geoNode, skeleton, morphTarget, transform );
return this.genGeometry( geoNode, skeleton, morphTargets, transform );
},
// Generate a THREE.BufferGeometry from a node in FBXTree.Objects.Geometry
genGeometry: function ( geoNode, skeleton, morphTarget, preTransform ) {
genGeometry: function ( geoNode, skeleton, morphTargets, preTransform ) {
var geo = new THREE.BufferGeometry();
if ( geoNode.attrName ) geo.name = geoNode.attrName;
......@@ -1677,7 +1679,7 @@ THREE.FBXLoader = ( function () {
}
this.addMorphTargets( geo, geoNode, morphTarget, preTransform );
this.addMorphTargets( geo, geoNode, morphTargets, preTransform );
return geo;
......@@ -2050,23 +2052,27 @@ THREE.FBXLoader = ( function () {
},
addMorphTargets: function ( parentGeo, parentGeoNode, morphTarget, preTransform ) {
addMorphTargets: function ( parentGeo, parentGeoNode, morphTargets, preTransform ) {
if ( morphTarget === null ) return;
if ( morphTargets.length === 0 ) return;
parentGeo.morphAttributes.position = [];
// parentGeo.morphAttributes.normal = []; // not implemented
var self = this;
morphTarget.rawTargets.forEach( function ( rawTarget ) {
var self = this;
morphTargets.forEach( function( morphTarget ) {
var morphGeoNode = fbxTree.Objects.Geometry[ rawTarget.geoID ];
morphTarget.rawTargets.forEach( function ( rawTarget ) {
if ( morphGeoNode !== undefined ) {
var morphGeoNode = fbxTree.Objects.Geometry[ rawTarget.geoID ];
self.genMorphGeometry( parentGeo, parentGeoNode, morphGeoNode, preTransform, rawTarget.name );
if ( morphGeoNode !== undefined ) {
}
self.genMorphGeometry( parentGeo, parentGeoNode, morphGeoNode, preTransform, rawTarget.name );
}
} );
} );
......
......@@ -1577,7 +1577,7 @@ var FBXLoader = ( function () {
parseMeshGeometry: function ( relationships, geoNode, deformers ) {
var skeletons = deformers.skeletons;
var morphTargets = deformers.morphTargets;
var morphTargets = [];
var modelNodes = relationships.parents.map( function ( parent ) {
......@@ -1596,13 +1596,15 @@ var FBXLoader = ( function () {
}, null );
var morphTarget = relationships.children.reduce( function ( morphTarget, child ) {
relationships.children.forEach( function( child ) {
if ( morphTargets[ child.ID ] !== undefined ) morphTarget = morphTargets[ child.ID ];
if ( deformers.morphTargets[ child.ID ] !== undefined ) {
return morphTarget;
morphTargets.push( deformers.morphTargets[ child.ID ] );
}, null );
}
} );
// Assume one model and get the preRotation from that
// if there is more than one model associated with the geometry this may cause problems
......@@ -1619,12 +1621,12 @@ var FBXLoader = ( function () {
var transform = generateTransform( transformData );
return this.genGeometry( geoNode, skeleton, morphTarget, transform );
return this.genGeometry( geoNode, skeleton, morphTargets, transform );
},
// Generate a BufferGeometry from a node in FBXTree.Objects.Geometry
genGeometry: function ( geoNode, skeleton, morphTarget, preTransform ) {
genGeometry: function ( geoNode, skeleton, morphTargets, preTransform ) {
var geo = new BufferGeometry();
if ( geoNode.attrName ) geo.name = geoNode.attrName;
......@@ -1725,7 +1727,7 @@ var FBXLoader = ( function () {
}
this.addMorphTargets( geo, geoNode, morphTarget, preTransform );
this.addMorphTargets( geo, geoNode, morphTargets, preTransform );
return geo;
......@@ -2098,23 +2100,27 @@ var FBXLoader = ( function () {
},
addMorphTargets: function ( parentGeo, parentGeoNode, morphTarget, preTransform ) {
addMorphTargets: function ( parentGeo, parentGeoNode, morphTargets, preTransform ) {
if ( morphTarget === null ) return;
if ( morphTargets.length === 0 ) return;
parentGeo.morphAttributes.position = [];
// parentGeo.morphAttributes.normal = []; // not implemented
var self = this;
morphTarget.rawTargets.forEach( function ( rawTarget ) {
var self = this;
morphTargets.forEach( function( morphTarget ) {
var morphGeoNode = fbxTree.Objects.Geometry[ rawTarget.geoID ];
morphTarget.rawTargets.forEach( function ( rawTarget ) {
if ( morphGeoNode !== undefined ) {
var morphGeoNode = fbxTree.Objects.Geometry[ rawTarget.geoID ];
self.genMorphGeometry( parentGeo, parentGeoNode, morphGeoNode, preTransform, rawTarget.name );
if ( morphGeoNode !== undefined ) {
}
self.genMorphGeometry( parentGeo, parentGeoNode, morphGeoNode, preTransform, rawTarget.name );
}
} );
} );
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册