optimization

This commit is contained in:
Irlan 2018-04-20 22:12:41 -03:00
parent 1f3fe9f873
commit 57a0809bcb

View File

@ -195,15 +195,16 @@ void b3QHull::Set(const b3Vec3* points, u32 count)
faceCount = 0; faceCount = 0;
// These structures map vertex/edge pointers to indices in the run-time hull // These structures map vertex/edge pointers to indices in the run-time hull
b3PIMap<B3_MAX_HULL_VERTICES> vertexMap; b3PIMap<B3_MAX_HULL_VERTICES> vs;
b3PIMap<B3_MAX_HULL_EDGES> edgeMap; b3PIMap<B3_MAX_HULL_EDGES> es;
// Face half-edges
u8 fhs[B3_MAX_HULL_EDGES];
u32 nfh = 0;
qhFace* face = faceList.head; qhFace* face = faceList.head;
while (face) while (face)
{ {
// Collected face half-edges
b3StackArray<u8, 32> faceEdges;
qhHalfEdge* edge = face->edge; qhHalfEdge* edge = face->edge;
do do
{ {
@ -212,9 +213,7 @@ void b3QHull::Set(const b3Vec3* points, u32 count)
qhVertex* v1 = edge->tail; qhVertex* v1 = edge->tail;
qhVertex* v2 = twin->tail; qhVertex* v2 = twin->tail;
// Are the vertices unique? b3PointerIndex* mv1 = vs.Find(v1);
b3PointerIndex* mv1 = vertexMap.Find(v1);
b3PointerIndex* mv2 = vertexMap.Find(v2);
u8 iv1; u8 iv1;
if (mv1) if (mv1)
@ -223,6 +222,8 @@ void b3QHull::Set(const b3Vec3* points, u32 count)
} }
else else
{ {
// Add a unique vertex
// Vertex excess // Vertex excess
if (vertexCount == B3_MAX_HULL_VERTICES) if (vertexCount == B3_MAX_HULL_VERTICES)
{ {
@ -236,9 +237,12 @@ void b3QHull::Set(const b3Vec3* points, u32 count)
iv1 = vertexCount; iv1 = vertexCount;
++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; u8 iv2;
if (mv2) if (mv2)
{ {
@ -259,10 +263,10 @@ void b3QHull::Set(const b3Vec3* points, u32 count)
iv2 = vertexCount; iv2 = vertexCount;
++vertexCount; ++vertexCount;
vertexMap.Add({ v2, iv2 }); vs.Add({ v2, iv2 });
} }
b3PointerIndex* mte = edgeMap.Find(edge); b3PointerIndex* mte = es.Find(edge);
if (mte) if (mte)
{ {
@ -270,7 +274,9 @@ void b3QHull::Set(const b3Vec3* points, u32 count)
b3HalfEdge* e2 = edges + ie2; b3HalfEdge* e2 = edges + ie2;
B3_ASSERT(e2->face == B3_NULL_HULL_FEATURE); B3_ASSERT(e2->face == B3_NULL_HULL_FEATURE);
e2->face = u8(faceCount); e2->face = u8(faceCount);
faceEdges.PushBack(ie2);
B3_ASSERT(nfh < B3_MAX_HULL_EDGES);
fhs[nfh++] = ie2;
} }
else else
{ {
@ -283,12 +289,12 @@ void b3QHull::Set(const b3Vec3* points, u32 count)
return; return;
} }
u8 ie1 = edgeCount;
b3HalfEdge* e1 = edges + edgeCount; b3HalfEdge* e1 = edges + edgeCount;
u8 ie1 = edgeCount;
++edgeCount; ++edgeCount;
u8 ie2 = edgeCount;
b3HalfEdge* e2 = edges + edgeCount; b3HalfEdge* e2 = edges + edgeCount;
u8 ie2 = edgeCount;
++edgeCount; ++edgeCount;
e1->face = u8(faceCount); e1->face = u8(faceCount);
@ -299,10 +305,11 @@ void b3QHull::Set(const b3Vec3* points, u32 count)
e2->origin = iv2; e2->origin = iv2;
e2->twin = ie1; e2->twin = ie1;
faceEdges.PushBack(ie1); es.Add({ edge, ie1 });
es.Add({ twin, ie2 });
edgeMap.Add({ edge, ie1 }); B3_ASSERT(nfh < B3_MAX_HULL_EDGES);
edgeMap.Add({ twin, ie2 }); fhs[nfh++] = ie1;
} }
edge = edge->next; edge = edge->next;
@ -315,18 +322,20 @@ void b3QHull::Set(const b3Vec3* points, u32 count)
b3Face* f = faces + faceCount; b3Face* f = faces + faceCount;
++faceCount; ++faceCount;
B3_ASSERT(faceEdges.Count() > 0); B3_ASSERT(nfh > 0);
f->edge = faceEdges[0]; f->edge = fhs[0];
// Link face half-edges // 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; u32 j = i < nfh - 1 ? i + 1 : 0;
edges[edge].next = faceEdges[j]; edges[edge].next = fhs[j];
} }
nfh = 0;
face = face->next; face = face->next;
} }