From 66a030b800c0def8a0b15847b3661b990f925837 Mon Sep 17 00:00:00 2001 From: amzn-mike <80125227+amzn-mike@users.noreply.github.com> Date: Wed, 9 Jun 2021 22:35:03 -0500 Subject: [PATCH] Fix transform data Use first offsetMatrix for a bone (there may be multiple) and calculate using offsetOfParent * inverseRootOffset * rootOffset * inverseOffset (cherry picked from commit a8eae976dda39ad28f9aa235e1e6ba34715ac48a) # Conflicts: # Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpTransformImporter.cpp --- .../Importers/AssImpTransformImporter.cpp | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpTransformImporter.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpTransformImporter.cpp index 153dfce69d..dc59f59147 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpTransformImporter.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpTransformImporter.cpp @@ -46,8 +46,9 @@ namespace AZ serializeContext->Class()->Version(1); } } - - void GetAllBones(const aiScene* scene, AZStd::unordered_map& boneLookup) + + void GetAllBones( + const aiScene* scene, AZStd::unordered_multimap& boneLookup) { for (unsigned meshIndex = 0; meshIndex < scene->mNumMeshes; ++meshIndex) { @@ -57,7 +58,7 @@ namespace AZ { const aiBone* bone = mesh->mBones[boneIndex]; - boneLookup[bone->mName.C_Str()] = bone; + boneLookup.emplace(bone->mName.C_Str(), bone); } } } @@ -73,18 +74,19 @@ namespace AZ return Events::ProcessingResult::Ignored; } - AZStd::unordered_map boneLookup; + AZStd::unordered_multimap boneLookup; GetAllBones(scene, boneLookup); auto boneIterator = boneLookup.find(currentNode->mName.C_Str()); const bool isBone = boneIterator != boneLookup.end(); - if (currentNode->mName.C_Str() == AZStd::string("FrontCloth_02")) + if (currentNode->mName.C_Str() == AZStd::string("spine_C0_0_jnt")) { - __debugbreak(); + //__debugbreak(); } aiMatrix4x4 combinedTransform; + DataTypes::MatrixType finalMat; if (isBone) { @@ -121,7 +123,16 @@ namespace AZ while (curNode && boneLookup.count(curNode->mName.C_Str())) { AZStd::string name = curNode->mName.C_Str(); - addOffset(name, boneLookup.at(name)->mOffsetMatrix); + + auto range = boneLookup.equal_range(name); + + for (auto it = range.first; it != range.second; ++it) + { + addOffset(name, it->second->mOffsetMatrix); + break; + } + + //addOffset(name, boneLookup.at(name)->mOffsetMatrix); addTransform(name, curNode->mTransformation); curNode = curNode->mParent; @@ -152,14 +163,24 @@ namespace AZ //combinedTransform = parentOffset * inverseOffset; //parentTransform ^-1 * parentParent * azOffsetInverse - combinedTransform = parentTransformInverse * rootOffsetMatrix * inverseOffset; + //combinedTransform = parentTransformInverse * rootOffsetMatrix * inverseOffset; + + //azNodeLocal = offsets[1] * inverseOffsets[3] * (offsets[3] * inverseOffsets[0]) + finalMat = + offsets.at(AZ::GetMin(offsets.size()-1, (decltype(offsets.size()))1)) * inverseOffsets.at(inverseOffsets.size() - 1) * offsets.at(offsets.size() - 1) * inverseOffsets.at(0); } else { combinedTransform = GetConcatenatedLocalTransform(currentNode); } - DataTypes::MatrixType localTransform = AssImpSDKWrapper::AssImpTypeConverter::ToTransform(combinedTransform); + //DataTypes::MatrixType localTransform = AssImpSDKWrapper::AssImpTypeConverter::ToTransform(combinedTransform); + DataTypes::MatrixType localTransform = finalMat; + + if (localTransform == DataTypes::MatrixType::Identity()) + { + return Events::ProcessingResult::Ignored; + } context.m_sourceSceneSystem.SwapTransformForUpAxis(localTransform); context.m_sourceSceneSystem.ConvertUnit(localTransform);