//------------------------------------------------------------------------------------ void Scene::Enter() { g_env.pSceneMgr->ClearScene(); if(!m_bSetup) { m_setupFunc(this); m_bSetup = true; } // Compute and store the scene aabb m_sceneAABB.SetNull(); m_sceneShadowCasterAABB.SetNull(); m_sceneShadowReceiverAABB.SetNull(); for (size_t i=0; i<m_lstEntity.size(); ++i) { Entity* pEntity = m_lstEntity[i]; pEntity->UpdateAABB(); m_sceneAABB.Merge(pEntity->GetWorldAABB()); if (pEntity->GetCastShadow()) { m_sceneShadowCasterAABB.Merge(pEntity->GetWorldAABB()); } m_sceneShadowReceiverAABB.Merge(pEntity->GetWorldAABB()); } m_enterFunc(this); }
//------------------------------------------------------------------------------- void SceneManager::RenderPipline(uint32 phaseFlag, Material* pMaterial) { //================================================================================ /// Render sky //================================================================================ if (m_pSky && phaseFlag&eRenderPhase_Sky) { m_pSky->Render(); } //================================================================================ /// Render terrain //================================================================================ if (m_pTerrain && phaseFlag&eRenderPhase_Terrain) { m_pTerrain->Render(pMaterial); } else if (m_pTerrain && phaseFlag&eRenderPhase_ShadowMap) { m_pTerrain->Render(m_pTerrain->GetShadowMaterial()); } //================================================================================ /// Render SSAO map //================================================================================ if (phaseFlag & eRenderPhase_SSAO) { m_pSSAO->Update(); // Make use of early-Z D3D11_DEPTH_STENCIL_DESC& depthDesc = m_pRenderSystem->GetDepthStencilDesc(); depthDesc.DepthFunc = D3D11_COMPARISON_EQUAL; depthDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; m_pRenderSystem->SetDepthStencelState(depthDesc); } //================================================================================ /// Render entities //================================================================================ Scene::EntityList& lstEntity = m_pCurScene->GetEntityList(); if (phaseFlag & eRenderPhase_Solid) { for (size_t i=0; i<lstEntity.size(); ++i) { lstEntity[i]->Render(pMaterial); } } else if (phaseFlag & eRenderPhase_ShadowMap) { for (size_t i=0; i<lstEntity.size(); ++i) { Entity* ent = lstEntity[i]; if(ent->GetCastShadow()) ent->Render(); } } if (phaseFlag & eRenderPhase_SSAO) { D3D11_DEPTH_STENCIL_DESC& depthDesc = m_pRenderSystem->GetDepthStencilDesc(); depthDesc.DepthFunc = D3D11_COMPARISON_LESS; depthDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; m_pRenderSystem->SetDepthStencelState(depthDesc); } //================================================================================ /// Render water //================================================================================ if (m_pWater && phaseFlag&eRenderPhase_Water) { m_pWater->Render(); } //================================================================================ /// Render UI //================================================================================ if (phaseFlag & eRenderPhase_UI) { D3D11_DEPTH_STENCIL_DESC& depthDesc = m_pRenderSystem->GetDepthStencilDesc(); depthDesc.DepthEnable = FALSE; depthDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; m_pRenderSystem->SetDepthStencelState(depthDesc); char szBuf[64]; sprintf_s(szBuf, sizeof(szBuf), "lastFPS : %f", g_env.pFrameStat->lastFPS); m_pRenderSystem->DrawText(szBuf, IPOINT(10,10), Neo::SColor::YELLOW); // Debug RT if (m_debugRT == eDebugRT_SSAO) { m_pDebugRTMesh->Render(); } else if (m_debugRT == eDebugRT_ShadowMap) { m_pDebugRTMesh->Render(); } depthDesc.DepthEnable = TRUE; depthDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; m_pRenderSystem->SetDepthStencelState(depthDesc); } }