/*!**************************************************************************** @Function ReleaseView @Return bool true if no error occured @Description Code in ReleaseView() will be called by PVRShell when the application quits or before a change in the rendering context. ******************************************************************************/ bool OGLES3ShadowMapping::ReleaseView() { // Release textures { const CPVRTArray<SPVRTPFXTexture>& sTex = m_ppPFXEffects[0]->GetTextureArray(); for(unsigned int i = 0; i < sTex.GetSize(); ++i) glDeleteTextures(1, &sTex[i].ui); } // Release Print3D Textures m_Print3D.ReleaseTextures(); glDeleteBuffers(m_Scene.nNumMeshNode, m_puiVbo); glDeleteBuffers(m_Scene.nNumMeshNode, m_puiIndexVbo); // Release the effect[s] then the parser if (m_pPFXEffectParser) for (unsigned int i=0; i < m_pPFXEffectParser->GetNumberEffects(); i++) if (m_ppPFXEffects[i]) delete m_ppPFXEffects[i]; delete [] m_ppPFXEffects; delete m_pPFXEffectParser; return true; }
/*!**************************************************************************** @Function ReleaseView @Return bool true if no error occurred @Description Code in ReleaseView() will be called by PVRShell when the application quits or before a change in the rendering context. ******************************************************************************/ bool OGLES3MagicLantern::ReleaseView() { // Delete all effects. for (unsigned int i=0; i<m_ppEffectParser->GetNumberEffects(); i++) { delete m_pFX[i]; } // Delete the PFX container. delete m_ppEffectParser; // Delete buffer objects. glDeleteBuffers(m_Scene.nNumMesh, m_puiVbo); glDeleteBuffers(m_Scene.nNumMesh, m_puiIndexVbo); // Release loaded textures for(unsigned int uiIndex = 0; uiIndex < m_TextureCache.GetSize(); ++uiIndex) { GLuint uiHandle = m_TextureCache.GetDataAtIndex(uiIndex)->uiHandle; glDeleteTextures(1, &uiHandle); } m_TextureCache.Clear(); // Release Print3D Textures m_Print3D.ReleaseTextures(); return true; }
/*!**************************************************************************** @Function LoadPFX @Return bool true if no error occurred @Description Loads and compiles the shaders and links the shader programs required for this training course ******************************************************************************/ bool OGLES3ShadowMapping::LoadPFX(CPVRTString* pErrorStr) { // Parse the whole PFX and store all data. m_pPFXEffectParser = new CPVRTPFXParser(); if(m_pPFXEffectParser->ParseFromFile(c_szPFXFile, pErrorStr) != PVR_SUCCESS) { *pErrorStr = "Parse failed:\n" + *pErrorStr; return false; } // Setup all effects in the PFX file so we initialize the shaders and // store uniforms and attributes locations. unsigned int uiNumEffects = m_pPFXEffectParser->GetNumberEffects(); m_ppPFXEffects = new CPVRTPFXEffect*[uiNumEffects]; for (unsigned int i=0; i < uiNumEffects; i++) m_ppPFXEffects[i] = 0; // Load one by one the effects. This will also compile the shaders. for (unsigned int i=0; i < uiNumEffects; i++) { m_ppPFXEffects[i] = new CPVRTPFXEffect(m_sContext); if(m_ppPFXEffects[i]->RegisterUniformSemantic(c_CustomSemantics, c_uiNumCustomSemantics, pErrorStr)) { *pErrorStr = "Failed to set custom semantics:\n" + *pErrorStr; return false; } unsigned int nUnknownUniformCount = 0; if(m_ppPFXEffects[i]->Load(*m_pPFXEffectParser, m_pPFXEffectParser->GetEffect(i).Name.c_str(), NULL, NULL, nUnknownUniformCount, pErrorStr) != PVR_SUCCESS) { *pErrorStr = "Failed to load effect " + m_pPFXEffectParser->GetEffect(i).Name.String() + CPVRTString(":\n") + *pErrorStr; return false; } // .. upps, some uniforms are not in our table. Better to quit because something is not quite right. if(nUnknownUniformCount) { *pErrorStr = "Unknown uniform semantic.\n"; return false; } } return true; }
/*!**************************************************************************** @Function InitView @Return bool true if no error occured @Description Code in InitView() will be called by PVRShell upon initialization or after a change in the rendering context. Used to initialize variables that are dependant on the rendering context (e.g. textures, vertex buffers, etc.) ******************************************************************************/ bool OGLES3ShadowMapping::InitView() { CPVRTString ErrorStr; m_bRotate = PVRShellGet(prefIsRotated) && PVRShellGet(prefFullScreen); // Initialize VBO data if(!LoadVbos(&ErrorStr)) { PVRShellSet(prefExitMessage, ErrorStr.c_str()); return false; } // Load textures if (!LoadTextures(&ErrorStr)) { PVRShellSet(prefExitMessage, ErrorStr.c_str()); return false; } // Load and compile the shaders & link programs if (!LoadPFX(&ErrorStr)) { PVRShellSet(prefExitMessage, ErrorStr.c_str()); return false; } // Map the individual effects to make it easier to address them for (unsigned int i=0; i < m_pPFXEffectParser->GetNumberEffects(); i++) { // Store the indices for the individual effects if (m_pPFXEffectParser->GetEffect(i).Name == c_RenderShadowMapEffectName) m_iEffectIndex[INDEX_RENDERSHADOW] = i; else if (m_pPFXEffectParser->GetEffect(i).Name == c_RenderSceneEffectName) m_iEffectIndex[INDEX_RENDERSCENE] = i; } if (!CreateFBO(&ErrorStr)) { PVRShellSet(prefExitMessage, ErrorStr.c_str()); return false; } // Initialize Print3D if (m_Print3D.SetTextures(0, PVRShellGet(prefWidth), PVRShellGet(prefHeight),m_bRotate) != PVR_SUCCESS) { PVRShellSet(prefExitMessage, "ERROR: Cannot initialize Print3D\n"); return false; } // Use a nice bright blue as clear colour glClearColor(0.6f, 0.8f, 1.0f, 1.0f); // Enable culling glEnable(GL_CULL_FACE); // and depth testing glEnable(GL_DEPTH_TEST); return true; }
/*!**************************************************************************** @Function LoadPFX @Output pErrorStr A string describing the error on failure @Return bool true if no error occurred @Description Loads and compiles the shaders and links the shader programs required for this training course ******************************************************************************/ bool OGLES3MagicLantern::LoadPFX(void) { CPVRTString error = ""; // Parse the whole PFX and store all data. m_ppEffectParser = new CPVRTPFXParser(); if(m_ppEffectParser->ParseFromFile(c_szPFXSrcFile, &error) != PVR_SUCCESS) { error = "Parse failed:\n\n" + error; PVRShellSet(prefExitMessage, error.c_str()); return false; } // Setup all effects in the PFX file so we initialise the shaders and // store uniforms and attributes locations. unsigned int uNumEffects = m_ppEffectParser->GetNumberEffects(); for (unsigned int i=0; i<uNumEffects; i++) { // Load one by one the effects. This will also compile the shaders. m_pFX[i] = new CPVRTPFXEffect(); unsigned int nUnknownUniformCount = 0; if(m_pFX[i]->Load(*m_ppEffectParser, m_ppEffectParser->GetEffect(i).Name.c_str(), NULL, this, nUnknownUniformCount, &error) != PVR_SUCCESS) { error = "Effect load failed:\n\n" + error; PVRShellSet(prefExitMessage, error.c_str()); return false; } // .. upps, some uniforms are not in our table. Better to quit because something is not quite right. if(nUnknownUniformCount) { PVRShellOutputDebug(error.c_str()); PVRShellOutputDebug("Unknown uniform semantic count: %d\n", nUnknownUniformCount); return false; } } // Allocate an array of integers to hold an effect ID per material. m_puiMaterialEffectID = new GLuint[m_Scene.nNumMaterial]; // Assign an effect to each material based on its name. // If there is a material with an effect name which is not in the PFX // file, the application will quit and report an error. for(int i = 0; i < (int) m_Scene.nNumMaterial; ++i) { SPODMaterial* pMaterial = &m_Scene.pMaterial[i]; m_puiMaterialEffectID[i] = 0xbad; for (unsigned int j=0; j<uNumEffects; j++) { // Compare the effect string in the material to each effect in our file so we can // match effects to meshes. // All effects are contained in the same PFX file so we do not have to worry about // effects spread across several files. // Note: Each material can only contain a single effect but the same effect // might be applied to several materials. if (m_ppEffectParser->GetEffect(j).Name == pMaterial->pszEffectName) { m_puiMaterialEffectID[i] = j; } } if(m_puiMaterialEffectID[i] == 0xbad) { PVRShellOutputDebug("ERROR: %s effect not found in PFX\n", pMaterial->pszEffectName); return false; } } return true; }