From 422cddf5b0f6f77a83e1d454eab4103292215307 Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Wed, 6 Sep 2023 08:48:32 -0400 Subject: [PATCH] Added skeleton hierarchy --- Nuake/src/Rendering/Mesh/SkinnedMesh.cpp | 6 ++++ Nuake/src/Rendering/Mesh/SkinnedMesh.h | 6 ++++ Nuake/src/Resource/ModelLoader.cpp | 18 +++++++++- Nuake/src/Resource/ModelLoader.h | 1 + Nuake/src/Resource/SkeletalAnimation.h | 12 +++++++ Nuake/src/Resource/SkinnedModel.h | 1 + Nuake/src/Scene/Scene.cpp | 42 ++++++++++-------------- Nuake/src/Scene/Scene.h | 4 +++ 8 files changed, 64 insertions(+), 26 deletions(-) diff --git a/Nuake/src/Rendering/Mesh/SkinnedMesh.cpp b/Nuake/src/Rendering/Mesh/SkinnedMesh.cpp index 49db585a..daf6a61a 100644 --- a/Nuake/src/Rendering/Mesh/SkinnedMesh.cpp +++ b/Nuake/src/Rendering/Mesh/SkinnedMesh.cpp @@ -11,6 +11,7 @@ #include "src/Rendering/Buffers/VertexArray.h" #include "src/Rendering/Buffers/VertexBufferLayout.h" + #include namespace Nuake @@ -199,4 +200,9 @@ namespace Nuake SetupMesh(); return true; } + + void SkinnedMesh::SetSkeletalAnimation(Ref skeletalAnimation) + { + m_SkeletalAnimation = skeletalAnimation; + } } diff --git a/Nuake/src/Rendering/Mesh/SkinnedMesh.h b/Nuake/src/Rendering/Mesh/SkinnedMesh.h index 7c0a2017..9ce765bf 100644 --- a/Nuake/src/Rendering/Mesh/SkinnedMesh.h +++ b/Nuake/src/Rendering/Mesh/SkinnedMesh.h @@ -3,6 +3,7 @@ #include "src/Rendering/AABB.h" #include "src/Resource/Resource.h" #include "src/Resource/Serializable.h" +#include "src/Resource/SkeletalAnimation.h" #include "src/Rendering/Vertex.h" #include "src/Rendering/Mesh/Bone.h" @@ -39,7 +40,12 @@ namespace Nuake json Serialize() override; bool Deserialize(const json& j) override; + void SetSkeletalAnimation(Ref animation); + Ref GetSkeletalAnimation() const { return m_SkeletalAnimation; } + private: + Ref m_SkeletalAnimation; + Ref m_Material = nullptr; std::vector m_Indices; std::vector m_Vertices; diff --git a/Nuake/src/Resource/ModelLoader.cpp b/Nuake/src/Resource/ModelLoader.cpp index 199b2b73..157ac835 100644 --- a/Nuake/src/Resource/ModelLoader.cpp +++ b/Nuake/src/Resource/ModelLoader.cpp @@ -77,7 +77,6 @@ namespace Nuake } ProcessSkinnedNode(scene->mRootNode, scene); - if (scene->HasAnimations()) { SkeletalAnimation animation; @@ -353,6 +352,23 @@ namespace Nuake } } + void ModelLoader::ProcessSkeleton(SkeletonNode& des, const aiNode* src) + { + // Create a Bone object for this node + SkeletonNode bone; + bone.Name = src->mName.C_Str(); + bone.Transform = ConvertMatrixToGLMFormat(src->mTransformation); + + des.ChildrenCount++; + des.Children.push_back(bone); + + // Recursively process child nodes (bones) + for (uint32_t i = 0; i < src->mNumChildren; i++) + { + ProcessSkeleton(bone, src->mChildren[i]); + } + } + std::vector ModelLoader::ProcessIndices(aiMesh* mesh) { auto indices = std::vector(); diff --git a/Nuake/src/Resource/ModelLoader.h b/Nuake/src/Resource/ModelLoader.h index a0a8e092..6c2cba9e 100644 --- a/Nuake/src/Resource/ModelLoader.h +++ b/Nuake/src/Resource/ModelLoader.h @@ -48,6 +48,7 @@ namespace Nuake std::vector ProcessSkinnedVertices(aiMesh* mesh); void SetVertexBoneData(SkinnedVertex& vertex, int boneId, float weight); void ProcessAnimationNode(SkeletonNode& dest, const aiNode* src); + void ProcessSkeleton(SkeletonNode& des, const aiNode* src); static inline Matrix4 ConvertMatrixToGLMFormat(const aiMatrix4x4& from) { diff --git a/Nuake/src/Resource/SkeletalAnimation.h b/Nuake/src/Resource/SkeletalAnimation.h index 668495be..ad78d0e2 100644 --- a/Nuake/src/Resource/SkeletalAnimation.h +++ b/Nuake/src/Resource/SkeletalAnimation.h @@ -11,12 +11,24 @@ namespace Nuake Vector3 Scalings; }; + struct BoneTransformTrack + { + std::vector positionTimestamps = {}; + std::vector rotationTimestamps = {}; + std::vector scaleTimestamps = {}; + + std::vector positions = {}; + std::vector rotations = {}; + std::vector scales = {}; + }; + class SkeletalAnimation { private: float m_Duration; int m_TicksPerSecond; + std::unordered_map m_Tracks; std::vector m_Bones; public: diff --git a/Nuake/src/Resource/SkinnedModel.h b/Nuake/src/Resource/SkinnedModel.h index fa4cc819..93930cec 100644 --- a/Nuake/src/Resource/SkinnedModel.h +++ b/Nuake/src/Resource/SkinnedModel.h @@ -20,6 +20,7 @@ namespace Nuake SkinnedModel(const std::string path); ~SkinnedModel(); + SkeletonNode& GetSkeletonRootNode() { return m_SkeletonRoot; } void SetSkeletonRootNode(SkeletonNode& root) { m_SkeletonRoot = std::move(root); diff --git a/Nuake/src/Scene/Scene.cpp b/Nuake/src/Scene/Scene.cpp index e65b6ff3..2d888c34 100644 --- a/Nuake/src/Scene/Scene.cpp +++ b/Nuake/src/Scene/Scene.cpp @@ -466,33 +466,25 @@ namespace Nuake return; } - SkinnedModelComponent& component = entity.GetComponent(); - for (Ref& model : component.ModelResource->GetMeshes()) + auto& component = entity.GetComponent(); + auto& skeletonRoot = component.ModelResource->GetSkeletonRootNode(); + + Entity skeletonRootEntity = CreateEntity(skeletonRoot.Name); + skeletonRootEntity.AddComponent(); + entity.AddChild(skeletonRootEntity); + + CreateSkeletonTraverse(skeletonRootEntity, skeletonRoot); + } + + void Scene::CreateSkeletonTraverse(Entity& entity, SkeletonNode& skeletonNode) + { + for (auto& c : skeletonNode.Children) { - for (auto& bone : model->GetBones()) - { - auto& parentComponent = entity.GetComponent(); + Entity boneEntity = CreateEntity(c.Name); + boneEntity.AddComponent(); + entity.AddChild(boneEntity); - Logger::Log("bone found:" + bone.Name, "debug", VERBOSE); - if (EntityExists(bone.Name) == false) - { - Entity boneEntity = CreateEntity(bone.Name); - boneEntity.AddComponent(); - - Vector3 position; - Quat rotation; - Vector3 scale; - Decompose(bone.Offset, position, rotation, scale); - - auto& transformComponent = entity.GetComponent(); - transformComponent.SetLocalPosition(position); - transformComponent.SetLocalRotation(rotation); - transformComponent.SetLocalScale(scale); - transformComponent.SetLocalTransform(bone.Offset); - - entity.AddChild(boneEntity); - } - } + CreateSkeletonTraverse(boneEntity, c); } } diff --git a/Nuake/src/Scene/Scene.h b/Nuake/src/Scene/Scene.h index 09a09128..1053ccc4 100644 --- a/Nuake/src/Scene/Scene.h +++ b/Nuake/src/Scene/Scene.h @@ -17,6 +17,7 @@ namespace Nuake { + class SkeletonNode; class Entity; class SceneRenderer; @@ -93,5 +94,8 @@ namespace Nuake // Component specific utilies void CreateSkeleton(Entity& entity); + + private: + void CreateSkeletonTraverse(Entity& entity, SkeletonNode& skeletonNode); }; }