From 2c8adfdf9300def720cb39251466d28ca0958ddb Mon Sep 17 00:00:00 2001 From: JeffR Date: Thu, 14 Nov 2024 19:29:41 -0600 Subject: [PATCH] Fixed child relative transforms for when SceneGroups are updated --- Engine/source/T3D/SceneGroup.cpp | 54 +++++++++++++------------------- 1 file changed, 22 insertions(+), 32 deletions(-) diff --git a/Engine/source/T3D/SceneGroup.cpp b/Engine/source/T3D/SceneGroup.cpp index 127b5e069..c84456f9a 100644 --- a/Engine/source/T3D/SceneGroup.cpp +++ b/Engine/source/T3D/SceneGroup.cpp @@ -158,15 +158,6 @@ void SceneGroup::onInspect(GuiInspector* inspector) void SceneGroup::setTransform(const MatrixF& mat) { - //transform difference - MatrixF oldTransform = getTransform(); - - Parent::setTransform(mat); - - // Calculate the delta transformation - MatrixF deltaTransform = mat; - deltaTransform.mul(oldTransform.inverse()); - if (isServerObject()) { setMaskBits(TransformMask); @@ -177,15 +168,17 @@ void SceneGroup::setTransform(const MatrixF& mat) SceneObject* child = dynamic_cast(*itr); if (child) { - // Get the child's current transform - MatrixF childTransform = child->getTransform(); + // Get the child's current world transform + MatrixF childWorldTrans = child->getTransform(); - // Apply the delta transformation (ignoring scale) - MatrixF updatedTransform = childTransform; - updatedTransform.mul(deltaTransform); + MatrixF childLocalTrans; + childLocalTrans = mWorldToObj.mul(childWorldTrans); - // Update the child's transform - child->setTransform(updatedTransform); + MatrixF updatedTrans; + updatedTrans.mul(mat, childLocalTrans); + + // Set the child's new world transform + child->setTransform(updatedTrans); PhysicsShape* childPS = dynamic_cast(child); if (childPS) @@ -193,40 +186,37 @@ void SceneGroup::setTransform(const MatrixF& mat) } } } + + Parent::setTransform(mat); } void SceneGroup::setRenderTransform(const MatrixF& mat) { - //transform difference - MatrixF oldTransform = getRenderTransform(); - - Parent::setRenderTransform(mat); - - // Calculate the delta transformation - MatrixF deltaTransform = mat; - deltaTransform.mul(oldTransform.inverse()); - // Update all child transforms for (SimSetIterator itr(this); *itr; ++itr) { SceneObject* child = dynamic_cast(*itr); if (child) { - // Get the child's current transform - MatrixF childTransform = child->getTransform(); + // Get the child's current world transform + MatrixF childWorldTrans = child->getRenderTransform(); - // Apply the delta transformation (ignoring scale) - MatrixF updatedTransform = childTransform; - updatedTransform.mul(deltaTransform); + MatrixF childLocalTrans; + childLocalTrans = mWorldToObj.mul(childWorldTrans); - // Update the child's transform - child->setTransform(updatedTransform); + MatrixF updatedTrans; + updatedTrans.mul(mat, childLocalTrans); + + // Set the child's new world transform + child->setRenderTransform(updatedTrans); PhysicsShape* childPS = dynamic_cast(child); if (childPS) childPS->storeRestorePos(); } } + + Parent::setRenderTransform(mat); } void SceneGroup::addObject(SimObject* object)