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 ); }
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 ); }