cleanup hull validation

This commit is contained in:
Irlan 2018-04-20 01:23:08 -03:00
parent 0e0438e0a9
commit ffed35d10a
3 changed files with 48 additions and 37 deletions

View File

@ -120,9 +120,11 @@ public:
return m_iteration;
}
// Return if this hull is valid.
bool IsConsistent() const;
// Validate this hull.
void Validate() const;
void Validate(const qhFace* face) const;
void Validate(const qhHalfEdge* edge) const;
// Draw this hull.
void Draw() const;
private:

View File

@ -40,21 +40,14 @@ void b3Hull::Validate() const
void b3Hull::Validate(const b3Face* face) const
{
bool ok = false;
const b3HalfEdge* begin = GetEdge(face->edge);
const b3HalfEdge* edge = begin;
do
{
if (GetFace(edge->face) == face)
{
ok = true;
break;
}
{
B3_ASSERT(GetFace(edge->face) == face);
edge = edges + edge->next;
} while (edge != begin);
B3_ASSERT(ok);
Validate(edges + face->edge);
}
@ -69,12 +62,14 @@ void b3Hull::Validate(const b3HalfEdge* e) const
B3_ASSERT(twin->twin == edgeIndex);
u32 count = 0;
const b3HalfEdge* begin = e;
do
{
const b3HalfEdge* next = edges + e->next;
e = edges + next->twin;
B3_ASSERT(count < edgeCount);
++count;
const b3HalfEdge* next = edges + e->next;
e = edges + next->twin;
} while (e != begin);
}

View File

@ -108,6 +108,8 @@ void qhHull::Construct(void* memory, const b3Array<b3Vec3>& vs)
return;
}
Validate();
qhVertex* eye = NextVertex();
while (eye)
{
@ -274,12 +276,7 @@ bool qhHull::BuildInitialHull(const b3Array<b3Vec3>& vertices)
}
// Connectivity check.
bool ok = IsConsistent();
B3_ASSERT(ok);
if (!ok)
{
return false;
}
Validate();
// Add remaining points to the hull.
// Assign closest face plane to each of them.
@ -714,28 +711,45 @@ void qhHull::MergeFaces(b3Array<qhFace*>& newFaces)
}
}
bool qhHull::IsConsistent() const
void qhHull::Validate(const qhHalfEdge* edge) const
{
const qhHalfEdge* twin = edge->twin;
B3_ASSERT(twin->twin == edge);
b3Vec3 A = edge->tail->position;
b3Vec3 B = twin->tail->position;
B3_ASSERT(b3DistanceSquared(A, B) > B3_EPSILON * B3_EPSILON);
u32 count = 0;
qhFace* f = m_faceList.head;
while (f)
const qhHalfEdge* begin = edge;
do
{
B3_ASSERT(f->state != qhFace::e_deleted);
qhHalfEdge* e = f->edge;
do
{
++count;
//B3_ASSERT(e->face == f);
B3_ASSERT(e->twin->twin == e);
B3_ASSERT(count < 10000);
e = e->next;
} while (e != f->edge);
++count;
const qhHalfEdge* next = edge->next;
edge = next->twin;
} while (edge != begin);
}
f = f->next;
void qhHull::Validate(const qhFace* face) const
{
const qhHalfEdge* begin = face->edge;
const qhHalfEdge* edge = begin;
do
{
B3_ASSERT(edge->face == face);
edge = edge->next;
} while (edge != begin);
Validate(face->edge);
}
void qhHull::Validate() const
{
for (qhFace* face = m_faceList.head; face != NULL; face = face->next)
{
B3_ASSERT(face->state != face->e_deleted);
Validate(face);
}
return true;
}
void qhHull::Draw() const