70void inpminmax(T& a, T& b)
79bool intersectsHelperTriangleAabb3D(
const P& v0,
const P& v1,
const P& v2,
const P& a,
const P& b)
81 typedef typename P::TVector TVector;
82 typedef typename P::TValue TValue;
88 Range(TValue min, TValue max): min_(min), max_(max)
90 inpminmax(min_, max_);
92 Range& operator+=(
const Range& other)
98 bool seperated(
const Range& other)
const
100 return other.max_ < min_ || other.min_ > max_;
107 const TVector f = v1 - v0;
112 const Range triangleRange(
113 v0.z * v1.y - v0.y * v1.z,
114 f.y * v2.z - f.z * v2.y
116 Range boxRange(a.y * -f.z, b.y * -f.z);
117 boxRange += Range(a.z * f.y, b.z * f.y);
118 if (triangleRange.seperated(boxRange))
return false;
123 const Range triangleRange(
124 v0.x * v1.z - v0.z * v1.x,
125 f.z * v2.x - f.x * v2.z
127 Range boxRange(a.z * -f.x, b.z * -f.x);
128 boxRange += Range(a.x * f.z, b.x * f.z);
129 if (triangleRange.seperated(boxRange))
return false;
134 const Range triangleRange(
135 v0.y * v1.x - v0.x * v1.y,
136 f.x * v2.y - f.y * v2.x
138 Range boxRange(a.x * -f.y, b.x * -f.y);
139 boxRange += Range(a.y * f.x, b.y * f.x);
140 if (triangleRange.seperated(boxRange))
return false;
157 if (!impl::intersectsHelperTriangleAabb3D(triangle[0], triangle[1], triangle[2], box.
min(), box.
max()))
return false;
158 if (!impl::intersectsHelperTriangleAabb3D(triangle[1], triangle[2], triangle[0], box.
min(), box.
max()))
return false;
159 if (!impl::intersectsHelperTriangleAabb3D(triangle[2], triangle[0], triangle[1], box.
min(), box.
max()))
return false;