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 | |
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
-rw-r--r-- | game/geoData.h | 2 | ||||
-rw-r--r-- | game/terrain.cpp | 2 | ||||
-rw-r--r-- | game/terrain.h | 2 | ||||
-rw-r--r-- | gfx/aabb.cpp | 15 | ||||
-rw-r--r-- | gfx/aabb.h | 30 | ||||
-rw-r--r-- | gfx/frustum.cpp | 7 | ||||
-rw-r--r-- | gfx/frustum.h | 7 | ||||
-rw-r--r-- | test/test-lib.cpp | 2 |
8 files changed, 31 insertions, 36 deletions
diff --git a/game/geoData.h b/game/geoData.h index a504f9b..0ff0c42 100644 --- a/game/geoData.h +++ b/game/geoData.h @@ -81,5 +81,5 @@ protected: virtual void afterChange(); private: - AxisAlignedBoundingBox extents; + AxisAlignedBoundingBox<GlobalDistance> extents; }; diff --git a/game/terrain.cpp b/game/terrain.cpp index 530b373..577d9e5 100644 --- a/game/terrain.cpp +++ b/game/terrain.cpp @@ -82,7 +82,7 @@ Terrain::generateMeshes() {(surfaceKey.basePosition + 1) * TILE_SIZE || getExtents().max.z}}; } else { - meshItr->second.aabb = AxisAlignedBoundingBox::fromPoints( + meshItr->second.aabb = AxisAlignedBoundingBox<GlobalDistance>::fromPoints( indices | std::views::transform([this](const auto vertex) -> GlobalPosition3D { return this->point(VertexHandle {static_cast<int>(vertex)}); })); diff --git a/game/terrain.h b/game/terrain.h index f38fe84..5f03634 100644 --- a/game/terrain.h +++ b/game/terrain.h @@ -35,7 +35,7 @@ private: glVertexArray vertexArray; glBuffer indicesBuffer; GLsizei count; - AxisAlignedBoundingBox aabb; + AxisAlignedBoundingBox<GlobalDistance> aabb; }; struct SurfaceKey { diff --git a/gfx/aabb.cpp b/gfx/aabb.cpp deleted file mode 100644 index 19c2217..0000000 --- a/gfx/aabb.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "aabb.h" - -AxisAlignedBoundingBox & -AxisAlignedBoundingBox::operator+=(const GlobalPosition3D & point) -{ - min = glm::min(min, point); - max = glm::max(max, point); - return *this; -} - -AxisAlignedBoundingBox -AxisAlignedBoundingBox::operator-(const GlobalPosition3D & viewPoint) const -{ - return {min - viewPoint, max - viewPoint}; -} @@ -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; }; diff --git a/gfx/frustum.cpp b/gfx/frustum.cpp index 8031d85..865dcde 100644 --- a/gfx/frustum.cpp +++ b/gfx/frustum.cpp @@ -1,5 +1,4 @@ #include "frustum.h" -#include "aabb.h" #include <algorithm> #include <collections.h> #include <glm/ext/matrix_transform.hpp> @@ -20,11 +19,11 @@ Frustum::updateView(const glm::mat4 & newView) } bool -Frustum::contains(const AxisAlignedBoundingBox & aabb) const +Frustum::contains(const BoundingBox & aabb) const { static constexpr auto EXTENT_CORNER_IDXS = [] { - using Extent = GlobalPosition3D AxisAlignedBoundingBox::*; - constexpr auto EXTENTS = std::array {&AxisAlignedBoundingBox::min, &AxisAlignedBoundingBox::max}; + using Extent = GlobalPosition3D BoundingBox::*; + constexpr auto EXTENTS = std::array {&BoundingBox::min, &BoundingBox::max}; std::array<glm::vec<3, Extent>, 2ZU * 2ZU * 2ZU> out {}; std::ranges::copy(std::views::cartesian_product(EXTENTS, EXTENTS, EXTENTS) | std::views::transform( diff --git a/gfx/frustum.h b/gfx/frustum.h index 5ee7d2c..2624ba1 100644 --- a/gfx/frustum.h +++ b/gfx/frustum.h @@ -1,11 +1,10 @@ #pragma once +#include "aabb.h" #include "config/types.h" #include <array> #include <glm/mat4x4.hpp> -class AxisAlignedBoundingBox; - class Frustum { public: Frustum(const GlobalPosition3D & pos, const glm::mat4 & view, const glm::mat4 & projection); @@ -30,11 +29,13 @@ public: void updateView(const glm::mat4 & view); - [[nodiscard]] bool contains(const AxisAlignedBoundingBox &) const; + using BoundingBox = AxisAlignedBoundingBox<GlobalDistance>; + [[nodiscard]] bool contains(const BoundingBox &) const; protected: static constexpr size_t FACES = 6; void updateCache(); + [[nodiscard]] bool boundByPlanes(const BoundingBox &, size_t nplanes) const; GlobalPosition3D position; glm::mat4 view, projection; diff --git a/test/test-lib.cpp b/test/test-lib.cpp index 8dadc70..ec91f6e 100644 --- a/test/test-lib.cpp +++ b/test/test-lib.cpp @@ -114,7 +114,7 @@ BOOST_DATA_TEST_CASE(mergeCloseInts, BOOST_AUTO_TEST_CASE(aabb_from_points) { - const auto aabb = AxisAlignedBoundingBox::fromPoints(std::vector<GlobalPosition3D> { + const auto aabb = AxisAlignedBoundingBox<GlobalDistance>::fromPoints(std::vector<GlobalPosition3D> { {1, 2, 3}, {4, 2, 1}, {9, 1, 7}, |