From b4c85224bd0113cbe24b87e9cd9e5cfb527f32c4 Mon Sep 17 00:00:00 2001 From: Lewy Blue Date: Sat, 22 Sep 2018 10:11:22 +0100 Subject: [PATCH] Fix morph multimaterial --- examples/js/loaders/FBXLoader.js | 63 ++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 15 deletions(-) diff --git a/examples/js/loaders/FBXLoader.js b/examples/js/loaders/FBXLoader.js index 2cd4f9a66e9dd..a940822a237b3 100644 --- a/examples/js/loaders/FBXLoader.js +++ b/examples/js/loaders/FBXLoader.js @@ -1407,31 +1407,26 @@ THREE.FBXLoader = ( function () { setupMorphMaterials: function () { + var self = this; sceneGraph.traverse( function ( child ) { if ( child.isMesh ) { - if ( child.geometry.morphAttributes.position || child.geometry.morphAttributes.normal ) { - - var uuid = child.uuid; - var matUuid = child.material.uuid; + if ( child.geometry.morphAttributes.position && child.geometry.morphAttributes.position.length ) { - // if a geometry has morph targets, it cannot share the material with other geometries - var sharedMat = false; + if ( Array.isArray( child.material ) ) { - sceneGraph.traverse( function ( child ) { + child.material.forEach( function ( material, i ) { - if ( child.isMesh ) { + self.setupMorphMaterial( child, material, i ); - if ( child.material.uuid === matUuid && child.uuid !== uuid ) sharedMat = true; - - } + } ); - } ); + } else { - if ( sharedMat === true ) child.material = child.material.clone(); + self.setupMorphMaterial( child, child.material ); - child.material.morphTargets = true; + } } @@ -1441,6 +1436,44 @@ THREE.FBXLoader = ( function () { }, + setupMorphMaterial: function ( child, material, index ) { + + var uuid = child.uuid; + var matUuid = material.uuid; + + // if a geometry has morph targets, it cannot share the material with other geometries + var sharedMat = false; + + sceneGraph.traverse( function ( node ) { + + if ( node.isMesh ) { + + if ( Array.isArray( node.material ) ) { + + node.material.forEach( function ( mat ) { + + if ( mat.uuid === matUuid && node.uuid !== uuid ) sharedMat = true; + + } ); + + } else if ( node.material.uuid === matUuid && node.uuid !== uuid ) sharedMat = true; + + } + + } ); + + if ( sharedMat === true ) { + + var clonedMat = material.clone(); + clonedMat.morphTargets = true; + + if ( index === undefined ) child.material = clonedMat; + else child.material[ index ] = clonedMat; + + } else material.morphTargets = true; + + } + }; // parse Geometry data from FBXTree and return map of BufferGeometries @@ -2591,7 +2624,7 @@ THREE.FBXLoader = ( function () { var initialRotation = new THREE.Quaternion(); var initialScale = new THREE.Vector3(); - rawTracks.transform.decompose( initialPosition, initialRotation, initialScale ); + if ( rawTracks.transform ) rawTracks.transform.decompose( initialPosition, initialRotation, initialScale ); initialPosition = initialPosition.toArray(); initialRotation = new THREE.Euler().setFromQuaternion( initialRotation, rawTracks.eulerOrder ).toArray();