game2001/server/gameserver/collider.cc
2019-03-20 19:58:28 +08:00

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;
}