From 3c32f21c4a8ac082bf7397f5be57b86b9990bdb7 Mon Sep 17 00:00:00 2001 From: SirLynix Date: Sat, 25 Mar 2023 15:19:58 +0100 Subject: [PATCH] Utility/Node: Add missing SetTransform overload --- include/Nazara/Utility/Node.hpp | 1 + src/Nazara/Utility/Node.cpp | 38 +++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/include/Nazara/Utility/Node.hpp b/include/Nazara/Utility/Node.hpp index a0530c549..7d6969fbe 100644 --- a/include/Nazara/Utility/Node.hpp +++ b/include/Nazara/Utility/Node.hpp @@ -85,6 +85,7 @@ namespace Nz void SetScale(const Vector3f& scale, CoordSys coordSys = CoordSys::Local, Invalidation invalidation = Invalidation::InvalidateRecursively); inline void SetScale(float scale, CoordSys coordSys = CoordSys::Local, Invalidation invalidation = Invalidation::InvalidateRecursively); inline void SetScale(float scaleX, float scaleY, float scaleZ = 1.f, CoordSys coordSys = CoordSys::Local, Invalidation invalidation = Invalidation::InvalidateRecursively); + void SetTransform(const Vector3f& position, const Quaternionf& rotation, CoordSys coordSys = CoordSys::Local, Invalidation invalidation = Invalidation::InvalidateRecursively); void SetTransform(const Vector3f& position, const Quaternionf& rotation, const Vector3f& scale, CoordSys coordSys = CoordSys::Local, Invalidation invalidation = Invalidation::InvalidateRecursively); inline void SetTransformMatrix(const Matrix4f& matrix, Invalidation invalidation = Invalidation::InvalidateRecursively); diff --git a/src/Nazara/Utility/Node.cpp b/src/Nazara/Utility/Node.cpp index 8d5ff2cd6..d61d40253 100644 --- a/src/Nazara/Utility/Node.cpp +++ b/src/Nazara/Utility/Node.cpp @@ -223,6 +223,44 @@ namespace Nz Invalidate(invalidation); } + + void Node::SetTransform(const Vector3f& position, const Quaternionf& rotation, CoordSys coordSys, Invalidation invalidation) + { + switch (coordSys) + { + case CoordSys::Global: + { + // Position + if (m_parent && m_inheritPosition) + { + m_parent->EnsureDerivedUpdate(); + + m_position = (m_parent->m_derivedRotation.GetConjugate() * (position - m_parent->m_derivedPosition)) / m_parent->m_derivedScale - m_initialPosition; + } + else + m_position = position - m_initialPosition; + + // Rotation + if (m_parent && m_inheritRotation) + { + Quaternionf rot(m_parent->GetRotation() * m_initialRotation); + + m_rotation = rot.GetConjugate() * rotation; + } + else + m_rotation = rotation; + + break; + } + + case CoordSys::Local: + m_position = position; + m_rotation = rotation; + break; + } + + Invalidate(invalidation); + } void Node::SetTransform(const Vector3f& position, const Quaternionf& rotation, const Vector3f& scale, CoordSys coordSys, Invalidation invalidation) {