summaryrefslogtreecommitdiff
path: root/gfx/aabb.h
blob: 229d5165a3533e8eb3a01aa88aeacf34db8cf0d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#pragma once

#include "config/types.h"
#include <algorithm>
#include <tuple>

class AxisAlignedBoundingBox {
public:
	AxisAlignedBoundingBox() = default;

	AxisAlignedBoundingBox(const GlobalPosition3D & min, const GlobalPosition3D & max) : min {min}, max {max} { }

	AxisAlignedBoundingBox & operator+=(const GlobalPosition3D & point);

	AxisAlignedBoundingBox operator-(const GlobalPosition3D & viewPoint) const;

	[[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>(
				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;
};