X-Git-Url: https://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=model.hpp;h=e74d65717973400120fd38eb4f2e4a71ba4418b3;hp=92aab0dd21cb80cb95791f475819522ee0b58056;hb=17dcc398b9a5d1a6a287c01dff7fc7cf2b792372;hpb=b75b26b3081207cd4169f2ac50875e35d19b8a14 diff --git a/model.hpp b/model.hpp index 92aab0d..e74d657 100644 --- a/model.hpp +++ b/model.hpp @@ -1,5 +1,9 @@ +#ifndef MODEL_HPP +#define MODEL_HPP + #include #include +#include #ifdef __APPLE__ #include #else @@ -19,6 +23,14 @@ inline glm::mat4 aiMatrixToMat4(aiMatrix4x4 from) { return to; } +inline aiMatrix4x4 mat4ToaiMatrix(glm::mat4 from) { + aiMatrix4x4 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 { @@ -26,7 +38,7 @@ class Model { std::vector nodeAnims; }; - typedef std::map> BoneMap; + typedef std::map> BoneMap; typedef std::map> AnimMap; typedef std::map BoneTransforms; @@ -48,11 +60,21 @@ class Model { class Node { public: - 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; + Node(aiNode &aiNode, GLuint progId, AnimMap *animMap, std::set allBones, Node *parent); + + 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); - const aiNode &ai; + aiNode &ai; + + // an extra transform + glm::mat4 transform = glm::mat4(1); + + glm::mat4 totalTrans(const glm::mat4 parentTrans, const float tick) const; + + const Node *parent; + + bool operator==(const Node &rhs) const; private: const GLuint progId; @@ -60,11 +82,12 @@ class Model { const AnimMap *animMap; std::vector children; std::vector meshIndices; + const bool isBone; }; Node* getRoot() { return root; } - Node* find(const aiString name); - Node* find(const std::string &name); + Node* find(const aiString name) const; + Node* find(const std::string &name) const; private: const Program program; @@ -74,5 +97,10 @@ class Model { std::vector materials; + AnimMap animMap; + + BoneTransforms calcBoneTransforms(const Node &n, const float tick, const std::set bones, const glm::mat4 parentTrans) const; void loadModel(const std::string &path); }; + +#endif