#ifndef Skeleton_h__ #define Skeleton_h__ #include #include "Common.h" #include "../GLM.h" //struct Bone //{ // Bone(std::string name, glm::mat4 offsetMatrix) // : Name(name) // , OffsetMatrix(offsetMatrix) // { } // // ~Bone() // { // for (auto kv : Children) { // delete kv.second; // } // } // // std::string Name; // glm::mat4 OffsetMatrix; // glm::mat4 LocalMatrix; // // std::map Children; //}; class Skeleton { public: struct Bone { Bone(int id, Bone* parent, std::string name, glm::mat4 offsetMatrix) : ID(id) , Parent(parent) , Name(name) , OffsetMatrix(offsetMatrix) { } int ID; std::string Name; glm::mat4 OffsetMatrix; Bone* Parent; std::vector Children; }; struct Animation { struct Keyframe { struct BoneProperty { int ID; glm::vec3 Position; glm::quat Rotation; glm::vec3 Scale = glm::vec3(1); }; int Index = 0; double Time = 0.0; std::map BoneProperties; }; std::string Name; double Duration; std::vector Keyframes; }; Skeleton() { } ~Skeleton(); Bone* RootBone; std::map Bones; // Attach a new bone to the skeleton // Returns: New bone index int CreateBone(int ID, int parentID, std::string name, glm::mat4 offsetMatrix); int GetBoneID(std::string name); const Animation* GetAnimation(std::string name); std::vector GetFrameBones(const Animation& animation, double time, bool noRootMotion = false); void AccumulateBoneTransforms(bool noRootMotion, const Animation::Keyframe& currentFrame, const Animation::Keyframe& nextFrame, float progress, std::map& boneMatrices, const Bone* bone, glm::mat4 parentMatrix); void PrintSkeleton(); void PrintSkeleton(const Bone* parent, int depthCount); std::map Animations; private: std::map m_BonesByName; int GetKeyframe(const Animation& animation, double time); }; #endif