summaryrefslogtreecommitdiff
path: root/gfx/aabb.cpp
blob: 0a04ef42407897ab3bdd6a7baf1260ca7ddb986e (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
#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;
}

AxisAlignedBoundingBox
AxisAlignedBoundingBox::operator-(const GlobalPosition3D & viewPoint) const
{
	return {min - viewPoint, max - viewPoint};
}