+ // 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;
+ 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 * glm::inverse(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());
+