translate the hull; invalid catch
This commit is contained in:
@ -64,15 +64,14 @@ struct qhFace
|
||||
|
||||
struct qhHalfEdge
|
||||
{
|
||||
qhVertex* tail;
|
||||
|
||||
qhHalfEdge* prev;
|
||||
qhHalfEdge* next;
|
||||
|
||||
qhHalfEdge* twin;
|
||||
|
||||
qhFace* face;
|
||||
|
||||
qhVertex* tail;
|
||||
|
||||
//
|
||||
qhHalfEdge* freeNext;
|
||||
bool active;
|
||||
@ -111,6 +110,9 @@ public:
|
||||
// Get the list of faces in this convex hull.
|
||||
const qhList<qhFace>& GetFaceList() const;
|
||||
|
||||
// Translate this hull.
|
||||
void Translate(const b3Vec3& translation);
|
||||
|
||||
// Get the number of iterations this algorithm ran.
|
||||
u32 GetIterations() const;
|
||||
|
||||
@ -173,6 +175,14 @@ private:
|
||||
|
||||
void* m_buffer;
|
||||
|
||||
u32 m_vertexCapacity;
|
||||
u32 m_faceCapacity;
|
||||
u32 m_edgeCapacity;
|
||||
|
||||
u32 m_vertexCount;
|
||||
u32 m_faceCount;
|
||||
u32 m_edgeCount;
|
||||
|
||||
qhVertex* m_freeVertices;
|
||||
qhHalfEdge* m_freeEdges;
|
||||
qhFace* m_freeFaces;
|
||||
|
@ -42,39 +42,6 @@ inline T* qhList<T>::Remove(T* link)
|
||||
|
||||
// qhHull
|
||||
|
||||
// Given a number of points return the required memory size in
|
||||
// bytes for constructing the convex hull of those points.
|
||||
inline u32 qhGetBufferSize(u32 pointCount)
|
||||
{
|
||||
u32 size = 0;
|
||||
|
||||
// Hull using Euler's Formula
|
||||
u32 V = pointCount;
|
||||
u32 E = 3 * V - 6;
|
||||
u32 HE = 2 * E;
|
||||
u32 F = 2 * V - 4;
|
||||
|
||||
size += V * sizeof(qhVertex);
|
||||
size += HE * sizeof(qhHalfEdge);
|
||||
size += F * sizeof(qhFace);
|
||||
|
||||
// Horizon
|
||||
size += HE * sizeof(qhHalfEdge*);
|
||||
|
||||
// Saved horizon vertices
|
||||
// One vertex per horizon edge
|
||||
size += HE * sizeof(qhVertex*);
|
||||
|
||||
// Saved conflict vertices
|
||||
size += V * sizeof(qhVertex*);
|
||||
|
||||
// New Faces
|
||||
// One face per horizon edge
|
||||
size += HE * sizeof(qhFace*);
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
inline const qhList<qhVertex>& qhHull::GetVertexList() const
|
||||
{
|
||||
return m_vertexList;
|
||||
@ -92,6 +59,9 @@ inline u32 qhHull::GetIterations() const
|
||||
|
||||
inline qhVertex* qhHull::AllocateVertex()
|
||||
{
|
||||
B3_ASSERT(m_vertexCount < m_vertexCapacity);
|
||||
++m_vertexCount;
|
||||
|
||||
qhVertex* v = m_freeVertices;
|
||||
B3_ASSERT(v->active == false);
|
||||
v->active = true;
|
||||
@ -101,7 +71,10 @@ inline qhVertex* qhHull::AllocateVertex()
|
||||
|
||||
inline void qhHull::FreeVertex(qhVertex* v)
|
||||
{
|
||||
//B3_ASSERT(v->active == true);
|
||||
B3_ASSERT(m_vertexCount > 0);
|
||||
--m_vertexCount;
|
||||
|
||||
B3_ASSERT(v->active == true);
|
||||
v->active = false;
|
||||
v->freeNext = m_freeVertices;
|
||||
m_freeVertices = v;
|
||||
@ -109,6 +82,9 @@ inline void qhHull::FreeVertex(qhVertex* v)
|
||||
|
||||
inline qhHalfEdge* qhHull::AllocateEdge()
|
||||
{
|
||||
B3_ASSERT(m_edgeCount < m_edgeCapacity);
|
||||
++m_edgeCount;
|
||||
|
||||
qhHalfEdge* e = m_freeEdges;
|
||||
B3_ASSERT(e->active == false);
|
||||
e->active = true;
|
||||
@ -118,7 +94,10 @@ inline qhHalfEdge* qhHull::AllocateEdge()
|
||||
|
||||
inline void qhHull::FreeEdge(qhHalfEdge* e)
|
||||
{
|
||||
//B3_ASSERT(e->active == true);
|
||||
B3_ASSERT(m_edgeCount > 0);
|
||||
--m_edgeCount;
|
||||
|
||||
B3_ASSERT(e->active == true);
|
||||
e->active = false;
|
||||
e->freeNext = m_freeEdges;
|
||||
m_freeEdges = e;
|
||||
@ -126,6 +105,9 @@ inline void qhHull::FreeEdge(qhHalfEdge* e)
|
||||
|
||||
inline qhFace* qhHull::AllocateFace()
|
||||
{
|
||||
B3_ASSERT(m_faceCount < m_faceCapacity);
|
||||
++m_faceCount;
|
||||
|
||||
qhFace* f = m_freeFaces;
|
||||
B3_ASSERT(f->active == false);
|
||||
f->active = true;
|
||||
@ -135,31 +117,11 @@ inline qhFace* qhHull::AllocateFace()
|
||||
|
||||
inline void qhHull::FreeFace(qhFace* f)
|
||||
{
|
||||
//B3_ASSERT(f->active == true);
|
||||
B3_ASSERT(m_faceCount > 0);
|
||||
--m_faceCount;
|
||||
|
||||
B3_ASSERT(f->active == true);
|
||||
f->active = false;
|
||||
f->freeNext = m_freeFaces;
|
||||
m_freeFaces = f;
|
||||
}
|
||||
|
||||
inline qhHalfEdge* qhHull::FindHalfEdge(const qhVertex* v1, const qhVertex* v2) const
|
||||
{
|
||||
for (qhFace* face = m_faceList.head; face != NULL; face = face->next)
|
||||
{
|
||||
qhHalfEdge* e = face->edge;
|
||||
do
|
||||
{
|
||||
if (e->tail == v1 && e->next->tail == v2)
|
||||
{
|
||||
return e;
|
||||
}
|
||||
|
||||
if (e->tail == v2 && e->next->tail == v1)
|
||||
{
|
||||
return e->twin;
|
||||
}
|
||||
|
||||
e = e->next;
|
||||
} while (e != face->edge);
|
||||
}
|
||||
return NULL;
|
||||
}
|
Reference in New Issue
Block a user