41    static constexpr int cMaxPointsToIncludeOriginInHull = 32;
 
   42    static_assert(cMaxPointsToIncludeOriginInHull < cMaxPoints);
 
   50#ifdef JPH_ENABLE_ASSERTS 
   52    float               mGJKTolerance = 0.0f;
 
   65        template <
typename A, 
typename B>
 
   66        Vec3            Add(
const A &inA, 
const B &inB, 
Vec3Arg inDirection, 
int &outIndex)
 
   69            Vec3 p = inA.GetSupport(inDirection);
 
   70            Vec3 q = inB.GetSupport(-inDirection);
 
  103    template <
typename AE, 
typename BE>
 
  114        float combined_radius = inConvexRadiusA + inConvexRadiusB;
 
  115        float combined_radius_sq = combined_radius * combined_radius;
 
  116        float closest_points_dist_sq = mGJK.
GetClosestPoints(inAExcludingConvexRadius, inBExcludingConvexRadius, inTolerance, combined_radius_sq, ioV, outPointA, outPointB);
 
  117        if (closest_points_dist_sq > combined_radius_sq)
 
  122        if (closest_points_dist_sq > 0.0f)
 
  125            float v_len = sqrt(closest_points_dist_sq); 
 
  126            outPointA += ioV * (inConvexRadiusA / v_len);
 
  127            outPointB -= ioV * (inConvexRadiusB / v_len);
 
  146    template <
typename AI, 
typename BI>
 
  155        SupportPoints support_points;
 
  156        mGJK.
GetClosestPointsSimplex(support_points.mY.data(), support_points.mP, support_points.mQ, support_points.mY.GetSizeRef());
 
  159        switch (support_points.mY.size())
 
  165                support_points.mY.pop_back();
 
  169                (void)support_points.Add(inAIncludingConvexRadius, inBIncludingConvexRadius, 
Vec3(0, 1, 0), p1);
 
  170                (void)support_points.Add(inAIncludingConvexRadius, inBIncludingConvexRadius, 
Vec3(-1, -1, -1), p2);
 
  171                (void)support_points.Add(inAIncludingConvexRadius, inBIncludingConvexRadius, 
Vec3(1, -1, -1), p3);
 
  172                (void)support_points.Add(inAIncludingConvexRadius, inBIncludingConvexRadius, 
Vec3(0, -1, 1), p4);
 
  183                Vec3 axis = (support_points.mY[1] - support_points.mY[0]).Normalized();
 
  186                Vec3 dir2 = rotation * dir1;
 
  187                Vec3 dir3 = rotation * dir2;
 
  189                (void)support_points.Add(inAIncludingConvexRadius, inBIncludingConvexRadius, dir1, p1);
 
  190                (void)support_points.Add(inAIncludingConvexRadius, inBIncludingConvexRadius, dir2, p2);
 
  191                (void)support_points.Add(inAIncludingConvexRadius, inBIncludingConvexRadius, dir3, p3);
 
  207#ifdef JPH_EPA_CONVEX_BUILDER_DRAW 
  208        hull.DrawLabel(
"Build initial hull");
 
  210#ifdef JPH_EPA_PENETRATION_DEPTH_DEBUG 
  211        Trace(
"Init: num_points = %u", (
uint)support_points.mY.size());
 
  221                if (!hull.
AddPoint(t, i, FLT_MAX, new_triangles))
 
  230#ifdef JPH_EPA_CONVEX_BUILDER_DRAW 
  231        hull.DrawLabel(
"Complete hull");
 
  238        hull.DrawLabel(
"Ensure origin in hull");
 
  264#ifdef JPH_EPA_CONVEX_BUILDER_DRAW 
  265            hull.DrawLabel(
"Next iteration");
 
  267#ifdef JPH_EPA_PENETRATION_DEPTH_DEBUG 
  268            Trace(
"EncapsulateOrigin: verts = (%d, %d, %d), closest_dist_sq = %g, centroid = (%g, %g, %g), normal = (%g, %g, %g)",
 
  280            Vec3 w = support_points.Add(inAIncludingConvexRadius, inBIncludingConvexRadius, t->
mNormal, new_index);
 
  282#ifdef JPH_EPA_CONVEX_BUILDER_DRAW 
  291            if (!t->
IsFacing(w) || !hull.
AddPoint(t, new_index, FLT_MAX, new_triangles))
 
  299            if (!hull.
HasNextTriangle() || support_points.mY.size() >= cMaxPointsToIncludeOriginInHull)
 
  303#ifdef JPH_EPA_CONVEX_BUILDER_DRAW 
  304        hull.DrawLabel(
"Main algorithm");
 
  308        float closest_dist_sq = FLT_MAX;
 
  314        bool flip_v_sign = 
false;
 
  329#ifdef JPH_EPA_CONVEX_BUILDER_DRAW 
  330            hull.DrawLabel(
"Next iteration");
 
  332#ifdef JPH_EPA_PENETRATION_DEPTH_DEBUG 
  333            Trace(
"FindClosest: verts = (%d, %d, %d), closest_len_sq = %g, centroid = (%g, %g, %g), normal = (%g, %g, %g)",
 
  352            Vec3 w = support_points.Add(inAIncludingConvexRadius, inBIncludingConvexRadius, t->
mNormal, new_index);
 
  365#ifdef JPH_EPA_PENETRATION_DEPTH_DEBUG 
  366            Trace(
"FindClosest: w = (%g, %g, %g), dot = %g, dist_sq = %g",
 
  370#ifdef JPH_EPA_CONVEX_BUILDER_DRAW 
  380#ifdef JPH_EPA_PENETRATION_DEPTH_DEBUG 
  387            closest_dist_sq = min(closest_dist_sq, dist_sq);
 
  392#ifdef JPH_EPA_PENETRATION_DEPTH_DEBUG 
  393                Trace(
"Not facing triangle");
 
  400            if (!hull.
AddPoint(t, new_index, closest_dist_sq, new_triangles))
 
  402#ifdef JPH_EPA_PENETRATION_DEPTH_DEBUG 
  403                Trace(
"Could not add point");
 
  409            bool has_defect = 
false;
 
  410            for (
const Triangle *nt : new_triangles)
 
  411                if (nt->IsFacingOrigin())
 
  418#ifdef JPH_EPA_PENETRATION_DEPTH_DEBUG 
  424                Vec3 w2 = inAIncludingConvexRadius.GetSupport(-t->
mNormal) - inBIncludingConvexRadius.GetSupport(t->
mNormal);
 
  431        while (hull.
HasNextTriangle() && support_points.mY.size() < cMaxPoints);
 
  437#ifdef JPH_EPA_CONVEX_BUILDER_DRAW 
  438        hull.DrawLabel(
"Closest found");
 
  468            outPointA = p0 + last->
mLambda[0] * (p1 - p0) + last->
mLambda[1] * (p2 - p0);
 
  469            outPointB = q0 + last->
mLambda[0] * (q1 - q0) + last->
mLambda[1] * (q2 - q0);
 
  474            outPointA = p1 + last->
mLambda[0] * (p0 - p1) + last->
mLambda[1] * (p2 - p1);
 
  475            outPointB = q1 + last->
mLambda[0] * (q0 - q1) + last->
mLambda[1] * (q2 - q1);
 
  484    template <
typename AE, 
typename AI, 
typename BE, 
typename BI>
 
  485    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)
 
  488        switch (
GetPenetrationDepthStepGJK(inAExcludingConvexRadius, inConvexRadiusA, inBExcludingConvexRadius, inConvexRadiusB, inCollisionToleranceSq, ioV, outPointA, outPointB))
 
  497            return GetPenetrationDepthStepEPA(inAIncludingConvexRadius, inBIncludingConvexRadius, inPenetrationTolerance, ioV, outPointA, outPointB);
 
  521    template <
typename A, 
typename B>
 
  522    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)
 
  527        if (!mGJK.
CastShape(inStart, inDirection, inCollisionTolerance, inA, inB, inConvexRadiusA, inConvexRadiusB, ioLambda, outPointA, outPointB, outContactNormal))
 
  531        bool contact_normal_invalid = outContactNormal.
IsNearZero(
Square(inCollisionTolerance));
 
  533        if (inReturnDeepestPoint
 
  535            && (inConvexRadiusA + inConvexRadiusB == 0.0f 
 
  536                || contact_normal_invalid))
 
  545        else if (contact_normal_invalid)
 
  548            outContactNormal = inDirection;
 
unsigned int uint
Definition: Core.h:452
 
#define JPH_NAMESPACE_END
Definition: Core.h:378
 
#define JPH_NAMESPACE_BEGIN
Definition: Core.h:372
 
TraceFunction Trace
Definition: IssueReporting.cpp:18
 
#define JPH_IF_ENABLE_ASSERTS(...)
Definition: IssueReporting.h:35
 
#define JPH_ASSERT(...)
Definition: IssueReporting.h:33
 
JPH_INLINE constexpr T Square(T inV)
Square a value.
Definition: Math.h:52
 
JPH_INLINE 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:271
 
static const Color sPurple
Definition: Color.h:61
 
static const Color sWhite
Definition: Color.h:67
 
static const Color sRed
Definition: Color.h:55
 
static const Color sYellow
Definition: Color.h:60
 
GeometryRef CreateTriangleGeometryForConvex(SupportFunction inGetSupport)
Definition: DebugRenderer.cpp:698
 
static DebugRenderer * sInstance
Singleton instance.
Definition: DebugRenderer.h:179
 
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
 
Class that holds the information of one triangle.
Definition: EPAConvexHullBuilder.h:62
 
Vec3 mCentroid
Center of the triangle.
Definition: EPAConvexHullBuilder.h:89
 
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:37
 
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:522
 
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:485
 
EStatus GetPenetrationDepthStepGJK(const AE &inAExcludingConvexRadius, float inConvexRadiusA, const BE &inBExcludingConvexRadius, float inConvexRadiusB, float inTolerance, Vec3 &ioV, Vec3 &outPointA, Vec3 &outPointB)
Definition: EPAPenetrationDepth.h:104
 
EStatus
Return code for GetPenetrationDepthStepGJK.
Definition: EPAPenetrationDepth.h:86
 
@ 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:147
 
Definition: GJKClosestPoint.h:23
 
bool CastShape(Mat44Arg inStart, Vec3Arg inDirection, float inTolerance, const A &inA, const B &inB, float &ioLambda)
Definition: GJKClosestPoint.h:659
 
void GetClosestPointsSimplex(Vec3 *outY, Vec3 *outP, Vec3 *outQ, uint &outNumPoints) const
Definition: GJKClosestPoint.h:496
 
float GetClosestPoints(const A &inA, const B &inB, float inTolerance, float inMaxDistSq, Vec3 &ioV, Vec3 &outPointA, Vec3 &outPointB)
Definition: GJKClosestPoint.h:328
 
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:14
 
void push_back(const T &inElement)
Add element to the back of the array.
Definition: StaticArray.h:61
 
uint size_type
Definition: StaticArray.h:18
 
size_type size() const
Returns amount of elements in the array.
Definition: StaticArray.h:89
 
JPH_INLINE float Dot(Vec3Arg inV2) const
Dot product.
Definition: Vec3.inl:649
 
JPH_INLINE Vec3 GetNormalizedPerpendicular() const
Get normalized vector that is perpendicular to this vector.
Definition: Vec3.inl:824
 
JPH_INLINE float GetX() const
Get individual components.
Definition: Vec3.h:124
 
JPH_INLINE Vec3 NormalizedOr(Vec3Arg inZeroValue) const
Normalize vector or return inZeroValue if the length of the vector is zero.
Definition: Vec3.inl:720
 
JPH_INLINE float GetY() const
Definition: Vec3.h:125
 
JPH_INLINE float LengthSq() const
Squared length of vector.
Definition: Vec3.inl:665
 
JPH_INLINE bool IsNearZero(float inMaxDistSq=1.0e-12f) const
Test if vector is near zero.
Definition: Vec3.inl:351
 
static JPH_INLINE Vec3 sZero()
Vector with all zeros.
Definition: Vec3.inl:107
 
JPH_INLINE float GetZ() const
Definition: Vec3.h:126
 
Structure that adds a convex radius.
Definition: ConvexSupport.h:46
 
Structure that performs a Minkowski difference A - B.
Definition: ConvexSupport.h:67
 
Vec3 GetSupport(Vec3Arg inDirection) const
Calculate the support vector for this convex shape.
Definition: ConvexSupport.h:75