diff --git a/libs/geom/include/psemek/geom/intersection.hpp b/libs/geom/include/psemek/geom/intersection.hpp index 5cc16b79..dbb72cf2 100644 --- a/libs/geom/include/psemek/geom/intersection.hpp +++ b/libs/geom/include/psemek/geom/intersection.hpp @@ -3,6 +3,8 @@ #include #include +#include +#include #include #include @@ -102,4 +104,28 @@ namespace psemek::geom return false; } + template + interval intersection(ray const & r, box const & b) + { + auto t = interval::full(); + + for (std::size_t i = 0; i < N; ++i) + { + T tmin = (b[i].min - r.origin[i]) / r.direction[i]; + T tmax = (b[i].max - r.origin[i]) / r.direction[i]; + + if (tmin > tmax) std::swap(tmin, tmax); + + t &= interval{tmin, tmax}; + } + + return t; + } + + template + bool intersect(ray const & r, box const & b) + { + return !intersection(r, b).empty(); + } + }