X-Git-Url: http://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=model.hpp;h=ecc8842b7e3807d901d642dc721f572a8cd91b78;hp=0339538429cc94ae87292ff3f53e56cd460777a6;hb=b472351f3c80cec8c7e9ec30cb4c113c947c0ff7;hpb=b64cd5a5ec09e6f051583371045ef7080c69b776 diff --git a/model.hpp b/model.hpp index 0339538..ecc8842 100644 --- a/model.hpp +++ b/model.hpp @@ -1,4 +1,9 @@ +#ifndef MODEL_HPP +#define MODEL_HPP + #include +#include +#include #ifdef __APPLE__ #include #else @@ -6,27 +11,85 @@ #endif #include #include +#include "material.hpp" +#include "program.hpp" +#include "skybox.hpp" + class Model { - public: - Model(const std::string &path, GLuint progId): progId(progId) { - loadModel(path); - } - void draw(); - private: - const GLuint progId; + + struct Animation { + double duration; + std::vector nodeAnims; + }; + + typedef std::map> BoneMap; + typedef std::map> AnimMap; + typedef std::map BoneTransforms; + + struct VertBones { + unsigned int ids[4] = {0, 0, 0 ,0}; + float weights[4] = {1, 0, 0, 0}; + }; struct Mesh { Mesh(const aiMesh *aiMesh, GLuint progId); + GLuint progId, vao, numIndices; + unsigned int materialIndex; + BoneMap boneMap; + const aiMesh &ai; + }; + + 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); + + 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); + aiNode &ai; - GLuint vao, vertexVbo, normalVbo, indicesVbo; + // an extra transform + glm::mat4 transform = glm::mat4(1); - std::vector vertices; - std::vector normals; - std::vector texCoords; - std::vector indices; + 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 children; + std::vector meshIndices; + const bool isBone; }; + Node& getRoot() const { return *root; } + Node* find(const aiString name) const; + Node* find(const std::string &name) const; + + std::pair closestVertex(Model::Node &node, glm::vec3 a, glm::vec3 b, glm::mat4 parentTrans = glm::mat4(1)) const; + + private: + const Program program; + std::vector meshes; + Node *root; + + std::vector materials; + + AnimMap animMap; + + BoneTransforms calcBoneTransforms(const Node &n, const float tick, const std::set bones, const glm::mat4 parentTrans) const; void loadModel(const std::string &path); }; + +#endif