summaryrefslogtreecommitdiff
path: root/gfx
diff options
context:
space:
mode:
Diffstat (limited to 'gfx')
-rw-r--r--gfx/aabb.cpp15
-rw-r--r--gfx/aabb.h30
-rw-r--r--gfx/frustum.cpp7
-rw-r--r--gfx/frustum.h7
4 files changed, 27 insertions, 32 deletions
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};
-}
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 <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;