Josh's Graphics Library
Skeleton.h
Go to the documentation of this file.
1#pragma once
2#include <vector>
3#include <array>
4#include <J3ML/LinearAlgebra/Vector3.hpp>
5#include <J3ML/LinearAlgebra/Matrix4x4.hpp>
6#include <unordered_map>
7
8namespace JGL {
9 class Bone;
10 class SkeletalVertex;
11 class Skeleton;
12 class KeyFrame;
13 class Animation;
14}
15
16class JGL::SkeletalVertex : public Vector3 {
17private:
18 std::array<int, 4> bone_ids = { 0, 0, 0, 0 };
19 std::array<float, 4> bone_weights = { 0, 0, 0, 0 };
20public:
21 [[nodiscard]] std::array<int, 4> GetAffectingBoneIDs() const;
22 [[nodiscard]] std::array<float, 4> GetAffectingBoneWeights() const;
23public:
24 SkeletalVertex() = default;
26 SkeletalVertex(const Vector3& rhs, const std::vector<int>& bone_ids, const std::vector<float>& bone_weights);
27};
28
29class JGL::Bone {
30private:
31 int id = 0;
32 // Not every gltf2 model includes names, but I'll still include it.
33 std::string name;
34 Matrix4x4 inverse_bind_matrix = Matrix4x4::Identity;
35 Matrix4x4 offset_matrix = Matrix4x4::Identity;
36 Matrix4x4 final_transform = Matrix4x4::Identity;
37 int parent_id = -1;
38 std::vector<int> children{};
39public:
40 [[nodiscard]] int GetID() const;
41 [[nodiscard]] std::string GetName() const;
42 [[nodiscard]] Matrix4x4 GetInverseBindMatrix() const;
43 [[nodiscard]] Matrix4x4 GetOffsetMatrix() const;
44 [[nodiscard]] Matrix4x4 GetFinalTransform() const;
45 [[nodiscard]] bool IsRootBone() const;
46public:
47 [[nodiscard]] int GetParentID() const;
48 [[nodiscard]] std::vector<int> GetChildren() const;
49public:
50 void SetParent(int parent_id);
51 void AppendChild(int new_child);
52 void SetID(int numeric_id);
53 void SetName(const std::string& string_id);
54 void SetInverseBindMatrix(const Matrix4x4& inverse_bind);
55 void SetOffsetMatrix(const Matrix4x4& offset);
56 void SetFinalTransformMatrix(const Matrix4x4& final);
57public:
58 ~Bone() = default;
59 Bone() = default;
60 explicit Bone(int numeric_id, const std::string& string_id = "", int parent_id = -1, const std::vector<int>& children_ids = {},
61 const Matrix4x4& inverse_bind = Matrix4x4::Identity, const Matrix4x4& offset = Matrix4x4::Identity, const Matrix4x4& final = Matrix4x4::Identity);
62};
63
65private:
66 Bone root;
67 std::vector<Bone> bones;
68public:
69 [[nodiscard]] Bone* GetRootBone();
70 [[nodiscard]] Bone* FindBone(int id);
71 [[nodiscard]] Bone* FindBone(const std::string& string_id);
72public:
73 void AppendBone(const Bone& bone);
74public:
75 explicit Skeleton(const Bone& root_bone, const std::vector<Bone>& children = {});
76 ~Skeleton() = default;
77 Skeleton() = default;
78};
79
81private:
82 float time_stamp = 0;
83 Skeleton pose;
84public:
85 [[nodiscard]] float GetTimeStamp() const;
86 [[nodiscard]] Skeleton GetSkeleton() const;
87public:
88 KeyFrame(const Skeleton& pose, float time_stamp);
89};
90
92private:
93 float length;
94 std::vector<KeyFrame> key_frames;
95public:
96 [[nodiscard]] float GetDuratrion() const;
97 [[nodiscard]] std::vector<KeyFrame> GetKeyFrames() const;
98public:
99 void AppendKeyFrame(const KeyFrame& new_key);
100 void SetDuration(float duration);
101public:
102 explicit Animation(float duration, const std::vector<KeyFrame>& key_frames = {});
103 ~Animation() = default;
104};
105
106
Definition: Skeleton.h:91
~Animation()=default
std::vector< KeyFrame > GetKeyFrames() const
Definition: Skeleton.cpp:153
void AppendKeyFrame(const KeyFrame &new_key)
Definition: Skeleton.cpp:157
float GetDuratrion() const
Definition: Skeleton.cpp:149
void SetDuration(float duration)
Definition: Skeleton.cpp:161
Animation(float duration, const std::vector< KeyFrame > &key_frames={})
Definition: Skeleton.cpp:144
Definition: Skeleton.h:29
int GetParentID() const
Definition: Skeleton.cpp:83
void SetName(const std::string &string_id)
Definition: Skeleton.cpp:67
Bone()=default
void SetFinalTransformMatrix(const Matrix4x4 &final)
Definition: Skeleton.cpp:79
Matrix4x4 GetFinalTransform() const
Definition: Skeleton.cpp:47
bool IsRootBone() const
Definition: Skeleton.cpp:25
~Bone()=default
void AppendChild(int new_child)
Definition: Skeleton.cpp:59
std::string GetName() const
Definition: Skeleton.cpp:35
void SetOffsetMatrix(const Matrix4x4 &offset)
Definition: Skeleton.cpp:75
void SetID(int numeric_id)
Definition: Skeleton.cpp:63
int GetID() const
Definition: Skeleton.cpp:31
void SetInverseBindMatrix(const Matrix4x4 &inverse_bind)
Definition: Skeleton.cpp:71
Matrix4x4 GetOffsetMatrix() const
Definition: Skeleton.cpp:43
std::vector< int > GetChildren() const
Definition: Skeleton.cpp:51
void SetParent(int parent_id)
Definition: Skeleton.cpp:55
Matrix4x4 GetInverseBindMatrix() const
Definition: Skeleton.cpp:39
Definition: Skeleton.h:80
float GetTimeStamp() const
Definition: Skeleton.cpp:131
Skeleton GetSkeleton() const
Definition: Skeleton.cpp:135
KeyFrame(const Skeleton &pose, float time_stamp)
Definition: Skeleton.cpp:139
Definition: Skeleton.h:16
std::array< int, 4 > GetAffectingBoneIDs() const
Definition: Skeleton.cpp:7
SkeletalVertex()=default
std::array< float, 4 > GetAffectingBoneWeights() const
Definition: Skeleton.cpp:11
Definition: Skeleton.h:64
Bone * FindBone(int id)
Definition: Skeleton.cpp:101
Bone * GetRootBone()
Definition: Skeleton.cpp:97
Skeleton()=default
void AppendBone(const Bone &bone)
Definition: Skeleton.cpp:122
~Skeleton()=default
OpenGL Wrapper for rendering 2D & 3D graphics in both a 2D and 3D context.
Definition: JGL.h:31