19 requires std::is_arithmetic_v<T>
26 Minimum_(EmptyMinimum(), EmptyMinimum(), EmptyMinimum()),
27 Maximum_(EmptyMaximum(), EmptyMaximum(), EmptyMaximum())
50 requires std::is_floating_point_v<T>
89 return Minimum_.X() > Maximum_.X();
95 (IsFinitePoint(Minimum_) && IsFinitePoint(Maximum_) &&
96 Minimum_.X() <= Maximum_.X() &&
97 Minimum_.Y() <= Maximum_.Y() &&
98 Minimum_.Z() <= Maximum_.Z());
109 std::conditional_t<(
sizeof(
T) <
sizeof(
double)),
double,
T>;
111 static_cast<T>((
static_cast<Calculation>(Minimum_.X()) +
114 static_cast<T>((
static_cast<Calculation>(Minimum_.Y()) +
117 static_cast<T>((
static_cast<Calculation>(Minimum_.Z()) +
128 const long double x =
static_cast<long double>(Maximum_.X()) -
129 static_cast<long double>(Minimum_.X());
130 const long double y =
static_cast<long double>(Maximum_.Y()) -
131 static_cast<long double>(Minimum_.Y());
132 const long double z =
static_cast<long double>(Maximum_.Z()) -
133 static_cast<long double>(Minimum_.Z());
135 static_cast<long double>(std::numeric_limits<T>::max());
140 return Vec3<T>(
static_cast<T>(
x),
static_cast<T>(
y),
152 std::conditional_t<(
sizeof(
T) <
sizeof(
double)),
double,
T>;
154 static_cast<T>((
static_cast<Calculation>(Maximum_.X()) -
157 static_cast<T>((
static_cast<Calculation>(Maximum_.Y()) -
160 static_cast<T>((
static_cast<Calculation>(Maximum_.Z()) -
168 point.Y() >= Minimum_.Y() &&
point.Z() >= Minimum_.Z() &&
169 point.X() <= Maximum_.X() &&
point.Y() <= Maximum_.Y() &&
170 point.Z() <= Maximum_.Z();
182 Maximum_.X() >=
other.Minimum_.X() &&
183 Minimum_.X() <=
other.Maximum_.X() &&
184 Maximum_.Y() >=
other.Minimum_.Y() &&
185 Minimum_.Y() <=
other.Maximum_.Y() &&
186 Maximum_.Z() >=
other.Minimum_.Z() &&
187 Minimum_.Z() <=
other.Maximum_.Z();
201 std::min(Minimum_.Y(),
other.Minimum_.Y()),
202 std::min(Minimum_.Z(),
other.Minimum_.Z())),
204 std::max(Maximum_.Y(),
other.Maximum_.Y()),
205 std::max(Maximum_.Z(),
other.Maximum_.Z())),
216 std::max(Minimum_.Y(),
other.Minimum_.Y()),
217 std::max(Minimum_.Z(),
other.Minimum_.Z())),
219 std::min(Maximum_.Y(),
other.Maximum_.Y()),
220 std::min(Maximum_.Z(),
other.Maximum_.Z())),
227 if (!IsFinitePoint(
point))
236 std::min(Minimum_.Y(),
point.Y()),
237 std::min(Minimum_.Z(),
point.Z())),
239 std::max(Maximum_.Y(),
point.Y()),
240 std::max(Maximum_.Z(),
point.Z())),
251 return Point3<T>(std::clamp(
point.X(), Minimum_.X(), Maximum_.X()),
252 std::clamp(
point.Y(), Minimum_.Y(), Maximum_.Y()),
253 std::clamp(
point.Z(), Minimum_.Z(), Maximum_.Z()));
263 const double x =
static_cast<double>(Maximum_.X()) -
264 static_cast<double>(Minimum_.X());
265 const double y =
static_cast<double>(Maximum_.Y()) -
266 static_cast<double>(Minimum_.Y());
267 const double z =
static_cast<double>(Maximum_.Z()) -
268 static_cast<double>(Minimum_.Z());
269 return static_cast<T>(
x *
y *
z);
279 const double x =
static_cast<double>(Maximum_.X()) -
280 static_cast<double>(Minimum_.X());
281 const double y =
static_cast<double>(Maximum_.Y()) -
282 static_cast<double>(Minimum_.Y());
283 const double z =
static_cast<double>(Maximum_.Z()) -
284 static_cast<double>(Minimum_.Z());
285 return static_cast<T>(2.0 * (
x *
y +
y *
z +
z *
x));
295 return std::array<Point3<T>, 8>{
296 Point3<T>(Minimum_.X(), Minimum_.Y(), Minimum_.Z()),
297 Point3<T>(Maximum_.X(), Minimum_.Y(), Minimum_.Z()),
298 Point3<T>(Minimum_.X(), Maximum_.Y(), Minimum_.Z()),
299 Point3<T>(Maximum_.X(), Maximum_.Y(), Minimum_.Z()),
300 Point3<T>(Minimum_.X(), Minimum_.Y(), Maximum_.Z()),
301 Point3<T>(Maximum_.X(), Minimum_.Y(), Maximum_.Z()),
302 Point3<T>(Minimum_.X(), Maximum_.Y(), Maximum_.Z()),
303 Point3<T>(Maximum_.X(), Maximum_.Y(), Maximum_.Z())};
309 return left.Minimum_ ==
right.Minimum_ &&
318 Aabb3(
const Point3<T>& minimum,
319 const Point3<T>& maximum,
320 UncheckedTag) noexcept :
321 Minimum_(minimum), Maximum_(maximum)
325 [[nodiscard]]
static constexpr T EmptyMinimum() noexcept
327 if constexpr (std::is_floating_point_v<T>)
329 return std::numeric_limits<T>::infinity();
333 return std::numeric_limits<T>::max();
337 [[nodiscard]]
static constexpr T EmptyMaximum() noexcept
339 if constexpr (std::is_floating_point_v<T>)
341 return -std::numeric_limits<T>::infinity();
345 return std::numeric_limits<T>::lowest();
349 [[nodiscard]]
static bool IsFinitePoint(
const Point3<T>& point)
noexcept
351 if constexpr (std::is_floating_point_v<T>)
353 return std::isfinite(point.X()) && std::isfinite(point.Y()) &&
354 std::isfinite(point.Z());
359 [[nodiscard]]
static bool IsFiniteVector(
const Vec3<T>& vector)
noexcept
361 if constexpr (std::is_floating_point_v<T>)
363 return std::isfinite(vector.X()) && std::isfinite(vector.Y()) &&
364 std::isfinite(vector.Z());
389static_assert(std::is_trivially_copyable_v<mv::math::Aabb3f>);
390static_assert(std::is_standard_layout_v<mv::math::Aabb3f>);
393static_assert(std::is_trivially_copyable_v<mv::math::Aabb3d>);
394static_assert(std::is_standard_layout_v<mv::math::Aabb3d>);
bool IsEmpty() const noexcept
static std::optional< Aabb3 > TryFromPoints(std::span< const Point3< T > > points) noexcept
const Point3< T > & Minimum() const noexcept
static std::optional< Aabb3 > TryFromMinMax(const Point3< T > &minimum, const Point3< T > &maximum) noexcept
bool Contains(const Aabb3 &other) const noexcept
std::optional< std::array< Point3< T >, 8 > > TryCorners() const noexcept
static Aabb3 Empty() noexcept
Aabb3 Merged(const Aabb3 &other) const noexcept
friend bool operator==(const Aabb3 &left, const Aabb3 &right) noexcept
bool IsValid() const noexcept
Aabb3 Intersection(const Aabb3 &other) const noexcept
std::optional< Aabb3 > TryExpanded(const Point3< T > &point) const noexcept
bool Contains(const Point3< T > &point) const noexcept
static std::optional< Aabb3 > TryFromCenterHalfExtents(const Point3< T > ¢er, const Vec3< T > &halfExtents) noexcept
std::optional< Point3< T > > TryCenter() const noexcept
bool Intersects(const Aabb3 &other) const noexcept
const Point3< T > & Maximum() const noexcept
std::optional< Vec3< T > > TryHalfExtents() const noexcept
T Volume() const noexcept
std::optional< Vec3< T > > TrySize() const noexcept
std::optional< Point3< T > > TryClosestPoint(const Point3< T > &point) const noexcept
T SurfaceArea() const noexcept
Aabb3< std::int32_t > Aabb3i32
Aabb3< std::uint32_t > Aabb3u32