X-Git-Url: https://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=model.hpp;h=bf6f08f346133920d792870d6a0f42249fe5e0cd;hp=358b92d07701211a99eff67692e1ec56045f6468;hb=dbd855720a9af7d6e599ddc50bbbb0dee85458a5;hpb=511a2c92fcb9dda82dd5d38b91ea03790d0cb7b2 diff --git a/model.hpp b/model.hpp index 358b92d..bf6f08f 100644 --- a/model.hpp +++ b/model.hpp @@ -1,4 +1,6 @@ #include +#include +#include #ifdef __APPLE__ #include #else @@ -6,40 +8,69 @@ #endif #include #include -#include #include "material.hpp" #include "program.hpp" #include "skybox.hpp" +inline glm::mat4 aiMatrixToMat4(aiMatrix4x4 from) { + glm::mat4 to; + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + to[i][j] = from[j][i]; + return to; +} + 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); - void draw(Skybox skybox) const; + Model(const aiScene *scene, 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, const BoneTransforms &boneTransforms, glm::mat4 parentModel) const; const std::vector &getChildren() const { return children; } Node* findNode(const aiNode &aiNode); - glm::mat4 model = glm::mat4(1); const aiNode &ai; + + // an extra transform + glm::mat4 transform = glm::mat4(1); + + glm::mat4 totalTrans(const glm::mat4 parentTrans, const float tick) const; + private: const GLuint progId; + const AnimMap *animMap; std::vector children; std::vector meshIndices; }; Node* getRoot() { return root; } - Node* find(const std::string &name); + Node* find(const aiString name) const; + Node* find(const std::string &name) const; private: const Program program; @@ -49,7 +80,8 @@ class Model { std::vector materials; - void loadModel(const std::string &path); + AnimMap animMap; - Assimp::Importer importer; + BoneTransforms calcBoneTransforms(const Node &n, const float tick, const std::set bones, const glm::mat4 parentTrans) const; + void loadModel(const std::string &path); };