MUDA
Loading...
Searching...
No Matches
aabb.h
1#pragma once
2#include <muda/ext/geo/lbvh/utility.h>
3#include <thrust/swap.h>
4#include <cmath>
5#include <cuda_runtime.h>
6
7namespace muda::lbvh
8{
9template <typename T>
10struct AABB
11{
12 typename vector_of<T>::type upper;
13 typename vector_of<T>::type lower;
14
15 MUDA_GENERIC AABB() noexcept = default;
16 MUDA_GENERIC AABB(const AABB<T>&) noexcept = default;
17 MUDA_GENERIC AABB(AABB<T>&&) noexcept = default;
18 MUDA_GENERIC AABB& operator=(const AABB<T>&) noexcept = default;
19 MUDA_GENERIC AABB& operator=(AABB<T>&&) noexcept = default;
20};
21
22template <typename T>
23MUDA_GENERIC inline bool intersects(const AABB<T>& lhs, const AABB<T>& rhs) noexcept
24{
25 if(lhs.upper.x < rhs.lower.x || rhs.upper.x < lhs.lower.x)
26 {
27 return false;
28 }
29 if(lhs.upper.y < rhs.lower.y || rhs.upper.y < lhs.lower.y)
30 {
31 return false;
32 }
33 if(lhs.upper.z < rhs.lower.z || rhs.upper.z < lhs.lower.z)
34 {
35 return false;
36 }
37 return true;
38}
39
40MUDA_GENERIC inline AABB<double> merge(const AABB<double>& lhs, const AABB<double>& rhs) noexcept
41{
42 AABB<double> merged;
43 merged.upper.x = ::fmax(lhs.upper.x, rhs.upper.x);
44 merged.upper.y = ::fmax(lhs.upper.y, rhs.upper.y);
45 merged.upper.z = ::fmax(lhs.upper.z, rhs.upper.z);
46 merged.lower.x = ::fmin(lhs.lower.x, rhs.lower.x);
47 merged.lower.y = ::fmin(lhs.lower.y, rhs.lower.y);
48 merged.lower.z = ::fmin(lhs.lower.z, rhs.lower.z);
49 return merged;
50}
51
52MUDA_GENERIC inline AABB<float> merge(const AABB<float>& lhs, const AABB<float>& rhs) noexcept
53{
54 AABB<float> merged;
55 merged.upper.x = ::fmaxf(lhs.upper.x, rhs.upper.x);
56 merged.upper.y = ::fmaxf(lhs.upper.y, rhs.upper.y);
57 merged.upper.z = ::fmaxf(lhs.upper.z, rhs.upper.z);
58 merged.lower.x = ::fminf(lhs.lower.x, rhs.lower.x);
59 merged.lower.y = ::fminf(lhs.lower.y, rhs.lower.y);
60 merged.lower.z = ::fminf(lhs.lower.z, rhs.lower.z);
61 return merged;
62}
63
64// metrics defined in
65// Nearest Neighbor Queries (1995) ACS-SIGMOD
66// - Nick Roussopoulos, Stephen Kelley FredericVincent
67
68MUDA_GENERIC inline float mindist(const AABB<float>& lhs, const float4& rhs) noexcept
69{
70 const float dx = ::fminf(lhs.upper.x, ::fmaxf(lhs.lower.x, rhs.x)) - rhs.x;
71 const float dy = ::fminf(lhs.upper.y, ::fmaxf(lhs.lower.y, rhs.y)) - rhs.y;
72 const float dz = ::fminf(lhs.upper.z, ::fmaxf(lhs.lower.z, rhs.z)) - rhs.z;
73 return dx * dx + dy * dy + dz * dz;
74}
75
76MUDA_GENERIC inline double mindist(const AABB<double>& lhs, const double4& rhs) noexcept
77{
78 const double dx = ::fmin(lhs.upper.x, ::fmax(lhs.lower.x, rhs.x)) - rhs.x;
79 const double dy = ::fmin(lhs.upper.y, ::fmax(lhs.lower.y, rhs.y)) - rhs.y;
80 const double dz = ::fmin(lhs.upper.z, ::fmax(lhs.lower.z, rhs.z)) - rhs.z;
81 return dx * dx + dy * dy + dz * dz;
82}
83
84MUDA_GENERIC inline float minmaxdist(const AABB<float>& lhs, const float4& rhs) noexcept
85{
86 float3 rm_sq = make_float3((lhs.lower.x - rhs.x) * (lhs.lower.x - rhs.x),
87 (lhs.lower.y - rhs.y) * (lhs.lower.y - rhs.y),
88 (lhs.lower.z - rhs.z) * (lhs.lower.z - rhs.z));
89 float3 rM_sq = make_float3((lhs.upper.x - rhs.x) * (lhs.upper.x - rhs.x),
90 (lhs.upper.y - rhs.y) * (lhs.upper.y - rhs.y),
91 (lhs.upper.z - rhs.z) * (lhs.upper.z - rhs.z));
92
93 if((lhs.upper.x + lhs.lower.x) * 0.5f < rhs.x)
94 {
95 thrust::swap(rm_sq.x, rM_sq.x);
96 }
97 if((lhs.upper.y + lhs.lower.y) * 0.5f < rhs.y)
98 {
99 thrust::swap(rm_sq.y, rM_sq.y);
100 }
101 if((lhs.upper.z + lhs.lower.z) * 0.5f < rhs.z)
102 {
103 thrust::swap(rm_sq.z, rM_sq.z);
104 }
105
106 const float dx = rm_sq.x + rM_sq.y + rM_sq.z;
107 const float dy = rM_sq.x + rm_sq.y + rM_sq.z;
108 const float dz = rM_sq.x + rM_sq.y + rm_sq.z;
109 return ::fminf(dx, ::fminf(dy, dz));
110}
111
112MUDA_GENERIC inline double minmaxdist(const AABB<double>& lhs, const double4& rhs) noexcept
113{
114 double3 rm_sq = make_double3((lhs.lower.x - rhs.x) * (lhs.lower.x - rhs.x),
115 (lhs.lower.y - rhs.y) * (lhs.lower.y - rhs.y),
116 (lhs.lower.z - rhs.z) * (lhs.lower.z - rhs.z));
117 double3 rM_sq = make_double3((lhs.upper.x - rhs.x) * (lhs.upper.x - rhs.x),
118 (lhs.upper.y - rhs.y) * (lhs.upper.y - rhs.y),
119 (lhs.upper.z - rhs.z) * (lhs.upper.z - rhs.z));
120
121 if((lhs.upper.x + lhs.lower.x) * 0.5 < rhs.x)
122 {
123 thrust::swap(rm_sq.x, rM_sq.x);
124 }
125 if((lhs.upper.y + lhs.lower.y) * 0.5 < rhs.y)
126 {
127 thrust::swap(rm_sq.y, rM_sq.y);
128 }
129 if((lhs.upper.z + lhs.lower.z) * 0.5 < rhs.z)
130 {
131 thrust::swap(rm_sq.z, rM_sq.z);
132 }
133
134 const double dx = rm_sq.x + rM_sq.y + rM_sq.z;
135 const double dy = rM_sq.x + rm_sq.y + rM_sq.z;
136 const double dz = rM_sq.x + rM_sq.y + rm_sq.z;
137 return ::fmin(dx, ::fmin(dy, dz));
138}
139
140template <typename T>
141MUDA_GENERIC inline typename vector_of<T>::type centroid(const AABB<T>& box) noexcept
142{
143 typename vector_of<T>::type c;
144 c.x = (box.upper.x + box.lower.x) * 0.5;
145 c.y = (box.upper.y + box.lower.y) * 0.5;
146 c.z = (box.upper.z + box.lower.z) * 0.5;
147 return c;
148}
149
150} // namespace muda::lbvh
Definition aabb.h:11
Definition utility.h:9