201 lines
4.5 KiB
C++
201 lines
4.5 KiB
C++
#include "cCollision.hpp"
|
|
|
|
using MathEngine::cCollision;
|
|
using MathEngine::Vector4;
|
|
using MathEngine::Vector2;
|
|
using MathEngine::iVector4;
|
|
using MathEngine::iVector2;
|
|
|
|
cCollision::cCollision()
|
|
{
|
|
}
|
|
|
|
cCollision::~cCollision()
|
|
{
|
|
}
|
|
|
|
/// Functions
|
|
/*static*/ const bool cCollision::BoundingBox( const SDL_Rect& a, const SDL_Rect& b )
|
|
{
|
|
if ((b.x + b.w) < a.x)
|
|
return false; //just checking if their
|
|
if ((a.x + a.w) < b.x )
|
|
return false; //bounding boxes even touch
|
|
|
|
if ((b.y + b.h) < a.y)
|
|
return false;
|
|
if ((a.y + a.h) < b.y)
|
|
return false;
|
|
|
|
return true; //bounding boxes intersect
|
|
}
|
|
|
|
/*static*/ const bool cCollision::BoundingBox( const Vector4& a, const Vector4& b )
|
|
{
|
|
if ((b.x + b.z) < a.x)
|
|
return false; //just checking if their
|
|
if ((a.x + a.z) < b.x )
|
|
return false; //bounding boxes even touch
|
|
|
|
if ((b.y + b.w) < a.y)
|
|
return false;
|
|
if ((a.y + a.w) < b.y)
|
|
return false;
|
|
|
|
return true; //bounding boxes intersect
|
|
}
|
|
|
|
/*static*/ const bool cCollision::BoundingBox( const SDL_Rect& a, const Vector4& b )
|
|
{
|
|
Vector4 temp = a;
|
|
|
|
return cCollision::BoundingBox(temp, b);
|
|
}
|
|
|
|
/*static*/ const bool cCollision::BoundingBox( const Vector4& a, const SDL_Rect& b )
|
|
{
|
|
return cCollision::BoundingBox(b, a);
|
|
}
|
|
|
|
/*static*/ const bool cCollision::BoundingBox( const iVector4& a, const iVector4& b )
|
|
{
|
|
if ((b.x + b.z) < a.x)
|
|
return false; //just checking if their
|
|
if ((a.x + a.z) < b.x )
|
|
return false; //bounding boxes even touch
|
|
|
|
if ((b.y + b.w) < a.y)
|
|
return false;
|
|
if ((a.y + a.w) < b.y)
|
|
return false;
|
|
|
|
return true; //bounding boxes intersect
|
|
}
|
|
|
|
/*static*/ const bool cCollision::BoundingBox( const SDL_Rect& a, const iVector4& b )
|
|
{
|
|
iVector4 temp = a;
|
|
|
|
return cCollision::BoundingBox(temp, b);
|
|
}
|
|
|
|
/*static*/ const bool cCollision::BoundingBox( const iVector4& a, const SDL_Rect& b )
|
|
{
|
|
return cCollision::BoundingBox(b, a);
|
|
}
|
|
|
|
/*static*/ const bool cCollision::BoundingBox( const iVector4& a, const Vector4& b )
|
|
{
|
|
Vector4 temp = a;
|
|
|
|
return cCollision::BoundingBox( temp, b );
|
|
}
|
|
|
|
/*static*/ const bool cCollision::BoundingBox( const Vector4& a, const iVector4& b )
|
|
{
|
|
return cCollision::BoundingBox( b, a );
|
|
}
|
|
|
|
/*static*/ const Vector2 cCollision::Inside( const SDL_Rect& a, const SDL_Rect& b )
|
|
{
|
|
Vector2 rtn;
|
|
rtn.x = 0.0f;
|
|
rtn.y = 0.0f;
|
|
|
|
//Check if left side of b is inside of a
|
|
if (b.x < a.x)
|
|
rtn.x = (float)(b.x - a.x);
|
|
//Check if right side of b is inside of a
|
|
if ((b.x + b.w) > (a.x + a.w))
|
|
rtn.x = (float)((b.x + b.w) - (a.x + a.w));
|
|
//Check if top side of b is inside of a
|
|
if (b.y < a.y)
|
|
rtn.y = (float)(b.y - a.y);
|
|
//Check if botton side of b is inside of a
|
|
if ((b.y + b.h) > (a.y + a.h))
|
|
rtn.y = (float)((b.y + b.h) - (a.y + a.h));
|
|
|
|
return rtn;
|
|
}
|
|
|
|
/*static*/ const Vector2 cCollision::Inside( const Vector4& a, const Vector4& b )
|
|
{
|
|
Vector2 rtn;
|
|
rtn.x = 0.0f;
|
|
rtn.y = 0.0f;
|
|
|
|
//Check if left side of b is inside of a
|
|
if (b.x < a.x)
|
|
rtn.x = a.x - b.x;
|
|
//Check if right side of b is inside of a
|
|
if ((b.x + b.z) > (a.x + a.z))
|
|
rtn.x = (a.x + a.z) - (b.x + b.z);
|
|
//Check if top side of b is inside of a
|
|
if (b.y < a.y)
|
|
rtn.y = a.y - b.y;
|
|
//Check if botton side of b is inside of a
|
|
if ((b.y + b.w) > (a.y + a.w))
|
|
rtn.y = (a.y + a.w) - (b.y + b.w);
|
|
|
|
return rtn;
|
|
}
|
|
|
|
/*static*/ const Vector2 cCollision::Inside( const SDL_Rect& a, const Vector4& b )
|
|
{
|
|
Vector4 temp = a;
|
|
|
|
return cCollision::Inside(temp, b);
|
|
}
|
|
|
|
/*static*/ const Vector2 cCollision::Inside( const Vector4& a, const SDL_Rect& b )
|
|
{
|
|
Vector4 temp = b;
|
|
|
|
return cCollision::Inside(a, temp);
|
|
}
|
|
|
|
/*static*/ const iVector2 cCollision::Inside( const iVector4& a, const iVector4& b )
|
|
{
|
|
iVector2 rtn;
|
|
rtn.x = 0;
|
|
rtn.y = 0;
|
|
|
|
//Check if left side of b is inside of a
|
|
if (b.x < a.x)
|
|
rtn.x = b.x - a.x;
|
|
//Check if right side of b is inside of a
|
|
if ((b.x + b.z) > (a.x + a.z))
|
|
rtn.x = (b.x + b.z) - (a.x + a.z);
|
|
//Check if top side of b is inside of a
|
|
if (b.y < a.y)
|
|
rtn.y = b.y - a.y;
|
|
//Check if botton side of b is inside of a
|
|
if ((b.y + b.w) > (a.y + a.w))
|
|
rtn.y = (b.y + b.w) - (a.y + a.w);
|
|
|
|
return rtn;
|
|
}
|
|
|
|
/*static*/ const iVector2 cCollision::Inside( const SDL_Rect& a, const iVector4& b )
|
|
{
|
|
iVector4 temp = a;
|
|
|
|
return cCollision::Inside( temp, b );
|
|
}
|
|
|
|
/*static*/ const iVector2 cCollision::Inside( const iVector4& a, const SDL_Rect& b )
|
|
{
|
|
return cCollision::Inside( b, a );
|
|
}
|
|
|
|
/*static*/ const Vector2 cCollision::Inside( const iVector4& a, const Vector4& b )
|
|
{
|
|
Vector4 temp = a;
|
|
|
|
return cCollision::Inside( temp, b );
|
|
}
|
|
|
|
/*static*/ const Vector2 cCollision::Inside( const Vector4& a, const iVector4& b )
|
|
{
|
|
return cCollision::Inside( b, a );
|
|
} |