From 57b19feca5d113ba6fc727cbc8e92e15bff5a9a9 Mon Sep 17 00:00:00 2001 From: amzn-mike <80125227+amzn-mike@users.noreply.github.com> Date: Wed, 16 Jun 2021 12:03:47 -0500 Subject: [PATCH] Cleanup code --- .../Importers/AssImpAnimationImporter.cpp | 8 +- .../Importers/AssImpBoneImporter.cpp | 34 ++---- .../Importers/AssImpTransformImporter.cpp | 104 ++++-------------- 3 files changed, 32 insertions(+), 114 deletions(-) diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpAnimationImporter.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpAnimationImporter.cpp index f066540c50..7ab9deb141 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpAnimationImporter.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpAnimationImporter.cpp @@ -463,13 +463,9 @@ namespace AZ decltype(boneAnimations) parentFillerAnimations; - // Go through all the animations and make sure we create animations for bones who's parents don't have an animation + // Go through all the animations and make sure we create placeholder animations for any bones missing them for (auto&& anim : boneAnimations) { - //const aiNode* node = scene->mRootNode->FindNode(anim.first.c_str()); - //const aiNode* parent = node->mParent; - - //while (parent && parent != scene->mRootNode) for (auto boneName : boneList) { if (!IsPivotNode(aiString(boneName.c_str()))) @@ -502,8 +498,6 @@ namespace AZ AZStd::make_pair(boneName, AZStd::make_pair(anim.second.first, AZStd::move(emptyAnimation)))); } } - - //parent = parent->mParent; } } diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpBoneImporter.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpBoneImporter.cpp index 694e3566f6..648007ca47 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpBoneImporter.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpBoneImporter.cpp @@ -97,7 +97,7 @@ namespace AZ EnumChildren(scene, child, mainBoneList, boneLookup); } } -#pragma optimize("", off) + Events::ProcessingResult AssImpBoneImporter::ImportBone(AssImpNodeEncounteredContext& context) { AZ_TraceContext("Importer", "Bone"); @@ -111,12 +111,7 @@ namespace AZ } bool isBone = false; - - //if (NodeParentIsOfType(context.m_scene.GetGraph(), context.m_currentGraphPosition, DataTypes::IBoneData::TYPEINFO_Uuid())) - //{ - // isBone = true; - //} - //else + { AZStd::unordered_map mainBoneList; AZStd::unordered_map boneLookup; @@ -170,25 +165,14 @@ namespace AZ { createdBoneData = AZStd::make_shared(); } - - // L_Lower_Eyelid_Jnt_01 - if (context.m_sourceNode.GetName() == AZStd::string("L_Lower_Eyelid_Jnt_01")) + + aiMatrix4x4 transform{}; + const aiNode* iteratingNode = currentNode; + + while (iteratingNode) { - //__debugbreak(); - } - - AZStd::vector transforms; - aiMatrix4x4 transform = currentNode->mTransformation; - const aiNode* parent = currentNode->mParent; - - auto addTrans = [&](auto mat) { transforms.push_back(AssImpSDKWrapper::AssImpTypeConverter::ToTransform(mat)); }; - addTrans(transform); - - while (parent) - { - addTrans(parent->mTransformation); - transform = parent->mTransformation * transform; - parent = parent->mParent; + transform = iteratingNode->mTransformation * transform; + iteratingNode = iteratingNode->mParent; } SceneAPI::DataTypes::MatrixType globalTransform = AssImpSDKWrapper::AssImpTypeConverter::ToTransform(transform); diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpTransformImporter.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpTransformImporter.cpp index 3e22bfc671..f7a85a161b 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpTransformImporter.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpTransformImporter.cpp @@ -62,7 +62,7 @@ namespace AZ } } } -#pragma optimize("", off) + Events::ProcessingResult AssImpTransformImporter::ImportTransform(AssImpSceneNodeAppendedContext& context) { AZ_TraceContext("Importer", "transform"); @@ -79,104 +79,44 @@ namespace AZ auto boneIterator = boneLookup.find(currentNode->mName.C_Str()); const bool isBone = boneIterator != boneLookup.end(); - - if (currentNode->mName.C_Str() == AZStd::string("spine_C0_0_jnt")) - { - //__debugbreak(); - } - - //aiMatrix4x4 combinedTransform; - DataTypes::MatrixType finalMat; + + DataTypes::MatrixType localTransform; if (isBone) { - auto parentNode = currentNode->mParent; + AZStd::vector offsets, inverseOffsets; + auto iteratingNode = currentNode; - aiMatrix4x4 offsetMatrix = boneIterator->second->mOffsetMatrix; - aiMatrix4x4 parentOffset {}; - aiMatrix4x4 parentTransform{}; - - if (parentNode) + while (iteratingNode && boneLookup.count(iteratingNode->mName.C_Str())) { - parentTransform = parentNode->mTransformation; - } - - auto azOffset = AssImpSDKWrapper::AssImpTypeConverter::ToTransform(offsetMatrix); - decltype(azOffset) azParentOffset{}; - AZStd::vector transforms, offsets, inverseTransforms, inverseOffsets; - - auto addTransform = [&](AZStd::string, aiMatrix4x4 mat) - { - auto azMat = AssImpSDKWrapper::AssImpTypeConverter::ToTransform(mat); - transforms.push_back(azMat); - inverseTransforms.push_back(azMat.GetInverseFull()); - }; - auto addOffset = [&]([[maybe_unused]] auto name, aiMatrix4x4 mat) - { - auto azMat = AssImpSDKWrapper::AssImpTypeConverter::ToTransform(mat); - offsets.push_back(azMat); - inverseOffsets.push_back(azMat.GetInverseFull()); - }; - - auto curNode = currentNode; - - while (curNode && boneLookup.count(curNode->mName.C_Str())) - { - AZStd::string name = curNode->mName.C_Str(); + AZStd::string name = iteratingNode->mName.C_Str(); auto range = boneLookup.equal_range(name); - for (auto it = range.first; it != range.second; ++it) + if (range.first != range.second) { - addOffset(name, it->second->mOffsetMatrix); - break; + // There can be multiple offsetMatrices for a given bone, we're only interested in grabbing the first one + auto boneFirstOffsetMatrix = range.first->second->mOffsetMatrix; + auto azMat = AssImpSDKWrapper::AssImpTypeConverter::ToTransform(boneFirstOffsetMatrix); + offsets.push_back(azMat); + inverseOffsets.push_back(azMat.GetInverseFull()); } - //addOffset(name, boneLookup.at(name)->mOffsetMatrix); - addTransform(name, curNode->mTransformation); - - curNode = curNode->mParent; + iteratingNode = iteratingNode->mParent; } - - // Go up the tree to find the root bone. It's parent will be the scene mRootNode - while (parentNode && parentNode->mParent && parentNode->mParent != scene->mRootNode) - { - parentNode = parentNode->mParent; - } - - auto parentBoneIterator = boneLookup.find(parentNode->mName.C_Str()); - aiMatrix4x4 rootOffsetMatrix{}; - - if (parentBoneIterator != boneLookup.end()) - { - rootOffsetMatrix = parentBoneIterator->second->mOffsetMatrix; - } - - auto inverseOffset = offsetMatrix; - inverseOffset.Inverse(); - - auto parentTransformInverse = parentTransform; - parentTransformInverse.Inverse(); - - //auto azInverse = azOffset.GetInverseFull(); - //auto azCombined = azParentOffset * azInverse; - //combinedTransform = parentOffset * inverseOffset; - - //parentTransform ^-1 * parentParent * azOffsetInverse - //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); + + localTransform = + offsets.at(AZ::GetMin(offsets.size()-1, static_cast(1))) // parent bone offset, or if there is no parent, then current node offset + * inverseOffsets.at(inverseOffsets.size() - 1) // Inverse of root bone offset + * offsets.at(offsets.size() - 1) // Root bone offset + * inverseOffsets.at(0); // Inverse of current node offset } else { - finalMat = AssImpSDKWrapper::AssImpTypeConverter::ToTransform(GetConcatenatedLocalTransform(currentNode)); + localTransform = AssImpSDKWrapper::AssImpTypeConverter::ToTransform(GetConcatenatedLocalTransform(currentNode)); } - //DataTypes::MatrixType localTransform = AssImpSDKWrapper::AssImpTypeConverter::ToTransform(combinedTransform); - DataTypes::MatrixType localTransform = finalMat; - + // Don't bother adding a node with the identity matrix if (localTransform == DataTypes::MatrixType::Identity()) { return Events::ProcessingResult::Ignored;