6#include <glm/gtx/matrix_decompose.hpp>
9 : center(ctr), halfExtents(halfExt), minCorner(ctr-halfExt), maxCorner(ctr+halfExt) {}
12 auto L = glm::mat3(modelMatrix);
13 auto T = glm::vec3(modelMatrix[3]);
15 glm::mat3 absL = glm::mat3(
21 glm::vec3 newHalfExtents = absL * halfExtents;
22 glm::vec3 newCenter = L * center + T;
24 return std::make_unique<AABB>(newCenter, newHalfExtents);
28 return (minCorner.x <= other.maxCorner.x && maxCorner.x >= other.minCorner.x) &&
29 (minCorner.y <= other.maxCorner.y && maxCorner.y >= other.minCorner.y) &&
30 (minCorner.z <= other.maxCorner.z && maxCorner.z >= other.minCorner.z);
35 glm::vec3 invDir = 1.0f / ray.
dir;
37 glm::vec3 t0s = (minCorner - ray.
origin) * invDir;
38 glm::vec3 t1s = (maxCorner - ray.
origin) * invDir;
40 glm::vec3 tsmaller = glm::min(t0s, t1s);
41 glm::vec3 tbigger = glm::max(t0s, t1s);
43 float tmin = std::max(std::max(tsmaller.x, tsmaller.y), tsmaller.z);
44 float tmax = std::min(std::min(tbigger.x, tbigger.y), tbigger.z);
46 bool hit = tmax >= std::max(tmin, 0.0f);
47 return hit ? std::optional{ tmin } : std::nullopt;
51 return (p.x >= minCorner.x && p.x <= maxCorner.x) &&
52 (p.y >= minCorner.y && p.y <= maxCorner.y) &&
53 (p.z >= minCorner.z && p.z <= maxCorner.z);
58 return {p, glm::vec3(0.0f), 0.0f};
62 minCorner = glm::min(minCorner, point);
63 maxCorner = glm::max(maxCorner, point);
64 center = (minCorner + maxCorner) * 0.5f;
65 halfExtents = (maxCorner - minCorner) * 0.5f;
std::optional< float > intersectRay(const Math::Ray &ray) const override
Tests ray-collider intersection.
bool contains(const glm::vec3 &p) const override
Tests if a point is inside the collider volume.
bool intersectsAABB(const AABB &other) const
std::unique_ptr< ICollider > getTransformed(const glm::mat4 &modelMatrix) const override
Creates a transformed copy of this collider in world space.
void expand(const glm::vec3 &point)
glm::vec3 getAABBMin() const override
Gets the minimum, maximum corner of the axis-aligned bounding box (AABB) that contains this collider.
ContactInfo closestPoint(const glm::vec3 &p) const override
Finds the closest point on the collider surface to a given point.
glm::vec3 getAABBMax() const override
glm::vec3 origin
Starting point of the ray in world space.
glm::vec3 dir
Direction vector (should be normalized)
Represents a ray in 3D space.