From 21112389350fa04881edd895ea6a5ba10bcd5eb0 Mon Sep 17 00:00:00 2001 From: Dynamitos Date: Fri, 24 Jan 2025 19:23:58 +0100 Subject: [PATCH] implement box intersect --- src/scene/AABB.h | 15 ++++++++++++--- src/scene/BVH.cpp | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/scene/AABB.h b/src/scene/AABB.h index e0f9c5a..18664f0 100644 --- a/src/scene/AABB.h +++ b/src/scene/AABB.h @@ -43,10 +43,19 @@ struct AABB max = glm::vec3(std::max(max.x, transformed.x), std::max(max.y, transformed.y), std::max(max.z, transformed.z)); } } - bool intersects(Ray ray) + bool intersects(Ray ray, float tmin, float tmax) { - assert(false && "TODO"); - return false; + glm::vec3 invD = 1.0f / ray.direction; + glm::vec3 t0s = glm::vec3(min - ray.origin) * invD; + glm::vec3 t1s = glm::vec3(max - ray.origin) * invD; + + glm::vec3 tsmaller = std::min(t0s, t1s); + glm::vec3 tbigger = std::max(t0s, t1s); + + tmin = std::max(tmin, std::max(tsmaller.x, std::max(tsmaller.y, tsmaller.z))); + tmax = std::min(tmax, std::min(tbigger.x, std::min(tbigger.y, tbigger.z))); + + return (tmin < tmax); } static AABB combine(AABB lhs, AABB rhs) { diff --git a/src/scene/BVH.cpp b/src/scene/BVH.cpp index 68996d2..e754f9c 100644 --- a/src/scene/BVH.cpp +++ b/src/scene/BVH.cpp @@ -78,7 +78,7 @@ std::optional BVH::traceRay(Ray ray) std::vector BVH::generateIntersections(PNode& currentNode, Ray ray) { - if (!currentNode->aabb.intersects(ray)) + if (!currentNode->aabb.intersects(ray, 0, 1)) { return {}; }