Pioneer
Loading...
Searching...
No Matches
Aabb.h
Go to the documentation of this file.
1// Copyright © 2008-2024 Pioneer Developers. See AUTHORS.txt for details
2// Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3
4#ifndef _AABB_H
5#define _AABB_H
6
7#include "vector3.h"
8
9#include <algorithm> // for std::min / std::max
10
11struct Aabb {
13 double radius;
14 Aabb() :
15 min(DBL_MAX, DBL_MAX, DBL_MAX),
16 max(-DBL_MAX, -DBL_MAX, -DBL_MAX),
17 radius(0.1)
18 {
19 }
20 // Fast constructor for pre-conditioned values
21 // Should only be used when _min < _max for all {x,y,z}
22 Aabb(const vector3d &_min, const vector3d &_max, float rad) :
23 min(_min),
24 max(_max),
25 radius(rad)
26 {
27 }
28 void Update(const Aabb &b)
29 {
30 max.x = std::max(max.x, b.max.x);
31 max.y = std::max(max.y, b.max.y);
32 max.z = std::max(max.z, b.max.z);
33 min.x = std::min(min.x, b.min.x);
34 min.y = std::min(min.y, b.min.y);
35 min.z = std::min(min.z, b.min.z);
36 radius = std::max(radius, b.radius);
37 }
38
39 void Update(const vector3d &p)
40 {
41 if (max.x < p.x) max.x = p.x;
42 if (max.y < p.y) max.y = p.y;
43 if (max.z < p.z) max.z = p.z;
44 if (min.x > p.x) min.x = p.x;
45 if (min.y > p.y) min.y = p.y;
46 if (min.z > p.z) min.z = p.z;
47 if (p.Dot(p) > radius * radius) radius = p.Length();
48 }
49 void Update(float x, float y, float z)
50 {
51 if (max.x < x) max.x = x;
52 if (max.y < y) max.y = y;
53 if (max.z < z) max.z = z;
54 if (min.x > x) min.x = x;
55 if (min.y > y) min.y = y;
56 if (min.z > z) min.z = z;
57 }
58 template <typename T>
59 bool IsIn(const vector3<T> &p) const
60 {
61 return ((p.x >= min.x) && (p.x <= max.x) &&
62 (p.y >= min.y) && (p.y <= max.y) &&
63 (p.z >= min.z) && (p.z <= max.z));
64 }
65 bool Intersects(const Aabb &o) const
66 {
67 return min < o.max && max > o.min;
68 }
69 // returns maximum point radius, usually smaller than max radius of bounding box
70 double GetRadius() const { return radius; }
71};
72
73// SIMD-capable AABB type without additional overhead
74template <typename Vec3>
75struct AABB {
76 using Number = typename Vec3::element_type;
77
78 Vec3 min, max;
79
80 static AABB Invalid()
81 {
82 return AABB{ Vec3(DBL_MAX, DBL_MAX, DBL_MAX), Vec3(-DBL_MAX, -DBL_MAX, -DBL_MAX) };
83 }
84
85 void Update(const AABB &rhs)
86 {
87 using std::max;
88 using std::min;
89
90 this->max = max(this->max, rhs.max);
91 this->min = min(this->min, rhs.min);
92 }
93
94 void Update(const Vec3 &point)
95 {
96 using std::max;
97 using std::min;
98
99 this->max = max(this->max, point);
100 this->min = min(this->min, point);
101 }
102
103 auto IntersectsRay(const Vec3 &start, const Vec3 &inv_dir, Number dist) const
104 {
105 using std::max;
106 using std::min;
107
108 Vec3 l1 = (this->min - start) * inv_dir;
109 Vec3 l2 = (this->max - start) * inv_dir;
110
111 Vec3 vmin = min(l1, l2);
112 Vec3 vmax = max(l1, l2);
113
114 double lmin = max(vmin.x, max(vmin.y, vmin.z));
115 double lmax = min(vmax.x, min(vmax.y, vmax.z));
116
117 return ((lmax >= 0.f) & (lmax >= lmin) & (lmin < dist));
118 }
119
120 auto IsIn(Vec3 point) const { return point >= min && point <= max; }
121 auto Intersects(const AABB &rhs) const { return min < rhs.max && max > rhs.min; }
122};
123
125
126#endif /* _AABB_H */
T Dot(const vector3 &b) const
Definition: vector3.h:129
T y
Definition: vector3.h:20
T x
Definition: vector3.h:20
T Length() const
Definition: vector3.h:130
T z
Definition: vector3.h:20
Definition: Aabb.h:75
void Update(const AABB &rhs)
Definition: Aabb.h:85
Vec3 min
Definition: Aabb.h:78
auto Intersects(const AABB &rhs) const
Definition: Aabb.h:121
static AABB Invalid()
Definition: Aabb.h:80
void Update(const Vec3 &point)
Definition: Aabb.h:94
typename Vec3::element_type Number
Definition: Aabb.h:76
Vec3 max
Definition: Aabb.h:78
auto IntersectsRay(const Vec3 &start, const Vec3 &inv_dir, Number dist) const
Definition: Aabb.h:103
auto IsIn(Vec3 point) const
Definition: Aabb.h:120
Definition: Aabb.h:11
vector3d max
Definition: Aabb.h:12
Aabb(const vector3d &_min, const vector3d &_max, float rad)
Definition: Aabb.h:22
void Update(const Aabb &b)
Definition: Aabb.h:28
Aabb()
Definition: Aabb.h:14
vector3d min
Definition: Aabb.h:12
double GetRadius() const
Definition: Aabb.h:70
void Update(float x, float y, float z)
Definition: Aabb.h:49
bool IsIn(const vector3< T > &p) const
Definition: Aabb.h:59
bool Intersects(const Aabb &o) const
Definition: Aabb.h:65
double radius
Definition: Aabb.h:13
void Update(const vector3d &p)
Definition: Aabb.h:39