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