summaryrefslogtreecommitdiff
path: root/gfx/aabb.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2025-03-06 02:41:09 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2025-03-11 01:13:52 +0000
commitba69d51cc372197ef55feb87a33ed03afd1b0ca3 (patch)
treece50ac42a8d30d5246ca767107d76886d7237e69 /gfx/aabb.cpp
parentPass frustum into render functions (diff)
downloadilt-ba69d51cc372197ef55feb87a33ed03afd1b0ca3.tar.bz2
ilt-ba69d51cc372197ef55feb87a33ed03afd1b0ca3.tar.xz
ilt-ba69d51cc372197ef55feb87a33ed03afd1b0ca3.zip
Create AxisAlignedBoundingBox
Used to define the extents of GeoData mesh
Diffstat (limited to 'gfx/aabb.cpp')
-rw-r--r--gfx/aabb.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/gfx/aabb.cpp b/gfx/aabb.cpp
new file mode 100644
index 0000000..862dacb
--- /dev/null
+++ b/gfx/aabb.cpp
@@ -0,0 +1,24 @@
+#include "aabb.h"
+#include <algorithm>
+#include <tuple>
+
+AxisAlignedBoundingBox
+AxisAlignedBoundingBox::fromPoints(const std::span<const GlobalPosition3D> 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>(
+ 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));
+ }));
+}
+
+AxisAlignedBoundingBox &
+AxisAlignedBoundingBox::operator+=(const GlobalPosition3D & point)
+{
+ min = glm::min(min, point);
+ max = glm::max(max, point);
+ return *this;
+}