//Called to update the display. //You should call glutSwapBuffers after all of your rendering to display what you rendered. //If you need continuous updates of the screen, call glutPostRedisplay() at the end of the function. void display() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if(g_pConeMesh && g_pCylinderMesh && g_pCubeTintMesh && g_pCubeColorMesh && g_pPlaneMesh) { g_camMatrix.SetMatrix(mainCharacter.AcquireCamera().CalcLookAtMatrix()); glutil::MatrixStack modelMatrix; //Render the ground plane. { glutil::PushStack push(modelMatrix); modelMatrix.ApplyMatrix(g_camMatrix.Top()); modelMatrix.Scale(glm::vec3(100.0f, 1.0f, 100.0f)); glUseProgram(UniformColor.theProgram); glUniformMatrix4fv(UniformColor.modelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(modelMatrix.Top())); glUniform4f(UniformColor.baseColorUnif, 0.302f, 0.416f, 0.0589f, 1.0f); g_pPlaneMesh->Render(); glUseProgram(0); } //Draw the trees DrawForest(UniformColorTint, modelMatrix, g_camMatrix); //Draw the building. { glutil::PushStack push(modelMatrix); modelMatrix.ApplyMatrix(g_camMatrix.Top()); modelMatrix.Translate(glm::vec3(20.0f, 0.0f, -10.0f)); DrawParthenon(UniformColorTint, ObjectColor, modelMatrix); } //Draw the treasure for(int i = 0; i < COUNT; i++) { if(littleTreasures[i].IsRemoved() == false) { glutil::PushStack push(modelMatrix); modelMatrix.ApplyMatrix(g_camMatrix.Top()); littleTreasures[i].Update(); littleTreasures[i].Render(UniformColorTint, modelMatrix); } else { littleTreasures[i].Spawn(g_parthenonBaseVolume, g_treeVolumes, ARRAY_COUNT(g_forest), mainCharacter.GetCollisionVolume()); } } } HandleMouse(); glutPostRedisplay(); glutSwapBuffers(); userMouse.OverrideLastPosition(userMouse.GetCurrentPosition()); }