diff --git a/include/Nazara/3D/Model.hpp b/include/Nazara/3D/Model.hpp index 2dddccf25..fa0feb8c5 100644 --- a/include/Nazara/3D/Model.hpp +++ b/include/Nazara/3D/Model.hpp @@ -36,6 +36,7 @@ class NAZARA_API NzModel : public NzSceneNode unsigned int GetSkinCount() const; const NzMesh* GetMesh() const; nzSceneNodeType GetSceneNodeType() const override; + NzSkeleton* GetSkeleton(); const NzSkeleton* GetSkeleton() const; bool HasAnimation() const; diff --git a/include/Nazara/Utility/Mesh.hpp b/include/Nazara/Utility/Mesh.hpp index 4de0d937a..3c759f90d 100644 --- a/include/Nazara/Utility/Mesh.hpp +++ b/include/Nazara/Utility/Mesh.hpp @@ -48,7 +48,7 @@ class NAZARA_API NzMesh : public NzResource, NzResourceListener bool AddSubMesh(NzSubMesh* subMesh); bool AddSubMesh(const NzString& identifier, NzSubMesh* subMesh); - void Animate(const NzAnimation* animation, unsigned int frameA, unsigned int frameB, float interpolation) const; + void Animate(const NzAnimation* animation, unsigned int frameA, unsigned int frameB, float interpolation, NzSkeleton* skeleton) const; bool CreateKeyframe(); bool CreateSkeletal(unsigned int jointCount); diff --git a/src/Nazara/3D/Model.cpp b/src/Nazara/3D/Model.cpp index dd26a9f57..daab502ab 100644 --- a/src/Nazara/3D/Model.cpp +++ b/src/Nazara/3D/Model.cpp @@ -112,6 +112,11 @@ nzSceneNodeType NzModel::GetSceneNodeType() const return nzSceneNodeType_Model; } +NzSkeleton* NzModel::GetSkeleton() +{ + return &m_skeleton; +} + const NzSkeleton* NzModel::GetSkeleton() const { return &m_skeleton; @@ -419,5 +424,5 @@ void NzModel::Update(float elapsedTime) } } - m_mesh->Animate(m_animation, m_currentFrame, m_nextFrame, m_interpolation); + m_mesh->Animate(m_animation, m_currentFrame, m_nextFrame, m_interpolation, &m_skeleton); } diff --git a/src/Nazara/Utility/Mesh.cpp b/src/Nazara/Utility/Mesh.cpp index 906a34b9a..227cf949c 100644 --- a/src/Nazara/Utility/Mesh.cpp +++ b/src/Nazara/Utility/Mesh.cpp @@ -128,7 +128,7 @@ bool NzMesh::AddSubMesh(const NzString& identifier, NzSubMesh* subMesh) return true; } -void NzMesh::Animate(const NzAnimation* animation, unsigned int frameA, unsigned int frameB, float interpolation) const +void NzMesh::Animate(const NzAnimation* animation, unsigned int frameA, unsigned int frameB, float interpolation, NzSkeleton* skeleton) const { #if NAZARA_UTILITY_SAFE if (!m_impl) @@ -182,11 +182,19 @@ void NzMesh::Animate(const NzAnimation* animation, unsigned int frameA, unsigned break; case nzAnimationType_Skeletal: - animation->AnimateSkeleton(&m_impl->skeleton, frameA, frameB, interpolation); + #if NAZARA_UTILITY_SAFE + if (!skeleton) + { + NazaraError("Skeleton must be valid for skeletal animation"); + return; + } + #endif + + animation->AnimateSkeleton(skeleton, frameA, frameB, interpolation); for (NzSubMesh* subMesh : m_impl->subMeshes) { NzSkeletalMesh* skeletalMesh = static_cast(subMesh); - skeletalMesh->Skin(&m_impl->skeleton); + skeletalMesh->Skin(skeleton); } break;