Ejemplo n.º 1
0
const bool Character::canSee( Entity* entity ) const
{
    auto scene = Locator::getGraphics().getScene();
    auto movable = entity->getMovable();
    auto worldEye = getWorldEyePosition();
    auto halfFov = Degree( mFieldOfView.valueDegrees() / 2.0f );
    auto aabb = movable->getWorldAabbUpdated();

    if ( aabb.distance( worldEye ) > mViewDistance )
        return false;

    auto samplingPoints = Math::aabbCorners( aabb );
    for ( size_t i = 0; i < samplingPoints.size(); i++ )
    {
        auto sample = samplingPoints[i];
        if ( sample.distance( worldEye ) <= mViewDistance )
        {
            sample -= worldEye;
            if ( sample.angleBetween( mFacing ) <= halfFov )
            {
                Ogre::Ray ray( worldEye, sample );
                auto query = scene->createRayQuery( ray );

                // Mask out cameras, because 1) we don't care 2) their bounds will
                // be out of date, causing an assertion failure
                uint32_t mask = 0xFFFFFFFF;
                mask &= ~SceneQueryFlag_Camera;
                query->setQueryMask( mask );
                query->setSortByDistance( true );

                auto results = query->execute();
                for ( auto result : results )
                {
                    if ( !result.movable )
                        break;
                    auto flags = result.movable->getQueryFlags();
                    if ( ( flags & SceneQueryFlag_World ) != 0 )
                        break;
                    if ( result.movable->getId() == movable->getId() )
                    {
                        scene->destroyQuery( query );
                        return true;
                    }
                }
                scene->destroyQuery( query );
            }
        }
    }
    return false;
}
void GLES2HardwareOcclusionQuery::notifyOnContextLost()
{
    destroyQuery();
}
/**
  * Object destructor
  */
GLES2HardwareOcclusionQuery::~GLES2HardwareOcclusionQuery() 
{ 
    destroyQuery();
}