diff --git a/include/Nazara/Utility/Node.hpp b/include/Nazara/Utility/Node.hpp index b47c89dee..ed54c4b25 100644 --- a/include/Nazara/Utility/Node.hpp +++ b/include/Nazara/Utility/Node.hpp @@ -27,6 +27,9 @@ class NAZARA_API NzNode bool GetInheritRotation() const; bool GetInheritScale() const; bool GetInheritTranslation() const; + NzQuaternionf GetInitialRotation() const; + NzVector3f GetInitialScale() const; + NzVector3f GetInitialTranslation() const; const NzNode* GetParent() const; NzQuaternionf GetRotation() const; NzVector3f GetScale() const; @@ -47,6 +50,12 @@ class NAZARA_API NzNode void SetInheritRotation(bool inheritRotation); void SetInheritScale(bool inheritScale); void SetInheritTranslation(bool inheritTranslation); + void SetInitialRotation(const NzQuaternionf& quat); + void SetInitialScale(const NzVector3f& scale); + void SetInitialScale(float scale); + void SetInitialScale(float scaleX, float scaleY, float scaleZ); + void SetInitialTranslation(const NzVector3f& translation); + void SetInitialTranslation(float translationX, float translationXY, float translationZ); void SetParent(const NzNode* node = nullptr); void SetParent(const NzNode& node); void SetRotation(const NzQuaternionf& quat, nzCoordSys coordSys = nzCoordSys_Local); @@ -68,10 +77,13 @@ class NAZARA_API NzNode mutable std::set m_childs; mutable NzMatrix4f m_transformMatrix; mutable NzQuaternionf m_derivedRotation; + NzQuaternionf m_initialRotation; NzQuaternionf m_rotation; NzString m_name; mutable NzVector3f m_derivedTranslation; mutable NzVector3f m_derivedScale; + NzVector3f m_initialScale; + NzVector3f m_initialTranslation; NzVector3f m_scale; NzVector3f m_translation; const NzNode* m_parent; diff --git a/src/Nazara/Utility/Node.cpp b/src/Nazara/Utility/Node.cpp index 03c00ccfc..cb4355dd8 100644 --- a/src/Nazara/Utility/Node.cpp +++ b/src/Nazara/Utility/Node.cpp @@ -6,7 +6,10 @@ #include NzNode::NzNode() : +m_initialRotation(NzQuaternionf::Identity()), m_rotation(NzQuaternionf::Identity()), +m_initialScale(NzVector3f(1.f, 1.f, 1.f)), +m_initialTranslation(NzVector3f::Zero()), m_scale(NzVector3f(1.f, 1.f, 1.f)), m_translation(NzVector3f::Zero()), m_parent(nullptr), @@ -19,7 +22,10 @@ m_matrixUpdated(false) } NzNode::NzNode(const NzNode& node) : +m_initialRotation(node.m_initialRotation), m_rotation(node.m_rotation), +m_initialScale(node.m_initialScale), +m_initialTranslation(node.m_initialTranslation), m_scale(node.m_scale), m_translation(node.m_translation), m_parent(node.m_parent), @@ -81,6 +87,21 @@ bool NzNode::GetInheritTranslation() const return m_inheritTranslation; } +NzQuaternionf NzNode::GetInitialRotation() const +{ + return m_initialRotation; +} + +NzVector3f NzNode::GetInitialScale() const +{ + return m_initialScale; +} + +NzVector3f NzNode::GetInitialTranslation() const +{ + return m_initialTranslation; +} + const NzNode* NzNode::GetParent() const { return m_parent; @@ -233,6 +254,49 @@ void NzNode::SetInheritTranslation(bool inheritTranslation) } } +void NzNode::SetInitialRotation(const NzQuaternionf& rotation) +{ + m_initialRotation = rotation + m_initialRotation.Normalize(); // Évitons toute mauvaise surprise ... + + Invalidate(); +} + +void NzNode::SetInitialScale(const NzVector3f& scale) +{ + m_initialScale = scale; + + Invalidate(); +} + +void NzNode::SetInitialScale(float scale) +{ + m_initialScale.Set(scale); + + Invalidate(); +} + +void NzNode::SetInitialScale(float scaleX, float scaleY, float scaleZ) +{ + m_initialScale.Set(scaleX, scaleY, scaleZ); + + Invalidate(); +} + +void NzNode::SetInitialTranslation(const NzVector3f& translation) +{ + m_initialTranslation = translation; + + Invalidate(); +} + +void NzNode::SetInitialTranslation(float translationX, float translationY, float translationZ) +{ + m_initialTranslation.Set(translationX, translationY, translationZ); + + Invalidate(); +} + void NzNode::SetParent(const NzNode* node) { if (m_parent == node) @@ -393,20 +457,20 @@ void NzNode::UpdateDerived() const if (m_inheritRotation) { - m_derivedRotation = m_parent->m_derivedRotation * m_rotation; + m_derivedRotation = m_parent->m_derivedRotation * m_initialRotation * m_rotation; m_derivedRotation.Normalize(); } else - m_derivedRotation = m_rotation; + m_derivedRotation = m_initialRotation * m_rotation; - m_derivedScale = m_scale; + m_derivedScale = m_initialScale * m_scale; if (m_inheritScale) m_derivedScale *= m_parent->m_derivedScale; if (m_inheritTranslation) - m_derivedTranslation = m_parent->m_derivedRotation*(m_parent->m_derivedScale * m_translation) + m_parent->m_derivedTranslation; + m_derivedTranslation = m_parent->m_derivedRotation*(m_parent->m_derivedScale * (m_initialTranslation + m_translation)) + m_parent->m_derivedTranslation; else - m_derivedTranslation = m_translation; + m_derivedTranslation = m_initialTranslation + m_translation; } else {