15 requires std::is_floating_point_v<T>
21 ReciprocalDirection_(Reciprocal(
ray.Direction().Vector().X()),
22 Reciprocal(
ray.Direction().Vector().Y()),
23 Reciprocal(
ray.Direction().Vector().Z())),
24 ParallelMask_(BuildParallelMask(
ray.Direction().Vector()))
35 return ReciprocalDirection_;
40 return (ParallelMask_ & (1U <<
axis)) != 0
U;
47 ? std::copysign(std::numeric_limits<T>::infinity(),
52 [[nodiscard]]
static unsigned int BuildParallelMask(
53 const Vec3<T>& direction)
noexcept
55 return (IsEffectivelyParallel(direction.X()) ? 1U : 0U) |
56 (IsEffectivelyParallel(direction.Y()) ? 2U : 0U) |
57 (IsEffectivelyParallel(direction.Z()) ? 4U : 0U);
60 [[nodiscard]]
static bool IsEffectivelyParallel(T value)
noexcept
62 return value == T(0) || !std::isfinite(T(1) / value);
66 Vec3<T> ReciprocalDirection_;
67 unsigned int ParallelMask_;
74static_assert(std::is_trivially_copyable_v<mv::math::PreparedRay3f>);
75static_assert(std::is_standard_layout_v<mv::math::PreparedRay3f>);
76static_assert(std::is_trivially_copyable_v<mv::math::PreparedRay3d>);
77static_assert(std::is_standard_layout_v<mv::math::PreparedRay3d>);
PreparedRay3(const Ray3< T > &ray) noexcept
bool IsParallel(std::size_t axis) const noexcept
const Ray3< T > & Ray() const noexcept
const Vec3< T > & ReciprocalDirection() const noexcept