#pragma once #include #include #include #include #include constexpr int MAX_BONES_PER_VERTEX = 4; struct VertexBoneData { std::array ids; std::array weights; // Ad bone weighting to vertex info void add(uint32_t boneID, float weight) { for(uint32_t i = 0; i < MAX_BONES_PER_VERTEX; i++) { if(weights[i] == 0.0f) { ids[i] = boneID; weights[i] = weight; return; } } } }; struct BoneInfo { glm::mat4 offset, final; }; struct aiNode; struct aiScene; class Skeleton : public Asset { public: Skeleton(int i) { index = i; } void Load(Renderer* renderer) override; void Unload(Renderer* renderer) override; std::type_index GetType() override { return typeid(Skeleton); } void UpdateSkeletalNodes(aiNode* pNode, const glm::mat4& parentTransformation); std::vector vertex_bones; std::map mapping; std::vector bone_info; glm::mat4 globalInverse; aiScene* animScene; float animTime = 0.0f; int index; };