bool Entity::collides(Entity other)
{
// GETTING ORIENTED BOUNDING BOXES:
vector<Point> e1 = this->getOBB();
vector<Point> e2 = other.getOBB();
// GETTING NUMBER OF FACES FOR EACH ENTITY:
int e1_faces = e1.size();
int e2_faces = e2.size();
// MINIMUM OVERLAP:
float overlap1 = FLT_MAX;
float overlap2 = FLT_MAX;
// FOR EACH FACE RELATIVE TO THIS ENTITY:
for(int i = 0; i < e1_faces; i++)
{
// GET CURRENT FACE:
Point face(e1[i].x - e1[(i + 1) % e1_faces].x, e1[i].y - e1[(i + 1) % e1_faces].y);
// GET CURRENT AXIS PERPENDICULAR TO THE CURRENT FACE:
Point axis(-face.y, face.x);
// NORMALIZE THE AXIS:
axis /= sqrt(axis.x * axis.x + axis.y * axis.y);
// GET MAXIMUM AND MINIMUM POSSIBLE VALUES OF A FLOAT:
Point e1_overlap(FLT_MAX, -FLT_MAX);
Point e2_overlap(FLT_MAX, -FLT_MAX);
// GET THE MAXIMUM AND MINIMUM VALUES OF THIS ENTITY RELATIVE TO THE AXIS:
for(int j = 0; j < e1_faces; j++)
{
float e1_proj = ((axis.x * e1[j].x) + (axis.y * e1[j].y)) / ((axis.x * axis.x) + (axis.y * axis.y));
e1_overlap.x = min(e1_proj, e1_overlap.x);
e1_overlap.y = max(e1_proj, e1_overlap.y);
}
// GET THE MAXIMUM AND MINIMUM VALUES OF THE OTHER ENTITY RELATIVE TO THE AXIS:
for(int j = 0; j < e2_faces; j++)
{
float e2_proj = ((axis.x * e2[j].x) + (axis.y * e2[j].y)) / ((axis.x * axis.x) + (axis.y * axis.y));
e2_overlap.x = min(e2_proj, e2_overlap.x);
e2_overlap.y = max(e2_proj, e2_overlap.y);
}
if((e1_overlap.y - e1_overlap.x) < overlap1)
{
overlap1 = (e1_overlap.y - e1_overlap.x);
}
if((e2_overlap.y - e2_overlap.x) < overlap2)
{
overlap2 = (e2_overlap.y - e2_overlap.x);
}
// EXIT IF THE PROJECTIONS DO NOT OVERLAP:
if(!(e1_overlap.y >= e2_overlap.x && e1_overlap.x <= e2_overlap.y))
{
return false;
}
}
// IF ON ALL AXIS AN OVERLAP OCCURS THEN THE ENTITIES ARE INTERSECTING:
return true;
}