X-Git-Url: https://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=model.hpp;h=e7ad29cd2c9f97b0cf3b414c9e1c89aaf7d367b6;hp=a3a290c80096279f31d105265316e23d1d316479;hb=b91a0d30ae6484b6c4d981aeafa8d4996c98effe;hpb=ad77a970429c9c5e9cf8d513d0469d03ad82e622 diff --git a/model.hpp b/model.hpp index a3a290c..e7ad29c 100644 --- a/model.hpp +++ b/model.hpp @@ -15,21 +15,6 @@ #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 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 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 meshes; + + private: + const Program program; Node *root; std::vector materials;