23#if defined(DEBUG) || defined (_DEBUG)
27#include <spu_printf.h>
28#define printf spu_printf
33#ifdef BT_USE_DOUBLE_PRECISION
34 #define REL_ERROR2 btScalar(1.0e-12)
37 #define REL_ERROR2 btScalar(1.0e-6)
52m_shapeTypeA(
objectA->getShapeType()),
53m_shapeTypeB(
objectB->getShapeType()),
58m_catchDegeneracies(1),
59m_fixContactNormalDirection(1)
74m_catchDegeneracies(1),
75m_fixContactNormalDirection(1)
92 m_cachedSeparatingDistance = 0.f;
104 bool check2d = m_minkowskiA->isConvex2d() && m_minkowskiB->isConvex2d();
120 m_cachedSeparatingAxis.setValue(0,1,0);
122 bool isValid =
false;
125 m_degenerateSimplex = 0;
127 m_lastUsedMethod = -1;
137 m_simplexSolver->reset();
161 delta = m_cachedSeparatingAxis.
dot(w);
166 m_degenerateSimplex = 10;
173 if (m_simplexSolver->inSimplex(w))
175 m_degenerateSimplex = 1;
187 m_degenerateSimplex = 2;
190 m_degenerateSimplex = 11;
203 m_degenerateSimplex = 3;
211 m_degenerateSimplex = 6;
222 m_degenerateSimplex = 7;
237 m_degenerateSimplex = 12;
247 #if defined(DEBUG) || defined (_DEBUG)
249 printf(
"btGjkPairDetector maxIter exceeded:%i\n",m_curIter);
250 printf(
"sepAxis=(%f,%f,%f), squaredDistance = %f, shapeTypeA=%i,shapeTypeB=%i\n",
251 m_cachedSeparatingAxis.getX(),
252 m_cachedSeparatingAxis.getY(),
253 m_cachedSeparatingAxis.getZ(),
255 m_minkowskiA->getShapeType(),
256 m_minkowskiB->getShapeType());
264 bool check = (!m_simplexSolver->fullSimplex());
271 m_degenerateSimplex = 13;
286 m_degenerateSimplex = 5;
301 m_lastUsedMethod = 1;
304 m_lastUsedMethod = 2;
317 if (m_penetrationDepthSolver)
323 m_cachedSeparatingAxis.
setZero();
325 bool isValid2 = m_penetrationDepthSolver->calcPenDepth(
327 m_minkowskiA,m_minkowskiB,
341 lenSqr = m_cachedSeparatingAxis.length2();
348 m_lastUsedMethod = 3;
350 if (!isValid || (distance2 < distance))
352 distance = distance2;
361 m_lastUsedMethod = 8;
365 m_lastUsedMethod = 9;
377 if (m_cachedSeparatingAxis.length2() >
btScalar(0.))
381 if (!isValid || (distance2 < distance))
383 distance = distance2;
392 m_lastUsedMethod = 6;
395 m_lastUsedMethod = 5;
407 if (isValid && ((distance < 0) || (distance*distance <
input.m_maximumDistanceSquared)))
411 m_cachedSeparatingDistance = distance;
449 m_lastUsedMethod = 10;
int gNumDeepPenetrationChecks
btScalar gGjkEpaPenetrationTolerance
const T & btMax(const T &a, const T &b)
btScalar dot(const btQuaternion &q1, const btQuaternion &q2)
Calculate the dot product between two quaternions.
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)
#define btSimplexSolverInterface
ConvexPenetrationDepthSolver provides an interface for penetration depth calculation.
The btConvexShape is an abstract shape interface, implemented by all convex shapes such as btBoxShape...
virtual void getClosestPoints(const ClosestPointInput &input, Result &output, class btIDebugDraw *debugDraw, bool swapResults=false)
btGjkPairDetector(const btConvexShape *objectA, const btConvexShape *objectB, btSimplexSolverInterface *simplexSolver, btConvexPenetrationDepthSolver *penetrationDepthSolver)
void getClosestPointsNonVirtual(const ClosestPointInput &input, Result &output, class btIDebugDraw *debugDraw)
The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations.
btVector3 can be used to represent 3D points and vectors.
btScalar dot(const btVector3 &v) const
Return the dot product.
btScalar length2() const
Return the length of the vector squared.