コード例 #1
0
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 );
    }
}
コード例 #2
0
ファイル: bsp.cpp プロジェクト: cheinkn/basextreme
BSPSector* BSP::sectorRender(BSPSector* sector)
{
    if( intersectAABBFrustum( &sector->_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( &sector->_lsd ) < D3DXVec3LengthSq( &sector->_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;
}