10 #include <OpenGL/glew.h>
12 #include <glm/glm.hpp>
13 #include <assimp/scene.h>
14 #include "material.hpp"
15 #include "program.hpp"
18 inline glm::mat4 aiMatrixToMat4(aiMatrix4x4 from) {
20 for (int i = 0; i < 4; i++)
21 for (int j = 0; j < 4; j++)
22 to[i][j] = from[j][i];
26 inline aiMatrix4x4 mat4ToaiMatrix(glm::mat4 from) {
28 for (int i = 0; i < 4; i++)
29 for (int j = 0; j < 4; j++)
30 to[i][j] = from[j][i];
38 std::vector<const aiNodeAnim*> nodeAnims;
41 typedef std::map<std::string, std::pair<unsigned int, aiBone*>> BoneMap;
42 typedef std::map<std::string, std::vector<const Animation>> AnimMap;
43 typedef std::map<std::string, glm::mat4> BoneTransforms;
46 unsigned int ids[4] = {0, 0, 0 ,0};
47 float weights[4] = {1, 0, 0, 0};
51 Mesh(const aiMesh *aiMesh, GLuint progId);
52 GLuint progId, vao, numIndices;
53 unsigned int materialIndex;
58 Model(const aiScene *scene, Program p);
59 void draw(Skybox skybox, const float tick) const;
63 Node(aiNode &aiNode, GLuint progId, AnimMap *animMap, std::set<std::string> allBones, Node *parent);
65 void draw(const std::vector<Mesh> &meshes, const std::vector<Material> &materials, const Skybox s, const float tick, const BoneTransforms &boneTransforms, glm::mat4 parentModel) const;
66 const std::vector<Node*> &getChildren() const { return children; }
67 Node* findNode(const aiNode &aiNode);
71 glm::mat4 transform = glm::mat4(1);
73 glm::mat4 totalTrans(const glm::mat4 parentTrans, const float tick) const;
76 const Node &getRoot() const;
78 bool operator==(const Node &rhs) const;
83 const AnimMap *animMap;
84 std::vector<Node*> children;
85 std::vector<unsigned int> meshIndices;
89 Node* getRoot() { return root; }
90 Node* find(const aiString name) const;
91 Node* find(const std::string &name) const;
94 const Program program;
96 std::vector<Mesh> meshes;
99 std::vector<Material> materials;
103 BoneTransforms calcBoneTransforms(const Node &n, const float tick, const std::set<std::string> bones, const glm::mat4 parentTrans) const;
104 void loadModel(const std::string &path);