fix #35; check edge validity;

This commit is contained in:
Irlan
2018-04-26 00:46:36 -03:00
parent 534448ea60
commit f882c8c68e
4 changed files with 21 additions and 7 deletions

View File

@ -67,6 +67,14 @@ struct qhFace
struct qhHalfEdge
{
enum State
{
e_used,
e_deleted
};
State state;
qhHalfEdge* freeNext;
qhVertex* tail;

View File

@ -121,11 +121,7 @@ inline void qhFace::ComputeCenterAndPlane()
// Given a number of points return the required memory size in
// bytes for constructing the convex hull of those points.
// This function uses constant expression (C++11). Therefore, you can evaluate
// its value at compile-time. That is particularly usefull when you want to
// create a stack buffer from a constant number of vertices.
// Due to the constexpr specifier, this function is automatically inlined.
constexpr u32 qhGetBufferSize(u32 pointCount)
inline u32 qhGetBufferSize(u32 pointCount)
{
u32 size = 0;
@ -179,12 +175,14 @@ inline void qhHull::FreeVertex(qhVertex* v)
inline qhHalfEdge* qhHull::AllocateEdge()
{
qhHalfEdge* e = m_freeEdges;
e->state = qhHalfEdge::e_used;
m_freeEdges = e->freeNext;
return e;
}
inline void qhHull::FreeEdge(qhHalfEdge* e)
{
e->state = qhHalfEdge::e_deleted;
e->freeNext = m_freeEdges;
m_freeEdges = e;
}

View File

@ -172,8 +172,8 @@ void b3QHull::Set(const b3Vec3* points, u32 count)
// Create a convex hull.
// Allocate memory buffer for the worst case.
const u32 qhBufferSize = qhGetBufferSize(B3_MAX_HULL_VERTICES);
u8 qhBuffer[qhBufferSize];
u32 qhBufferSize = qhGetBufferSize(B3_MAX_HULL_VERTICES);
void* qhBuffer = b3Alloc(qhBufferSize);
// Build
qhHull hull;
@ -191,6 +191,7 @@ void b3QHull::Set(const b3Vec3* points, u32 count)
if (fs_count == B3_MAX_HULL_FACES)
{
// Face excess
b3Free(qhBuffer);
return;
}
@ -206,6 +207,7 @@ void b3QHull::Set(const b3Vec3* points, u32 count)
if (iv == B3_MAX_HULL_VERTICES)
{
// Vertex excess
b3Free(qhBuffer);
return;
}
@ -214,6 +216,7 @@ void b3QHull::Set(const b3Vec3* points, u32 count)
if (iedge == B3_MAX_HULL_EDGES)
{
// Half-edge excess
b3Free(qhBuffer);
return;
}
@ -222,6 +225,7 @@ void b3QHull::Set(const b3Vec3* points, u32 count)
if (itwin == B3_MAX_HULL_EDGES)
{
// Half-edge excess
b3Free(qhBuffer);
return;
}
@ -271,6 +275,8 @@ void b3QHull::Set(const b3Vec3* points, u32 count)
++iface;
}
b3Free(qhBuffer);
B3_ASSERT(vs.count <= B3_MAX_HULL_VERTICES);
vertexCount = vs.count;

View File

@ -768,6 +768,8 @@ void qhHull::Validate(const qhFace* face) const
const qhHalfEdge* edge = begin;
do
{
B3_ASSERT(edge->state != qhHalfEdge::e_deleted);
B3_ASSERT(edge->face == face);
qhHalfEdge* twin = edge->twin;