Do boning and animation properly
[opengl.git] / model.hpp
index 92aab0dd21cb80cb95791f475819522ee0b58056..bf6f08f346133920d792870d6a0f42249fe5e0cd 100644 (file)
--- a/model.hpp
+++ b/model.hpp
@@ -1,5 +1,6 @@
 #include <vector>
 #include <map>
+#include <set>
 #ifdef __APPLE__
 #include <GL/glew.h>
 #else
@@ -26,7 +27,7 @@ class Model {
                std::vector<const aiNodeAnim*> nodeAnims;
        };
 
-       typedef std::map<std::string, std::pair<unsigned int, glm::mat4>> BoneMap;
+       typedef std::map<std::string, std::pair<unsigned int, aiBone*>> BoneMap;
        typedef std::map<std::string, std::vector<const Animation>> AnimMap;
        typedef std::map<std::string, glm::mat4> BoneTransforms;
 
@@ -49,11 +50,16 @@ class Model {
                class Node {
                        public:
                                Node(const aiNode &aiNode, GLuint progId, AnimMap *animMap);
-                               void draw(const std::vector<Mesh> &meshes, const std::vector<Material> &materials, const Skybox s, const float tick, glm::mat4 parentModel, BoneTransforms boneTransforms) const;
+                               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;
                                const std::vector<Node*> &getChildren() const { return children; }
                                Node* findNode(const aiNode &aiNode);
                                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;
 
@@ -63,8 +69,8 @@ class Model {
                };
                
                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 +80,8 @@ class Model {
 
                std::vector<Material> materials;
 
+               AnimMap animMap;
+
+               BoneTransforms calcBoneTransforms(const Node &n, const float tick, const std::set<std::string> bones, const glm::mat4 parentTrans) const;
                void loadModel(const std::string &path);
 };