void CheckForCollisions( IGameObject* pGameObject, AUVec3f& desiredPosition, float frameDelta )
	{
		const AUVec3f& refPos = pGameObject->GetEntity()->GetPosition();
		const float refDist = pGameObject->GetCollisionRadius();

		for (int i=0; i<EGT_COUNT; ++i)
		{
			TGameObjects& data = m_Objects[i];
			TGameObjects::iterator it = data.begin();
			TGameObjects::iterator itEnd = data.end();
			while (it != itEnd)
			{
				IGameObject* pTestObject = *it;
				if (pTestObject != pGameObject)
				{
					const AUVec3f& testObjectPos = pTestObject->GetEntity()->GetPosition();
					float distSqr = (refPos - testObjectPos).MagnitudeSqr();
					float minAllowedDist = refDist + pTestObject->GetCollisionRadius();
					if ( (distSqr <= minAllowedDist * minAllowedDist) && (pGameObject->GetGameTeam() != pTestObject->GetGameTeam()) )
					{
						// Set desired position to edge of collision radii		
						AUVec3f dir = (refPos - testObjectPos).GetNormalised();
						desiredPosition = testObjectPos + dir * minAllowedDist;

						pTestObject->OnCollision( pGameObject );
						pGameObject->OnCollision( pTestObject );
					}
				}

				++it;
			}
		}
	}
	void ApplyTeamRepulsionFields( IGameObject* pGameObject, AUVec3f& desiredPosition, float frameDelta )
	{
		const AUVec3f& refPos = pGameObject->GetEntity()->GetPosition();
		const float refDist = pGameObject->GetCollisionRadius();
		const float forceStartMultiplier = 1.5f;

		TGameObjects& data = m_Objects[pGameObject->GetGameTeam()];
		TGameObjects::iterator it = data.begin();
		TGameObjects::iterator itEnd = data.end();
		while (it != itEnd)
		{
			IGameObject* pTeamObject = *it;
			if (pTeamObject != pGameObject)
			{
				const AUVec3f& teamObjectPos = pTeamObject->GetEntity()->GetPosition();
				const float minAllowedDist = refDist + pTeamObject->GetCollisionRadius();
				const float distSqr = (refPos - teamObjectPos).MagnitudeSqr();
				const float forceStart = minAllowedDist * forceStartMultiplier;
				if ( distSqr < forceStart * forceStart )
				{
					float repulsionMagnitude = (forceStart - sqrt(distSqr)) / ( forceStart * ( 1.0f - 1.0f / forceStartMultiplier ) );
					AUVec3f dir = (refPos - teamObjectPos).GetNormalised();
					desiredPosition += dir * pGameObject->GetMaxSpeed() * frameDelta * repulsionMagnitude;
				}
			}
			
			++it;
		}
	}
	// Pushes results into m_workingData
	void DoGetPerceived( const TGameObjects& data, const IGameObject* pPerceiver, const AUVec3f& center, float radius ) const
	{
		size_t count = data.size();
		for (size_t j=0; j<count; ++j)
		{
			IGameObject* pObj = data[j];
			float dist = (pObj->GetEntity()->GetPosition() - center).Magnitude();
			if ( pObj->GetEntityId() != pPerceiver->GetEntityId() && dist < radius )
			{
				m_workingData.push_back( pObj );
			}
		}
	}
	virtual AUVec3f CalculateDesiredPosition( float timeDelta )
	{
		AUVec3f pos = m_pOwner->GetEntity()->GetPosition();

		IGameObject* pGameObject = 0;
		IObjectUtils::GetObject( &pGameObject, m_pBBCommon->enemy_collision_objectid );
		if (pGameObject)
		{
			AUVec3f targetVec = pGameObject->GetEntity()->GetPosition() - m_pBBCommon->current_position;
			AUVec3f targetDir = targetVec.GetNormalised();
			float dist = std::min( targetVec.Magnitude(), m_pOwner->GetMaxSpeed() * timeDelta );
			pos += targetDir * dist;
		}

		return pos;
	}
	IGameObject* GetSelectedObject( const AUVec3f& selectPos )
	{
		IGameObject* pGameObject = 0;
		float dist = FLT_MAX;
		TGameObjects::iterator it = m_Objects.begin();
		TGameObjects::iterator itEnd = m_Objects.end();
		while (it != itEnd)
		{
			IGameObject* pObj = *it;
			const AUVec3f& objPos = pObj->GetEntity()->GetPosition();
			float testDist = AUVec3f(objPos.x - selectPos.x, 0.0f, objPos.z - selectPos.z).Magnitude();
			if ( testDist < pObj->GetCollisionRadius() && testDist < dist )
			{
				pGameObject = pObj;
				dist = testDist;
			}

			++it;
		}

		return pGameObject;
	}