#include <vector>
+#include <map>
#ifdef __APPLE__
#include <GL/glew.h>
#else
#endif
#include <glm/glm.hpp>
#include <assimp/scene.h>
-#include <assimp/Importer.hpp>
#include "material.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;
+}
class Model {
+ struct Animation {
+ double duration;
+ std::vector<const aiNodeAnim*> nodeAnims;
+ };
+
+ typedef std::map<std::string, std::pair<unsigned int, glm::mat4>> BoneMap;
+ typedef std::map<std::string, std::vector<const Animation>> AnimMap;
+ typedef std::map<std::string, glm::mat4> 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;
};
public:
- Model(const std::string &path, GLuint progId);
- void draw() const;
+ Model(const aiScene *scene, Program p);
+ void draw(Skybox skybox, const float tick) const;
class Node {
public:
- Node(const aiNode &aiNode, GLuint progId);
- void draw(const std::vector<Mesh> &meshes, const std::vector<Material> &materials, glm::mat4 parentModel) const;
+ Node(const aiNode &aiNode, GLuint progId, AnimMap *animMap);
+ void draw(const std::vector<Mesh> &meshes, const std::vector<Material> &materials, const Skybox s, const float tick, glm::mat4 parentModel, BoneTransforms boneTransforms) const;
const std::vector<Node*> &getChildren() const { return children; }
Node* findNode(const aiNode &aiNode);
- glm::mat4 model = glm::mat4(1);
const aiNode &ai;
+
private:
const GLuint progId;
+ const AnimMap *animMap;
std::vector<Node*> children;
std::vector<unsigned int> meshIndices;
};
Node* getRoot() { return root; }
+ Node* find(const aiString name);
Node* find(const std::string &name);
private:
- const GLuint progId;
+ const Program program;
std::vector<Mesh> meshes;
Node *root;
std::vector<Material> materials;
void loadModel(const std::string &path);
-
- Assimp::Importer importer;
};