aboutsummaryrefslogtreecommitdiff
path: root/PhysX_3.4/Source/PhysXCooking/src/convex
diff options
context:
space:
mode:
authorSheikh Dawood <[email protected]>2018-04-09 10:13:48 -0500
committerSheikh Dawood <[email protected]>2018-04-09 10:13:48 -0500
commit238605d8225a9135d6b60646e05d066e25424eee (patch)
tree2b013bd4946bb3c699d7a06ef1f21be85d367f63 /PhysX_3.4/Source/PhysXCooking/src/convex
parentAdd ParamTool.exe (diff)
downloadphysx-3.4-238605d8225a9135d6b60646e05d066e25424eee.tar.xz
physx-3.4-238605d8225a9135d6b60646e05d066e25424eee.zip
PhysX 3.4, APEX 1.4 patch release @23879214
Diffstat (limited to 'PhysX_3.4/Source/PhysXCooking/src/convex')
-rw-r--r--PhysX_3.4/Source/PhysXCooking/src/convex/QuickHullConvexHullLib.cpp68
1 files changed, 47 insertions, 21 deletions
diff --git a/PhysX_3.4/Source/PhysXCooking/src/convex/QuickHullConvexHullLib.cpp b/PhysX_3.4/Source/PhysXCooking/src/convex/QuickHullConvexHullLib.cpp
index b9d0adfc..5d933f73 100644
--- a/PhysX_3.4/Source/PhysXCooking/src/convex/QuickHullConvexHullLib.cpp
+++ b/PhysX_3.4/Source/PhysXCooking/src/convex/QuickHullConvexHullLib.cpp
@@ -1449,53 +1449,79 @@ namespace local
PX_ALLOCA(edges, QuickHullHalfEdge, (face1.numEdges + face2.numEdges));
PxMemSet(edges, 0, (face1.numEdges + face2.numEdges)*sizeof(QuickHullHalfEdge));
QuickHullFace mergedFace;
- mergedFace.edge = &edges[0];
+ mergedFace.edge = &edges[0];
// copy the first face edges
PxU32 currentEdge = 0;
- QuickHullHalfEdge* copyHe = he.next;
- while (copyHe != &he)
+ const QuickHullHalfEdge* heTwin = NULL;
+ const QuickHullHalfEdge* heCopy = NULL;
+ const QuickHullHalfEdge* startEdge = (face1.edge != &he) ? face1.edge : face1.edge->next;
+ const QuickHullHalfEdge* copyHe = startEdge;
+ do
{
edges[currentEdge].face = &mergedFace;
edges[currentEdge].tail = copyHe->tail;
- edges[currentEdge].next = &edges.mPointer[currentEdge + 1];
+ if(copyHe == &he)
+ {
+ heTwin = copyHe->twin;
+ heCopy = &edges[currentEdge];
+ }
+ const PxU32 nextIndex = (copyHe->next == startEdge) ? 0 : currentEdge + 1;
+ const PxU32 prevIndex = (currentEdge == 0) ? face1.numEdges - 1 : currentEdge - 1;
+ edges[currentEdge].next = &edges.mPointer[nextIndex];
+ edges[currentEdge].prev = &edges.mPointer[prevIndex];
currentEdge++;
copyHe = copyHe->next;
- }
+ } while (copyHe != startEdge);
// copy the second face edges
- copyHe = he.twin->next;
- while (copyHe != he.twin)
+ copyHe = face2.edge;
+ do
{
edges[currentEdge].face = &mergedFace;
edges[currentEdge].tail = copyHe->tail;
- edges[currentEdge].next = &edges.mPointer[currentEdge + 1];
+ if(heTwin == copyHe)
+ heTwin = &edges[currentEdge];
+ const PxU32 nextIndex = (copyHe->next == face2.edge) ? face1.numEdges : currentEdge + 1;
+ const PxU32 prevIndex = (currentEdge == face1.numEdges) ? face1.numEdges + face2.numEdges - 1 : currentEdge - 1;
+ edges[currentEdge].next = &edges.mPointer[nextIndex];
+ edges[currentEdge].prev = &edges.mPointer[prevIndex];
currentEdge++;
copyHe = copyHe->next;
- }
- edges[--currentEdge].next = &edges.mPointer[0];
+ } while (copyHe != face2.edge);
+
+ PX_ASSERT(heTwin);
+
+ QuickHullHalfEdge* hedgeAdjPrev = heCopy->prev;
+ QuickHullHalfEdge* hedgeAdjNext = heCopy->next;
+ QuickHullHalfEdge* hedgeOppPrev = heTwin->prev;
+ QuickHullHalfEdge* hedgeOppNext = heTwin->next;
+
+ hedgeOppPrev->next = hedgeAdjNext;
+ hedgeAdjNext->prev = hedgeOppPrev;
+
+ hedgeAdjPrev->next = hedgeOppNext;
+ hedgeOppNext->prev = hedgeAdjPrev;
// compute normal and centroid
mergedFace.computeNormalAndCentroid();
// test the vertex distance
- float maxDist = mPlaneTolerance;
- QuickHullHalfEdge* qhe = mergedFace.edge;
- do
+ const float maxDist = mPlaneTolerance;
+ for(PxU32 iVerts=0; iVerts< mNumVertices; iVerts++)
{
- const QuickHullVertex& vertex = qhe->tail;
+ const QuickHullVertex& vertex = mVerticesList[iVerts];
const float dist = mergedFace.distanceToPlane(vertex.point);
if (dist > maxDist)
{
return false;
}
- qhe = qhe->next;
- } while (qhe != mergedFace.edge);
+ }
// check the convexity
- qhe = mergedFace.edge;
+ QuickHullHalfEdge* qhe = mergedFace.edge;
do
{
const QuickHullVertex& vertex = qhe->tail;
@@ -1525,10 +1551,10 @@ namespace local
QuickHullHalfEdge* hedgeOpp = he.twin;
- QuickHullHalfEdge* hedgeAdjPrev = he.prev;
- QuickHullHalfEdge* hedgeAdjNext = he.next;
- QuickHullHalfEdge* hedgeOppPrev = hedgeOpp->prev;
- QuickHullHalfEdge* hedgeOppNext = hedgeOpp->next;
+ hedgeAdjPrev = he.prev;
+ hedgeAdjNext = he.next;
+ hedgeOppPrev = hedgeOpp->prev;
+ hedgeOppNext = hedgeOpp->next;
// check if we are lining up with the face in adjPrev dir
while (hedgeAdjPrev->getOppositeFace() == oppFace)