ray: return NaN for negative aabb intersection
This commit is contained in:
parent
012f8107c6
commit
e939cca6fd
7
ray.cpp
7
ray.cpp
@ -47,7 +47,7 @@ util::ray<S,T>::intersect (plane<S,T> q) const
|
||||
/// returns the distance from origin to AABB intersection
|
||||
///
|
||||
/// returns NaN on miss
|
||||
/// returns -ve if behind
|
||||
/// returns NaN if behind
|
||||
template <size_t S, typename T>
|
||||
T
|
||||
util::ray<S,T>::intersect (AABB<S,T> r) const
|
||||
@ -61,9 +61,11 @@ util::ray<S,T>::intersect (AABB<S,T> r) const
|
||||
auto tmin = max (vmin);
|
||||
auto tmax = min (vmax);
|
||||
|
||||
// closest intersection is behind us
|
||||
if (tmax < 0)
|
||||
return tmax;
|
||||
return std::numeric_limits<T>::quiet_NaN ();
|
||||
|
||||
// missed intersection
|
||||
if (tmin > tmax)
|
||||
return std::numeric_limits<T>::quiet_NaN ();
|
||||
|
||||
@ -75,6 +77,7 @@ util::ray<S,T>::intersect (AABB<S,T> r) const
|
||||
/// returns the smallest distance from ray origin to a sphere intersection
|
||||
///
|
||||
/// returns NaN on miss
|
||||
/// returns NaN if behind
|
||||
template <size_t S, typename T>
|
||||
T
|
||||
util::ray<S,T>::intersect (sphere<S,T> s) const
|
||||
|
13
test/ray.cpp
13
test/ray.cpp
@ -22,17 +22,24 @@ void
|
||||
test_intersect_aabb (util::TAP::logger &tap)
|
||||
{
|
||||
// trivial case: unit aabb at origin, ray from (0.5,-0.5) upwards
|
||||
const util::AABB2f b {
|
||||
const util::AABB2f box {
|
||||
{ 0.f, 0.f },
|
||||
{ 1.f, 1.f }
|
||||
};
|
||||
|
||||
const util::ray2f l {
|
||||
const util::ray2f forward {
|
||||
{ 0.5f, -0.5f },
|
||||
{ 0.f, 1.f }
|
||||
};
|
||||
|
||||
tap.expect_eq (l.intersect (b), 0.5f, "ray-aabb intersect");
|
||||
tap.expect_eq (forward.intersect (box), 0.5f, "ray-aabb intersect");
|
||||
|
||||
const util::ray2f behind {
|
||||
{ 0.5f, 2.f },
|
||||
{ 0.f, 1.f }
|
||||
};
|
||||
|
||||
tap.expect_nan (behind.intersect (box), "ray-aabb intersect behind");
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user