29#ifndef GU_SWEEP_CONVEX_TRI
30#define GU_SWEEP_CONVEX_TRI
32#include "geometry/PxConvexMeshGeometry.h"
33#include "GuVecTriangle.h"
34#include "GuVecConvexHull.h"
35#include "GuConvexMesh.h"
36#include "GuGJKRaycast.h"
40 const PxVec3& v0,
const PxVec3& v1,
const PxVec3& v2,
41 ConvexHullV& convexHull,
const aos::PxMatTransformV& meshToConvex,
const aos::PxTransformV& convexTransfV,
42 const aos::Vec3VArg convexSpaceDir,
const PxVec3& unitDir,
const PxVec3& meshSpaceUnitDir,
43 const aos::FloatVArg fullDistance, PxReal shrunkDistance,
44 PxGeomSweepHit& hit,
bool isDoubleSided,
const PxReal inflation,
bool& initialOverlap, PxU32 faceIndex)
50 const PxVec3 denormalizedNormal = (v1 - v0).
cross(v2 - v1);
54 const bool culled = denormalizedNormal.dot(meshSpaceUnitDir) <= 0.0f;
59 const Vec3V zeroV = V3Zero();
60 const FloatV
zero = FZero();
62 const Vec3V p0 = V3LoadU(v0);
63 const Vec3V p1 = V3LoadU(v1);
64 const Vec3V p2 = V3LoadU(v2);
67 TriangleV triangleV(meshToConvex.transform(p0), meshToConvex.transform(p1), meshToConvex.transform(p2));
70 Vec3V closestA,normal;
72 const LocalConvex<TriangleV> convexA(triangleV);
73 const LocalConvex<ConvexHullV> convexB(convexHull);
74 const Vec3V initialSearchDir = V3Sub(triangleV.getCenter(), convexHull.getCenter());
77 const bool gjkHit = gjkRaycastPenetration<LocalConvex<TriangleV>, LocalConvex<ConvexHullV> >(
78 convexA, convexB, initialSearchDir,
zero, zeroV, convexSpaceDir, toi, normal, closestA, inflation,
false);
82 if(FAllGrtrOrEq(zero, toi))
84 initialOverlap =
true;
85 return setInitialOverlapResults(hit, unitDir, faceIndex);
88 const FloatV minDist = FLoad(shrunkDistance);
89 const FloatV dist = FMul(toi, fullDistance);
90 if(FAllGrtr(minDist, dist))
92 hit.faceIndex = faceIndex;
93 hit.flags = PxHitFlag::ePOSITION | PxHitFlag::eNORMAL | PxHitFlag::eFACE_INDEX;
94 const Vec3V destWorldPointA = convexTransfV.transform(closestA);
95 const Vec3V destNormal = V3Normalize(convexTransfV.rotate(normal));
96 V3StoreU(destWorldPointA, hit.position);
97 V3StoreU(destNormal, hit.normal);
98 FStore(dist, &hit.distance);
GLM_FUNC_QUALIFIER vec< 3, T, Q > cross(vec< 3, T, Q > const &x, vec< 3, T, Q > const &y)
Definition func_geometric.inl:175
#define PX_FORCE_INLINE
Definition PxPreprocessor.h:335
GLM_FUNC_DECL GLM_CONSTEXPR genType zero()
Definition constants.inl:6