Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
AABox.h
Go to the documentation of this file.
1// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
2// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
3// SPDX-License-Identifier: MIT
4
5#pragma once
6
10#include <Jolt/Math/Mat44.h>
11
13
15class [[nodiscard]] AABox
16{
17public:
19
21 AABox() : mMin(Vec3::sReplicate(FLT_MAX)), mMax(Vec3::sReplicate(-FLT_MAX)) { }
22 AABox(Vec3Arg inMin, Vec3Arg inMax) : mMin(inMin), mMax(inMax) { }
23 AABox(DVec3Arg inMin, DVec3Arg inMax) : mMin(inMin.ToVec3RoundDown()), mMax(inMax.ToVec3RoundUp()) { }
24 AABox(Vec3Arg inCenter, float inRadius) : mMin(inCenter - Vec3::sReplicate(inRadius)), mMax(inCenter + Vec3::sReplicate(inRadius)) { }
25
27 static AABox sFromTwoPoints(Vec3Arg inP1, Vec3Arg inP2) { return AABox(Vec3::sMin(inP1, inP2), Vec3::sMax(inP1, inP2)); }
28
30 static AABox sFromTriangle(const VertexList &inVertices, const IndexedTriangle &inTriangle)
31 {
32 AABox box = sFromTwoPoints(Vec3(inVertices[inTriangle.mIdx[0]]), Vec3(inVertices[inTriangle.mIdx[1]]));
33 box.Encapsulate(Vec3(inVertices[inTriangle.mIdx[2]]));
34 return box;
35 }
36
38 static AABox sBiggest()
39 {
41 return AABox(Vec3::sReplicate(-0.5f * FLT_MAX), Vec3::sReplicate(0.5f * FLT_MAX));
42 }
43
45 bool operator == (const AABox &inRHS) const { return mMin == inRHS.mMin && mMax == inRHS.mMax; }
46 bool operator != (const AABox &inRHS) const { return mMin != inRHS.mMin || mMax != inRHS.mMax; }
47
49 void SetEmpty()
50 {
51 mMin = Vec3::sReplicate(FLT_MAX);
52 mMax = Vec3::sReplicate(-FLT_MAX);
53 }
54
56 bool IsValid() const
57 {
58 return mMin.GetX() <= mMax.GetX() && mMin.GetY() <= mMax.GetY() && mMin.GetZ() <= mMax.GetZ();
59 }
60
62 void Encapsulate(Vec3Arg inPos)
63 {
64 mMin = Vec3::sMin(mMin, inPos);
65 mMax = Vec3::sMax(mMax, inPos);
66 }
67
69 void Encapsulate(const AABox &inRHS)
70 {
71 mMin = Vec3::sMin(mMin, inRHS.mMin);
72 mMax = Vec3::sMax(mMax, inRHS.mMax);
73 }
74
76 void Encapsulate(const Triangle &inRHS)
77 {
78 Vec3 v = Vec3::sLoadFloat3Unsafe(inRHS.mV[0]);
79 Encapsulate(v);
80 v = Vec3::sLoadFloat3Unsafe(inRHS.mV[1]);
81 Encapsulate(v);
82 v = Vec3::sLoadFloat3Unsafe(inRHS.mV[2]);
83 Encapsulate(v);
84 }
85
87 void Encapsulate(const VertexList &inVertices, const IndexedTriangle &inTriangle)
88 {
89 for (uint32 idx : inTriangle.mIdx)
90 Encapsulate(Vec3(inVertices[idx]));
91 }
92
94 AABox Intersect(const AABox &inOther) const
95 {
96 return AABox(Vec3::sMax(mMin, inOther.mMin), Vec3::sMin(mMax, inOther.mMax));
97 }
98
100 void EnsureMinimalEdgeLength(float inMinEdgeLength)
101 {
102 Vec3 min_length = Vec3::sReplicate(inMinEdgeLength);
103 mMax = Vec3::sSelect(mMax, mMin + min_length, Vec3::sLess(mMax - mMin, min_length));
104 }
105
107 void ExpandBy(Vec3Arg inVector)
108 {
109 mMin -= inVector;
110 mMax += inVector;
111 }
112
115 {
116 return 0.5f * (mMin + mMax);
117 }
118
121 {
122 return 0.5f * (mMax - mMin);
123 }
124
126 Vec3 GetSize() const
127 {
128 return mMax - mMin;
129 }
130
132 float GetSurfaceArea() const
133 {
134 Vec3 extent = mMax - mMin;
135 return 2.0f * (extent.GetX() * extent.GetY() + extent.GetX() * extent.GetZ() + extent.GetY() * extent.GetZ());
136 }
137
139 float GetVolume() const
140 {
141 Vec3 extent = mMax - mMin;
142 return extent.GetX() * extent.GetY() * extent.GetZ();
143 }
144
146 bool Contains(const AABox &inOther) const
147 {
148 return UVec4::sAnd(Vec3::sLessOrEqual(mMin, inOther.mMin), Vec3::sGreaterOrEqual(mMax, inOther.mMax)).TestAllXYZTrue();
149 }
150
152 bool Contains(Vec3Arg inOther) const
153 {
154 return UVec4::sAnd(Vec3::sLessOrEqual(mMin, inOther), Vec3::sGreaterOrEqual(mMax, inOther)).TestAllXYZTrue();
155 }
156
158 bool Contains(DVec3Arg inOther) const
159 {
160 return Contains(Vec3(inOther));
161 }
162
164 bool Overlaps(const AABox &inOther) const
165 {
166 return !UVec4::sOr(Vec3::sGreater(mMin, inOther.mMax), Vec3::sLess(mMax, inOther.mMin)).TestAnyXYZTrue();
167 }
168
170 bool Overlaps(const Plane &inPlane) const
171 {
172 Vec3 normal = inPlane.GetNormal();
173 float dist_normal = inPlane.SignedDistance(GetSupport(normal));
174 float dist_min_normal = inPlane.SignedDistance(GetSupport(-normal));
175 return dist_normal * dist_min_normal <= 0.0f; // If both support points are on the same side of the plane we don't overlap
176 }
177
179 void Translate(Vec3Arg inTranslation)
180 {
181 mMin += inTranslation;
182 mMax += inTranslation;
183 }
184
186 void Translate(DVec3Arg inTranslation)
187 {
188 mMin = (DVec3(mMin) + inTranslation).ToVec3RoundDown();
189 mMax = (DVec3(mMax) + inTranslation).ToVec3RoundUp();
190 }
191
193 AABox Transformed(Mat44Arg inMatrix) const
194 {
195 // Start with the translation of the matrix
196 Vec3 new_min, new_max;
197 new_min = new_max = inMatrix.GetTranslation();
198
199 // Now find the extreme points by considering the product of the min and max with each column of inMatrix
200 for (int c = 0; c < 3; ++c)
201 {
202 Vec3 col = inMatrix.GetColumn3(c);
203
204 Vec3 a = col * mMin[c];
205 Vec3 b = col * mMax[c];
206
207 new_min += Vec3::sMin(a, b);
208 new_max += Vec3::sMax(a, b);
209 }
210
211 // Return the new bounding box
212 return AABox(new_min, new_max);
213 }
214
217 {
218 AABox transformed = Transformed(inMatrix.GetRotation());
219 transformed.Translate(inMatrix.GetTranslation());
220 return transformed;
221 }
222
224 AABox Scaled(Vec3Arg inScale) const
225 {
226 return AABox::sFromTwoPoints(mMin * inScale, mMax * inScale);
227 }
228
230 Vec3 GetSupport(Vec3Arg inDirection) const
231 {
232 return Vec3::sSelect(mMax, mMin, Vec3::sLess(inDirection, Vec3::sZero()));
233 }
234
236 template <class VERTEX_ARRAY>
237 void GetSupportingFace(Vec3Arg inDirection, VERTEX_ARRAY &outVertices) const
238 {
239 outVertices.resize(4);
240
241 int axis = inDirection.Abs().GetHighestComponentIndex();
242 if (inDirection[axis] < 0.0f)
243 {
244 switch (axis)
245 {
246 case 0:
247 outVertices[0] = Vec3(mMax.GetX(), mMin.GetY(), mMin.GetZ());
248 outVertices[1] = Vec3(mMax.GetX(), mMax.GetY(), mMin.GetZ());
249 outVertices[2] = Vec3(mMax.GetX(), mMax.GetY(), mMax.GetZ());
250 outVertices[3] = Vec3(mMax.GetX(), mMin.GetY(), mMax.GetZ());
251 break;
252
253 case 1:
254 outVertices[0] = Vec3(mMin.GetX(), mMax.GetY(), mMin.GetZ());
255 outVertices[1] = Vec3(mMin.GetX(), mMax.GetY(), mMax.GetZ());
256 outVertices[2] = Vec3(mMax.GetX(), mMax.GetY(), mMax.GetZ());
257 outVertices[3] = Vec3(mMax.GetX(), mMax.GetY(), mMin.GetZ());
258 break;
259
260 case 2:
261 outVertices[0] = Vec3(mMin.GetX(), mMin.GetY(), mMax.GetZ());
262 outVertices[1] = Vec3(mMax.GetX(), mMin.GetY(), mMax.GetZ());
263 outVertices[2] = Vec3(mMax.GetX(), mMax.GetY(), mMax.GetZ());
264 outVertices[3] = Vec3(mMin.GetX(), mMax.GetY(), mMax.GetZ());
265 break;
266 }
267 }
268 else
269 {
270 switch (axis)
271 {
272 case 0:
273 outVertices[0] = Vec3(mMin.GetX(), mMin.GetY(), mMin.GetZ());
274 outVertices[1] = Vec3(mMin.GetX(), mMin.GetY(), mMax.GetZ());
275 outVertices[2] = Vec3(mMin.GetX(), mMax.GetY(), mMax.GetZ());
276 outVertices[3] = Vec3(mMin.GetX(), mMax.GetY(), mMin.GetZ());
277 break;
278
279 case 1:
280 outVertices[0] = Vec3(mMin.GetX(), mMin.GetY(), mMin.GetZ());
281 outVertices[1] = Vec3(mMax.GetX(), mMin.GetY(), mMin.GetZ());
282 outVertices[2] = Vec3(mMax.GetX(), mMin.GetY(), mMax.GetZ());
283 outVertices[3] = Vec3(mMin.GetX(), mMin.GetY(), mMax.GetZ());
284 break;
285
286 case 2:
287 outVertices[0] = Vec3(mMin.GetX(), mMin.GetY(), mMin.GetZ());
288 outVertices[1] = Vec3(mMin.GetX(), mMax.GetY(), mMin.GetZ());
289 outVertices[2] = Vec3(mMax.GetX(), mMax.GetY(), mMin.GetZ());
290 outVertices[3] = Vec3(mMax.GetX(), mMin.GetY(), mMin.GetZ());
291 break;
292 }
293 }
294 }
295
298 {
299 return Vec3::sMin(Vec3::sMax(inPoint, mMin), mMax);
300 }
301
303 inline float GetSqDistanceTo(Vec3Arg inPoint) const
304 {
305 return (GetClosestPoint(inPoint) - inPoint).LengthSq();
306 }
307
311};
312
#define JPH_NAMESPACE_END
Definition Core.h:414
std::uint32_t uint32
Definition Core.h:484
#define JPH_NAMESPACE_BEGIN
Definition Core.h:408
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition Memory.h:31
Axis aligned box.
Definition AABox.h:16
Vec3 GetExtent() const
Get extent of bounding box (half of the size)
Definition AABox.h:120
JPH_OVERRIDE_NEW_DELETE AABox()
Constructor.
Definition AABox.h:21
static AABox sBiggest()
Get bounding box of size FLT_MAX.
Definition AABox.h:38
static AABox sFromTriangle(const VertexList &inVertices, const IndexedTriangle &inTriangle)
Create box from indexed triangle.
Definition AABox.h:30
void Translate(DVec3Arg inTranslation)
Translate bounding box.
Definition AABox.h:186
AABox Scaled(Vec3Arg inScale) const
Scale this bounding box, can handle non-uniform and negative scaling.
Definition AABox.h:224
bool Contains(Vec3Arg inOther) const
Check if this box contains a point.
Definition AABox.h:152
Vec3 GetSize() const
Get size of bounding box.
Definition AABox.h:126
void EnsureMinimalEdgeLength(float inMinEdgeLength)
Make sure that each edge of the bounding box has a minimal length.
Definition AABox.h:100
Vec3 mMin
Bounding box min and max.
Definition AABox.h:309
void SetEmpty()
Reset the bounding box to an empty bounding box.
Definition AABox.h:49
AABox Intersect(const AABox &inOther) const
Intersect this bounding box with inOther, returns the intersection.
Definition AABox.h:94
void ExpandBy(Vec3Arg inVector)
Widen the box on both sides by inVector.
Definition AABox.h:107
static AABox sFromTwoPoints(Vec3Arg inP1, Vec3Arg inP2)
Create box from 2 points.
Definition AABox.h:27
void Encapsulate(const AABox &inRHS)
Encapsulate bounding box in bounding box.
Definition AABox.h:69
AABox(Vec3Arg inMin, Vec3Arg inMax)
Definition AABox.h:22
void Encapsulate(const VertexList &inVertices, const IndexedTriangle &inTriangle)
Encapsulate triangle in bounding box.
Definition AABox.h:87
AABox Transformed(DMat44Arg inMatrix) const
Transform bounding box.
Definition AABox.h:216
void GetSupportingFace(Vec3Arg inDirection, VERTEX_ARRAY &outVertices) const
Get the vertices of the face that faces inDirection the most.
Definition AABox.h:237
float GetSqDistanceTo(Vec3Arg inPoint) const
Get the squared distance between inPoint and this box (will be 0 if in Point is inside the box)
Definition AABox.h:303
AABox(Vec3Arg inCenter, float inRadius)
Definition AABox.h:24
float GetVolume() const
Get volume of bounding box.
Definition AABox.h:139
Vec3 GetClosestPoint(Vec3Arg inPoint) const
Get the closest point on or in this box to inPoint.
Definition AABox.h:297
Vec3 GetSupport(Vec3Arg inDirection) const
Calculate the support vector for this convex shape.
Definition AABox.h:230
AABox Transformed(Mat44Arg inMatrix) const
Transform bounding box.
Definition AABox.h:193
bool Overlaps(const Plane &inPlane) const
Check if this box overlaps with a plane.
Definition AABox.h:170
bool Overlaps(const AABox &inOther) const
Check if this box overlaps with another box.
Definition AABox.h:164
AABox(DVec3Arg inMin, DVec3Arg inMax)
Definition AABox.h:23
float GetSurfaceArea() const
Get surface area of bounding box.
Definition AABox.h:132
void Translate(Vec3Arg inTranslation)
Translate bounding box.
Definition AABox.h:179
bool IsValid() const
Check if the bounding box is valid (max >= min)
Definition AABox.h:56
void Encapsulate(Vec3Arg inPos)
Encapsulate point in bounding box.
Definition AABox.h:62
Vec3 GetCenter() const
Get center of bounding box.
Definition AABox.h:114
bool Contains(const AABox &inOther) const
Check if this box contains another box.
Definition AABox.h:146
bool Contains(DVec3Arg inOther) const
Check if this box contains a point.
Definition AABox.h:158
void Encapsulate(const Triangle &inRHS)
Encapsulate triangle in bounding box.
Definition AABox.h:76
Vec3 mMax
Definition AABox.h:310
Holds a 4x4 matrix of floats with the last column consisting of doubles.
Definition DMat44.h:13
JPH_INLINE DVec3 GetTranslation() const
Definition DMat44.h:111
JPH_INLINE Mat44 GetRotation() const
Get rotation part only (note: retains the first 3 values from the bottom row)
Definition DMat44.h:128
Definition DVec3.h:14
Triangle with 32-bit indices and material index.
Definition IndexedTriangle.h:80
uint32 mIdx[3]
Definition IndexedTriangle.h:75
Holds a 4x4 matrix of floats, but supports also operations on the 3x3 upper left part of the matrix.
Definition Mat44.h:13
JPH_INLINE Vec3 GetColumn3(uint inCol) const
Definition Mat44.h:158
JPH_INLINE Vec3 GetTranslation() const
Definition Mat44.h:152
An infinite plane described by the formula X . Normal + Constant = 0.
Definition Plane.h:11
Vec3 GetNormal() const
Definition Plane.h:30
float SignedDistance(Vec3Arg inPoint) const
Distance point to plane.
Definition Plane.h:54
A simple triangle and its material.
Definition Triangle.h:11
Float3 mV[3]
Vertices.
Definition Triangle.h:27
JPH_INLINE bool TestAnyXYZTrue() const
Test if any of X, Y or Z components are true (true is when highest bit of component is set)
Definition UVec4.inl:403
static JPH_INLINE UVec4 sAnd(UVec4Arg inV1, UVec4Arg inV2)
Logical and (component wise)
Definition UVec4.inl:202
static JPH_INLINE UVec4 sOr(UVec4Arg inV1, UVec4Arg inV2)
Logical or (component wise)
Definition UVec4.inl:174
JPH_INLINE bool TestAllXYZTrue() const
Test if X, Y and Z components are true (true is when highest bit of component is set)
Definition UVec4.inl:413
Definition Vec3.h:17
static JPH_INLINE Vec3 sMax(Vec3Arg inV1, Vec3Arg inV2)
Return the maximum of each of the components.
Definition Vec3.inl:155
static JPH_INLINE Vec3 sMin(Vec3Arg inV1, Vec3Arg inV2)
Return the minimum value of each of the components.
Definition Vec3.inl:142
JPH_INLINE float GetX() const
Get individual components.
Definition Vec3.h:124
static JPH_INLINE UVec4 sGreaterOrEqual(Vec3Arg inV1, Vec3Arg inV2)
Greater than or equal (component wise)
Definition Vec3.inl:233
static JPH_INLINE UVec4 sLessOrEqual(Vec3Arg inV1, Vec3Arg inV2)
Less than or equal (component wise)
Definition Vec3.inl:203
JPH_INLINE Vec3 Abs() const
Return the absolute value of each of the components.
Definition Vec3.inl:572
static JPH_INLINE UVec4 sGreater(Vec3Arg inV1, Vec3Arg inV2)
Greater than (component wise)
Definition Vec3.inl:218
JPH_INLINE float GetY() const
Definition Vec3.h:125
static JPH_INLINE Vec3 sZero()
Vector with all zeros.
Definition Vec3.inl:103
static JPH_INLINE UVec4 sLess(Vec3Arg inV1, Vec3Arg inV2)
Less than (component wise)
Definition Vec3.inl:188
static JPH_INLINE Vec3 sReplicate(float inV)
Replicate inV across all components.
Definition Vec3.inl:114
static JPH_INLINE Vec3 sSelect(Vec3Arg inNotSet, Vec3Arg inSet, UVec4Arg inControl)
Component wise select, returns inNotSet when highest bit of inControl = 0 and inSet when highest bit ...
Definition Vec3.inl:265
static JPH_INLINE Vec3 sLoadFloat3Unsafe(const Float3 &inV)
Load 3 floats from memory (reads 32 bits extra which it doesn't use)
Definition Vec3.inl:130
JPH_INLINE float GetZ() const
Definition Vec3.h:126
JPH_INLINE int GetHighestComponentIndex() const
Get index of component with highest value.
Definition Vec3.inl:567