diff --git a/build/FBX2glTF b/build/FBX2glTF index a810e15..271a681 100755 Binary files a/build/FBX2glTF and b/build/FBX2glTF differ diff --git a/src/fbx/Fbx2Raw.cpp b/src/fbx/Fbx2Raw.cpp index ca85f0d..f11438a 100644 --- a/src/fbx/Fbx2Raw.cpp +++ b/src/fbx/Fbx2Raw.cpp @@ -830,11 +830,43 @@ static void ReadAnimations(RawModel& raw, FbxScene* pScene, const GltfOptions& o const FbxVector4 baseTranslation = baseTransform.GetT(); const FbxQuaternion baseRotation = baseTransform.GetQ(); const FbxVector4 baseScaling = computeLocalScale(pNode); - bool hasTranslation = false; - bool hasRotation = false; - bool hasScale = false; + FbxAnimCurveNode* translationCurveNode = pNode->LclTranslation.GetCurveNode(); + FbxAnimCurveNode* rotationCurveNode = pNode->LclRotation.GetCurveNode(); + FbxAnimCurveNode* scalingCurveNode = pNode->LclScaling.GetCurveNode(); + + bool hasTranslation = !!translationCurveNode; + bool hasRotation = !!rotationCurveNode; + bool hasScale = !!scalingCurveNode; bool hasMorphs = false; + FbxMesh* mesh = pNode->GetMesh(); + if (mesh) { + int deformerCount = mesh->GetDeformerCount(FbxDeformer::eBlendShape); + for (int i = 0; i < deformerCount; ++i) { + FbxBlendShape* blendShape = static_cast(mesh->GetDeformer(i, FbxDeformer::eBlendShape)); + int channelCount = blendShape->GetBlendShapeChannelCount(); + for (int j = 0; j < channelCount; ++j) { + FbxBlendShapeChannel* channel = blendShape->GetBlendShapeChannel(j); + if (channel && channel->GetTargetShapeCount() > 0) { + for (int layerIx = 0; layerIx < pAnimStack->GetMemberCount(); layerIx++) { + FbxAnimLayer* layer = pAnimStack->GetMember(layerIx); + FbxAnimCurve* curve = mesh->GetShapeChannel(i, j, layer); + if (curve) { + hasMorphs = true; + break; + } + } + if (hasMorphs) { + break; + } + } + } + if (hasMorphs) { + break; + } + } + } + RawChannel channel; channel.nodeIndex = raw.GetNodeById(pNode->GetUniqueID()); @@ -847,21 +879,6 @@ static void ReadAnimations(RawModel& raw, FbxScene* pScene, const GltfOptions& o const FbxQuaternion localRotation = localTransform.GetQ(); const FbxVector4 localScale = computeLocalScale(pNode, pTime); - - hasTranslation |= - (fabs(localTranslation[0] - baseTranslation[0]) > epsilon || - fabs(localTranslation[1] - baseTranslation[1]) > epsilon || - fabs(localTranslation[2] - baseTranslation[2]) > epsilon); - hasRotation |= - (fabs(localRotation[0] - baseRotation[0]) > epsilon || - fabs(localRotation[1] - baseRotation[1]) > epsilon || - fabs(localRotation[2] - baseRotation[2]) > epsilon || - fabs(localRotation[3] - baseRotation[3]) > epsilon); - hasScale |= - (fabs(localScale[0] - baseScaling[0]) > epsilon || - fabs(localScale[1] - baseScaling[1]) > epsilon || - fabs(localScale[2] - baseScaling[2]) > epsilon); - channel.translations.push_back(toVec3f(localTranslation) * scaleFactor); channel.rotations.push_back(toQuatf(localRotation)); channel.scales.push_back(toVec3f(localScale)); @@ -915,7 +932,6 @@ static void ReadAnimations(RawModel& raw, FbxScene* pScene, const GltfOptions& o if (!std::isnan(result)) { // we're transitioning into targetIx channel.weights.push_back(result); - hasMorphs = true; continue; } if (targetIx != targetCount - 1) { @@ -923,7 +939,6 @@ static void ReadAnimations(RawModel& raw, FbxScene* pScene, const GltfOptions& o if (!std::isnan(result)) { // we're transitioning AWAY from targetIx channel.weights.push_back(1.0f - result); - hasMorphs = true; continue; } } @@ -937,20 +952,18 @@ static void ReadAnimations(RawModel& raw, FbxScene* pScene, const GltfOptions& o } } - if (!optAnimation || hasTranslation || hasRotation || hasScale || hasMorphs) { - if (optAnimation) { - if (!hasTranslation) { - channel.translations.clear(); - } - if (!hasRotation) { - channel.rotations.clear(); - } - if (!hasScale) { - channel.scales.clear(); - } - if (!hasMorphs) { - channel.weights.clear(); - } + if (hasTranslation || hasRotation || hasScale || hasMorphs) { + if (!hasTranslation) { + channel.translations.clear(); + } + if (!hasRotation) { + channel.rotations.clear(); + } + if (!hasScale) { + channel.scales.clear(); + } + if (!hasMorphs) { + channel.weights.clear(); } animation.channels.emplace_back(channel);