+ // bones
+ std::vector<glm::mat4> idBones(17, glm::mat4(1.f));
+ glUniformMatrix4fv(glGetUniformLocation(progId, "bones"), 17, GL_FALSE, glm::value_ptr(idBones[0]));
+
+ for (std::pair<std::string, std::pair<unsigned int, glm::mat4>> pair: mesh.boneMap) {
+
+ 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]; */
+ /* } */
+ for (const Animation anim: animMap->at(nodeName)) {
+ float t = fmod(tick, anim.duration);
+ for (const aiNodeAnim *nodeAnim: anim.nodeAnims) {
+ boneTrans = boneTrans * lerpPosition(nodeAnim, t);
+ boneTrans = boneTrans * lerpRotation(nodeAnim, t);
+ boneTrans = boneTrans * lerpScaling(nodeAnim, t);
+ }
+ }
+
+ boneTrans = boneTrans * boneOffset;
+
+
+ std::string boneLocStr = "bones[" + std::to_string(boneId) + "]";
+ GLuint boneLoc = glGetUniformLocation(progId, boneLocStr.c_str());
+ glUniformMatrix4fv(boneLoc, 1, GL_FALSE, glm::value_ptr(boneTrans));
+ }
+
+ Material material = materials[mesh.materialIndex];
+ material.bind();
+
+ glUniform1i(glGetUniformLocation(progId, "irradianceMap"), 4);
+ glActiveTexture(GL_TEXTURE4);
+ glBindTexture(GL_TEXTURE_CUBE_MAP, skybox.getIrradianceMap());
+
+ glUniform1i(glGetUniformLocation(progId, "prefilterMap"), 5);
+ glActiveTexture(GL_TEXTURE5);
+ glBindTexture(GL_TEXTURE_CUBE_MAP, skybox.getPrefilterMap());
+
+ glUniform1i(glGetUniformLocation(progId, "brdfMap"), 6);
+ glActiveTexture(GL_TEXTURE6);
+ glBindTexture(GL_TEXTURE_2D, skybox.getBRDFMap());
+