10 #include "math/vector.h"
11 #include "math/aatriangle.h"
12 #include "math/rectangle.h"
13 #include "collision_hit.h"
19 Collision::rectangle_rectangle(CollisionHit& hit, const Rectangle& r1,
22 if(r1.p2.x < r2.p1.x || r1.p1.x > r2.p2.x)
24 if(r1.p2.y < r2.p1.y || r1.p1.y > r2.p2.y)
27 hit.depth = r1.p2.x - r2.p1.x;
31 float px2 = r2.p2.x - r1.p1.x;
38 float py1 = r1.p2.y - r2.p1.y;
45 float py2 = r2.p2.y - r1.p1.y;
55 //---------------------------------------------------------------------------
57 static void makePlane(const Vector& p1, const Vector& p2, Vector& n, float& c)
59 n = Vector(p2.y-p1.y, p1.x-p2.x);
61 float nval = n.norm();
67 Collision::rectangle_aatriangle(CollisionHit& hit, const Rectangle& rect,
68 const AATriangle& triangle)
70 if(!rectangle_rectangle(hit, rect, (const Rectangle&) triangle))
76 switch(triangle.dir) {
77 case AATriangle::SOUTHWEST:
78 p1 = Vector(rect.p1.x, rect.p2.y);
79 makePlane(triangle.p1, triangle.p2, normal, c);
81 case AATriangle::NORTHEAST:
82 p1 = Vector(rect.p2.x, rect.p1.y);
83 makePlane(triangle.p2, triangle.p1, normal, c);
85 case AATriangle::SOUTHEAST:
87 makePlane(Vector(triangle.p1.x, triangle.p2.y),
88 Vector(triangle.p2.x, triangle.p1.y), normal, c);
90 case AATriangle::NORTHWEST:
92 makePlane(Vector(triangle.p2.x, triangle.p1.y),
93 Vector(triangle.p1.x, triangle.p2.y), normal, c);
97 float depth = -(normal * p1) - c;
100 if(depth < hit.depth) {