void Batch::Sector::render(float maxDistance) { if( left == NULL && right == NULL ) { // calculate nearest (rough) distance to this sector Vector distance; D3DXVec3Subtract( &distance, &boundingSphere.center, &Camera::eyePos ); float nearestDistance = D3DXVec3Length( &distance ) - boundingSphere.radius; Color color = yellow; // mark too far sectors with red color if( nearestDistance > maxDistance ) { color = red; } // render AABB dxRenderAABB( &boundingBox, &color, NULL ); } else { if( left ) static_cast<Sector*>(left)->render( maxDistance ); if( right ) static_cast<Sector*>(right)->render( maxDistance ); } }
BSPSector* BSP::sectorRender(BSPSector* sector) { if( intersectAABBFrustum( §or->_boundingBox, Camera::frustrum ) ) { if( sector->_leftSubset ) { sector->_lsc = sector->_leftSubset->getBoundingBox()->inf + 0.5f * ( sector->_leftSubset->getBoundingBox()->sup - sector->_leftSubset->getBoundingBox()->inf ); sector->_rsc = sector->_rightSubset->getBoundingBox()->inf + 0.5f * ( sector->_rightSubset->getBoundingBox()->sup - sector->_rightSubset->getBoundingBox()->inf ); sector->_lsd = Camera::eyePos - sector->_lsc; sector->_rsd = Camera::eyePos - sector->_rsd; if( D3DXVec3LengthSq( §or->_lsd ) < D3DXVec3LengthSq( §or->_rsd ) ) { sectorRender( sector->_leftSubset ); sectorRender( sector->_rightSubset ); } else { sectorRender( sector->_rightSubset ); sectorRender( sector->_leftSubset ); } } else { sector->render(); if( Engine::instance->getRenderMode() & engine::rmBSPAABB ) { if( sector->_atomicsInSector.size() ) { dxRenderAABB( sector->getBoundingBox(), &green, NULL ); } else { dxRenderAABB( sector->getBoundingBox(), &yellow, NULL ); } } } } return sector; }