api stuff, bugfix, comment
This commit is contained in:
parent
1c71bbaa90
commit
97ee209bb6
@ -119,19 +119,17 @@ private:
|
|||||||
bool BuildInitialHull(const b3Vec3* vertices, u32 count);
|
bool BuildInitialHull(const b3Vec3* vertices, u32 count);
|
||||||
|
|
||||||
qhVertex* NextVertex();
|
qhVertex* NextVertex();
|
||||||
|
|
||||||
void AddVertex(qhVertex* v);
|
void AddVertex(qhVertex* v);
|
||||||
|
|
||||||
void BuildHorizon(qhVertex* eye);
|
void FindHorizon(qhVertex* eye);
|
||||||
void BuildHorizon(qhVertex* eye, qhHalfEdge* edge);
|
void FindHorizon(qhVertex* eye, qhHalfEdge* edge);
|
||||||
|
|
||||||
void AddNewFaces(qhVertex* eye);
|
void AddNewFaces(qhVertex* eye);
|
||||||
void MergeFaces();
|
void MergeFaces();
|
||||||
bool MergeFace(qhFace* face);
|
bool MergeFace(qhFace* face);
|
||||||
|
|
||||||
qhFace* AddTriangle(qhVertex* v1, qhVertex* v2, qhVertex* v3);
|
qhFace* CreateTriangle(qhVertex* v1, qhVertex* v2, qhVertex* v3);
|
||||||
|
qhHalfEdge* CreateAdjoiningTriangle(qhVertex* v, qhHalfEdge* he);
|
||||||
qhHalfEdge* AddAdjoiningTriangle(qhVertex* v, qhHalfEdge* he);
|
|
||||||
|
|
||||||
qhHalfEdge* FindTwin(const qhVertex* tail, const qhVertex* head) const;
|
qhHalfEdge* FindTwin(const qhVertex* tail, const qhVertex* head) const;
|
||||||
|
|
||||||
|
@ -115,8 +115,6 @@ void qhHull::Construct(void* memory, const b3Vec3* vs, u32 count)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Validate();
|
|
||||||
|
|
||||||
qhVertex* eye = NextVertex();
|
qhVertex* eye = NextVertex();
|
||||||
while (eye)
|
while (eye)
|
||||||
{
|
{
|
||||||
@ -124,6 +122,8 @@ void qhHull::Construct(void* memory, const b3Vec3* vs, u32 count)
|
|||||||
eye = NextVertex();
|
eye = NextVertex();
|
||||||
++m_iteration;
|
++m_iteration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Validate();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool qhHull::BuildInitialHull(const b3Vec3* vertices, u32 vertexCount)
|
bool qhHull::BuildInitialHull(const b3Vec3* vertices, u32 vertexCount)
|
||||||
@ -268,18 +268,18 @@ bool qhHull::BuildInitialHull(const b3Vec3* vertices, u32 vertexCount)
|
|||||||
|
|
||||||
if (b3Distance(D, plane) < 0.0f)
|
if (b3Distance(D, plane) < 0.0f)
|
||||||
{
|
{
|
||||||
faces[0] = AddTriangle(v1, v2, v3);
|
faces[0] = CreateTriangle(v1, v2, v3);
|
||||||
faces[1] = AddTriangle(v4, v2, v1);
|
faces[1] = CreateTriangle(v4, v2, v1);
|
||||||
faces[2] = AddTriangle(v4, v3, v2);
|
faces[2] = CreateTriangle(v4, v3, v2);
|
||||||
faces[3] = AddTriangle(v4, v1, v3);
|
faces[3] = CreateTriangle(v4, v1, v3);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Ensure CCW order.
|
// Ensure CCW order.
|
||||||
faces[0] = AddTriangle(v1, v3, v2);
|
faces[0] = CreateTriangle(v1, v3, v2);
|
||||||
faces[1] = AddTriangle(v4, v1, v2);
|
faces[1] = CreateTriangle(v4, v1, v2);
|
||||||
faces[2] = AddTriangle(v4, v2, v3);
|
faces[2] = CreateTriangle(v4, v2, v3);
|
||||||
faces[3] = AddTriangle(v4, v3, v1);
|
faces[3] = CreateTriangle(v4, v3, v1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Connectivity check.
|
// Connectivity check.
|
||||||
@ -353,12 +353,12 @@ qhVertex* qhHull::NextVertex()
|
|||||||
|
|
||||||
void qhHull::AddVertex(qhVertex* eye)
|
void qhHull::AddVertex(qhVertex* eye)
|
||||||
{
|
{
|
||||||
BuildHorizon(eye);
|
FindHorizon(eye);
|
||||||
AddNewFaces(eye);
|
AddNewFaces(eye);
|
||||||
MergeFaces();
|
MergeFaces();
|
||||||
}
|
}
|
||||||
|
|
||||||
void qhHull::BuildHorizon(qhVertex* eye)
|
void qhHull::FindHorizon(qhVertex* eye)
|
||||||
{
|
{
|
||||||
// Clean visited flags
|
// Clean visited flags
|
||||||
for (qhFace* face = m_faceList.head; face != NULL; face = face->next)
|
for (qhFace* face = m_faceList.head; face != NULL; face = face->next)
|
||||||
@ -366,12 +366,12 @@ void qhHull::BuildHorizon(qhVertex* eye)
|
|||||||
face->state = qhFace::e_invisible;
|
face->state = qhFace::e_invisible;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build horizon.
|
// Find the horizon
|
||||||
m_horizonCount = 0;
|
m_horizonCount = 0;
|
||||||
BuildHorizon(eye, eye->conflictFace->edge);
|
FindHorizon(eye, eye->conflictFace->edge);
|
||||||
}
|
}
|
||||||
|
|
||||||
void qhHull::BuildHorizon(qhVertex* eye, qhHalfEdge* begin)
|
void qhHull::FindHorizon(qhVertex* eye, qhHalfEdge* begin)
|
||||||
{
|
{
|
||||||
// Mark face as visible/visited.
|
// Mark face as visible/visited.
|
||||||
qhFace* face = begin->face;
|
qhFace* face = begin->face;
|
||||||
@ -388,7 +388,7 @@ void qhHull::BuildHorizon(qhVertex* eye, qhHalfEdge* begin)
|
|||||||
{
|
{
|
||||||
if (b3Distance(eye->position, adjFace->plane) > m_tolerance)
|
if (b3Distance(eye->position, adjFace->plane) > m_tolerance)
|
||||||
{
|
{
|
||||||
BuildHorizon(eye, adjEdge);
|
FindHorizon(eye, adjEdge);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -412,7 +412,7 @@ void qhHull::AddNewFaces(qhVertex* eye)
|
|||||||
|
|
||||||
{
|
{
|
||||||
qhHalfEdge* edge = m_horizon[0];
|
qhHalfEdge* edge = m_horizon[0];
|
||||||
qhHalfEdge* leftEdge = AddAdjoiningTriangle(eye, edge);
|
qhHalfEdge* leftEdge = CreateAdjoiningTriangle(eye, edge);
|
||||||
qhHalfEdge* rightEdge = leftEdge->prev;
|
qhHalfEdge* rightEdge = leftEdge->prev;
|
||||||
|
|
||||||
prevEdge = rightEdge;
|
prevEdge = rightEdge;
|
||||||
@ -425,7 +425,7 @@ void qhHull::AddNewFaces(qhVertex* eye)
|
|||||||
for (u32 i = 1; i < m_horizonCount - 1; ++i)
|
for (u32 i = 1; i < m_horizonCount - 1; ++i)
|
||||||
{
|
{
|
||||||
qhHalfEdge* edge = m_horizon[i];
|
qhHalfEdge* edge = m_horizon[i];
|
||||||
qhHalfEdge* leftEdge = AddAdjoiningTriangle(eye, edge);
|
qhHalfEdge* leftEdge = CreateAdjoiningTriangle(eye, edge);
|
||||||
qhHalfEdge* rightEdge = leftEdge->prev;
|
qhHalfEdge* rightEdge = leftEdge->prev;
|
||||||
|
|
||||||
leftEdge->twin = prevEdge;
|
leftEdge->twin = prevEdge;
|
||||||
@ -438,7 +438,7 @@ void qhHull::AddNewFaces(qhVertex* eye)
|
|||||||
|
|
||||||
{
|
{
|
||||||
qhHalfEdge* edge = m_horizon[m_horizonCount - 1];
|
qhHalfEdge* edge = m_horizon[m_horizonCount - 1];
|
||||||
qhHalfEdge* leftEdge = AddAdjoiningTriangle(eye, edge);
|
qhHalfEdge* leftEdge = CreateAdjoiningTriangle(eye, edge);
|
||||||
qhHalfEdge* rightEdge = leftEdge->prev;
|
qhHalfEdge* rightEdge = leftEdge->prev;
|
||||||
|
|
||||||
leftEdge->twin = prevEdge;
|
leftEdge->twin = prevEdge;
|
||||||
@ -513,7 +513,7 @@ void qhHull::AddNewFaces(qhVertex* eye)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qhFace* qhHull::AddTriangle(qhVertex* v1, qhVertex* v2, qhVertex* v3)
|
qhFace* qhHull::CreateTriangle(qhVertex* v1, qhVertex* v2, qhVertex* v3)
|
||||||
{
|
{
|
||||||
qhFace* face = AllocateFace();
|
qhFace* face = AllocateFace();
|
||||||
|
|
||||||
@ -561,7 +561,7 @@ qhFace* qhHull::AddTriangle(qhVertex* v1, qhVertex* v2, qhVertex* v3)
|
|||||||
return face;
|
return face;
|
||||||
}
|
}
|
||||||
|
|
||||||
qhHalfEdge* qhHull::AddAdjoiningTriangle(qhVertex* eye, qhHalfEdge* horizonEdge)
|
qhHalfEdge* qhHull::CreateAdjoiningTriangle(qhVertex* eye, qhHalfEdge* horizonEdge)
|
||||||
{
|
{
|
||||||
B3_ASSERT(horizonEdge->face->state == qhFace::e_visible);
|
B3_ASSERT(horizonEdge->face->state == qhFace::e_visible);
|
||||||
|
|
||||||
@ -619,12 +619,12 @@ bool qhHull::MergeFace(qhFace* rightFace)
|
|||||||
|
|
||||||
if (d1 < -m_tolerance && d2 < -m_tolerance)
|
if (d1 < -m_tolerance && d2 < -m_tolerance)
|
||||||
{
|
{
|
||||||
// convex
|
// Convex
|
||||||
e = e->next;
|
e = e->next;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// concave or coplanar
|
// Concave or coplanar
|
||||||
if (leftFace == rightFace)
|
if (leftFace == rightFace)
|
||||||
{
|
{
|
||||||
e = e->next;
|
e = e->next;
|
||||||
@ -641,11 +641,11 @@ bool qhHull::MergeFace(qhFace* rightFace)
|
|||||||
v0->conflictFace = rightFace;
|
v0->conflictFace = rightFace;
|
||||||
}
|
}
|
||||||
|
|
||||||
// set right face to reference a non-deleted edge
|
// Set right face to reference a non-deleted edge
|
||||||
B3_ASSERT(e->face == rightFace);
|
B3_ASSERT(e->face == rightFace);
|
||||||
rightFace->edge = e->prev;
|
rightFace->edge = e->prev;
|
||||||
|
|
||||||
// absorb face
|
// Absorb face
|
||||||
qhHalfEdge* te = e->twin;
|
qhHalfEdge* te = e->twin;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@ -653,7 +653,7 @@ bool qhHull::MergeFace(qhFace* rightFace)
|
|||||||
te = te->next;
|
te = te->next;
|
||||||
} while (te != e->twin);
|
} while (te != e->twin);
|
||||||
|
|
||||||
// link edges
|
// Link edges
|
||||||
e->prev->next = e->twin->next;
|
e->prev->next = e->twin->next;
|
||||||
e->next->prev = e->twin->prev;
|
e->next->prev = e->twin->prev;
|
||||||
e->twin->prev->next = e->next;
|
e->twin->prev->next = e->next;
|
||||||
@ -664,17 +664,11 @@ bool qhHull::MergeFace(qhFace* rightFace)
|
|||||||
m_faceList.Remove(leftFace);
|
m_faceList.Remove(leftFace);
|
||||||
FreeFace(leftFace);
|
FreeFace(leftFace);
|
||||||
|
|
||||||
|
// Compute face center and plane
|
||||||
rightFace->ComputeCenterAndPlane();
|
rightFace->ComputeCenterAndPlane();
|
||||||
|
|
||||||
{
|
// Validate
|
||||||
qhHalfEdge* he = rightFace->edge;
|
Validate(rightFace);
|
||||||
do
|
|
||||||
{
|
|
||||||
B3_ASSERT(he->face == rightFace);
|
|
||||||
B3_ASSERT(he->twin->twin == he);
|
|
||||||
he = he->next;
|
|
||||||
} while (he != rightFace->edge);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -707,7 +701,7 @@ void qhHull::Validate(const qhHalfEdge* edge) const
|
|||||||
|
|
||||||
b3Vec3 A = edge->tail->position;
|
b3Vec3 A = edge->tail->position;
|
||||||
b3Vec3 B = twin->tail->position;
|
b3Vec3 B = twin->tail->position;
|
||||||
B3_ASSERT(b3DistanceSquared(A, B) > B3_EPSILON * B3_EPSILON);
|
B3_ASSERT(b3DistanceSquared(A, B) >= B3_LINEAR_SLOP * B3_LINEAR_SLOP);
|
||||||
|
|
||||||
u32 count = 0;
|
u32 count = 0;
|
||||||
const qhHalfEdge* begin = edge;
|
const qhHalfEdge* begin = edge;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user