diff options
| author | bgaldrikian <[email protected]> | 2020-10-08 22:01:09 -0700 |
|---|---|---|
| committer | bgaldrikian <[email protected]> | 2020-10-08 22:01:09 -0700 |
| commit | c389ca2d86ed528e4d54941378a4752ca74026e8 (patch) | |
| tree | 271dba95c84f62d13bcebbc62b5dcdc5b7ff443e /sdk/extensions/authoring/source/NvBlastExtApexSharedParts.cpp | |
| parent | * NvBlastAsset::testForValidChunkOrder (used when creating an NvBlastAsset) i... (diff) | |
| download | blast-1.1.6_release.tar.xz blast-1.1.6_release.zip | |
* Updated license filev1.1.6_releasev1.1.6_rc1
* Updated copyright dates
* Removed ArtistTool
* Pulled request #15 "Fix Blast bond generation"
* Pulled request #16 "Fix invalid pointer access in authoring tools"
Diffstat (limited to 'sdk/extensions/authoring/source/NvBlastExtApexSharedParts.cpp')
| -rwxr-xr-x | sdk/extensions/authoring/source/NvBlastExtApexSharedParts.cpp | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/sdk/extensions/authoring/source/NvBlastExtApexSharedParts.cpp b/sdk/extensions/authoring/source/NvBlastExtApexSharedParts.cpp index 847df77..807310d 100755 --- a/sdk/extensions/authoring/source/NvBlastExtApexSharedParts.cpp +++ b/sdk/extensions/authoring/source/NvBlastExtApexSharedParts.cpp @@ -23,7 +23,7 @@ // components in life support devices or systems without express written approval of
// NVIDIA Corporation.
//
-// Copyright (c) 2016-2018 NVIDIA Corporation. All rights reserved.
+// Copyright (c) 2016-2020 NVIDIA Corporation. All rights reserved.
#include "NvBlastExtApexSharedParts.h"
@@ -821,11 +821,23 @@ Status Collide(const Vec3V& initialDir, const ConvexV& convexA, const Mat34V& bT return Status(BAllEq(bCon, bTrue) == 1 ? STATUS_CONTACT : STATUS_DEGENERATE);
}
-static void _calcSeparation(const ConvexV& convexA, const physx::PxTransform& aToWorldIn, const Mat34V& bToA, ConvexV& convexB, Output& out, Separation& sep)
+static void _calcSeparation(const ConvexV& convexA, const physx::PxTransform& aToWorldIn, const Mat34V& bToA, ConvexV& convexB, const Vec3V& centroidAToB, Output& out, Separation& sep)
{
Mat33V aToB = M34Trnsps33(bToA);
Vec3V normalA = out.getNormal();
+ FloatV vEpsilon = FLoad(1e-6f);
+ if (BAllEqFFFF(FIsGrtr(out.mDistSq, vEpsilon)))
+ {
+ if (BAllEqTTTT(FIsGrtr(V3Dot(centroidAToB, centroidAToB), vEpsilon)))
+ {
+ normalA = V3Normalize(centroidAToB);
+ }
+ else
+ {
+ normalA = V3UnitX();
+ }
+ }
convexA.calcExtent(normalA, sep.min0, sep.max0);
Vec3V normalB = M33MulV3(aToB, normalA);
@@ -972,9 +984,16 @@ bool importerHullsInProximityApexFree(uint32_t hull0Count, const PxVec3* hull0, convexB.mNumAovVertices = numAov1;
convexB.mAovVertices = verts1;
+ const physx::PxVec3 hullACenter = hull0Bounds.getCenter();
+ const physx::PxVec3 hullBCenter = hull1Bounds.getCenter();
+ const Vec3V centroidA = V3LoadU(&hullACenter.x);
+ const Vec3V centroidB = M34MulV3(bToA, V3LoadU(&hullBCenter.x));
+
// Take the origin of B in As space as the inital direction as it is 'the difference in transform origins B-A in A's space'
// Should be a good first guess
- const Vec3V initialDir = bToA.col3;
+ // Use centroid information
+ const Vec3V initialDir = V3Sub(centroidB, centroidA);
+
Output output;
Status status = Collide(initialDir, convexA, bToA, convexB, output);
@@ -999,7 +1018,7 @@ bool importerHullsInProximityApexFree(uint32_t hull0Count, const PxVec3* hull0, {
if (separation)
{
- _calcSeparation(convexA, localToWorldRT0In, bToA, convexB, output, *separation);
+ _calcSeparation(convexA, localToWorldRT0In, bToA, convexB, initialDir, output, *separation);
}
return true;
}
@@ -1008,7 +1027,7 @@ bool importerHullsInProximityApexFree(uint32_t hull0Count, const PxVec3* hull0, {
if (separation)
{
- _calcSeparation(convexA, localToWorldRT0In, bToA, convexB, output, *separation);
+ _calcSeparation(convexA, localToWorldRT0In, bToA, convexB, initialDir, output, *separation);
}
PxF32 val;
FStore(output.mDistSq, &val);
|