Rework UI architecture and blendshape animation
[opengl.git] / model.hpp
index a3a290c80096279f31d105265316e23d1d316479..e7ad29cd2c9f97b0cf3b414c9e1c89aaf7d367b6 100644 (file)
--- a/model.hpp
+++ b/model.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;
-}
-
-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 {
 
@@ -47,17 +32,21 @@ class Model {
                float weights[4] = {1, 0, 0, 0};
        };
        
+       public:
+               Model(std::vector<std::string> blendshapes, std::string neutral, Program p);
+               Model(const aiScene *scene, Program p);
+               void draw(Skybox skybox, const float tick) const;
+
                struct Mesh {
                        Mesh(const aiMesh *aiMesh, GLuint progId);
                        GLuint progId, vao, numIndices;
+                       GLuint vbos[6];
                        unsigned int materialIndex;
                        BoneMap boneMap;
+                       const aiMesh &ai;
+                       void updatePosBuffer() const;
                };
 
-       public:
-               Model(const aiScene *scene, Program p);
-               void draw(Skybox skybox, const float tick) const;
-
                class Node {
                        public:
                                Node(aiNode &aiNode, GLuint progId, AnimMap *animMap, std::set<std::string> allBones, Node *parent);
@@ -86,14 +75,21 @@ class Model {
                                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;
 
-       private:
-               const Program program;
+               struct VertexLookup {
+                       glm::vec3 pos;
+                       int meshIdx, vertIdx;
+                       float distance;
+               };
+               VertexLookup closestVertex(Model::Node &node, glm::vec3 a, glm::vec3 b, glm::mat4 parentTrans = glm::mat4(1)) const;
                
                std::vector<Mesh> meshes;
+       
+       private:
+               const Program program;
                Node *root;
 
                std::vector<Material> materials;