X-Git-Url: http://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=model.hpp;h=2803a7ee3cc7147550af2928ce5978419727f6f8;hp=e0c8a2d93acd0a4e7fedcd542bcc4a36cb1746a9;hb=6fb9efea1fd0e4575973719a997602da4b4c4fa5;hpb=8abaf8f77191e1c660def0832d8036a8b4639ba8 diff --git a/model.hpp b/model.hpp index e0c8a2d..2803a7e 100644 --- a/model.hpp +++ b/model.hpp @@ -1,4 +1,5 @@ #include +#include #ifdef __APPLE__ #include #else @@ -13,37 +14,53 @@ class Model { + struct Animation { + double duration; + std::vector nodeAnims; + }; + + typedef std::map> BoneMap; + typedef std::map> AnimMap; + typedef std::map BoneTransforms; + + struct VertBones { + unsigned int ids[4] = {0, 0, 0 ,0}; + float weights[4] = {1, 0, 0, 0}; + }; + struct Mesh { Mesh(const aiMesh *aiMesh, GLuint progId); GLuint progId, vao, numIndices; unsigned int materialIndex; + BoneMap boneMap; }; public: - Model(const std::string &path, Program p, Skybox s); - void draw() const; + Model(const std::string &path, Program p); + void draw(Skybox skybox, const float tick) const; class Node { public: - Node(const aiNode &aiNode, GLuint progId); - void draw(const std::vector &meshes, const std::vector &materials, const Skybox s, glm::mat4 parentModel) const; + Node(const aiNode &aiNode, GLuint progId, AnimMap *animMap); + void draw(const std::vector &meshes, const std::vector &materials, const Skybox s, const float tick, glm::mat4 parentModel, BoneTransforms boneTransforms) const; const std::vector &getChildren() const { return children; } Node* findNode(const aiNode &aiNode); - glm::mat4 model = glm::mat4(1); const aiNode &ai; + private: const GLuint progId; + const AnimMap *animMap; std::vector children; std::vector meshIndices; }; Node* getRoot() { return root; } + Node* find(const aiString name); Node* find(const std::string &name); private: const Program program; - const Skybox skybox; std::vector meshes; Node *root;