X-Git-Url: https://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=model.hpp;h=e7ad29cd2c9f97b0cf3b414c9e1c89aaf7d367b6;hp=5c74cb386ef50a1bca316dc3bd286132710c939c;hb=9886c33eb8cd31f28234585718410cd51aef2a4c;hpb=be8759aec179d6d7bed58732134673870c596b4f diff --git a/model.hpp b/model.hpp index 5c74cb3..e7ad29c 100644 --- a/model.hpp +++ b/model.hpp @@ -1,5 +1,9 @@ +#ifndef MODEL_HPP +#define MODEL_HPP + #include #include +#include #ifdef __APPLE__ #include #else @@ -7,11 +11,11 @@ #endif #include #include -#include #include "material.hpp" #include "program.hpp" #include "skybox.hpp" + class Model { struct Animation { @@ -19,7 +23,7 @@ class Model { std::vector nodeAnims; }; - typedef std::map> BoneMap; + typedef std::map> BoneMap; typedef std::map> AnimMap; typedef std::map BoneTransforms; @@ -28,25 +32,39 @@ 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 std::string &path, Program p); - void draw(Skybox skybox, const float tick) const; - 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); - glm::mat4 model = glm::mat4(1); - 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; @@ -54,21 +72,32 @@ 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& 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; - void loadModel(const std::string &path); + AnimMap animMap; - Assimp::Importer importer; + BoneTransforms calcBoneTransforms(const Node &n, const float tick, const std::set bones, const glm::mat4 parentTrans) const; + void loadModel(const std::string &path); }; + +#endif