2004-06-03 20:38:14 +02:00
|
|
|
#include "precompiled.h"
|
|
|
|
|
2004-05-28 04:57:50 +02:00
|
|
|
#include "Collision.h"
|
|
|
|
#include "EntityManager.h"
|
|
|
|
|
2004-05-29 05:32:33 +02:00
|
|
|
CBoundingObject* getContainingObject( const CVector2D& point )
|
|
|
|
{
|
|
|
|
std::vector<HEntity>* entities = g_EntityManager.getActive();
|
|
|
|
std::vector<HEntity>::iterator it;
|
|
|
|
|
|
|
|
for( it = entities->begin(); it != entities->end(); it++ )
|
|
|
|
{
|
|
|
|
assert( (*it)->m_bounds );
|
|
|
|
if( (*it)->m_bounds->contains( point ) )
|
|
|
|
{
|
|
|
|
CBoundingObject* bounds = (*it)->m_bounds;
|
|
|
|
delete( entities );
|
|
|
|
return( bounds );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
delete( entities );
|
|
|
|
return( NULL );
|
|
|
|
}
|
|
|
|
|
2004-05-28 04:57:50 +02:00
|
|
|
HEntity getCollisionObject( CEntity* entity )
|
|
|
|
{
|
|
|
|
assert( entity->m_bounds );
|
|
|
|
|
|
|
|
std::vector<HEntity>* entities = g_EntityManager.getActive();
|
|
|
|
std::vector<HEntity>::iterator it;
|
|
|
|
|
|
|
|
for( it = entities->begin(); it != entities->end(); it++ )
|
|
|
|
{
|
|
|
|
assert( (*it)->m_bounds );
|
|
|
|
if( (*it)->m_bounds == entity->m_bounds ) continue;
|
|
|
|
if( entity->m_bounds->intersects( (*it)->m_bounds ) )
|
|
|
|
{
|
|
|
|
HEntity collisionObject = *it;
|
|
|
|
delete( entities );
|
|
|
|
return( collisionObject );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
delete( entities );
|
2004-06-02 18:11:32 +02:00
|
|
|
return HEntity();
|
2004-05-28 04:57:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
HEntity getCollisionObject( CEntity* entity, float x, float y )
|
|
|
|
{
|
|
|
|
float _x = entity->m_bounds->m_pos.x;
|
|
|
|
float _y = entity->m_bounds->m_pos.y;
|
|
|
|
entity->m_bounds->setPosition( x, y );
|
|
|
|
HEntity _e = getCollisionObject( entity );
|
|
|
|
entity->m_bounds->setPosition( _x, _y );
|
|
|
|
return( _e );
|
2004-05-29 05:32:33 +02:00
|
|
|
}
|
|
|
|
|
2004-06-03 04:20:48 +02:00
|
|
|
bool getRayIntersection( const CVector2D& source, const CVector2D& forward, const CVector2D& right, float length, float maxDistance, CBoundingObject* destinationCollisionObject, rayIntersectionResults* results )
|
2004-05-29 05:32:33 +02:00
|
|
|
{
|
|
|
|
std::vector<HEntity>* entities = g_EntityManager.getActive();
|
|
|
|
std::vector<HEntity>::iterator it;
|
|
|
|
|
|
|
|
float closestApproach, dist;
|
|
|
|
|
|
|
|
CVector2D delta;
|
|
|
|
|
|
|
|
results->distance = length + maxDistance;
|
|
|
|
results->boundingObject = NULL;
|
|
|
|
|
|
|
|
for( it = entities->begin(); it != entities->end(); it++ )
|
|
|
|
{
|
|
|
|
assert( (*it)->m_bounds );
|
2004-06-03 04:20:48 +02:00
|
|
|
if( (*it)->m_bounds == destinationCollisionObject ) continue;
|
|
|
|
// HACK:
|
|
|
|
if( (*it)->m_bounds->m_type == CBoundingObject::BOUND_OABB ) continue;
|
2004-05-29 05:32:33 +02:00
|
|
|
if( (*it)->m_speed ) continue;
|
|
|
|
CBoundingObject* obj = (*it)->m_bounds;
|
|
|
|
delta = obj->m_pos - source;
|
|
|
|
closestApproach = delta.dot( right );
|
|
|
|
dist = delta.dot( forward );
|
2004-06-03 04:20:48 +02:00
|
|
|
float collisionRadius = maxDistance + obj->m_radius;
|
2004-05-29 05:32:33 +02:00
|
|
|
|
2004-06-03 04:20:48 +02:00
|
|
|
if( ( fabs( closestApproach ) < collisionRadius ) && ( dist > collisionRadius * 0.0f ) && ( dist < length - collisionRadius * 0.0f ) )
|
2004-05-29 05:32:33 +02:00
|
|
|
{
|
|
|
|
if( dist < results->distance )
|
|
|
|
{
|
|
|
|
results->boundingObject = obj;
|
|
|
|
results->closestApproach = closestApproach;
|
|
|
|
results->distance = dist;
|
|
|
|
results->hEntity = (*it);
|
|
|
|
results->position = obj->m_pos;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
delete( entities );
|
|
|
|
if( results->boundingObject ) return( true );
|
|
|
|
return( false );
|
2004-06-02 18:11:32 +02:00
|
|
|
}
|