Vertex picking
[opengl.git] / model.hpp
index bf6f08f346133920d792870d6a0f42249fe5e0cd..ecc8842b7e3807d901d642dc721f572a8cd91b78 100644 (file)
--- a/model.hpp
+++ b/model.hpp
@@ -1,3 +1,6 @@
+#ifndef MODEL_HPP
+#define MODEL_HPP
+
 #include <vector>
 #include <map>
 #include <set>
 #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 {
 
@@ -41,6 +37,7 @@ class Model {
                GLuint progId, vao, numIndices;
                unsigned int materialIndex;
                BoneMap boneMap;
+               const aiMesh &ai;
        };
        
        public:
@@ -49,29 +46,38 @@ class Model {
 
                class Node {
                        public:
-                               Node(const aiNode &aiNode, GLuint progId, AnimMap *animMap);
+                               Node(aiNode &aiNode, GLuint progId, AnimMap *animMap, std::set<std::string> allBones, Node *parent);
+
                                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;
+                               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;
+                               const Node &getRoot() const;
+
+                               bool operator==(const Node &rhs) const;
+
                        private:
                                const GLuint progId;
 
                                const AnimMap *animMap;
                                std::vector<Node*> children;
                                std::vector<unsigned int> meshIndices;
+                               const bool isBone;
                };
                
-               Node* getRoot() { return root; }
+               Node& getRoot() const { return *root; }
                Node* find(const aiString name) const;
                Node* find(const std::string &name) const;
 
+               std::pair<glm::vec3, float> closestVertex(Model::Node &node, glm::vec3 a, glm::vec3 b, glm::mat4 parentTrans = glm::mat4(1)) const;
+       
        private:
                const Program program;
                
@@ -85,3 +91,5 @@ class Model {
                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);
 };
+
+#endif