29#ifndef GU_INTERSECTION_TRIANGLE_BOX_REF_H
30#define GU_INTERSECTION_TRIANGLE_BOX_REF_H
32#include "foundation/PxVec3.h"
51#define CROSS(dest,v1,v2) \
52 dest.x=v1.y*v2.z-v1.z*v2.y; \
53 dest.y=v1.z*v2.x-v1.x*v2.z; \
54 dest.z=v1.x*v2.y-v1.y*v2.x;
56#define DOT(v1,v2) (v1.x*v2.x+v1.y*v2.y+v1.z*v2.z)
58#define FINDMINMAX(x0, x1, x2, minimum, maximum) \
59 minimum = physx::intrinsics::selectMin(x0, x1); \
60 maximum = physx::intrinsics::selectMax(x0, x1); \
61 minimum = physx::intrinsics::selectMin(minimum, x2); \
62 maximum = physx::intrinsics::selectMax(maximum, x2);
64 static PX_CUDA_CALLABLE
PX_FORCE_INLINE PxIntBool planeBoxOverlap(
const PxVec3& normal, PxReal d,
const PxVec3& maxbox)
101 if(normal.
dot(vmin) + d > 0.0f)
103 if(normal.
dot(vmax) + d >= 0.0f)
109#define AXISTEST_X01(a, b, fa, fb) \
110 p0 = a*v0.y - b*v0.z; \
111 p2 = a*v2.y - b*v2.z; \
112 minimum = physx::intrinsics::selectMin(p0, p2); \
113 maximum = physx::intrinsics::selectMax(p0, p2); \
114 rad = fa * extents.y + fb * extents.z; \
115 if(minimum>rad || maximum<-rad) return PxIntFalse;
117#define AXISTEST_X2(a, b, fa, fb) \
118 p0 = a*v0.y - b*v0.z; \
119 p1 = a*v1.y - b*v1.z; \
120 minimum = physx::intrinsics::selectMin(p0, p1); \
121 maximum = physx::intrinsics::selectMax(p0, p1); \
122 rad = fa * extents.y + fb * extents.z; \
123 if(minimum>rad || maximum<-rad) return PxIntFalse;
126#define AXISTEST_Y02(a, b, fa, fb) \
127 p0 = -a*v0.x + b*v0.z; \
128 p2 = -a*v2.x + b*v2.z; \
129 minimum = physx::intrinsics::selectMin(p0, p2); \
130 maximum = physx::intrinsics::selectMax(p0, p2); \
131 rad = fa * extents.x + fb * extents.z; \
132 if(minimum>rad || maximum<-rad) return PxIntFalse;
134#define AXISTEST_Y1(a, b, fa, fb) \
135 p0 = -a*v0.x + b*v0.z; \
136 p1 = -a*v1.x + b*v1.z; \
137 minimum = physx::intrinsics::selectMin(p0, p1); \
138 maximum = physx::intrinsics::selectMax(p0, p1); \
139 rad = fa * extents.x + fb * extents.z; \
140 if(minimum>rad || maximum<-rad) return PxIntFalse;
143#define AXISTEST_Z12(a, b, fa, fb) \
144 p1 = a*v1.x - b*v1.y; \
145 p2 = a*v2.x - b*v2.y; \
146 minimum = physx::intrinsics::selectMin(p1, p2); \
147 maximum = physx::intrinsics::selectMax(p1, p2); \
148 rad = fa * extents.x + fb * extents.y; \
149 if(minimum>rad || maximum<-rad) return PxIntFalse;
151#define AXISTEST_Z0(a, b, fa, fb) \
152 p0 = a*v0.x - b*v0.y; \
153 p1 = a*v1.x - b*v1.y; \
154 minimum = physx::intrinsics::selectMin(p0, p1); \
155 maximum = physx::intrinsics::selectMax(p0, p1); \
156 rad = fa * extents.x + fb * extents.y; \
157 if(minimum>rad || maximum<-rad) return PxIntFalse;
161 template <const
bool bDoVertexChecks = false>
162 static PX_CUDA_CALLABLE
PX_FORCE_INLINE PxIntBool intersectTriangleBox_RefImpl(
const PxVec3& boxcenter,
const PxVec3& extents,
const PxVec3& tp0,
const PxVec3& tp1,
const PxVec3& tp2)
173 const PxVec3 v0 = tp0 - boxcenter;
174 const PxVec3 v1 = tp1 - boxcenter;
175 const PxVec3 v2 = tp2 - boxcenter;
179 if (
PxAbs(v0.x) <= extents.x &&
PxAbs(v0.y) <= extents.y &&
PxAbs(v0.z) <= extents.z)
181 if (
PxAbs(v1.x) <= extents.x &&
PxAbs(v1.y) <= extents.y &&
PxAbs(v1.z) <= extents.z)
183 if (
PxAbs(v2.x) <= extents.x &&
PxAbs(v2.y) <= extents.y &&
PxAbs(v2.z) <= extents.z)
188 const PxVec3 e0 = v1 - v0;
189 const PxVec3 e1 = v2 - v1;
190 const PxVec3 e2 = v0 - v2;
192 float minimum, maximum, rad, p0, p1, p2;
195 float fex =
PxAbs(e0.x);
196 float fey =
PxAbs(e0.y);
197 float fez =
PxAbs(e0.z);
198 AXISTEST_X01(e0.z, e0.y, fez, fey);
199 AXISTEST_Y02(e0.z, e0.x, fez, fex);
200 AXISTEST_Z12(e0.y, e0.x, fey, fex);
205 AXISTEST_X01(e1.z, e1.y, fez, fey);
206 AXISTEST_Y02(e1.z, e1.x, fez, fex);
207 AXISTEST_Z0(e1.y, e1.x, fey, fex);
212 AXISTEST_X2(e2.z, e2.y, fez, fey);
213 AXISTEST_Y1(e2.z, e2.x, fez, fex);
214 AXISTEST_Z12(e2.y, e2.x, fey, fex);
223 FINDMINMAX(v0.x, v1.x, v2.x, minimum, maximum);
224 if(minimum>extents.x || maximum<-extents.x)
228 FINDMINMAX(v0.y, v1.y, v2.y, minimum, maximum);
229 if(minimum>extents.y || maximum<-extents.y)
233 FINDMINMAX(v0.z, v1.z, v2.z, minimum, maximum);
234 if(minimum>extents.z || maximum<-extents.z)
241 CROSS(normal, e0, e1);
242 const float d = -DOT(normal, v0);
243 if(!planeBoxOverlap(normal, d, extents))
PX_CUDA_CALLABLE PX_FORCE_INLINE float dot(const PxVec3 &v) const
returns the scalar product of this and other.
Definition PxVec3.h:276
#define PX_FORCE_INLINE
Definition PxPreprocessor.h:335
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39
PX_CUDA_CALLABLE PX_FORCE_INLINE float PxAbs(float a)
abs returns the absolute value of its argument.
Definition PxMath.h:109