Added initial states to node

Former-commit-id: 2127584e3432c16841817632522ea3bb82c7a786
This commit is contained in:
Lynix 2012-12-08 22:56:22 +01:00
parent 8376fb38cf
commit 7e533209dc
2 changed files with 81 additions and 5 deletions

View File

@ -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<NzNode*> 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;

View File

@ -6,7 +6,10 @@
#include <Nazara/Utility/Debug.hpp>
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
{