From 508881091a4ed05ce651c87bf5ecbda5292d2b0f Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Thu, 25 Apr 2024 21:43:48 -0400 Subject: [PATCH] Physics now calculates proper local transform if body has parent --- Nuake/src/Physics/DynamicWorld.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/Nuake/src/Physics/DynamicWorld.cpp b/Nuake/src/Physics/DynamicWorld.cpp index a4e00f66..d8f8f145 100644 --- a/Nuake/src/Physics/DynamicWorld.cpp +++ b/Nuake/src/Physics/DynamicWorld.cpp @@ -33,6 +33,7 @@ #include #include +#include namespace Nuake { @@ -529,14 +530,23 @@ namespace Nuake joltTransform(0, 3), joltTransform(1, 3), joltTransform(2, 3), joltTransform(3, 3) ); + Entity entity = { (entt::entity)entId, Engine::GetCurrentScene().get() }; + if (entity.GetComponent().HasParent) + { + auto& parent = entity.GetComponent().Parent; + auto& parentTransformComponent = parent.GetComponent(); + const Matrix4& parentTransform = parentTransformComponent.GetGlobalTransform(); + + transform = glm::inverse(parentTransform) * transform; + } + Vector3 scale = Vector3(); Quat rotation = Quat(); Vector3 pos = Vector3(); Vector3 skew = Vector3(); Vector4 pesp = Vector4(); glm::decompose(transform, scale, rotation, pos, skew, pesp); - - Entity entity = { (entt::entity)entId, Engine::GetCurrentScene().get() }; + auto& transformComponent = entity.GetComponent(); transformComponent.SetLocalPosition(pos); transformComponent.SetLocalRotation(Quat(bodyRotation.GetW(), bodyRotation.GetX(), bodyRotation.GetY(), bodyRotation.GetZ())); @@ -563,6 +573,15 @@ namespace Nuake joltTransform(0, 3), joltTransform(1, 3), joltTransform(2, 3), joltTransform(3, 3) ); + if(entity.GetComponent().HasParent) + { + auto& parent = entity.GetComponent().Parent; + auto& parentTransformComponent = parent.GetComponent(); + const Matrix4& parentTransform = parentTransformComponent.GetGlobalTransform(); + + transform = glm::inverse(parentTransform) * transform; + } + Vector3 scale = Vector3(); Quat rotation = Quat(); Vector3 pos = Vector3();