23 #if defined(DEBUG) || defined (_DEBUG)
27 #include <spu_printf.h>
28 #define printf spu_printf
34 #define REL_ERROR2 btScalar(1.0e-6)
43 m_penetrationDepthSolver(penetrationDepthSolver),
44 m_simplexSolver(simplexSolver),
45 m_minkowskiA(objectA),
46 m_minkowskiB(objectB),
47 m_shapeTypeA(objectA->getShapeType()),
48 m_shapeTypeB(objectB->getShapeType()),
49 m_marginA(objectA->getMargin()),
50 m_marginB(objectB->getMargin()),
51 m_ignoreMargin(false),
53 m_catchDegeneracies(1)
58 m_penetrationDepthSolver(penetrationDepthSolver),
59 m_simplexSolver(simplexSolver),
60 m_minkowskiA(objectA),
61 m_minkowskiB(objectB),
62 m_shapeTypeA(shapeTypeA),
63 m_shapeTypeB(shapeTypeB),
66 m_ignoreMargin(false),
68 m_catchDegeneracies(1)
85 m_cachedSeparatingDistance = 0.f;
93 localTransA.
getOrigin() -= positionOffset;
94 localTransB.
getOrigin() -= positionOffset;
96 bool check2d = m_minkowskiA->isConvex2d() && m_minkowskiB->isConvex2d();
103 #ifdef DEBUG_SPU_COLLISION_DETECTION
111 #ifdef DEBUG_SPU_COLLISION_DETECTION
117 int gGjkMaxIter = 1000;
118 m_cachedSeparatingAxis.setValue(0,1,0);
120 bool isValid =
false;
121 bool checkSimplex =
false;
122 bool checkPenetration =
true;
123 m_degenerateSimplex = 0;
125 m_lastUsedMethod = -1;
131 btScalar margin = marginA + marginB;
135 m_simplexSolver->reset();
146 btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA);
147 btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInB);
154 btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA);
155 btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInB);
157 btVector3 pInA = m_minkowskiA->localGetSupportingVertexWithoutMargin(seperatingAxisInA);
158 btVector3 qInB = m_minkowskiB->localGetSupportingVertexWithoutMargin(seperatingAxisInB);
159 #ifdef TEST_NON_VIRTUAL
160 btVector3 pInAv = m_minkowskiA->localGetSupportingVertexWithoutMargin(seperatingAxisInA);
161 btVector3 qInBv = m_minkowskiB->localGetSupportingVertexWithoutMargin(seperatingAxisInB);
172 #ifdef DEBUG_SPU_COLLISION_DETECTION
173 spu_printf(
"got local supporting vertices\n");
183 delta = m_cachedSeparatingAxis.
dot(w);
188 m_degenerateSimplex = 10;
195 if (m_simplexSolver->inSimplex(w))
197 m_degenerateSimplex = 1;
202 btScalar f0 = squaredDistance - delta;
209 m_degenerateSimplex = 2;
212 m_degenerateSimplex = 11;
218 #ifdef DEBUG_SPU_COLLISION_DETECTION
222 m_simplexSolver->addVertex(w, pWorld, qWorld);
223 #ifdef DEBUG_SPU_COLLISION_DETECTION
229 if (!m_simplexSolver->closest(newCachedSeparatingAxis))
231 m_degenerateSimplex = 3;
238 m_cachedSeparatingAxis = newCachedSeparatingAxis;
239 m_degenerateSimplex = 6;
244 btScalar previousSquaredDistance = squaredDistance;
245 squaredDistance = newCachedSeparatingAxis.
length2();
247 if (squaredDistance>previousSquaredDistance)
250 m_degenerateSimplex = 7;
251 squaredDistance = previousSquaredDistance;
252 checkSimplex =
false;
261 if (previousSquaredDistance - squaredDistance <=
SIMD_EPSILON * previousSquaredDistance)
265 m_degenerateSimplex = 12;
270 m_cachedSeparatingAxis = newCachedSeparatingAxis;
273 if (m_curIter++ > gGjkMaxIter)
275 #if defined(DEBUG) || defined (_DEBUG) || defined (DEBUG_SPU_COLLISION_DETECTION)
277 printf(
"btGjkPairDetector maxIter exceeded:%i\n",m_curIter);
278 printf(
"sepAxis=(%f,%f,%f), squaredDistance = %f, shapeTypeA=%i,shapeTypeB=%i\n",
279 m_cachedSeparatingAxis.getX(),
280 m_cachedSeparatingAxis.getY(),
281 m_cachedSeparatingAxis.getZ(),
283 m_minkowskiA->getShapeType(),
284 m_minkowskiB->getShapeType());
292 bool check = (!m_simplexSolver->fullSimplex());
299 m_degenerateSimplex = 13;
306 m_simplexSolver->compute_points(pointOnA, pointOnB);
307 normalInB = m_cachedSeparatingAxis;
313 m_degenerateSimplex = 5;
322 pointOnA -= m_cachedSeparatingAxis * (marginA / s);
323 pointOnB += m_cachedSeparatingAxis * (marginB / s);
324 distance = ((
btScalar(1.)/rlen) - margin);
327 m_lastUsedMethod = 1;
330 m_lastUsedMethod = 2;
334 bool catchDegeneratePenetrationCase =
335 (m_catchDegeneracies && m_penetrationDepthSolver && m_degenerateSimplex && ((distance+margin) < 0.01));
338 if (checkPenetration && (!isValid || catchDegeneratePenetrationCase ))
343 if (m_penetrationDepthSolver)
349 m_cachedSeparatingAxis.setZero();
351 bool isValid2 = m_penetrationDepthSolver->calcPenDepth(
353 m_minkowskiA,m_minkowskiB,
354 localTransA,localTransB,
355 m_cachedSeparatingAxis, tmpPointOnA, tmpPointOnB,
362 btVector3 tmpNormalInB = tmpPointOnB-tmpPointOnA;
366 tmpNormalInB = m_cachedSeparatingAxis;
367 lenSqr = m_cachedSeparatingAxis.
length2();
370 if (lenSqr > (SIMD_EPSILON*SIMD_EPSILON))
372 tmpNormalInB /=
btSqrt(lenSqr);
375 if (!isValid || (distance2 < distance))
377 distance = distance2;
378 pointOnA = tmpPointOnA;
379 pointOnB = tmpPointOnB;
380 normalInB = tmpNormalInB;
382 m_lastUsedMethod = 3;
385 m_lastUsedMethod = 8;
389 m_lastUsedMethod = 9;
401 if (m_cachedSeparatingAxis.length2() >
btScalar(0.))
405 if (!isValid || (distance2 < distance))
407 distance = distance2;
408 pointOnA = tmpPointOnA;
409 pointOnB = tmpPointOnB;
410 pointOnA -= m_cachedSeparatingAxis * marginA ;
411 pointOnB += m_cachedSeparatingAxis * marginB ;
412 normalInB = m_cachedSeparatingAxis;
415 m_lastUsedMethod = 6;
418 m_lastUsedMethod = 5;
436 printf(
"n = %2.3f,%2.3f,%2.3f. ",normalInB[0],normalInB[1],normalInB[2]);
437 printf(
"distance = %2.3f exit=%d deg=%d\n",distance,m_lastUsedMethod,m_degenerateSimplex);
441 m_cachedSeparatingAxis = normalInB;
442 m_cachedSeparatingDistance = distance;
446 pointOnB+positionOffset,