29#ifndef GU_SWEEP_TRIANGLE_UTILS_H
30#define GU_SWEEP_TRIANGLE_UTILS_H
32#include "geometry/PxTriangle.h"
33#include "PxQueryReport.h"
35#include "GuSweepSharedTests.h"
36#include "GuInternal.h"
44 void computeSphereTriImpactData(PxVec3& hit, PxVec3& normal,
const PxVec3& center,
const PxVec3& dir,
float t,
const PxTriangle& tri);
47 void computeBoxTriImpactData(PxVec3& hit, PxVec3& normal,
const PxVec3& boxExtents,
const PxVec3& localDir,
const PxTriangle& triInBoxSpace, PxReal impactDist);
51 void computeEdgeEdgeNormal(PxVec3& normal,
const PxVec3& p1,
const PxVec3& p2_p1,
const PxVec3& p3,
const PxVec3& p4_p3,
const PxVec3& dir,
float d);
60 PX_ASSERT(*cachedIndex < nbTris);
62 initIndex = *cachedIndex;
69 PX_FORCE_INLINE bool cullTriangle(
const PxVec3*
PX_RESTRICT triVerts,
const PxVec3& dir, PxReal radius, PxReal t,
const PxReal dpc0)
72 const PxReal dp0 = triVerts[0].dot(dir);
73 const PxReal dp1 = triVerts[1].dot(dir);
74 const PxReal dp2 = triVerts[2].dot(dir);
78 dp = physx::intrinsics::selectMin(dp, dp1);
79 dp = physx::intrinsics::selectMin(dp, dp2);
82 radius += 0.001f + GU_EPSILON_SAME_DISTANCE;
86 if(dp>dpc0 + t + radius)
93 const PxReal dpc1 = dpc0 - radius;
94 if(dp0<dpc1 && dp1<dpc1 && dp2<dpc1)
105 PX_FORCE_INLINE bool cullQuad(
const PxVec3*
PX_RESTRICT quadVerts,
const PxVec3& dir, PxReal radius, PxReal t,
const PxReal dpc0)
108 const PxReal dp0 = quadVerts[0].dot(dir);
109 const PxReal dp1 = quadVerts[1].dot(dir);
110 const PxReal dp2 = quadVerts[2].dot(dir);
111 const PxReal dp3 = quadVerts[3].dot(dir);
115 dp = physx::intrinsics::selectMin(dp, dp1);
116 dp = physx::intrinsics::selectMin(dp, dp2);
117 dp = physx::intrinsics::selectMin(dp, dp3);
120 radius += 0.001f + GU_EPSILON_SAME_DISTANCE;
124 if(dp>dpc0 + t + radius)
128 const float dpc1 = dpc0 - radius;
129 if(dp0<dpc1 && dp1<dpc1 && dp2<dpc1 && dp3<dpc1)
152 PX_FORCE_INLINE PxReal squareDistance(
const PxVec3& p0,
const PxVec3& dir, PxReal t,
const PxVec3& point)
154 PxVec3 diff = point - p0;
155 PxReal fT = diff.dot(dir);
156 fT = physx::intrinsics::selectMax(fT, 0.0f);
157 fT = physx::intrinsics::selectMin(fT, t);
159 return diff.magnitudeSquared();
164 PX_FORCE_INLINE bool coarseCullingTri(
const PxVec3& center,
const PxVec3& dir, PxReal t, PxReal radius,
const PxVec3*
PX_RESTRICT triVerts)
167 const PxVec3 triCenter = (triVerts[0] + triVerts[1] + triVerts[2]) * (1.0f/3.0f);
171 PxReal d =
PxSqrt(squareDistance(center, dir, t, triCenter)) - radius - 0.0001f;
181 if(d <= (triCenter-triVerts[0]).magnitudeSquared())
183 if(d <= (triCenter-triVerts[1]).magnitudeSquared())
185 if(d <= (triCenter-triVerts[2]).magnitudeSquared())
190 const float d0 = (triCenter-triVerts[0]).magnitudeSquared();
191 const float d1 = (triCenter-triVerts[1]).magnitudeSquared();
192 const float d2 = (triCenter-triVerts[2]).magnitudeSquared();
193 float triRadius = physx::intrinsics::selectMax(d0, d1);
194 triRadius = physx::intrinsics::selectMax(triRadius, d2);
202 PX_FORCE_INLINE bool coarseCullingQuad(
const PxVec3& center,
const PxVec3& dir, PxReal t, PxReal radius,
const PxVec3*
PX_RESTRICT quadVerts)
205 const PxVec3 quadCenter = (quadVerts[0] + quadVerts[1] + quadVerts[2] + quadVerts[3]) * (1.0f/4.0f);
208 PxReal d =
PxSqrt(squareDistance(center, dir, t, quadCenter)) - radius - 0.0001f;
218 if(d <= (quadCenter-quadVerts[0]).magnitudeSquared())
220 if(d <= (quadCenter-quadVerts[1]).magnitudeSquared())
222 if(d <= (quadCenter-quadVerts[2]).magnitudeSquared())
224 if(d <= (quadCenter-quadVerts[3]).magnitudeSquared())
231 PX_FORCE_INLINE bool rejectTriangle(
const PxVec3& center,
const PxVec3& unitDir, PxReal curT, PxReal radius,
const PxVec3*
PX_RESTRICT triVerts,
const PxReal dpc0)
233 if(!coarseCullingTri(center, unitDir, curT, radius, triVerts))
235 if(!cullTriangle(triVerts, unitDir, radius, curT, dpc0))
241 PX_FORCE_INLINE bool rejectQuad(
const PxVec3& center,
const PxVec3& unitDir, PxReal curT, PxReal radius,
const PxVec3*
PX_RESTRICT quadVerts,
const PxReal dpc0)
243 if(!coarseCullingQuad(center, unitDir, curT, radius, quadVerts))
245 if(!cullQuad(quadVerts, unitDir, radius, curT, dpc0))
250 PX_FORCE_INLINE bool shouldFlipNormal(
const PxVec3& normal,
bool meshBothSides,
bool isDoubleSided,
const PxVec3& triangleNormal,
const PxVec3& dir)
255 if(!meshBothSides || isDoubleSided)
258 PX_ASSERT(normal.dot(dir) <= 0.0f);
263 PX_FORCE_INLINE bool shouldFlipNormal(
const PxVec3& normal,
bool meshBothSides,
bool isDoubleSided,
const PxTriangle& triangle,
const PxVec3& dir,
const PxTransform* pose)
268 if(!meshBothSides || isDoubleSided)
271 PX_ASSERT(normal.dot(dir) <= 0.0f);
275 triangle.denormalizedNormal(triangleNormal);
284 PX_FORCE_INLINE bool setInitialOverlapResults(PxGeomSweepHit& hit,
const PxVec3& unitDir, PxU32 faceIndex)
287 hit.faceIndex = faceIndex;
289 hit.normal = -unitDir;
294 PX_FORCE_INLINE void computeBoxLocalImpact( PxVec3& pos, PxVec3& normal, PxHitFlags& outFlags,
295 const Box& box,
const PxVec3& localDir,
const PxTriangle& triInBoxSpace,
296 const PxHitFlags inFlags,
bool isDoubleSided,
bool meshBothSides, PxReal impactDist)
300 PxVec3 localPos, localNormal;
301 computeBoxTriImpactData(localPos, localNormal, box.extents, localDir, triInBoxSpace, impactDist);
305 localNormal.normalize();
314 if((localNormal.dot(localDir))>0.0f)
315 localNormal = -localNormal;
318 if(shouldFlipNormal(localNormal, meshBothSides, isDoubleSided, triInBoxSpace, localDir, NULL))
319 localNormal = -localNormal;
321 normal = box.rotate(localNormal);
327 pos = box.transform(localPos);
#define PX_RESTRICT
Definition PxPreprocessor.h:355
#define PX_FORCE_INLINE
Definition PxPreprocessor.h:335
GLM_FUNC_DECL vec< 3, T, Q > triangleNormal(vec< 3, T, Q > const &p1, vec< 3, T, Q > const &p2, vec< 3, T, Q > const &p3)
Definition normal.inl:7
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 PxSqrt(float a)
Square root.
Definition PxMath.h:146
@ eNORMAL
"normal" member of #PxQueryHit is valid
Definition PxGeometryHit.h:61
@ eFACE_INDEX
"face index" member of #PxQueryHit is valid
Definition PxGeometryHit.h:75
@ ePOSITION
"position" member of #PxQueryHit is valid
Definition PxGeometryHit.h:60