Actor::Actor(const String& name, ActorControlledObject* aco,
        PhysicalThing* pt, UserDefinedObject* go)
        : mName(name),
        mPhysicalThing(pt),
        mGameObject(go),
        mActorControlledObject(aco),
        mParent(0),
        mChilds(),
        mSceneNode(0),
        mDescription(0),
        mHighlighted(false),
        mBone(0)
    {
        if (mActorControlledObject != NULL)
        {
            mActorControlledObject->_setActor(this);
        }

        setRenderingDistance( ActorManager::getSingleton().getDefaultActorRenderingDistance() );

        if (mPhysicalThing != NULL)
        {
            mPhysicalThing->_setActor(this);
        }
        setQueryMask( QGF_DEFAULT );
    }
Exemple #2
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 Actor::removeQueryFlag( unsigned long flag )
 {
     setQueryMask(  getQueryMask() &~ flag );
 }
 void Actor::addQueryFlag( unsigned long flag  )
 {
     setQueryMask(  getQueryMask() | flag );
 }