GlistEngine
Loading...
Searching...
No Matches
gModel.h
Go to the documentation of this file.
1/*
2 * gModel.h
3 *
4 * Created on: May 10, 2020
5 * Author: noyan
6 */
7
8#ifndef ENGINE_GRAPHICS_GMODEL_H_
9#define ENGINE_GRAPHICS_GMODEL_H_
10
11#define GLM_FORCE_DEFAULT_ALIGNED_GENTYPES
12#include <glm/glm.hpp>
13#include <glm/gtc/matrix_inverse.hpp>
14#include <glm/gtc/matrix_transform.hpp>
15#include <assimp/Importer.hpp>
16#include <assimp/scene.h>
17#include <assimp/postprocess.h>
18#include <assimp/cimport.h>
19
20#include <string>
21#include <fstream>
22#include <sstream>
23#include <iostream>
24#include <map>
25#include "gSkinnedMesh.h"
26#include <vector>
27#include <deque>
28#include <thread>
29#include <unordered_map>
30
31
32class gModel : public gNode {
33public:
34 // model data
35 std::deque<gTexture*> textures_loaded; // stores all the textures loaded so far, optimization to make sure textures aren't loaded more than once.
36 std::deque<gSkinnedMesh*> meshes;
37 std::string directory;
38
39 // constructor, expects a filepath to a 3D model.
41 virtual ~gModel();
42
44
45 void loadModel(const std::string& modelPath);
46 void loadModelWithOriginalVertices(const std::string& modelPath);
47 void loadMorphingTargetModel(const std::string& modelPath);
48 void load(const std::string& fullPath);
49 void draw();
50
51 const std::string& getFilename() const;
52 const std::string getFullpath() const;
53 int getMeshNum() const;
54 int getMeshNo(const std::string& meshName) const;
55 gSkinnedMesh& getMesh(int meshNo);
57 std::string getMeshName(int meshNo) const;
59
60 void move(float dx, float dy, float dz) { move(glm::vec3(dx, dy, dz)); }
61 void move(const glm::vec3& dv);
62 void rotate(const glm::quat& q);
63 void rotate(float radians, float ax, float ay, float az); //first change
64 void rotateDeg(float degrees, float ax, float ay, float az) { rotate(glm::radians(degrees), ax, ay, az); } //first change
65 void rotateAround(float radians, const glm::vec3& axis, const glm::vec3& point);
66 void rotateAroundDeg(float degrees, const glm::vec3& axis, const glm::vec3& point) { rotateAround(glm::radians(degrees), axis, point); }
67 void scale(float sx, float sy, float sz);
68 void scale(float s);
69 void dolly(float distance);
70 void truck(float distance);
71 void boom(float distance);
72 void tilt(float radians);
73 void tiltDeg(float degrees) { tilt(glm::radians(degrees)); }
74 void pan(float radians);
75 void panDeg(float degrees) { pan(glm::radians(degrees)); }
76 void roll(float radians);
77 void rollDeg(float degrees) { roll(glm::radians(degrees)); }
78
79 void setPosition(float px, float py, float pz) { setPosition(glm::vec3(px, py, pz)); }
80 void setPosition(const glm::vec3& p);
81 void setOrientation(const glm::quat& o);
82 void setOrientation(const glm::vec3& angles);
83 void setScale(const glm::vec3& s);
84 void setScale(float sx, float sy, float sz) { setScale(glm::vec3(sx, sy, sz)); }
85 void setScale(float s) { setScale(glm::vec3(s, s, s)); }
86
87 void setTransformationMatrix(const glm::mat4& transformationMatrix);
88
89 bool isAnimated() const;
90 int getAnimationNum() const;
91 float getAnimationDuration(int animationNo = 0) const;
92 void animate(float animationPosition);
93 float getAnimationPosition() const;
94 void setAnimationFrameNo(int frameNo);
97 void setAnimationFrameNum(int animationKeyNum);
99 void setAnimationFramerate(float animationFramerate);
101 void setMorphingFrameNo(int morphingAnimationNo);
104 void setMorphingSpeed(int speed);
105 int getMorphingSpeed() const;
106 void setMorphingFrameNum(int morphingFrameNum);
108 void setMorphingTarget(int morphingTargetId);
109 int getMorphingTarget() const;
110
111 bool isVertexAnimated() const;
113 void makeVertexAnimated(bool storeOnVram = true);
114
116
118
119 void setEnableFrustumCulling(bool enable);
120
121protected:
123
124private:
125 struct SharedVertexIndex {
126 std::shared_ptr<std::vector<gVertex>> vertices;
127 std::shared_ptr<std::vector<gIndex>> indices;
128 };
129 std::unordered_map<const aiMesh*, SharedVertexIndex> mesh2svimap;
130
131 const aiScene* scene;
132 std::vector<const aiScene*> morphingtargetscenes;
133 void loadModelFile(const std::string& fullPath);
134 void loadModelFileWithOriginalVertices(const std::string& fullPath);
135 void loadMorphingTargetModelFile(const std::string& fullPath);
136 void processNode(aiNode* node, const aiScene* scene);
137 gSkinnedMesh* processMesh(const aiMesh* mesh, const aiScene* scene, aiMatrix4x4 matrix);
138 void loadMaterialTextures(gSkinnedMesh* mesh, aiMaterial* mat, aiTextureType type, gTexture::TextureType textureType);
139 void processMorphingNode(const aiNode* node, const aiScene* scene);
140 gMesh* processMorphingMesh(const aiMesh* mesh, const aiScene* scene, aiMatrix4x4 matrix);
141 //The below line's third parameter is to perform the animation on the target mesh by taking the aiTargetMesh as a reference. Haven't tested yet.
142 //void updateBones(gSkinnedMesh* gmesh, aiMesh* aimesh, aiMesh* aiTargetMesh);
143 void updateBones(gSkinnedMesh* gmesh, const aiMesh* aimesh);
144 void updateVbo(gSkinnedMesh* gmesh);
145 void updateAnimationNodes();
146 void generateAnimationKeys();
147
148 // Find a node using the map
149 aiNode* findNodeFast(const std::string& name) {
150 auto it = nodemap.find(name);
151 return (it != nodemap.end()) ? it->second : nullptr;
152 }
153
154 std::string filename;
155 int animationnum;
156 bool isanimated;
157 float animationposition, animationpositionold;
158 float animationframerate;
159 int animationframenum;
160 std::vector<float> animationkeys;
161 int animationframeno;
162
163 void prepareVertexAnimationData();
164 bool isvertexanimated;
165 bool isvertexanimationstoredonvram;
166
167 // this is used to find the nodes fast because assimp code is slow, it might consume little more memory
168 std::unordered_map<std::string, aiNode*> nodemap;
169 std::vector<unsigned int> meshindices;
170
171 glm::mat4 convertMatrix(const aiMatrix4x4 &aiMat);
172 gBoundingBox initialboundingbox;
173 gBoundingBox boundingbox;
174 bool isenablefrustumculling;
175 bool needsboundingboxrecalculation;
176
177};
178
179#endif /* ENGINE_GRAPHICS_GMODEL_H_ */
Definition gBoundingBox.h:36
Definition gMesh.h:27
Definition gModel.h:32
gSkinnedMesh & getMesh(int meshNo)
void processTransformationMatrix() override
void makeVertexAnimated(bool storeOnVram=true)
std::string directory
Definition gModel.h:37
void rotateAround(float radians, const glm::vec3 &axis, const glm::vec3 &point)
float getAnimationPosition() const
void boom(float distance)
int getMorphingFrameNum() const
int getMorphingFrameNo() const
void pan(float radians)
void draw()
void setPosition(float px, float py, float pz)
Definition gModel.h:79
gBoundingBox & getInitialBoundingBox()
int getAnimationNum() const
void setOrientation(const glm::vec3 &angles)
void animate(float animationPosition)
std::deque< gTexture * > textures_loaded
Definition gModel.h:35
void truck(float distance)
void setScale(float s)
Definition gModel.h:85
void rotateDeg(float degrees, float ax, float ay, float az)
Definition gModel.h:64
void setMorphingTarget(int morphingTargetId)
void rotate(const glm::quat &q)
void load(const std::string &fullPath)
int getAnimationFrameNum() const
void disassemble()
void nextMorphingFrame()
const gBoundingBox & getBoundingBox()
void setAnimationFrameNo(int frameNo)
gSkinnedMesh * getMeshPtr(int meshNo)
void setAnimationFramerate(float animationFramerate)
int getMeshNo(const std::string &meshName) const
float getAnimationDuration(int animationNo=0) const
void setPosition(const glm::vec3 &p)
float getAnimationFramerate() const
const std::string & getFilename() const
int getMeshNum() const
void setMorphingFrameNo(int morphingAnimationNo)
void recalculateBoundingBox()
void loadModelWithOriginalVertices(const std::string &modelPath)
bool isVertexAnimationStoredOnVram() const
void roll(float radians)
void dolly(float distance)
void tilt(float radians)
virtual ~gModel()
void rollDeg(float degrees)
Definition gModel.h:77
int getMorphingSpeed() const
void move(const glm::vec3 &dv)
void panDeg(float degrees)
Definition gModel.h:75
void nextAnimationFrame()
void tiltDeg(float degrees)
Definition gModel.h:73
void setMorphingSpeed(int speed)
int getAnimationFrameNo() const
void loadMorphingTargetModel(const std::string &modelPath)
void setOrientation(const glm::quat &o)
std::deque< gSkinnedMesh * > meshes
Definition gModel.h:36
const std::string getFullpath() const
void rotateAroundDeg(float degrees, const glm::vec3 &axis, const glm::vec3 &point)
Definition gModel.h:66
void move(float dx, float dy, float dz)
Definition gModel.h:60
void setTransformationMatrix(const glm::mat4 &transformationMatrix)
void setAnimationFrameNum(int animationKeyNum)
void setEnableFrustumCulling(bool enable)
void scale(float s)
void setScale(float sx, float sy, float sz)
Definition gModel.h:84
std::string getMeshName(int meshNo) const
void setMorphingFrameNum(int morphingFrameNum)
void rotate(float radians, float ax, float ay, float az)
int getMorphingTarget() const
void setScale(const glm::vec3 &s)
bool isAnimated() const
void loadModel(const std::string &modelPath)
void scale(float sx, float sy, float sz)
bool isVertexAnimated() const
Definition gNode.h:15
Definition gSkinnedMesh.h:15
TextureType
Definition gTexture.h:19