bool iTest (const AABB2D &ac, const Ray2D &bc) { assert(bc.direction[0] + bc.direction[1] != 0); Ray2D ray = bc; for (int i = 0; i < 2; ++i) ray.direction[i] = (ray.direction[i] == 0) ? FLT_EPSILON : ray.direction[i]; Plane2D planes[4]; planes[0] = { Vector2{ ac.min.x , ac.pos().y },Vector2{ -1, 0 } }; planes[1] = { Vector2{ ac.pos().x, ac.min.y },Vector2{ 0,-1 } }; planes[2] = { Vector2{ ac.max.x , ac.pos().y },Vector2{ 1, 0 } }; planes[3] = { Vector2{ ac.pos().x, ac.max.y },Vector2{ 0, 1 } }; float dists[4]; float tmin = FLT_MAX; float tmax = -FLT_MAX; for (int i = 0; i < 4; ++i) { float deno = -(dot(planes[i].normal, ray.direction)); dists[i] = dot(planes[i].normal, (ray.position - planes[i].position)) / deno; } tmin = fmaxf(fminf(dists[0], dists[2]), fminf(dists[1], dists[3])); tmax = fminf(fmaxf(dists[0], dists[2]), fmaxf(dists[1], dists[3])); return tmin <= tmax && 0 <= tmin <= bc.length; }
CollisionData iTest_data(const AABB2D &ac, const Plane2D &bc) { if (iTest(ac, bc)) { CollisionData r; r.collisionNormal = bc.normal; r.penDepth = dot(bc.normal, (ac.pos() - bc.position)); if (r.penDepth < 0) r.penDepth = 0; return r; } else return CollisionData{ 0,0 }; }
bool iTest (const AABB2D &ac, const Plane2D &bc) { return dot(bc.normal, (ac.pos() - bc.position)) <= (ac.dim().x / 2) * dot(bc.normal, Vector2{ 1,0 }) + (ac.dim().y / 2) * dot(bc.normal, Vector2{ 0,1 }); }