// // Render // void Render(unsigned Width, unsigned Height) { g_ElapsedTime = GetElapsedMilliseconds(); BeginFrame(); glViewport(0, 0, Width, Height); glClear(GL_DEPTH_BUFFER_BIT); // No need to clear color buffer, because we draw background image g_View = XMMatrixTranslation(0.0f, 0.0f, g_Distance); g_Proj = XMMatrixPerspectiveFovRH(XMConvertToRadians(45.0f), Width / (float)Height, 0.1f, 100.0f); // Bunny rotation g_SpinX += g_ElapsedTime / 50.0f; // Setup light positions for (int i = 0; i < MAX_POINT_LIGHTS; ++i) { POINT_LIGHT_SOURCE *pLight = &g_PointLights[i]; CalcLightPosition(pLight); } g_pBackground->SetScreenSize(Width, Height); g_pBackground->Draw(); DrawBunny(); DrawLights(); DrawHUD(Width, Height); EndFrame(); g_pFraps->OnPresent(); }
GLUSboolean display(GLUSfloat time) { g_LightTimer.Update(time); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glutil::MatrixStack modelMatrix; modelMatrix.SetMatrix(g_viewPole.CalcMatrix()); const glm::vec4 &worldLightPos = CalcLightPosition(); const glm::vec4 &lightPosCameraSpace = modelMatrix.Top() * worldLightPos; glUseProgram(g_MonoDiffuseProgram.program); glUniform4f(g_MonoDiffuseProgram.lightIntensityUnif, 0.8f, 0.8f, 0.8f, 1.0f); glUniform4f(g_MonoDiffuseProgram.ambientIntensityUnif, 0.2f, 0.2f, 0.2f, 1.0f); glUniform3fv(g_MonoDiffuseProgram.cameraSpaceLightPosUnif,1, glm::value_ptr(lightPosCameraSpace)); glUniform1f(g_MonoDiffuseProgram.lightAttenuationUnif, g_fLightAttenuation); glUniform1f(g_MonoDiffuseProgram.shininessFactorUnif, g_fGaussianRoughness); glUniform4fv(g_MonoDiffuseProgram.baseDiffuseColorUnif, 1, g_bDrawDark ? glm::value_ptr(g_darkColor) : glm::value_ptr(g_lightColor)); glUseProgram(g_ColorDiffuseProgram.program); glUniform4f(g_ColorDiffuseProgram.lightIntensityUnif, 0.8f, 0.8f, 0.8f, 1.0f); glUniform4f(g_ColorDiffuseProgram.ambientIntensityUnif, 0.2f, 0.2f, 0.2f, 1.0f); glUniform3fv(g_ColorDiffuseProgram.cameraSpaceLightPosUnif, 1, glm::value_ptr(lightPosCameraSpace)); glUniform1f(g_ColorDiffuseProgram.lightAttenuationUnif, g_fLightAttenuation); glUniform1f(g_ColorDiffuseProgram.shininessFactorUnif, g_fGaussianRoughness); glUseProgram(0); { glutil::PushStack push(modelMatrix); { glutil::PushStack push(modelMatrix); glm::mat3 normMatrix(modelMatrix.Top()); normMatrix = glm::transpose(glm::inverse(normMatrix)); glUseProgram(g_MonoDiffuseProgram.program); glUniformMatrix4fv(g_MonoDiffuseProgram.modelViewUnif, 1, GL_FALSE, glm::value_ptr(modelMatrix.Top())); glUniformMatrix3fv(g_MonoDiffuseProgram.modelViewForNormalUnif, 1, GL_FALSE, glm::value_ptr(normMatrix)); g_pPlaneMesh->render(); glUseProgram(0); } { glutil::PushStack push(modelMatrix); modelMatrix.ApplyMatrix(g_objtPole.CalcMatrix()); if (g_bScaleCyl) { modelMatrix.Scale(1.0f, 1.0f, 0.2f); } glm::mat3 normMatrix(modelMatrix.Top()); normMatrix = glm::transpose(glm::inverse(normMatrix)); ProgramData &prog = g_bDrawColoredCyl ? g_ColorDiffuseProgram : g_MonoDiffuseProgram; glUseProgram(prog.program); glUniformMatrix4fv(prog.modelViewUnif, 1, GL_FALSE, glm::value_ptr(modelMatrix.Top())); glUniformMatrix3fv(prog.modelViewForNormalUnif, 1, GL_FALSE, glm::value_ptr(normMatrix)); g_pCylinderMesh->render(g_bDrawColoredCyl ? "lit-color" : "lit"); glUseProgram(0); } if (g_bDrawLightSource) { glutil::PushStack push(modelMatrix); modelMatrix.Translate(glm::vec3(worldLightPos)); modelMatrix.Scale(0.1f, 0.1f, 0.1f); glUseProgram(g_UnlitProgram.program); glUniformMatrix4fv(g_UnlitProgram.modelViewUnif, 1, GL_FALSE, glm::value_ptr(modelMatrix.Top())); glUniform4f(g_UnlitProgram.objectColorUnif, 0.8078f, 0.8706f, 0.9922f, 1.0f); g_pCubeMesh->render("flat"); } } return GLUS_TRUE; }