예제 #1
0
 void destroyCollider(Collider* collider)
 {
     ColliderList::iterator it = mColliderList.find(collider);
     if (it != mColliderList.end())
     {
         mColliderList.erase(it);
         delete collider;
     }
 }
bool AiMovementWaypoint::findObstacle()
{
	PROFILER_AUTO_BLOCK_DEFINE("AiMovementWaypoint::findObstacle");

	CreatureObject * const creatureOwner = m_controller->getCreature();
	Vector const & creaturePosition_p = creatureOwner->getPosition_p();
	Vector const & goalPosition_p = getWaypoint().getPosition_p();
	Vector delta = goalPosition_p - creaturePosition_p;

	// Clamp the obstacle lookahead distance to 5 meters

	if (delta.magnitudeSquared() > 25.0f)
	{
		IGNORE_RETURN( delta.normalize() );

		delta *= 5.0f;
	}

	ColliderList collidedWith;

	// Collide with the statics in the world
	{
		bool const restrictToSameCell = true;
		Capsule const capsule(creaturePosition_p, creaturePosition_p + delta, m_controller->getCreatureRadius());
		
		CollisionWorld::getDatabase()->queryFor(SpatialDatabase::Q_Static, m_controller->getCreatureCell(), restrictToSameCell, capsule, collidedWith);
	}

	// Check out the collision results
	// Note: this needs to check for the closest collision object from the owner's position
	{
		m_obstacleLocation = AiLocation();
		ColliderList::const_iterator iterCollider = collidedWith.begin();

		for (; iterCollider != collidedWith.end(); ++iterCollider)
		{
			CollisionProperty * const collisionProperty = *iterCollider;
			Object const & object = collisionProperty->getOwner();

			if (object.getNetworkId() != creatureOwner->getNetworkId())
			{
				// We have collided with something
	
				m_obstacleLocation = AiLocation(&object);
				break;
			}
		}
	}

	if (!m_obstacleLocation.isValid())
	{
		return false;
	}

	return updateAvoidancePoint(0.0f);
}
예제 #3
0
        ~CollisionManagerImpl()
        {
            for (ColliderSetList::const_iterator si = mColliderSetList.begin(); si != mColliderSetList.end(); ++si)
            {
                delete *si;
            }

            for (ColliderList::const_iterator ci = mColliderList.begin(); ci != mColliderList.end(); ++ci)
            {
                delete *ci;
            }
        }
예제 #4
0
 T* _addCollider(T* collider)
 {
     mColliderList.insert(collider);
     return collider;
 }