39 static constexpr int cMaxPointsToIncludeOriginInHull = 32;
40 static_assert(cMaxPointsToIncludeOriginInHull < cMaxPoints);
58 template <
typename A,
typename B>
59 Vec3 Add(
const A &inA,
const B &inB,
Vec3Arg inDirection,
int &outIndex)
62 Vec3 p = inA.GetSupport(inDirection);
63 Vec3 q = inB.GetSupport(-inDirection);
96 template <
typename AE,
typename BE>
105 float combined_radius = inConvexRadiusA + inConvexRadiusB;
106 float combined_radius_sq = combined_radius * combined_radius;
107 float closest_points_dist_sq = mGJK.
GetClosestPoints(inAExcludingConvexRadius, inBExcludingConvexRadius, inTolerance, combined_radius_sq, ioV, outPointA, outPointB);
108 if (closest_points_dist_sq > combined_radius_sq)
113 if (closest_points_dist_sq > 0.0f)
116 float v_len = sqrt(closest_points_dist_sq);
117 outPointA += ioV * (inConvexRadiusA / v_len);
118 outPointB -= ioV * (inConvexRadiusB / v_len);
137 template <
typename AI,
typename BI>
146 SupportPoints support_points;
150 switch (support_points.mY.
size())
155 JPH_ASSERT(support_points.mY[0].IsNearZero(1.0e-8f));
160 (void)support_points.Add(inAIncludingConvexRadius, inBIncludingConvexRadius,
Vec3(0, 1, 0), p1);
161 (void)support_points.Add(inAIncludingConvexRadius, inBIncludingConvexRadius,
Vec3(-1, -1, -1), p2);
162 (void)support_points.Add(inAIncludingConvexRadius, inBIncludingConvexRadius,
Vec3(1, -1, -1), p3);
163 (void)support_points.Add(inAIncludingConvexRadius, inBIncludingConvexRadius,
Vec3(0, -1, 1), p4);
174 Vec3 axis = (support_points.mY[1] - support_points.mY[0]).Normalized();
177 Vec3 dir2 = rotation * dir1;
178 Vec3 dir3 = rotation * dir2;
180 (void)support_points.Add(inAIncludingConvexRadius, inBIncludingConvexRadius, dir1, p1);
181 (void)support_points.Add(inAIncludingConvexRadius, inBIncludingConvexRadius, dir2, p2);
182 (void)support_points.Add(inAIncludingConvexRadius, inBIncludingConvexRadius, dir3, p3);
206 if (!hull.
AddPoint(t, i, FLT_MAX, new_triangles))
243 Vec3 w = support_points.Add(inAIncludingConvexRadius, inBIncludingConvexRadius, t->
mNormal, new_index);
245#ifdef JPH_EPA_CONVEX_BUILDER_DRAW
254 if (!t->
IsFacing(w) || !hull.
AddPoint(t, new_index, FLT_MAX, new_triangles))
262 if (!hull.
HasNextTriangle() || support_points.mY.
size() >= cMaxPointsToIncludeOriginInHull)
267 float closest_dist_sq = FLT_MAX;
298 Vec3 w = support_points.Add(inAIncludingConvexRadius, inBIncludingConvexRadius, t->
mNormal, new_index);
311#ifdef JPH_EPA_CONVEX_BUILDER_DRAW
323 closest_dist_sq = min(closest_dist_sq, dist_sq);
331 if (!hull.
AddPoint(t, new_index, closest_dist_sq, new_triangles))
335 bool has_defect =
false;
336 for (
const Triangle *nt : new_triangles)
337 if (nt->IsFacingOrigin())
374 outPointA = p0 + last->
mLambda[0] * (p1 - p0) + last->
mLambda[1] * (p2 - p0);
375 outPointB = q0 + last->
mLambda[0] * (q1 - q0) + last->
mLambda[1] * (q2 - q0);
380 outPointA = p1 + last->
mLambda[0] * (p0 - p1) + last->
mLambda[1] * (p2 - p1);
381 outPointB = q1 + last->
mLambda[0] * (q0 - q1) + last->
mLambda[1] * (q2 - q1);
390 template <
typename AE,
typename AI,
typename BE,
typename BI>
391 bool GetPenetrationDepth(
const AE &inAExcludingConvexRadius,
const AI &inAIncludingConvexRadius,
float inConvexRadiusA,
const BE &inBExcludingConvexRadius,
const BI &inBIncludingConvexRadius,
float inConvexRadiusB,
float inCollisionToleranceSq,
float inPenetrationTolerance,
Vec3 &ioV,
Vec3 &outPointA,
Vec3 &outPointB)
394 switch (
GetPenetrationDepthStepGJK(inAExcludingConvexRadius, inConvexRadiusA, inBExcludingConvexRadius, inConvexRadiusB, inCollisionToleranceSq, ioV, outPointA, outPointB))
403 return GetPenetrationDepthStepEPA(inAIncludingConvexRadius, inBIncludingConvexRadius, inPenetrationTolerance, ioV, outPointA, outPointB);
427 template <
typename A,
typename B>
428 bool CastShape(
Mat44Arg inStart,
Vec3Arg inDirection,
float inCollisionTolerance,
float inPenetrationTolerance,
const A &inA,
const B &inB,
float inConvexRadiusA,
float inConvexRadiusB,
bool inReturnDeepestPoint,
float &ioLambda,
Vec3 &outPointA,
Vec3 &outPointB,
Vec3 &outContactNormal)
431 if (!mGJK.
CastShape(inStart, inDirection, inCollisionTolerance, inA, inB, inConvexRadiusA, inConvexRadiusB, ioLambda, outPointA, outPointB, outContactNormal))
435 bool contact_normal_invalid = outContactNormal.
IsNearZero(
Square(inCollisionTolerance));
437 if (inReturnDeepestPoint
439 && (inConvexRadiusA + inConvexRadiusB == 0.0f
440 || contact_normal_invalid))
449 else if (contact_normal_invalid)
452 outContactNormal = inDirection;
#define JPH_NAMESPACE_END
Definition Core.h:240
#define JPH_NAMESPACE_BEGIN
Definition Core.h:234
#define JPH_ASSERT(...)
Definition IssueReporting.h:33
constexpr T Square(T inV)
Square a value.
Definition Math.h:52
constexpr float DegreesToRadians(float inV)
Convert a value from degrees to radians.
Definition Math.h:13
#define JPH_PROFILE_FUNCTION()
Scope profiling for function.
Definition Profiler.h:236
static const Color sPurple
Definition Color.h:54
static const Color sRed
Definition Color.h:48
int mStartIdx
Vertex index in mPositions that indicates the start vertex of this edge.
Definition EPAConvexHullBuilder.h:54
Specialized points list that allows direct access to the size.
Definition EPAConvexHullBuilder.h:172
size_type & GetSizeRef()
Definition EPAConvexHullBuilder.h:174
Class that holds the information of one triangle.
Definition EPAConvexHullBuilder.h:62
Vec3 mCentroid
Center of the triangle.
Definition EPAConvexHullBuilder.h:89
bool mClosestPointInterior
Flag that indicates that the closest point from this triangle to the origin is an interior point.
Definition EPAConvexHullBuilder.h:93
bool IsFacing(Vec3Arg inPosition) const
Check if triangle is facing inPosition.
Definition EPAConvexHullBuilder.h:68
Vec3 mNormal
Normal of this triangle, length is 2 times area of triangle.
Definition EPAConvexHullBuilder.h:88
Edge mEdge[3]
3 edges of this triangle
Definition EPAConvexHullBuilder.h:87
float mClosestLenSq
Closest distance^2 from origin to triangle.
Definition EPAConvexHullBuilder.h:90
float mLambda[2]
Barycentric coordinates of closest point to origin on triangle.
Definition EPAConvexHullBuilder.h:91
bool mLambdaRelativeTo0
How to calculate the closest point, true: y0 + l0 * (y1 - y0) + l1 * (y2 - y0), false: y1 + l0 * (y0 ...
Definition EPAConvexHullBuilder.h:92
bool mRemoved
Flag that indicates that triangle has been removed.
Definition EPAConvexHullBuilder.h:94
A convex hull builder specifically made for the EPA penetration depth calculation....
Definition EPAConvexHullBuilder.h:24
Triangle * PeekClosestTriangleInQueue()
Access to the next closest triangle to the origin (won't remove it from the queue).
Definition EPAConvexHullBuilder.h:267
bool HasNextTriangle() const
Check if there's another triangle to process from the queue.
Definition EPAConvexHullBuilder.h:261
static constexpr int cMaxPoints
Max number of points in hull.
Definition EPAConvexHullBuilder.h:36
Triangle * PopClosestTriangleFromQueue()
Access to the next closest triangle to the origin and remove it from the queue.
Definition EPAConvexHullBuilder.h:273
void FreeTriangle(Triangle *inT)
Free a triangle.
Definition EPAConvexHullBuilder.h:365
Triangle * FindFacingTriangle(Vec3Arg inPosition, float &outBestDistSq)
Definition EPAConvexHullBuilder.h:280
void Initialize(int inIdx1, int inIdx2, int inIdx3)
Initialize the hull with 3 points.
Definition EPAConvexHullBuilder.h:233
bool AddPoint(Triangle *inFacingTriangle, int inIdx, float inClosestDistSq, NewTriangles &outTriangles)
Add a new point to the convex hull.
Definition EPAConvexHullBuilder.h:305
Definition EPAPenetrationDepth.h:35
bool CastShape(Mat44Arg inStart, Vec3Arg inDirection, float inCollisionTolerance, float inPenetrationTolerance, const A &inA, const B &inB, float inConvexRadiusA, float inConvexRadiusB, bool inReturnDeepestPoint, float &ioLambda, Vec3 &outPointA, Vec3 &outPointB, Vec3 &outContactNormal)
Definition EPAPenetrationDepth.h:428
bool GetPenetrationDepth(const AE &inAExcludingConvexRadius, const AI &inAIncludingConvexRadius, float inConvexRadiusA, const BE &inBExcludingConvexRadius, const BI &inBIncludingConvexRadius, float inConvexRadiusB, float inCollisionToleranceSq, float inPenetrationTolerance, Vec3 &ioV, Vec3 &outPointA, Vec3 &outPointB)
Definition EPAPenetrationDepth.h:391
EStatus GetPenetrationDepthStepGJK(const AE &inAExcludingConvexRadius, float inConvexRadiusA, const BE &inBExcludingConvexRadius, float inConvexRadiusB, float inTolerance, Vec3 &ioV, Vec3 &outPointA, Vec3 &outPointB)
Definition EPAPenetrationDepth.h:97
EStatus
Return code for GetPenetrationDepthStepGJK.
Definition EPAPenetrationDepth.h:79
@ NotColliding
Returned if the objects don't collide, in this case outPointA/outPointB are invalid.
@ Indeterminate
Returned if the objects penetrate further than the convex radius. In this case you need to call GetPe...
@ Colliding
Returned if the objects penetrate.
bool GetPenetrationDepthStepEPA(const AI &inAIncludingConvexRadius, const BI &inBIncludingConvexRadius, float inTolerance, Vec3 &outV, Vec3 &outPointA, Vec3 &outPointB)
Definition EPAPenetrationDepth.h:138
Definition GJKClosestPoint.h:23
bool CastShape(Mat44Arg inStart, Vec3Arg inDirection, float inTolerance, const A &inA, const B &inB, float &ioLambda)
Definition GJKClosestPoint.h:676
void GetClosestPointsSimplex(Vec3 *outY, Vec3 *outP, Vec3 *outQ, uint &outNumPoints) const
Definition GJKClosestPoint.h:502
float GetClosestPoints(const A &inA, const B &inB, float inTolerance, float inMaxDistSq, Vec3 &ioV, Vec3 &outPointA, Vec3 &outPointB)
Definition GJKClosestPoint.h:334
Holds a 4x4 matrix of floats, but supports also operations on the 3x3 upper left part of the matrix.
Definition Mat44.h:13
static JPH_INLINE Mat44 sRotation(Vec3Arg inAxis, float inAngle)
Rotate around arbitrary axis.
Definition Mat44.inl:139
Simple variable length array backed by a fixed size buffer.
Definition StaticArray.h:12
void push_back(const T &inElement)
Add element to the back of the array.
Definition StaticArray.h:59
uint size_type
Definition StaticArray.h:16
const T * data() const
Definition StaticArray.h:136
size_type size() const
Returns amount of elements in the array.
Definition StaticArray.h:87
void pop_back()
Remove element from the back of the array.
Definition StaticArray.h:74
JPH_INLINE float Dot(Vec3Arg inV2) const
Dot product.
Definition Vec3.inl:637
JPH_INLINE Vec3 GetNormalizedPerpendicular() const
Get normalized vector that is perpendicular to this vector.
Definition Vec3.inl:812
JPH_INLINE float LengthSq() const
Squared length of vector.
Definition Vec3.inl:653
JPH_INLINE bool IsNearZero(float inMaxDistSq=1.0e-12f) const
Test if vector is near zero.
Definition Vec3.inl:347
Structure that adds a convex radius.
Definition ConvexSupport.h:46