From 57a0809bcb5cc6f627075d8a56cc3d967d8e45aa Mon Sep 17 00:00:00 2001 From: Irlan <-> Date: Fri, 20 Apr 2018 22:12:41 -0300 Subject: [PATCH] optimization --- src/bounce/collision/shapes/qhull.cpp | 55 ++++++++++++++++----------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/src/bounce/collision/shapes/qhull.cpp b/src/bounce/collision/shapes/qhull.cpp index 096578e..8bdb151 100644 --- a/src/bounce/collision/shapes/qhull.cpp +++ b/src/bounce/collision/shapes/qhull.cpp @@ -195,15 +195,16 @@ void b3QHull::Set(const b3Vec3* points, u32 count) faceCount = 0; // These structures map vertex/edge pointers to indices in the run-time hull - b3PIMap vertexMap; - b3PIMap edgeMap; + b3PIMap vs; + b3PIMap es; + + // Face half-edges + u8 fhs[B3_MAX_HULL_EDGES]; + u32 nfh = 0; qhFace* face = faceList.head; while (face) { - // Collected face half-edges - b3StackArray faceEdges; - qhHalfEdge* edge = face->edge; do { @@ -212,9 +213,7 @@ void b3QHull::Set(const b3Vec3* points, u32 count) qhVertex* v1 = edge->tail; qhVertex* v2 = twin->tail; - // Are the vertices unique? - b3PointerIndex* mv1 = vertexMap.Find(v1); - b3PointerIndex* mv2 = vertexMap.Find(v2); + b3PointerIndex* mv1 = vs.Find(v1); u8 iv1; if (mv1) @@ -223,6 +222,8 @@ void b3QHull::Set(const b3Vec3* points, u32 count) } else { + // Add a unique vertex + // Vertex excess if (vertexCount == B3_MAX_HULL_VERTICES) { @@ -236,9 +237,12 @@ void b3QHull::Set(const b3Vec3* points, u32 count) iv1 = vertexCount; ++vertexCount; - vertexMap.Add({ v1, iv1 }); + // Add to vertex-index pair to the map + vs.Add({ v1, iv1 }); } + b3PointerIndex* mv2 = vs.Find(v2); + u8 iv2; if (mv2) { @@ -259,10 +263,10 @@ void b3QHull::Set(const b3Vec3* points, u32 count) iv2 = vertexCount; ++vertexCount; - vertexMap.Add({ v2, iv2 }); + vs.Add({ v2, iv2 }); } - b3PointerIndex* mte = edgeMap.Find(edge); + b3PointerIndex* mte = es.Find(edge); if (mte) { @@ -270,7 +274,9 @@ void b3QHull::Set(const b3Vec3* points, u32 count) b3HalfEdge* e2 = edges + ie2; B3_ASSERT(e2->face == B3_NULL_HULL_FEATURE); e2->face = u8(faceCount); - faceEdges.PushBack(ie2); + + B3_ASSERT(nfh < B3_MAX_HULL_EDGES); + fhs[nfh++] = ie2; } else { @@ -283,12 +289,12 @@ void b3QHull::Set(const b3Vec3* points, u32 count) return; } - u8 ie1 = edgeCount; b3HalfEdge* e1 = edges + edgeCount; + u8 ie1 = edgeCount; ++edgeCount; - u8 ie2 = edgeCount; b3HalfEdge* e2 = edges + edgeCount; + u8 ie2 = edgeCount; ++edgeCount; e1->face = u8(faceCount); @@ -299,10 +305,11 @@ void b3QHull::Set(const b3Vec3* points, u32 count) e2->origin = iv2; e2->twin = ie1; - faceEdges.PushBack(ie1); + es.Add({ edge, ie1 }); + es.Add({ twin, ie2 }); - edgeMap.Add({ edge, ie1 }); - edgeMap.Add({ twin, ie2 }); + B3_ASSERT(nfh < B3_MAX_HULL_EDGES); + fhs[nfh++] = ie1; } edge = edge->next; @@ -315,18 +322,20 @@ void b3QHull::Set(const b3Vec3* points, u32 count) b3Face* f = faces + faceCount; ++faceCount; - B3_ASSERT(faceEdges.Count() > 0); - f->edge = faceEdges[0]; + B3_ASSERT(nfh > 0); + f->edge = fhs[0]; // Link face half-edges - for (u32 i = 0; i < faceEdges.Count(); ++i) + for (u32 i = 0; i < nfh; ++i) { - u8 edge = faceEdges[i]; + u8 edge = fhs[i]; - u32 j = i < faceEdges.Count() - 1 ? i + 1 : 0; - edges[edge].next = faceEdges[j]; + u32 j = i < nfh - 1 ? i + 1 : 0; + edges[edge].next = fhs[j]; } + nfh = 0; + face = face->next; }