2#include <muda/ext/geo/lbvh/utility.h>
3#include <thrust/swap.h>
5#include <cuda_runtime.h>
15 MUDA_GENERIC
AABB()
noexcept =
default;
16 MUDA_GENERIC
AABB(
const AABB<T>&)
noexcept =
default;
18 MUDA_GENERIC
AABB& operator=(
const AABB<T>&)
noexcept =
default;
19 MUDA_GENERIC
AABB& operator=(
AABB<T>&&)
noexcept =
default;
23MUDA_GENERIC
inline bool intersects(
const AABB<T>& lhs,
const AABB<T>& rhs)
noexcept
25 if(lhs.upper.x < rhs.lower.x || rhs.upper.x < lhs.lower.x)
29 if(lhs.upper.y < rhs.lower.y || rhs.upper.y < lhs.lower.y)
33 if(lhs.upper.z < rhs.lower.z || rhs.upper.z < lhs.lower.z)
40MUDA_GENERIC
inline AABB<double> merge(
const AABB<double>& lhs,
const AABB<double>& rhs)
noexcept
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);
52MUDA_GENERIC
inline AABB<float> merge(
const AABB<float>& lhs,
const AABB<float>& rhs)
noexcept
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);
68MUDA_GENERIC
inline float mindist(
const AABB<float>& lhs,
const float4& rhs)
noexcept
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;
76MUDA_GENERIC
inline double mindist(
const AABB<double>& lhs,
const double4& rhs)
noexcept
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;
84MUDA_GENERIC
inline float minmaxdist(
const AABB<float>& lhs,
const float4& rhs)
noexcept
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));
93 if((lhs.upper.x + lhs.lower.x) * 0.5f < rhs.x)
95 thrust::swap(rm_sq.x, rM_sq.x);
97 if((lhs.upper.y + lhs.lower.y) * 0.5f < rhs.y)
99 thrust::swap(rm_sq.y, rM_sq.y);
101 if((lhs.upper.z + lhs.lower.z) * 0.5f < rhs.z)
103 thrust::swap(rm_sq.z, rM_sq.z);
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));
112MUDA_GENERIC
inline double minmaxdist(
const AABB<double>& lhs,
const double4& rhs)
noexcept
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));
121 if((lhs.upper.x + lhs.lower.x) * 0.5 < rhs.x)
123 thrust::swap(rm_sq.x, rM_sq.x);
125 if((lhs.upper.y + lhs.lower.y) * 0.5 < rhs.y)
127 thrust::swap(rm_sq.y, rM_sq.y);
129 if((lhs.upper.z + lhs.lower.z) * 0.5 < rhs.z)
131 thrust::swap(rm_sq.z, rM_sq.z);
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));
141MUDA_GENERIC
inline typename vector_of<T>::type centroid(
const AABB<T>& box)
noexcept
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;