void ZQuadTree::_FrustumCull(CGeoMapData &pHeightMap, Point &bottomLeft, CFrustum& pFrustum) { int ret; ret = _IsInFrustum(pHeightMap, bottomLeft, pFrustum); switch(ret) { case FRUSTUM_COMPLETELY_IN: m_bCulled = false; return; case FRUSTUM_PRTIALLY_IN: m_bCulled = false; break; case FRUSTUM_OUT: m_bCulled = true; return; } if(m_pChild[0]) m_pChild[0] ->_FrustumCull(pHeightMap, bottomLeft, pFrustum); if(m_pChild[1]) m_pChild[1] ->_FrustumCull(pHeightMap, bottomLeft, pFrustum); if(m_pChild[2]) m_pChild[2] ->_FrustumCull(pHeightMap, bottomLeft, pFrustum); if(m_pChild[3]) m_pChild[3] ->_FrustumCull(pHeightMap, bottomLeft, pFrustum); }
void AVQuadTree::_FrustumCull(TERRAIN_VERTEX *pHeightMap, AVFrustum *pFrustum ) { int result = _IsInFrustum(pHeightMap, pFrustum); if(result == FRUSTUM_TYPE_COMPLETE) { m_bCulled = false; return; } else if(result == FRUSTUM_TYPE_COMPLETELY) m_bCulled = false; else // FRUSTUM_TYPE_NO { m_bCulled = true; return; } for(int i=0; i<4; i++) if(m_pChild[i]) m_pChild[i]->_FrustumCull(pHeightMap, pFrustum); }
// _IsInFrustum()함수의 결과에 따라 프러스텀 컬링 수행 void ZQuadTree::_FrustumCull( TERRAINVERTEX* pHeightMap, ZFrustum* pFrustum ) { int ret; ret = _IsInFrustum( pHeightMap, pFrustum ); switch( ret ) { case FRUSTUM_COMPLETELY_IN : // 프러스텀에 완전포함, 하위노드 검색 필요없음 m_bCulled = FALSE; return; case FRUSTUM_PARTIALLY_IN : // 프러스텀에 일부포함, 하위노드 검색 필요함 m_bCulled = FALSE; break; case FRUSTUM_OUT : // 프러스텀에서 완전벗어남, 하위노드 검색 필요없음 m_bCulled = TRUE; return; } if( m_pChild[0] ) m_pChild[0]->_FrustumCull( pHeightMap, pFrustum ); if( m_pChild[1] ) m_pChild[1]->_FrustumCull( pHeightMap, pFrustum ); if( m_pChild[2] ) m_pChild[2]->_FrustumCull( pHeightMap, pFrustum ); if( m_pChild[3] ) m_pChild[3]->_FrustumCull( pHeightMap, pFrustum ); }