// Render shaders on entities void VPostProcessTranslucencies::DrawEntitiesShaders(const VisEntityCollection_cl &EntityCollection, VPassType_e ePassType) { VisDrawCallInfo_t SurfaceShaderList[RLP_MAX_ENTITY_SURFACESHADERS]; unsigned int iNumEntities = EntityCollection.GetNumEntries(); unsigned int i; Vision::RenderLoopHelper.BeginEntityRendering(); for (i=0; i<iNumEntities; i++) { VisBaseEntity_cl *pEntity = EntityCollection.GetEntry(i); // Foreground entities will be handled separately if (pEntity->IsObjectAlwaysInForegroundEnabled()) continue; if ( pEntity->HasShadersForPass(ePassType) ) { // Get a list of the corresponding pass type surface shaders VisShaderSet_cl *pShaderSet = pEntity->GetActiveShaderSet(); if (pShaderSet == NULL) continue; int iNumSurfaceShaders = pShaderSet->GetShaderAssignmentList(SurfaceShaderList, ePassType, RLP_MAX_ENTITY_SURFACESHADERS); VASSERT(iNumSurfaceShaders < RLP_MAX_ENTITY_SURFACESHADERS); if (iNumSurfaceShaders == 0) continue; VDynamicMesh *pMesh = pEntity->GetMesh(); // If the model has lit surfaces, and if the shaders makes use of the lighting information, we need to set up // the global lights. if (pMesh != NULL && pMesh->HasLitSurfaces() && (pShaderSet->GetCombinedTrackingMask()&(VSHADER_TRACKING_LIGHTGRID_PS|VSHADER_TRACKING_LIGHTGRID_GS|VSHADER_TRACKING_LIGHTGRID_VS)) ) { Vision::RenderLoopHelper.TrackLightGridInfo(pEntity); } // Render the entity with the surface shader list Vision::RenderLoopHelper.RenderEntityWithSurfaceShaderList(pEntity, iNumSurfaceShaders, SurfaceShaderList); } } Vision::RenderLoopHelper.EndEntityRendering(); }
// Renders foreground entities (i.e. entities which have been flagged as "always in foreground") void VPostProcessTranslucencies::DrawTransparentForegroundEntities(const VisEntityCollection_cl &EntityCollection) { unsigned int iNumEntities = EntityCollection.GetNumEntries(); // this collection only contains foreground objects if (iNumEntities==0 || m_spForegroundFillPassTechnique==NULL) return; INSERT_PERF_MARKER_SCOPE("VisionRenderLoop_cl::DrawForegroundEntities"); unsigned int i; const hkvMat4* pLastProj = NULL; Vision::RenderLoopHelper.BeginEntityRendering(); const int iPassCount = m_spForegroundFillPassTechnique->GetShaderCount(); for (int iPass=0;iPass<=iPassCount;iPass++) // +1 passes, where the last one is the actual material pass { for (i=0; i<iNumEntities; i++) { VisBaseEntity_cl *pEntity = EntityCollection.GetEntry(i); // Render only Entities that are flagged as "always in foreground" VASSERT_MSG(pEntity->IsObjectAlwaysInForegroundEnabled(), "Only entities with this flag should be passed to this function"); if (pEntity->HasShadersForPass(VPT_TransparentPass)) { VDynamicMesh *pMesh = pEntity->GetMesh(); VisShaderSet_cl *pShaderSet = pEntity->GetActiveShaderSet(); VASSERT(pMesh && pShaderSet); const hkvMat4* pThisProj = pEntity->GetCustomProjectionMatrixForForegroundObject(); if (pThisProj != pLastProj) { VisRenderStates_cl::SetCurrentProjectionMatrix(pThisProj); pLastProj = pThisProj; } if (iPass<iPassCount) // depth fill pass { VCompiledShaderPass *pPass = m_spForegroundFillPassTechnique->GetShader(iPass); Vision::RenderLoopHelper.RenderEntityWithShaders(pEntity, 1, &pPass); } else // material pass { const VisDrawCallInfo_t *pAssignment; int iNumSurfaceShaders = pShaderSet->GetShaderAssignmentList(&pAssignment); // If the shaders make use of the lighting information, we need to track the light grid if (pMesh != NULL && pMesh->HasLitSurfaces() && (pShaderSet->GetCombinedTrackingMask() & (VSHADER_TRACKING_LIGHTGRID_PS|VSHADER_TRACKING_LIGHTGRID_GS|VSHADER_TRACKING_LIGHTGRID_VS)) ) { Vision::RenderLoopHelper.TrackLightGridInfo(pEntity); } // Render the entity with the surface shader list Vision::RenderLoopHelper.RenderEntityWithSurfaceShaderList(pEntity, iNumSurfaceShaders, pAssignment); } } } } Vision::RenderLoopHelper.EndEntityRendering(); // reset to context projection matrix if (pLastProj) { VisRenderStates_cl::SetCurrentProjectionMatrix(NULL); } }