Skybox
[opengl.git] / model.hpp
1 #include <vector>
2 #ifdef __APPLE__
3 #include <GL/glew.h>
4 #else
5 #include <OpenGL/glew.h>
6 #endif
7 #include <glm/glm.hpp>
8 #include <assimp/scene.h>
9 #include <assimp/Importer.hpp>
10 #include "material.hpp"
11 #include "program.hpp"
12
13 class Model {
14
15         struct Mesh {
16                 Mesh(const aiMesh *aiMesh, GLuint progId);
17                 GLuint progId, vao, numIndices;
18                 unsigned int materialIndex;
19         };
20         
21         public:
22                 Model(const std::string &path, Program p);
23                 void draw() const;
24
25                 class Node {
26                         public:
27                                 Node(const aiNode &aiNode, GLuint progId);
28                                 void draw(const std::vector<Mesh> &meshes, const std::vector<Material> &materials, glm::mat4 parentModel) const;
29                                 const std::vector<Node*> &getChildren() const { return children; }
30                                 Node* findNode(const aiNode &aiNode);
31                                 glm::mat4 model = glm::mat4(1);
32                                 const aiNode &ai;
33                         private:
34                                 const GLuint progId;
35
36                                 std::vector<Node*> children;
37                                 std::vector<unsigned int> meshIndices;
38                 };
39                 
40                 Node* getRoot() { return root; }
41                 Node* find(const std::string &name);
42         
43         private:
44                 const Program program;
45                 
46                 std::vector<Mesh> meshes;
47                 Node *root;
48
49                 std::vector<Material> materials;
50
51                 void loadModel(const std::string &path);
52
53                 Assimp::Importer importer;
54 };