From d20fb50c9d9447ecb5fa5ae369dee9f2d73e101c Mon Sep 17 00:00:00 2001 From: Aaron Ruiz Mora Date: Tue, 27 Apr 2021 14:52:33 +0100 Subject: [PATCH] Cloth CPU Skinning using MCore DualQuaternions instead of Cry DualQuat --- .../ClothComponentMesh/ActorClothSkinning.cpp | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.cpp b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.cpp index 0baa385f44..c295eca188 100644 --- a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.cpp +++ b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.cpp @@ -10,15 +10,13 @@ * */ -#include // Needed for DualQuat -#include - #include #include // Needed to access the Mesh information inside Actor. #include #include +#include #include #include @@ -171,7 +169,7 @@ namespace NvCloth return transformData->GetSkinningMatrices(); } - AZStd::unordered_map ObtainSkinningDualQuaternions( + AZStd::unordered_map ObtainSkinningDualQuaternions( AZ::EntityId entityId, const AZStd::vector& jointIndices) { @@ -181,10 +179,10 @@ namespace NvCloth return {}; } - AZStd::unordered_map skinningDualQuaternions; + AZStd::unordered_map skinningDualQuaternions; for (AZ::u16 jointIndex : jointIndices) { - skinningDualQuaternions.emplace(jointIndex, AZMatrix3x4ToLYMatrix3x4(skinningMatrices[jointIndex])); + skinningDualQuaternions.emplace(jointIndex, MCore::DualQuaternion(AZ::Transform::CreateFromMatrix3x4(skinningMatrices[jointIndex]))); } return skinningDualQuaternions; } @@ -276,8 +274,8 @@ namespace NvCloth AZ::Vector3 ComputeSkinningVector(const AZ::Vector3& originalVector) override; private: - AZStd::unordered_map m_skinningDualQuaternions; - DualQuat m_vertexSkinningTransform = DualQuat(type_identity::IDENTITY); + AZStd::unordered_map m_skinningDualQuaternions; + MCore::DualQuaternion m_vertexSkinningTransform; }; void ActorClothSkinningDualQuaternion::UpdateSkinning() @@ -294,7 +292,7 @@ namespace NvCloth void ActorClothSkinningDualQuaternion::ComputeVertexSkinnningTransform(const SkinningInfo& skinningInfo) { - m_vertexSkinningTransform = DualQuat(type_zero::ZERO); + m_vertexSkinningTransform = MCore::DualQuaternion(AZ::Quaternion::CreateZero(), AZ::Quaternion::CreateZero()); for (size_t weightIndex = 0; weightIndex < skinningInfo.m_jointWeights.size(); ++weightIndex) { const AZ::u16 jointIndex = skinningInfo.m_jointIndices[weightIndex]; @@ -312,12 +310,12 @@ namespace NvCloth AZ::Vector3 ActorClothSkinningDualQuaternion::ComputeSkinningPosition(const AZ::Vector3& originalPosition) { - return LYVec3ToAZVec3(m_vertexSkinningTransform * AZVec3ToLYVec3(originalPosition)); + return m_vertexSkinningTransform.TransformPoint(originalPosition); } AZ::Vector3 ActorClothSkinningDualQuaternion::ComputeSkinningVector(const AZ::Vector3& originalVector) { - return LYVec3ToAZVec3(m_vertexSkinningTransform.nq * AZVec3ToLYVec3(originalVector)).GetNormalized(); + return m_vertexSkinningTransform.TransformVector(originalVector).GetNormalized(); } AZStd::unique_ptr ActorClothSkinning::Create(