temp intersect
Some checks failed
Linux arm64 / Build (push) Failing after 4m42s

This commit is contained in:
2024-03-26 09:00:47 +01:00
parent 7f5aee9e16
commit d1bb086daf

View File

@@ -1,18 +1,28 @@
#include "blitz/maths/Physics.h" #include "blitz/maths/Physics.h"
#include "blitz/maths/Maths.h" #include "blitz/maths/Maths.h"
#include "blitz/misc/Log.h"
#include <cmath> #include <cmath>
namespace blitz { namespace blitz {
namespace maths { namespace maths {
float Intersects(const Ray& ray, const AABB& aabb) { /**
Vec3f dirFrac{ * @brief Returns `true` if the half-line `ray` _strictly_ intersects with `aabb`,
* and `false` if it _strictly_ doesn't intersect.
* Note that if it only intersects with corners, edges, or sides of the box,
* or if any coordinate in `ray` is `NAN` or `inf` or if any coordinate in
* `aabb` is `NAN` the result is unspecified.
* */
float Distance(const Ray& ray, const AABB& aabb) {
// r.dir is unit direction vector of ray
Vec3f dirFrac = {
1.0f / ray.direction.x, 1.0f / ray.direction.x,
1.0f / ray.direction.y, 1.0f / ray.direction.y,
1.0f / ray.direction.z, 1.0f / ray.direction.z,
}; };
// lb is the corner of AABB with minimal coordinates - left bottom, rt is maximal corner
// r.org is origin of ray
float t1 = (aabb.from.x - ray.origin.x) * dirFrac.x; float t1 = (aabb.from.x - ray.origin.x) * dirFrac.x;
float t2 = (aabb.to.x - ray.origin.x) * dirFrac.x; float t2 = (aabb.to.x - ray.origin.x) * dirFrac.x;
float t3 = (aabb.from.y - ray.origin.y) * dirFrac.y; float t3 = (aabb.from.y - ray.origin.y) * dirFrac.y;
@@ -24,17 +34,19 @@ float Intersects(const Ray& ray, const AABB& aabb) {
float tmax = std::min(std::min(std::max(t1, t2), std::max(t3, t4)), std::max(t5, t6)); float tmax = std::min(std::min(std::max(t1, t2), std::max(t3, t4)), std::max(t5, t6));
// if tmax < 0, ray (line) is intersecting AABB, but the whole AABB is behind us // if tmax < 0, ray (line) is intersecting AABB, but the whole AABB is behind us
if (tmax < 0) {
return -1;
}
// if tmin > tmax, ray doesn't intersect AABB // if tmin > tmax, ray doesn't intersect AABB
if (tmin > tmax) { if (tmax < 0 || tmin > tmax) {
return -1; return -1.0f;
} }
return tmin; return tmin;
} }
bool Intersects(const Ray& ray, const AABB& aabb) {
float distance = Distance(ray, aabb);
utils::LOG(std::to_string(distance));
return distance >= 0.0f;
}
} // namespace maths } // namespace maths
} // namespace blitz } // namespace blitz