#ifndef SKELETON_BONE_HPP
#define SKELETON_BONE_HPP
#include "DynamicMesh.hpp"
#include "Transform.hpp"
#include <string>
#include <unordered_map>
#include <vector>
namespace wren {
class Skeleton;
class SkeletonBone : public Transform {
public:
static SkeletonBone *createSkeletonBone(Skeleton *skeleton, const char *name) { return new SkeletonBone(skeleton, name); }
const char *name() const { return mName.c_str(); }
void setVertexWeight(DynamicMesh *mesh, unsigned int index, float weight) { mWeights[mesh][index] = weight; }
float vertexWeight(DynamicMesh *mesh, unsigned int index) { return mWeights[mesh][index]; }
void setMatrixDirty() const override;
void applyBindingPose() {
mBoundMatrix = glm::inverse(matrix());
mFinalTransformDirty = true;
}
const glm::mat4 finalTransform() {
if (mFinalTransformDirty)
mFinalTransform = matrix() * mBoundMatrix;
return mFinalTransform;
}
private:
SkeletonBone(Skeleton *skeleton, const char *name);
virtual ~SkeletonBone() {}
std::string mName;
std::unordered_map<DynamicMesh *, std::unordered_map<unsigned int, float>> mWeights;
Skeleton *mSkeleton;
glm::mat4 mBoundMatrix;
glm::mat4 mFinalTransform;
mutable bool mFinalTransformDirty;
};
}
#endif