remove quickhull array dependency (except for drawing)
This commit is contained in:
@ -20,7 +20,6 @@
|
||||
#define QH_HULL_H
|
||||
|
||||
#include <bounce/common/geometry.h>
|
||||
#include <bounce/common/template/array.h>
|
||||
|
||||
template<class T>
|
||||
struct qhList
|
||||
@ -100,7 +99,7 @@ public:
|
||||
~qhHull();
|
||||
|
||||
// Construct this hull given a memory buffer and an array of points.
|
||||
// Use qhGetBufferCapacity to get the buffer capacity from the point array size.
|
||||
// Use qhGetBufferSize to get the buffer size given the number of points.
|
||||
void Construct(void* buffer, const b3Vec3* vertices, u32 vertexCount);
|
||||
|
||||
// Get the number of iterations this algorithm ran.
|
||||
@ -128,21 +127,18 @@ private:
|
||||
qhVertex* NextVertex();
|
||||
|
||||
void AddVertex(qhVertex* v);
|
||||
|
||||
void BuildHorizon(b3Array<qhHalfEdge*>& horizon, qhVertex* eye);
|
||||
|
||||
void BuildHorizon(b3Array<qhHalfEdge*>& horizon, qhVertex* eye, qhHalfEdge* e0, qhFace* f);
|
||||
|
||||
|
||||
void BuildHorizon(qhVertex* eye);
|
||||
void BuildHorizon(qhVertex* eye, qhHalfEdge* e0, qhFace* f);
|
||||
|
||||
void AddNewFaces(qhVertex* eye);
|
||||
void MergeFaces();
|
||||
bool MergeFace(qhFace* face);
|
||||
|
||||
qhFace* AddTriangle(qhVertex* v1, qhVertex* v2, qhVertex* v3);
|
||||
|
||||
qhHalfEdge* AddAdjoiningTriangle(qhVertex* v, qhHalfEdge* he);
|
||||
|
||||
void AddNewFaces(b3Array<qhFace*>& newFaces, qhVertex* eye, const b3Array<qhHalfEdge*>& horizon);
|
||||
|
||||
bool MergeFace(qhFace* face);
|
||||
|
||||
void MergeFaces(b3Array<qhFace*>& newFaces);
|
||||
|
||||
qhHalfEdge* FindTwin(const qhVertex* tail, const qhVertex* head) const;
|
||||
|
||||
// Coplanarity tolerance
|
||||
@ -163,10 +159,16 @@ private:
|
||||
|
||||
qhFace* AllocateFace();
|
||||
void FreeFace(qhFace* p);
|
||||
|
||||
|
||||
qhVertex* m_freeVertices;
|
||||
qhHalfEdge* m_freeEdges;
|
||||
qhFace* m_freeFaces;
|
||||
|
||||
qhHalfEdge** m_horizon;
|
||||
u32 m_horizonCount;
|
||||
|
||||
qhFace** m_newFaces;
|
||||
u32 m_newFaceCount;
|
||||
};
|
||||
|
||||
#include <bounce/quickhull/qh_hull.inl>
|
||||
|
@ -128,20 +128,31 @@ inline void qhFace::ComputeCenterAndPlane()
|
||||
// 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 qhGetBufferCapacity(u32 pointCount)
|
||||
constexpr 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;
|
||||
|
||||
HE *= 2;
|
||||
F *= 2;
|
||||
|
||||
u32 size = 0;
|
||||
|
||||
size += V * sizeof(qhVertex);
|
||||
size += HE * sizeof(qhHalfEdge);
|
||||
size += F * sizeof(qhFace);
|
||||
|
||||
// Extra
|
||||
size += HE * sizeof(qhHalfEdge);
|
||||
size += F * sizeof(qhFace);
|
||||
|
||||
// Horizon
|
||||
size += HE * sizeof(qhHalfEdge*);
|
||||
|
||||
// New Faces
|
||||
// One face per horizon edge
|
||||
size += HE * sizeof(qhFace*);
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user