/*!**************************************************************************** @Function RenderScene @Return bool true if no error occurred @Description Main rendering loop function of the program. The shell will call this function every frame. eglSwapBuffers() will be performed by PVRShell automatically. PVRShell will also manage important OS events. Will also manage relevant OS events. The user has access to these events through an abstraction layer provided by PVRShell. ******************************************************************************/ bool OGLES2FilmTV::RenderScene() { // Use shader program glUseProgram(m_ShaderProgram.uiId); // Enable the vertex attribute arrays glEnableVertexAttribArray(VERTEX_ARRAY); glEnableVertexAttribArray(NORMAL_ARRAY); // Render everything from the mini-camera's point of view if we have the FBOs CalcMiniCameraView(); if(m_bFBOsCreated) { // Setup the Viewport to the dimensions of the texture glViewport(0, 0, m_i32TexSize, m_i32TexSize); glBindFramebuffer(GL_FRAMEBUFFER, m_uiFbo[m_i32CurrentFBO]); DrawPODScene(m_MiniCamViewProj, false); if(m_bDiscard) // Was GL_EXT_discard_framebuffer supported? { /* Give the drivers a hint that we don't want the depth and stencil information stored for future use. Note: This training course doesn't have any stencil information so the STENCIL_ATTACHMENT enum is used for demonstrations purposes only and will be ignored by the driver. */ const GLenum attachments[] = { GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT }; m_Extensions.glDiscardFramebufferEXT(GL_FRAMEBUFFER, 2, attachments); } glBindFramebuffer(GL_FRAMEBUFFER, m_i32OriginalFB); // Render everything // Setup the Viewport to the dimensions of the screen glViewport(0, 0, PVRShellGet(prefWidth), PVRShellGet(prefHeight)); } DrawPODScene(m_ViewProjection, true); // Displays the demo name using the tools. For a detailed explanation, see the training course IntroducingPVRTools m_Print3D.DisplayDefaultTitle("FilmTV", "", ePVRTPrint3DSDKLogo); m_Print3D.Flush(); // Swap the FBO that we want to render to m_i32CurrentFBO = 1 - m_i32CurrentFBO; ++m_i32Frame; return true; }
/*!**************************************************************************** @Function RenderScene @Return bool true if no error occured @Description Main rendering loop function of the program. The shell will call this function every frame. eglSwapBuffers() will be performed by PVRShell automatically. PVRShell will also manage important OS events. Will also manage relevent OS events. The user has access to these events through an abstraction layer provided by PVRShell. ******************************************************************************/ bool OGLES3TextureStreaming::RenderScene() { // Clears the color and depth buffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Time based animation and locks the app to 60 FPS. // Uses the shell function PVRShellGetTime() to get the time in milliseconds. unsigned long ulTime = PVRShellGetTime(); unsigned long ulDeltaTime = ulTime - m_ulTimePrev; m_ulTimePrev = ulTime; m_fFrame += (float)ulDeltaTime * (60.0f/1000.0f); m_fBandScroll += (float)ulDeltaTime * (60.0f/1000.0f) * c_fBandScrollSpeed; if(m_fFrame > m_Scene.nNumFrame - 1) m_fFrame = 0.0f; if(m_fBandScroll > 1.0f) m_fBandScroll = -c_fBandWidth; bool bRotate = PVRShellGet(prefIsRotated) && PVRShellGet(prefFullScreen); m_Scene.SetFrame(m_fFrame); // Setup the main camera PVRTVec3 vFrom, vTo(0.0f), vUp(0.0f, 1.0f, 0.0f); float fFOV; // Camera nodes are after the mesh and light nodes in the array int i32CamID = m_Scene.pNode[m_Scene.nNumMeshNode + m_Scene.nNumLight + c_ui32Camera].nIdx; // Get the camera position, target and field of view (fov) if(m_Scene.pCamera[i32CamID].nIdxTarget != -1) // Does the camera have a target? fFOV = m_Scene.GetCameraPos( vFrom, vTo, c_ui32Camera); // vTo is taken from the target node else fFOV = m_Scene.GetCamera( vFrom, vTo, vUp, c_ui32Camera); // vTo is calculated from the rotation float fTargetAspect = 960.0f/640.0f; float fAspect = (float)PVRShellGet(prefWidth) / (float)PVRShellGet(prefHeight); fFOV *= fTargetAspect / fAspect; PVRTMat4 mView = PVRTMat4::LookAtRH(vFrom, vTo, vUp); PVRTMat4 mProjection = PVRTMat4::PerspectiveFovRH(fFOV, (float)PVRShellGet(prefWidth)/(float)PVRShellGet(prefHeight), c_fCameraNear, c_fCameraFar, PVRTMat4::OGL, bRotate); PVRTMat4 mViewProjection = mProjection * mView; DrawPODScene(mViewProjection); // Displays the demo name using the tools. For a detailed explanation, see the training course IntroducingPVRTools m_Print3D.DisplayDefaultTitle("Texture Streaming", c_pszDescription, ePVRTPrint3DSDKLogo); m_Print3D.Flush(); ++m_i32Frame; return true; }