98 lines
3.4 KiB
C++
98 lines
3.4 KiB
C++
#include "precompile.h"
|
|
|
|
#include "entity.h"
|
|
#include "collider.h"
|
|
#include "collision.h"
|
|
|
|
bool ColliderComponent::IntersectSegment(Vector2D& p0, Vector2D& p1)
|
|
{
|
|
switch (type) {
|
|
case CT_None:
|
|
break;
|
|
case CT_Aabb:
|
|
{
|
|
AabbCollider* a_aabb = (AabbCollider*)this;
|
|
return IntersectSegmentAabb(p0,
|
|
p1,
|
|
a_aabb->owner->pos + a_aabb->_min,
|
|
a_aabb->owner->pos + a_aabb->_max);
|
|
}
|
|
break;
|
|
case CT_Circle:
|
|
{
|
|
CircleCollider* a_circle = (CircleCollider*)this;
|
|
return IntersectSegmentCircle(p0,
|
|
p1,
|
|
a_circle->owner->pos + a_circle->pos,
|
|
a_circle->rad);
|
|
}
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool ColliderComponent::Intersect(ColliderComponent* b)
|
|
{
|
|
switch (type) {
|
|
case CT_None:
|
|
break;
|
|
case CT_Aabb:
|
|
{
|
|
AabbCollider* a_aabb = (AabbCollider*)this;
|
|
switch (b->type) {
|
|
case CT_None:
|
|
break;
|
|
case CT_Aabb:
|
|
{
|
|
AabbCollider* b_aabb = (AabbCollider*)b;
|
|
return IntersectAabbAabb(a_aabb->owner->pos + a_aabb->_min,
|
|
a_aabb->owner->pos + a_aabb->_max,
|
|
b_aabb->owner->pos + b_aabb->_min,
|
|
b_aabb->owner->pos + b_aabb->_max
|
|
);
|
|
}
|
|
break;
|
|
case CT_Circle:
|
|
{
|
|
CircleCollider* b_circle = (CircleCollider*)b;
|
|
return IntersectAabbCircle(a_aabb->owner->pos + a_aabb->_min,
|
|
a_aabb->owner->pos + a_aabb->_max,
|
|
b_circle->owner->pos + b_circle->pos,
|
|
b_circle->rad);
|
|
}
|
|
break;
|
|
}
|
|
};
|
|
break;
|
|
case CT_Circle:
|
|
{
|
|
CircleCollider* a_circle = (CircleCollider*)this;
|
|
switch (b->type) {
|
|
case CT_None:
|
|
break;
|
|
case CT_Aabb:
|
|
{
|
|
AabbCollider* b_aabb = (AabbCollider*)b;
|
|
return IntersectAabbCircle(b_aabb->owner->pos + b_aabb->_min,
|
|
b_aabb->owner->pos + b_aabb->_max,
|
|
a_circle->owner->pos + a_circle->pos,
|
|
a_circle->rad);
|
|
}
|
|
break;
|
|
case CT_Circle:
|
|
{
|
|
CircleCollider* b_circle = (CircleCollider*)b;
|
|
return IntersectCircleCircle(
|
|
a_circle->owner->pos + a_circle->pos,
|
|
a_circle->rad,
|
|
b_circle->owner->pos + b_circle->pos,
|
|
b_circle->rad);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
return false;
|
|
}
|