Update shader errors, add back brdffrag
[opengl.git] / model.cpp
index efc7f222b9db70856e362cf50b15549b5d5c4d27..a11a0745dd9d4b8d41da1c8a3809fa34384e1037 100644 (file)
--- a/model.cpp
+++ b/model.cpp
@@ -1,16 +1,8 @@
 #include "model.hpp"
 #include <iostream>
-#include <assimp/postprocess.h>
 #include <assimp/quaternion.h>
 #include <glm/gtc/type_ptr.hpp>
 
-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;
-}
 
 Model::Mesh::Mesh(const aiMesh *aiMesh, GLuint progId) {
 
@@ -232,11 +224,11 @@ void Model::Node::draw(   const std::vector<Mesh> &meshes,
        }
        
 
-       glm::mat4 m = parentTrans * animTrans * aiMatrixToMat4(ai.mTransformation) * model;
+       glm::mat4 m = parentTrans * animTrans * aiMatrixToMat4(ai.mTransformation);
 
-       for (auto child: children) {
-               boneTransforms[std::string(ai.mName.C_Str())] = m;
-       }
+       /* for (auto child: children) { */
+       /*      boneTransforms[std::string(ai.mName.C_Str())] = m; */
+       /* } */
        
        for (unsigned int i: meshIndices) {
                const Mesh &mesh = meshes[i];
@@ -250,13 +242,17 @@ void Model::Node::draw(   const std::vector<Mesh> &meshes,
 
                        std::string nodeName = pair.first;
                        unsigned int boneId = pair.second.first;
+                       // This is actually an inverse-bind matrix
+                       // i.e. position of the mesh in bone space
+                       // so no need to inverse again!
+                       // https://github.com/assimp/assimp/pull/1803/files
                        glm::mat4 boneOffset = pair.second.second;
 
                        glm::mat4 boneTrans(1.f);
-                       if (boneTransforms.count(nodeName)) {
-                               std::cerr << "got bone transform from map" << std::endl;
-                               boneTrans = boneTransforms[nodeName];
-                       }
+                       /* if (boneTransforms.count(nodeName)) { */
+                       /*      std::cerr << "got bone transform from map" << std::endl; */
+                       /*      boneTrans = boneTransforms[nodeName]; */
+                       /* } */
                        for (const Animation anim: animMap->at(nodeName)) {
                                float t = fmod(tick, anim.duration);
                                for (const aiNodeAnim *nodeAnim: anim.nodeAnims) {
@@ -266,7 +262,7 @@ void Model::Node::draw(     const std::vector<Mesh> &meshes,
                                }
                        }
 
-                       boneTrans = boneTrans * glm::inverse(boneOffset);
+                       boneTrans = boneTrans * boneOffset;
 
 
                        std::string boneLocStr = "bones[" + std::to_string(boneId) + "]";
@@ -296,16 +292,9 @@ void Model::Node::draw(    const std::vector<Mesh> &meshes,
        for (Node *child: children) child->draw(meshes, materials, skybox, tick, m, boneTransforms);
 }
 
-Model::Model(const std::string &path, Program p): program(p) {
+Model::Model(const aiScene *scene, Program p): program(p) {
        glUseProgram(p.progId);
 
-       const aiScene *scene = importer.ReadFile(path, 
-                       aiProcess_Triangulate | aiProcess_CalcTangentSpace | aiProcess_GenNormals | aiProcess_FlipUVs);
-       if (!scene) {
-               std::cerr << importer.GetErrorString() << std::endl;
-               exit(1);
-       }
-
        for (int i = 0; i < scene->mNumMeshes; i++) {
                const aiMesh *mesh = scene->mMeshes[i];
                meshes.push_back(Mesh(mesh, p.progId));
@@ -314,7 +303,7 @@ Model::Model(const std::string &path, Program p): program(p) {
        // TODO: handle default material inserted at the end by assimp
        for (unsigned int i = 0; i < scene->mNumMaterials - 1; i++) {
                const aiMaterial &material = *scene->mMaterials[i];
-               materials.push_back(Material(material, p.progId));
+               materials.push_back(Material(material, *scene, p.progId));
        }
 
        AnimMap *animMap = new AnimMap();
@@ -343,22 +332,22 @@ Model::Model(const std::string &path, Program p): program(p) {
        root = new Node(*(scene->mRootNode), p.progId, animMap);
 }
 
-void Model::calcBoneTransforms(aiNode &node, glm::mat4 parentTrans = glm::mat4(1), BoneTransforms boneTrans = BoneTransforms()) {
-       glm::mat4 animTrans(1.f);
-       if (animMap->count(std::string(ai.mName.C_Str()))) {
-               for (const Animation anim: animMap->at(std::string(ai.mName.C_Str()))) {
-                       float t = fmod(tick, anim.duration);
-                       for (const aiNodeAnim *nodeAnim: anim.nodeAnims) {
-                               animTrans *= lerpPosition(nodeAnim, t);
-                               animTrans *= lerpRotation(nodeAnim, t);
-                               animTrans *= lerpScaling(nodeAnim, t);
-                       }
-               }
-       }
+/* void Model::calcBoneTransforms(aiNode &node, glm::mat4 parentTrans = glm::mat4(1), BoneTransforms boneTrans = BoneTransforms()) { */
+/*     glm::mat4 animTrans(1.f); */
+/*     if (animMap->count(std::string(ai.mName.C_Str()))) { */
+/*             for (const Animation anim: animMap->at(std::string(ai.mName.C_Str()))) { */
+/*                     float t = fmod(tick, anim.duration); */
+/*                     for (const aiNodeAnim *nodeAnim: anim.nodeAnims) { */
+/*                             animTrans *= lerpPosition(nodeAnim, t); */
+/*                             animTrans *= lerpRotation(nodeAnim, t); */
+/*                             animTrans *= lerpScaling(nodeAnim, t); */
+/*                     } */
+/*             } */
+/*     } */
        
 
-       glm::mat4 m = parentTrans * animTrans * aiMatrixToMat4(ai.mTransformation) * model;
-}
+/*     glm::mat4 m = parentTrans * animTrans * aiMatrixToMat4(ai.mTransformation) * model; */
+/* } */
 
 void Model::draw(Skybox skybox, const float tick) const {
        glUseProgram(program.progId);