+ glUseProgram(getUtilProg()->progId);
+ setProjectionAndViewUniforms(getUtilProg()->progId);
+
+ glUseProgram(pbrProg->progId);
+ setProjectionAndViewUniforms(pbrProg->progId);
+
+ size_t numLights = lights.size() + (discoLights ? 3 : 0);
+ glm::vec3 lightPositions[numLights], lightColors[numLights];
+ for (int i = 0; i < lights.size(); i++) {
+ lightPositions[i] = glm::vec3(lights[i].trans[3]);
+ lightColors[i] = lights[i].color;
+ }
+
+ if (discoLights) {
+ for (int i = numLights - 3; i < numLights; i++) {
+ auto m = glm::translate(glm::mat4(1.f), glm::vec3(-2.5, 0, 0));
+ m = glm::rotate(m, glm::radians(d * 100 + i * 30), glm::vec3(1, 0, 0));
+ m = glm::rotate(m, glm::radians(d * 100 + i * 30), glm::vec3(0, 1, 0));
+ m = glm::rotate(m, glm::radians(d * 100 + i * 30), glm::vec3(0, 0, 1));
+ lightPositions[i] = glm::vec3(m * glm::vec4(5, 0, 0, 1));
+ lightColors[i] = glm::vec3(0.2);
+ if (i % 3 == 0) lightColors[i].x = sin(d);
+ if (i % 3 == 1) lightColors[i].y = cos(d * 3);
+ if (i % 3 == 2) lightColors[i].z = cos(d);
+ }
+ }
+
+ glUniform1ui(glGetUniformLocation(pbrProg->progId, "numLights"), numLights);
+ glUniform3fv(glGetUniformLocation(pbrProg->progId, "lightPositions"), numLights, glm::value_ptr(lightPositions[0]));
+ glUniform3fv(glGetUniformLocation(pbrProg->progId, "lightColors"), numLights, glm::value_ptr(lightColors[0]));
+
+#ifdef COWEDBOY_IK
+ {
+ glm::vec3 targetPos(sin(d) * 2 + 3, -2, 1);
+ Light targetLight = { glm::translate(glm::mat4(1), targetPos), {0.5, 1, 1} };
+ drawLight(targetLight);
+ inverseKinematics(*sceneModel->find("Shoulder.L"), *sceneModel->find("Finger.L"), targetPos);
+
+ targetPos = { sin(d * 2) * 2 - 5, 2.5, 0 };
+ targetLight = { glm::translate(glm::mat4(1), targetPos), {1, 1, 0.5} };
+ drawLight(targetLight);
+ inverseKinematics(*sceneModel->find("Shoulder.R"), *sceneModel->find("Finger.R"), targetPos);
+ }
+#endif