Cached skinning matrix

Former-commit-id: c5aeb09778f5696906eb764f600c4a152ab7ba48
This commit is contained in:
Lynix 2014-06-21 16:22:34 +02:00
parent 5310c8b0d6
commit 774df28d87
2 changed files with 46 additions and 4 deletions

View File

@ -21,18 +21,26 @@ class NAZARA_API NzJoint : public NzNode
NzJoint(const NzJoint& joint);
~NzJoint() = default;
NzMatrix4f GetInverseBindMatrix() const;
void EnsureSkinningMatrixUpdate() const;
const NzMatrix4f& GetInverseBindMatrix() const;
NzString GetName() const;
NzSkeleton* GetSkeleton();
const NzSkeleton* GetSkeleton() const;
const NzMatrix4f& GetSkinningMatrix() const;
void SetInverseBindMatrix(const NzMatrix4f& matrix);
void SetName(const NzString& name);
private:
void InvalidateNode();
void UpdateSkinningMatrix() const;
NzMatrix4f m_inverseBindMatrix;
mutable NzMatrix4f m_skinningMatrix;
NzString m_name;
NzSkeleton* m_skeleton;
mutable bool m_skinningMatrixUpdated;
};
#endif // NAZARA_JOINT_HPP

View File

@ -7,7 +7,8 @@
#include <Nazara/Utility/Debug.hpp>
NzJoint::NzJoint(NzSkeleton* skeleton) :
m_skeleton(skeleton)
m_skeleton(skeleton),
m_skinningMatrixUpdated(false)
{
}
@ -15,11 +16,18 @@ NzJoint::NzJoint(const NzJoint& joint) :
NzNode(joint),
m_inverseBindMatrix(joint.m_inverseBindMatrix),
m_name(joint.m_name),
m_skeleton(joint.m_skeleton)
m_skeleton(joint.m_skeleton),
m_skinningMatrixUpdated(false)
{
}
NzMatrix4f NzJoint::GetInverseBindMatrix() const
void NzJoint::EnsureSkinningMatrixUpdate() const
{
if (!m_skinningMatrixUpdated)
UpdateSkinningMatrix();
}
const NzMatrix4f& NzJoint::GetInverseBindMatrix() const
{
return m_inverseBindMatrix;
}
@ -39,9 +47,18 @@ const NzSkeleton* NzJoint::GetSkeleton() const
return m_skeleton;
}
const NzMatrix4f& NzJoint::GetSkinningMatrix() const
{
if (!m_skinningMatrixUpdated)
UpdateSkinningMatrix();
return m_skinningMatrix;
}
void NzJoint::SetInverseBindMatrix(const NzMatrix4f& matrix)
{
m_inverseBindMatrix = matrix;
m_skinningMatrixUpdated = false;
}
void NzJoint::SetName(const NzString& name)
@ -50,3 +67,20 @@ void NzJoint::SetName(const NzString& name)
m_skeleton->InvalidateJointMap();
}
void NzJoint::InvalidateNode()
{
NzNode::InvalidateNode();
m_skinningMatrixUpdated = false;
}
void NzJoint::UpdateSkinningMatrix() const
{
if (!m_transformMatrixUpdated)
UpdateTransformMatrix();
m_skinningMatrix.Set(m_inverseBindMatrix);
m_skinningMatrix.ConcatenateAffine(m_transformMatrix);
m_skinningMatrixUpdated = true;
}