34#define CATCH_DEGENERATE_TETRAHEDRON 1
146 nearest =
from +
t*v;
256 for (i=0;i<numverts;i++)
290 for (i=0;i<numverts;i++)
292#ifdef BT_USE_EQUAL_VERTEX_THRESHOLD
335 result.m_usedVertices.reset();
345 result.m_closestPointOnSimplex = a;
346 result.m_usedVertices.usedVertexA =
true;
347 result.setBarycentricCoordinates(1,0,0);
357 result.m_closestPointOnSimplex = b;
358 result.m_usedVertices.usedVertexB =
true;
359 result.setBarycentricCoordinates(0,1,0);
367 result.m_closestPointOnSimplex = a + v *
ab;
368 result.m_usedVertices.usedVertexA =
true;
369 result.m_usedVertices.usedVertexB =
true;
370 result.setBarycentricCoordinates(1-v,v,0);
381 result.m_closestPointOnSimplex = c;
382 result.m_usedVertices.usedVertexC =
true;
383 result.setBarycentricCoordinates(0,0,1);
391 result.m_closestPointOnSimplex = a + w *
ac;
392 result.m_usedVertices.usedVertexA =
true;
393 result.m_usedVertices.usedVertexC =
true;
394 result.setBarycentricCoordinates(1-w,0,w);
404 result.m_closestPointOnSimplex = b + w * (c - b);
405 result.m_usedVertices.usedVertexB =
true;
406 result.m_usedVertices.usedVertexC =
true;
407 result.setBarycentricCoordinates(0,1-w,w);
417 result.m_closestPointOnSimplex = a +
ab * v +
ac * w;
418 result.m_usedVertices.usedVertexA =
true;
419 result.m_usedVertices.usedVertexB =
true;
420 result.m_usedVertices.usedVertexC =
true;
421 result.setBarycentricCoordinates(1-v-w,v,w);
440#ifdef CATCH_DEGENERATE_TETRAHEDRON
441#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