AireEngine
A 3D Open-World Game Engine
Loading...
Searching...
No Matches
animation.h
1#pragma once
2
3#include <vector>
4#include <map>
5#include <glm/glm.hpp>
6#include <assimp/scene.h>
7#include <assimp/Importer.hpp>
8#include <assimp/postprocess.h>
9#include <functional>
10
11#include "../res-management/Model.h"
12
13#include "bone.h"
14#include "animationData.h"
15
16using namespace Aire;
17
19{
20 glm::mat4 transformation;
21 std::string name;
22 int childrenCount;
23 std::vector<AssimpNodeData> children;
24};
25
26namespace Aire {
29 {
30 public:
31 Animation() = default;
32
36 Animation(const std::string& animationPath, Model* model)
37 {
38 Assimp::Importer importer;
39 const aiScene* scene = importer.ReadFile(animationPath, aiProcess_Triangulate);
40 assert(scene && scene->mRootNode);
41 auto animation = scene->mAnimations[0];
42 m_Duration = animation->mDuration;
43 m_TicksPerSecond = animation->mTicksPerSecond;
44 aiMatrix4x4 globalTransformation = scene->mRootNode->mTransformation;
45 globalTransformation = globalTransformation.Inverse();
46 ReadHierarchyData(m_RootNode, scene->mRootNode);
47 ReadMissingBones(animation, *model);
48 }
49
51 {
52 }
53
57 Bone* FindBone(const std::string& name)
58 {
59 auto iter = std::find_if(m_Bones.begin(), m_Bones.end(),
60 [&](const Bone& Bone)
61 {
62 return Bone.GetBoneName() == name;
63 }
64 );
65 if (iter == m_Bones.end()) return nullptr;
66 else return &(*iter);
67 }
68
70 inline float GetTicksPerSecond() { return m_TicksPerSecond; }
71
73 inline float GetDuration() { return m_Duration; }
74
76 inline const AssimpNodeData& GetRootNode() { return m_RootNode; }
77
79 inline const std::map<std::string, BoneInfo>& GetBoneIDMap()
80 {
81 return m_BoneInfoMap;
82 }
83
84 private:
85
89 void ReadMissingBones(const aiAnimation* animation, Model& model)
90 {
91 int size = animation->mNumChannels;
92
93 auto& boneInfoMap = model.GetBoneInfoMap();//getting m_BoneInfoMap from Model class
94 int& boneCount = model.GetBoneCount(); //getting the m_BoneCounter from Model class
95
96 //reading channels(bones engaged in an animation and their keyframes)
97 for (int i = 0; i < size; i++)
98 {
99 auto channel = animation->mChannels[i];
100 std::string boneName = channel->mNodeName.data;
101
102 if (boneInfoMap.find(boneName) == boneInfoMap.end())
103 {
104 boneInfoMap[boneName].id = boneCount;
105 boneCount++;
106 }
107 m_Bones.push_back(Bone(channel->mNodeName.data,
108 boneInfoMap[channel->mNodeName.data].id, channel));
109 }
110
111 m_BoneInfoMap = boneInfoMap;
112 }
113
117 void ReadHierarchyData(AssimpNodeData& dest, const aiNode* src)
118 {
119 assert(src);
120
121 dest.name = src->mName.data;
122 dest.transformation = mathHelper::ConvertMatrixToGLMFormat(src->mTransformation);
123 dest.childrenCount = src->mNumChildren;
124
125 for (int i = 0; i < src->mNumChildren; i++)
126 {
127 AssimpNodeData newData;
128 ReadHierarchyData(newData, src->mChildren[i]);
129 dest.children.push_back(newData);
130 }
131 }
132 float m_Duration;
133 int m_TicksPerSecond;
134 std::vector<Bone> m_Bones;
135 AssimpNodeData m_RootNode;
136 std::map<std::string, BoneInfo> m_BoneInfoMap;
137 };
138};
Class that reads and processes the animation data.
Definition animation.h:29
float GetDuration()
Definition animation.h:73
Bone * FindBone(const std::string &name)
Definition animation.h:57
float GetTicksPerSecond()
Definition animation.h:70
const AssimpNodeData & GetRootNode()
Definition animation.h:76
const std::map< std::string, BoneInfo > & GetBoneIDMap()
Definition animation.h:79
Animation(const std::string &animationPath, Model *model)
Definition animation.h:36
Definition Model.h:30
auto & GetBoneInfoMap()
Definition Model.h:78
int & GetBoneCount()
Definition Model.h:82
Bone in a skeletal hierarchy.
Definition Bone.h:35
static glm::mat4 ConvertMatrixToGLMFormat(const aiMatrix4x4 &from)
Definition mathHelper.h:16
Definition animation.h:19