From ba69d51cc372197ef55feb87a33ed03afd1b0ca3 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Thu, 6 Mar 2025 02:41:09 +0000 Subject: Create AxisAlignedBoundingBox Used to define the extents of GeoData mesh --- gfx/aabb.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 gfx/aabb.h (limited to 'gfx/aabb.h') diff --git a/gfx/aabb.h b/gfx/aabb.h new file mode 100644 index 0000000..568e91a --- /dev/null +++ b/gfx/aabb.h @@ -0,0 +1,17 @@ +#pragma once + +#include "config/types.h" +#include + +class AxisAlignedBoundingBox { +public: + AxisAlignedBoundingBox() = default; + + AxisAlignedBoundingBox(const GlobalPosition3D & min, const GlobalPosition3D & max) : min {min}, max {max} { } + + AxisAlignedBoundingBox & operator+=(const GlobalPosition3D & point); + + [[nodiscard]] static AxisAlignedBoundingBox fromPoints(std::span points); + + GlobalPosition3D min, max; +}; -- cgit v1.2.3 From d0aceb54752078200bc75a96888ffaf7483678cb Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Fri, 7 Mar 2025 00:43:25 +0000 Subject: Add function to test if an AABB is visible in a frustum --- gfx/aabb.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'gfx/aabb.h') diff --git a/gfx/aabb.h b/gfx/aabb.h index 568e91a..db3a215 100644 --- a/gfx/aabb.h +++ b/gfx/aabb.h @@ -11,6 +11,8 @@ public: AxisAlignedBoundingBox & operator+=(const GlobalPosition3D & point); + AxisAlignedBoundingBox operator-(const GlobalPosition3D & viewPoint) const; + [[nodiscard]] static AxisAlignedBoundingBox fromPoints(std::span points); GlobalPosition3D min, max; -- cgit v1.2.3 From 9da25631a119fd16f1810a027dae1fde7cb7527d Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Fri, 7 Mar 2025 20:23:53 +0000 Subject: AxisAlignedBoundingBox construct from range instead of span --- gfx/aabb.h | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'gfx/aabb.h') diff --git a/gfx/aabb.h b/gfx/aabb.h index db3a215..229d516 100644 --- a/gfx/aabb.h +++ b/gfx/aabb.h @@ -1,7 +1,8 @@ #pragma once #include "config/types.h" -#include +#include +#include class AxisAlignedBoundingBox { public: @@ -13,7 +14,18 @@ public: AxisAlignedBoundingBox operator-(const GlobalPosition3D & viewPoint) const; - [[nodiscard]] static AxisAlignedBoundingBox fromPoints(std::span points); + [[nodiscard]] static AxisAlignedBoundingBox + fromPoints(auto && points) + { + using Limits = std::numeric_limits; + static constexpr const auto INITIAL + = std::make_pair(GlobalPosition3D {Limits::max()}, GlobalPosition3D {Limits::min()}); + return std::make_from_tuple( + 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; }; -- cgit v1.2.3 From a6cec1f8eeb54a12fb2ee058f07a451d3b549958 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 8 Mar 2025 19:54:10 +0000 Subject: Template AxisAlignedBoundingBox on unit type --- gfx/aabb.h | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) (limited to 'gfx/aabb.h') diff --git a/gfx/aabb.h b/gfx/aabb.h index 229d516..a661f66 100644 --- a/gfx/aabb.h +++ b/gfx/aabb.h @@ -1,31 +1,41 @@ #pragma once -#include "config/types.h" +#include "maths.h" #include #include -class AxisAlignedBoundingBox { +template 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; - static constexpr const auto INITIAL - = std::make_pair(GlobalPosition3D {Limits::max()}, GlobalPosition3D {Limits::min()}); - return std::make_from_tuple( + using Limits = std::numeric_limits; + static constexpr const auto INITIAL = std::make_pair(V {Limits::max()}, V {Limits::min()}); + return std::make_from_tuple>( 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; }; -- cgit v1.2.3 From 194148abd9ab89a5a514a37b7717b7c4de6aa758 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Mon, 10 Mar 2025 02:12:16 +0000 Subject: Pass a Frustum to shadow renderers The frustum might not be correct at this stage. --- gfx/aabb.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gfx/aabb.h') diff --git a/gfx/aabb.h b/gfx/aabb.h index a661f66..ce15a0f 100644 --- a/gfx/aabb.h +++ b/gfx/aabb.h @@ -37,5 +37,5 @@ public: })); } - V min, max; + V min {}, max {}; }; -- cgit v1.2.3