33#define CATCH_DEGENERATE_TETRAHEDRON 1
141 nearest =
from +
t * v;
247 for (i = 0; i < numverts; i++)
276 for (i = 0; i < numverts; i++)
278#ifdef BT_USE_EQUAL_VERTEX_THRESHOLD
315 result.m_usedVertices.reset();
325 result.m_closestPointOnSimplex = a;
326 result.m_usedVertices.usedVertexA =
true;
327 result.setBarycentricCoordinates(1, 0, 0);
337 result.m_closestPointOnSimplex = b;
338 result.m_usedVertices.usedVertexB =
true;
339 result.setBarycentricCoordinates(0, 1, 0);
348 result.m_closestPointOnSimplex = a + v *
ab;
349 result.m_usedVertices.usedVertexA =
true;
350 result.m_usedVertices.usedVertexB =
true;
351 result.setBarycentricCoordinates(1 - v, v, 0);
362 result.m_closestPointOnSimplex = c;
363 result.m_usedVertices.usedVertexC =
true;
364 result.setBarycentricCoordinates(0, 0, 1);
373 result.m_closestPointOnSimplex = a + w *
ac;
374 result.m_usedVertices.usedVertexA =
true;
375 result.m_usedVertices.usedVertexC =
true;
376 result.setBarycentricCoordinates(1 - w, 0, w);
387 result.m_closestPointOnSimplex = b + w * (c - b);
388 result.m_usedVertices.usedVertexB =
true;
389 result.m_usedVertices.usedVertexC =
true;
390 result.setBarycentricCoordinates(0, 1 - w, w);
400 result.m_closestPointOnSimplex = a +
ab * v +
ac * w;
401 result.m_usedVertices.usedVertexA =
true;
402 result.m_usedVertices.usedVertexB =
true;
403 result.m_usedVertices.usedVertexC =
true;
404 result.setBarycentricCoordinates(1 - v - w, v, w);
418#ifdef CATCH_DEGENERATE_TETRAHEDRON
419#ifdef BT_USE_DOUBLE_PRECISION
const T & btMax(const T &a, const T &b)
btScalar dot(const btQuaternion &q1, const btQuaternion &q2)
Calculate the dot product between two quaternions.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btVector3 can be used to represent 3D points and vectors.
btScalar dot(const btVector3 &v) const
Return the dot product.
void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z)
btScalar length2() const
Return the length of the vector squared.
void reduceVertices(const btUsageBitfield &usedVerts)
btVector3 m_simplexPointsP[VORONOI_SIMPLEX_MAX_VERTS]
btVector3 m_simplexVectorW[VORONOI_SIMPLEX_MAX_VERTS]
btSubSimplexClosestResult m_cachedBC
int getSimplex(btVector3 *pBuf, btVector3 *qBuf, btVector3 *yBuf) const
void addVertex(const btVector3 &w, const btVector3 &p, const btVector3 &q)
bool closestPtPointTetrahedron(const btVector3 &p, const btVector3 &a, const btVector3 &b, const btVector3 &c, const btVector3 &d, btSubSimplexClosestResult &finalResult)
bool m_cachedValidClosest
bool inSimplex(const btVector3 &w)
bool emptySimplex() const
int pointOutsideOfPlane(const btVector3 &p, const btVector3 &a, const btVector3 &b, const btVector3 &c, const btVector3 &d)
Test if point p and d lie on opposite sides of plane through abc.
void compute_points(btVector3 &p1, btVector3 &p2)
bool updateClosestVectorAndPoints()
bool closestPtPointTriangle(const btVector3 &p, const btVector3 &a, const btVector3 &b, const btVector3 &c, btSubSimplexClosestResult &result)
bool closest(btVector3 &v)
btScalar m_equalVertexThreshold
void removeVertex(int index)
void backup_closest(btVector3 &v)
btVector3 m_simplexPointsQ[VORONOI_SIMPLEX_MAX_VERTS]
void setBarycentricCoordinates(btScalar a=btScalar(0.), btScalar b=btScalar(0.), btScalar c=btScalar(0.), btScalar d=btScalar(0.))
btUsageBitfield m_usedVertices
btScalar m_barycentricCoords[4]
btVector3 m_closestPointOnSimplex
unsigned short usedVertexB
unsigned short usedVertexA