67 lines
1.3 KiB
C++
67 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include <vector>
|
|
#include <map>
|
|
#include <array>
|
|
#include <asset.hpp>
|
|
#include <glm/glm.hpp>
|
|
|
|
constexpr int MAX_BONES_PER_VERTEX = 4;
|
|
|
|
struct VertexBoneData
|
|
{
|
|
std::array<uint32_t, MAX_BONES_PER_VERTEX> ids;
|
|
std::array<float, MAX_BONES_PER_VERTEX> 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<VertexBoneData> vertex_bones;
|
|
std::map<std::string, uint32_t> mapping;
|
|
std::vector<BoneInfo> bone_info;
|
|
|
|
glm::mat4 globalInverse;
|
|
aiScene* animScene;
|
|
|
|
float animTime = 0.0f;
|
|
|
|
int index;
|
|
};
|