diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2025-03-08 19:54:10 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2025-03-11 01:13:59 +0000 |
commit | a6cec1f8eeb54a12fb2ee058f07a451d3b549958 (patch) | |
tree | 3a4337bf6b29117fd17eecb713c420e5a1bcf8ee /gfx/aabb.h | |
parent | Current tile in frustum as we loop (diff) | |
download | ilt-a6cec1f8eeb54a12fb2ee058f07a451d3b549958.tar.bz2 ilt-a6cec1f8eeb54a12fb2ee058f07a451d3b549958.tar.xz ilt-a6cec1f8eeb54a12fb2ee058f07a451d3b549958.zip |
Template AxisAlignedBoundingBox on unit type
Diffstat (limited to 'gfx/aabb.h')
-rw-r--r-- | gfx/aabb.h | 30 |
1 files changed, 20 insertions, 10 deletions
@@ -1,31 +1,41 @@ #pragma once -#include "config/types.h" +#include "maths.h" #include <algorithm> #include <tuple> -class AxisAlignedBoundingBox { +template<Arithmetic T, glm::qualifier Q = glm::defaultp> class AxisAlignedBoundingBox { public: + using V = glm::vec<3, T, Q>; AxisAlignedBoundingBox() = default; - AxisAlignedBoundingBox(const GlobalPosition3D & min, const GlobalPosition3D & max) : min {min}, max {max} { } + AxisAlignedBoundingBox(const V & min, const V & max) : min {min}, max {max} { } - AxisAlignedBoundingBox & operator+=(const GlobalPosition3D & point); + AxisAlignedBoundingBox & + operator+=(const V & point) + { + min = glm::min(min, point); + max = glm::max(max, point); + return *this; + } - AxisAlignedBoundingBox operator-(const GlobalPosition3D & viewPoint) const; + AxisAlignedBoundingBox + operator-(const V & viewPoint) const + { + return {min - viewPoint, max - viewPoint}; + } [[nodiscard]] static AxisAlignedBoundingBox fromPoints(auto && points) { - using Limits = std::numeric_limits<GlobalDistance>; - static constexpr const auto INITIAL - = std::make_pair(GlobalPosition3D {Limits::max()}, GlobalPosition3D {Limits::min()}); - return std::make_from_tuple<AxisAlignedBoundingBox>( + using Limits = std::numeric_limits<T>; + static constexpr const auto INITIAL = std::make_pair(V {Limits::max()}, V {Limits::min()}); + return std::make_from_tuple<AxisAlignedBoundingBox<T, Q>>( std::ranges::fold_left(points, INITIAL, [](const auto & prev, const auto & point) { auto & [min, max] = prev; return std::make_pair(glm::min(min, point), glm::max(max, point)); })); } - GlobalPosition3D min, max; + V min, max; }; |