16#ifndef BT_GJK_EPA_PENETATION_CONVEX_COLLISION_H
17#define BT_GJK_EPA_PENETATION_CONVEX_COLLISION_H
29template <
typename btConvexTemplate>
65template <
typename btConvexTemplate,
typename btGjkDistanceTemplate>
69 bool m_catchDegeneracies =
true;
70 btScalar m_cachedSeparatingDistance = 0.f;
89 int m_degenerateSimplex = 0;
91 int m_lastUsedMethod = -1;
119 delta = m_cachedSeparatingAxis.
dot(w);
124 m_degenerateSimplex = 10;
133 m_degenerateSimplex = 1;
145 m_degenerateSimplex = 2;
148 m_degenerateSimplex = 11;
161 m_degenerateSimplex = 3;
169 m_degenerateSimplex = 6;
180 m_degenerateSimplex = 7;
195 m_degenerateSimplex = 12;
205#if defined(DEBUG) || defined (_DEBUG)
207 printf(
"btGjkPairDetector maxIter exceeded:%i\n",m_curIter);
208 printf(
"sepAxis=(%f,%f,%f), squaredDistance = %f\n",
209 m_cachedSeparatingAxis.
getX(),
210 m_cachedSeparatingAxis.
getY(),
211 m_cachedSeparatingAxis.
getZ(),
227 m_degenerateSimplex = 13;
242 m_degenerateSimplex = 5;
257 m_lastUsedMethod = 1;
260 m_lastUsedMethod = 2;
265 (m_catchDegeneracies && m_degenerateSimplex && ((distance+margin) < 0.01));
277 m_cachedSeparatingAxis.
setZero();
298 if (!isValid || (distance2 < distance))
300 distance = distance2;
306 m_lastUsedMethod = 3;
309 m_lastUsedMethod = 8;
313 m_lastUsedMethod = 9;
329 if (!isValid || (distance2 < distance))
331 distance = distance2;
340 m_lastUsedMethod = 6;
343 m_lastUsedMethod = 5;
352 if (isValid && ((distance < 0) || (distance*distance <
colDesc.m_maximumDistanceSquared)))
356 m_cachedSeparatingDistance = distance;
363 return -m_lastUsedMethod;
bool btGjkEpaCalcPenDepth(const btConvexTemplate &a, const btConvexTemplate &b, const btGjkCollisionDescription &colDesc, btVector3 &v, btVector3 &wWitnessOnA, btVector3 &wWitnessOnB)
int btComputeGjkEpaPenetration(const btConvexTemplate &a, const btConvexTemplate &b, const btGjkCollisionDescription &colDesc, btVoronoiSimplexSolver &simplexSolver, btGjkDistanceTemplate *distInfo)
bool btGjkEpaSolver3_Penetration(const btConvexTemplate &a, const btConvexTemplate &b, const btVector3 &guess, btGjkEpaSolver3::sResults &results)
bool btGjkEpaSolver3_Distance(const btConvexTemplate &a, const btConvexTemplate &b, const btVector3 &guess, btGjkEpaSolver3::sResults &results)
const T & btMax(const T &a, const T &b)
btScalar length(const btQuaternion &q)
Return the length of a quaternion.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btScalar btSqrt(btScalar y)
btVector3 can be used to represent 3D points and vectors.
const btScalar & getZ() const
Return the z value.
btScalar dot(const btVector3 &v) const
Return the dot product.
btScalar length2() const
Return the length of the vector squared.
const btScalar & getY() const
Return the y value.
btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
const btScalar & getX() const
Return the x value.
btVoronoiSimplexSolver is an implementation of the closest point distance algorithm from a 1-4 points...