33#define CATCH_DEGENERATE_TETRAHEDRON 1
34void btVoronoiSimplexSolver::removeVertex(
int index)
59void btVoronoiSimplexSolver::reset()
69void btVoronoiSimplexSolver::addVertex(
const btVector3&
w,
const btVector3& p,
const btVector3& q)
81bool btVoronoiSimplexSolver::updateClosestVectorAndPoints()
113 btVector3
v = to -
from;
141 nearest =
from + t *
v;
236bool btVoronoiSimplexSolver::closest(btVector3&
v)
247 for (i = 0; i < numverts; i++)
257int btVoronoiSimplexSolver::getSimplex(btVector3* pBuf, btVector3* qBuf, btVector3* yBuf)
const
269bool btVoronoiSimplexSolver::inSimplex(
const btVector3&
w)
276 for (i = 0; i < numverts; i++)
278#ifdef BT_USE_EQUAL_VERTEX_THRESHOLD
296void btVoronoiSimplexSolver::backup_closest(btVector3&
v)
301bool btVoronoiSimplexSolver::emptySimplex()
const
306void btVoronoiSimplexSolver::compute_points(btVector3& p1, btVector3& p2)
315 result.m_usedVertices.reset();
318 btVector3 ab =
b - a;
319 btVector3 ac = c - a;
320 btVector3 ap = p - a;
325 result.m_closestPointOnSimplex = a;
326 result.m_usedVertices.usedVertexA =
true;
327 result.setBarycentricCoordinates(1, 0, 0);
332 btVector3 bp = p -
b;
335 if (d3 >=
btScalar(0.0) && d4 <= d3)
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);
357 btVector3 cp = p - c;
360 if (d6 >=
btScalar(0.0) && d5 <= d6)
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);
385 btScalar w = (d4 - d3) / ((d4 - d3) + (d5 - d6));
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);
411int btVoronoiSimplexSolver::pointOutsideOfPlane(
const btVector3& p,
const btVector3& a,
const btVector3&
b,
const btVector3& c,
const btVector3& d)
413 btVector3 normal = (
b - a).
cross(c - a);
418#ifdef CATCH_DEGENERATE_TETRAHEDRON
419#ifdef BT_USE_DOUBLE_PRECISION
434 return signp * signd <
btScalar(0.);
437bool btVoronoiSimplexSolver::closestPtPointTetrahedron(
const btVector3& p,
const btVector3& a,
const btVector3&
b,
const btVector3& c,
const btVector3& d,
btSubSimplexClosestResult& finalResult)
454 if (pointOutsideABC < 0 || pointOutsideACD < 0 || pointOutsideADB < 0 || pointOutsideBDC < 0)
460 if (!pointOutsideABC && !pointOutsideACD && !pointOutsideADB && !pointOutsideBDC)
474 if (sqDist < bestSqDist)
499 if (sqDist < bestSqDist)
524 if (sqDist < bestSqDist)
548 if (sqDist < bestSqDist)
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
SIMD_FORCE_INLINE btScalar distance2(const btVector3 &v) const
Return the distance squared between the ends of this and another vector This is symantically treating...
void reduceVertices(const btUsageBitfield &usedVerts)
bool closestPtPointTetrahedron(const btVector3 &p, const btVector3 &a, const btVector3 &b, const btVector3 &c, const btVector3 &d, btSubSimplexClosestResult &finalResult)
bool m_cachedValidClosest
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.
btVector3 m_simplexVectorW[VORONOI_SIMPLEX_MAX_VERTS]
btSubSimplexClosestResult m_cachedBC
bool updateClosestVectorAndPoints()
bool closestPtPointTriangle(const btVector3 &p, const btVector3 &a, const btVector3 &b, const btVector3 &c, btSubSimplexClosestResult &result)
btVector3 m_simplexPointsP[VORONOI_SIMPLEX_MAX_VERTS]
btVector3 m_simplexPointsQ[VORONOI_SIMPLEX_MAX_VERTS]
void removeVertex(int index)
btScalar m_equalVertexThreshold
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
IMETHOD Vector diff(const Vector &a, const Vector &b, double dt)
VecBase< float, 3 > cross(VecOp< float, 3 >, VecOp< float, 3 >) RET
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 usedVertexC
unsigned short usedVertexB
unsigned short usedVertexA
unsigned short usedVertexD