void CPixelVisibilitySystem::EndView() { if ( !PixelVisibility_IsAvailable() && CurrentViewID() >= 0 ) return; if ( m_setList.Head( m_activeSetsList ) == m_setList.InvalidIndex() ) return; CMatRenderContextPtr pRenderContext( materials ); IMaterial *pProxy = m_drawQueries ? m_pDrawMaterial : m_pProxyMaterial; pRenderContext->Bind( pProxy ); // BUGBUG: If you draw both queries, the measure query fails for some reason. if ( r_pixelvisibility_partial.GetBool() && !m_drawQueries ) { pRenderContext->DepthRange( 0.0f, 0.01f ); unsigned short node = m_setList.Head( m_activeSetsList ); while( node != m_setList.InvalidIndex() ) { CPixelVisSet *pSet = &m_setList[node]; unsigned short queryNode = FindQueryForView( pSet, CurrentViewID() ); if ( queryNode != m_queryList.InvalidIndex() ) { m_queryList[queryNode].IssueCountingQuery( pRenderContext, pSet->proxySize, pSet->proxyAspect, pProxy, pSet->sizeIsScreenSpace ); } node = m_setList.Next( node ); } pRenderContext->DepthRange( 0.0f, 1.0f ); } { unsigned short node = m_setList.Head( m_activeSetsList ); while( node != m_setList.InvalidIndex() ) { CPixelVisSet *pSet = &m_setList[node]; unsigned short queryNode = FindQueryForView( pSet, CurrentViewID() ); if ( queryNode != m_queryList.InvalidIndex() ) { m_queryList[queryNode].IssueQuery( pRenderContext, pSet->proxySize, pSet->proxyAspect, pProxy, pSet->sizeIsScreenSpace ); } node = m_setList.Next( node ); } } }
unsigned short CPixelVisibilitySystem::FindQueryForView( CPixelVisSet *pSet, int viewID ) { unsigned short node = m_queryList.Head( pSet->queryList ); while ( node != m_queryList.InvalidIndex() ) { if ( m_queryList[node].IsForView( viewID ) ) return node; node = m_queryList.Next( node ); } return m_queryList.InvalidIndex(); }
void CPixelVisibilitySystem::DeleteUnusedQueries( CPixelVisSet *pSet, bool bDeleteAll ) { unsigned short node = m_queryList.Head( pSet->queryList ); while ( node != m_queryList.InvalidIndex() ) { unsigned short next = m_queryList.Next( node ); if ( bDeleteAll || !m_queryList[node].IsActive() ) { m_queryList.Unlink( pSet->queryList, node); m_queryList.LinkToHead( m_freeQueriesList, node ); } node = next; } }
void CPixelVisibilitySystem::DeleteUnusedSets( bool bDeleteAll ) { unsigned short node = m_setList.Head( m_activeSetsList ); while ( node != m_setList.InvalidIndex() ) { unsigned short next = m_setList.Next( node ); CPixelVisSet *pSet = &m_setList[node]; if ( bDeleteAll || !m_setList[node].IsActive() ) { DeleteUnusedQueries( pSet, true ); } else { DeleteUnusedQueries( pSet, false ); } if ( m_queryList.Head(pSet->queryList) == m_queryList.InvalidIndex() ) { FreeSet( node ); } node = next; } }