Added optional argument to Node::SetParent

Also fixed Set[Rotation|Scale|Translation] within global coordinate
system


Former-commit-id: 7808de7c3044f7b9261b22b7db521aad00d63c9b
This commit is contained in:
Lynix 2013-01-11 14:28:00 +01:00
parent e5731bee91
commit 842890e12e
2 changed files with 45 additions and 19 deletions

View File

@ -56,8 +56,8 @@ class NAZARA_API NzNode
void SetInitialScale(float scaleX, float scaleY, float scaleZ); void SetInitialScale(float scaleX, float scaleY, float scaleZ);
void SetInitialTranslation(const NzVector3f& translation); void SetInitialTranslation(const NzVector3f& translation);
void SetInitialTranslation(float translationX, float translationXY, float translationZ); void SetInitialTranslation(float translationX, float translationXY, float translationZ);
void SetParent(const NzNode* node = nullptr); void SetParent(const NzNode* node = nullptr, bool keepDerived = false);
void SetParent(const NzNode& node); void SetParent(const NzNode& node, bool keepDerived = false);
void SetRotation(const NzQuaternionf& quat, nzCoordSys coordSys = nzCoordSys_Local); void SetRotation(const NzQuaternionf& quat, nzCoordSys coordSys = nzCoordSys_Local);
void SetScale(const NzVector3f& scale, nzCoordSys coordSys = nzCoordSys_Local); void SetScale(const NzVector3f& scale, nzCoordSys coordSys = nzCoordSys_Local);
void SetScale(float scale, nzCoordSys coordSys = nzCoordSys_Local); void SetScale(float scale, nzCoordSys coordSys = nzCoordSys_Local);

View File

@ -297,24 +297,43 @@ void NzNode::SetInitialTranslation(float translationX, float translationY, float
Invalidate(); Invalidate();
} }
void NzNode::SetParent(const NzNode* node) void NzNode::SetParent(const NzNode* node, bool keepDerived)
{ {
if (m_parent == node) if (m_parent == node)
return; return;
if (m_parent) if (keepDerived)
m_parent->RemoveChild(this); {
if (!m_derivedUpdated)
UpdateDerived();
m_parent = node; if (m_parent)
if (m_parent) m_parent->RemoveChild(this);
m_parent->AddChild(this);
Invalidate(); m_parent = node;
if (m_parent)
m_parent->AddChild(this);
SetRotation(m_derivedRotation, nzCoordSys_Global);
SetScale(m_derivedScale, nzCoordSys_Global);
SetTranslation(m_derivedTranslation, nzCoordSys_Global);
}
else
{
if (m_parent)
m_parent->RemoveChild(this);
m_parent = node;
if (m_parent)
m_parent->AddChild(this);
Invalidate();
}
} }
void NzNode::SetParent(const NzNode& node) void NzNode::SetParent(const NzNode& node, bool keepDerived)
{ {
SetParent(&node); SetParent(&node, keepDerived);
} }
void NzNode::SetRotation(const NzQuaternionf& rotation, nzCoordSys coordSys) void NzNode::SetRotation(const NzQuaternionf& rotation, nzCoordSys coordSys)
@ -327,9 +346,11 @@ void NzNode::SetRotation(const NzQuaternionf& rotation, nzCoordSys coordSys)
{ {
case nzCoordSys_Global: case nzCoordSys_Global:
{ {
if (m_parent) if (m_parent && m_inheritRotation)
{ {
m_rotation = q * m_parent->GetDerivedRotation().GetInverse(); ///FIXME: Vérifier si le résultat est correct NzQuaternionf rot(m_initialRotation * m_parent->GetDerivedRotation());
m_rotation = rot.GetInverse() * q; ///FIXME: Vérifier si le résultat est correct
m_rotation.Normalize(); m_rotation.Normalize();
} }
else else
@ -352,10 +373,10 @@ void NzNode::SetScale(const NzVector3f& scale, nzCoordSys coordSys)
{ {
case nzCoordSys_Global: case nzCoordSys_Global:
{ {
if (m_parent) if (m_parent && m_inheritScale)
m_scale = scale / m_parent->GetDerivedScale(); m_scale = scale / (m_initialScale * m_parent->GetDerivedScale());
else else
m_scale = scale; m_scale = scale / m_initialScale;
break; break;
} }
@ -383,10 +404,15 @@ void NzNode::SetTranslation(const NzVector3f& translation, nzCoordSys coordSys)
{ {
case nzCoordSys_Global: case nzCoordSys_Global:
{ {
if (m_parent) if (m_parent && m_inheritTranslation)
m_translation = translation - m_parent->GetDerivedTranslation(); {
if (!m_parent->m_derivedUpdated)
m_parent->UpdateDerived();
m_translation = (m_parent->m_derivedRotation.GetConjugate()*(translation - m_parent->m_derivedTranslation))/m_parent->m_derivedScale - m_initialTranslation;
}
else else
m_translation = translation; m_translation = translation - m_initialTranslation;
break; break;
} }