Polyphase Game Engine
Loading...
Searching...
No Matches
SkeletalMesh.h
Go to the documentation of this file.
1#pragma once
2
3#include <string>
4
5#include "Assets/Material.h"
6#include "Asset.h"
7#include "Vertex.h"
8#include "Constants.h"
9
10#include "Graphics/Graphics.h"
13
14#include "Maths.h"
15
16#if EDITOR
17#include <assimp/scene.h>
18#endif
19
20struct Bone
21{
22 std::string mName;
23 int32_t mIndex = -1;
24 int32_t mParentIndex = -1;
25 glm::mat4 mOffsetMatrix = { };
26 glm::mat4 mInvOffsetMatrix = { };
27};
28
30{
31 float mTime = 0.0f;
32 glm::vec3 mValue = {};
33};
34
36{
37 float mTime = 0.0f;
38 glm::quat mValue = {};
39};
40
42{
43 float mTime = 0.0f;
44 glm::vec3 mValue = {};
45};
46
48{
49 float mTime = 0.0f;
50 glm::vec3 mValue = {};
51};
52
54{
55 std::string mName;
56 std::vector<AnimEventKey> mEventKeys;
57};
58
60{
62 std::string mName;
63 std::string mAnimation;
64 float mTime = 0.0f;
65 glm::vec3 mValue = {};
66};
67
68struct Channel
69{
70 int32_t mBoneIndex = -1;
71 std::vector<PositionKey> mPositionKeys;
72 std::vector<RotationKey> mRotationKeys;
73 std::vector<ScaleKey> mScaleKeys;
74};
75
77{
78 std::string mName;
79 float mDuration = 0.0f;
80 float mTicksPerSecond = 0.0f;
81 std::vector<Channel> mChannels;
82 std::vector<AnimEventTrack> mEventTracks;
83};
84
86{
87public:
88
90
93
94 SkeletalMeshResource* GetResource();
95
96 // Asset Interface
97 virtual void LoadStream(Stream& stream, Platform platform) override;
98 virtual void SaveStream(Stream& stream, Platform platform) override;
99 virtual void Create() override;
100 virtual void Destroy() override;
101 virtual bool Import(const std::string& path, ImportOptions* options) override;
102 virtual void GatherProperties(std::vector<Property>& outProps) override;
103 virtual glm::vec4 GetTypeColor() override;
104 virtual const char* GetTypeName() override;
105 virtual const char* GetTypeImportExt() override;
106
107 class Material* GetMaterial();
108 void SetMaterial(class Material* newMaterial);
109
110 uint32_t GetNumIndices();
111 uint32_t GetNumFaces();
112 uint32_t GetNumVertices();
113
114 const IndexType* GetIndices() const;
115
116 int32_t FindBoneIndex(const std::string& name) const;
117 const std::vector<Bone>& GetBones() const;
118 const Bone& GetBone(int32_t index) const;
119 uint32_t GetNumBones() const;
120
121 glm::mat4 GetInvRootTransform() const;
122
123 const std::vector<Animation>& GetAnimations() const;
124 const Animation* GetAnimation(const char* name);
125
126 // Get length of animation in seconds
127 float GetAnimationDuration(const char* name);
128
129 const std::vector<VertexSkinned>& GetVertices() const;
130
131 void FinalizeBoneTransforms(std::vector<glm::mat4>& inoutTransforms);
132
133 void CopyBindPose(std::vector<glm::mat4>& outTransforms);
134
135 Bounds GetBounds() const;
136
137 const glm::mat4 GetBindPoseMatrix(int32_t boneIndex) const;
138
139 SkeletalMesh* GetAnimationLookupMesh();
140 void SetAnimationLookupMesh(SkeletalMesh* lookupMesh);
141
142 static bool HandlePropChange(Datum* datum, uint32_t index, const void* newValue);
143
144private:
145
146 void InitBindPose();
147 void ComputeBounds();
148
149 MaterialRef mMaterial;
150 SkeletalMeshRef mAnimationLookupMesh;
151 uint32_t mNumVertices;
152 uint32_t mNumIndices;
153 uint32_t mNumUvMaps;
154
155 std::vector<Bone> mBones;
156 std::vector<Animation> mAnimations;
157 std::vector<VertexSkinned> mVertices;
158
159 glm::mat4 mInvRootTransform;
160 std::vector<glm::mat4> mBindPoseMatrices;
161 std::vector<IndexType> mIndices;
162
163 Bounds mBounds;
164 float mBoundsScale = 1.1f;
165
166 // Graphics Resource
167 SkeletalMeshResource mResource;
168
169#if EDITOR
170public:
171 void Create(const aiScene& scene,
172 const aiMesh& meshData,
173 std::vector<Material>* materials = nullptr);
174
175 void SetupBoneHierarchy(
176 const aiNode& node,
177 const aiMesh& meshData,
178 std::vector<uint8_t>& boneIndices,
179 std::vector<float>& boneWeights,
180 int32_t parentBoneIndex);
181
182 void SetupAnimations(const aiScene& scene);
183 void SetupResource(const aiMesh& meshData,
184 const std::vector<float>& boneWeights,
185 const std::vector<uint8_t>& boneIndices);
186#endif // EDITOR
187};
Platform
Definition EngineTypes.h:31
uint16_t IndexType
Definition GraphicsTypes.h:121
#define POLYPHASE_API
Definition PolyphaseAPI.h:31
Bounds ComputeBounds(const std::vector< T > &vertices)
Definition Utilities.h:153
Definition AssetRef.h:18
Definition Asset.h:113
virtual bool Import(const std::string &path, ImportOptions *options=nullptr)
Definition Asset.cpp:244
virtual void Create()
Definition Asset.cpp:77
virtual void SaveStream(Stream &stream, Platform platform)
Definition Asset.cpp:236
virtual glm::vec4 GetTypeColor()
Definition Asset.cpp:254
virtual const char * GetTypeImportExt()
Definition Asset.cpp:264
virtual const char * GetTypeName()
Definition Asset.cpp:259
virtual void GatherProperties(std::vector< Property > &outProps) override
Definition Asset.cpp:249
virtual void LoadStream(Stream &stream, Platform platform)
Definition Asset.cpp:222
virtual void Destroy()
Definition Asset.cpp:87
Definition Datum.h:164
Definition Asset.h:102
Definition Material.h:48
Definition SkeletalMesh3d.h:52
Definition SkeletalMesh.h:86
DECLARE_ASSET(SkeletalMesh, Asset)
Definition Stream.h:21
Definition SkeletalMesh.h:48
float mTime
Definition SkeletalMesh.h:49
glm::vec3 mValue
Definition SkeletalMesh.h:50
Definition SkeletalMesh.h:54
std::string mName
Definition SkeletalMesh.h:55
std::vector< AnimEventKey > mEventKeys
Definition SkeletalMesh.h:56
Definition SkeletalMesh.h:60
SkeletalMesh3D * mNode
Definition SkeletalMesh.h:61
float mTime
Definition SkeletalMesh.h:64
std::string mAnimation
Definition SkeletalMesh.h:63
glm::vec3 mValue
Definition SkeletalMesh.h:65
std::string mName
Definition SkeletalMesh.h:62
Definition SkeletalMesh.h:77
std::string mName
Definition SkeletalMesh.h:78
std::vector< Channel > mChannels
Definition SkeletalMesh.h:81
float mTicksPerSecond
Definition SkeletalMesh.h:80
std::vector< AnimEventTrack > mEventTracks
Definition SkeletalMesh.h:82
float mDuration
Definition SkeletalMesh.h:79
Definition SkeletalMesh.h:21
glm::mat4 mInvOffsetMatrix
Definition SkeletalMesh.h:26
glm::mat4 mOffsetMatrix
Definition SkeletalMesh.h:25
std::string mName
Definition SkeletalMesh.h:22
int32_t mIndex
Definition SkeletalMesh.h:23
int32_t mParentIndex
Definition SkeletalMesh.h:24
Definition EngineTypes.h:193
Definition SkeletalMesh.h:69
std::vector< ScaleKey > mScaleKeys
Definition SkeletalMesh.h:73
int32_t mBoneIndex
Definition SkeletalMesh.h:70
std::vector< PositionKey > mPositionKeys
Definition SkeletalMesh.h:71
std::vector< RotationKey > mRotationKeys
Definition SkeletalMesh.h:72
Definition SkeletalMesh.h:30
glm::vec3 mValue
Definition SkeletalMesh.h:32
float mTime
Definition SkeletalMesh.h:31
Definition SkeletalMesh.h:36
glm::quat mValue
Definition SkeletalMesh.h:38
float mTime
Definition SkeletalMesh.h:37
Definition SkeletalMesh.h:42
float mTime
Definition SkeletalMesh.h:43
glm::vec3 mValue
Definition SkeletalMesh.h:44
Definition GraphicsTypes.h:178