27 btVector3&
v, btVector3& pa, btVector3& pb,
32 bool check2d = convexA->isConvex2d() && convexB->isConvex2d();
36 btIntermediateResult() : m_hasResult(
false)
40 btVector3 m_normalOnBInWorld;
41 btVector3 m_pointInWorld;
45 virtual void setShapeIdentifiersA(
int partId0,
int index0)
50 virtual void setShapeIdentifiersB(
int partId1,
int index1)
55 void addContactPoint(
const btVector3& normalOnBInWorld,
const btVector3& pointInWorld,
btScalar depth)
57 m_normalOnBInWorld = normalOnBInWorld;
58 m_pointInWorld = pointInWorld;
68 btVector3 separatingAxisInA, separatingAxisInB;
69 btVector3 pInA, qInB, pWorld, qWorld,
w;
72#define USE_BATCHED_SUPPORT 1
74#ifdef USE_BATCHED_SUPPORT
84 for (i = 0; i < numSampleDirections; i++)
87 separatingAxisInABatch[i] = (-
norm) * transA.getBasis();
88 separatingAxisInBBatch[i] =
norm * transB.getBasis();
92 int numPDA = convexA->getNumPreferredPenetrationDirections();
95 for (
int i = 0; i < numPDA; i++)
98 convexA->getPreferredPenetrationDirection(i,
norm);
101 separatingAxisInABatch[numSampleDirections] = (-
norm) * transA.getBasis();
102 separatingAxisInBBatch[numSampleDirections] =
norm * transB.getBasis();
103 numSampleDirections++;
109 int numPDB = convexB->getNumPreferredPenetrationDirections();
112 for (
int i = 0; i < numPDB; i++)
115 convexB->getPreferredPenetrationDirection(i,
norm);
118 separatingAxisInABatch[numSampleDirections] = (-
norm) * transA.getBasis();
119 separatingAxisInBBatch[numSampleDirections] =
norm * transB.getBasis();
120 numSampleDirections++;
125 convexA->batchedUnitVectorGetSupportingVertexWithoutMargin(separatingAxisInABatch, supportVerticesABatch, numSampleDirections);
126 convexB->batchedUnitVectorGetSupportingVertexWithoutMargin(separatingAxisInBBatch, supportVerticesBBatch, numSampleDirections);
128 for (i = 0; i < numSampleDirections; i++)
135 if (
norm.length2() > 0.01)
137 separatingAxisInA = separatingAxisInABatch[i];
138 separatingAxisInB = separatingAxisInBBatch[i];
140 pInA = supportVerticesABatch[i];
141 qInB = supportVerticesBBatch[i];
143 pWorld = transA(pInA);
144 qWorld = transB(qInB);
169 int numPDA = convexA->getNumPreferredPenetrationDirections();
172 for (
int i = 0; i < numPDA; i++)
175 convexA->getPreferredPenetrationDirection(i,
norm);
178 numSampleDirections++;
184 int numPDB = convexB->getNumPreferredPenetrationDirections();
187 for (
int i = 0; i < numPDB; i++)
190 convexB->getPreferredPenetrationDirection(i,
norm);
193 numSampleDirections++;
199 for (
int i = 0; i < numSampleDirections; i++)
202 separatingAxisInA = (-
norm) * transA.getBasis();
203 separatingAxisInB =
norm * transB.getBasis();
204 pInA = convexA->localGetSupportVertexWithoutMarginNonVirtual(separatingAxisInA);
205 qInB = convexB->localGetSupportVertexWithoutMarginNonVirtual(separatingAxisInB);
206 pWorld = transA(pInA);
207 qWorld = transB(qInB);
223 minA += minNorm * convexA->getMarginNonVirtual();
224 minB -= minNorm * convexB->getMarginNonVirtual();
230 minProj += extraSeparation + (convexA->getMarginNonVirtual() + convexB->getMarginNonVirtual());
236 btVector3
color(0, 1, 0);
239 btVector3 vec = minB - minA;
241 debugDraw->drawLine(minA, minA + (minNorm * minProj), color);
248 btVector3 offset = minNorm * offsetDist;
252 btVector3 newOrg = transA.getOrigin() + offset;
255 displacedTrans.setOrigin(newOrg);
258 input.m_transformB = transB;
261 btIntermediateResult res;
265 btScalar correctedMinNorm = minProj - res.m_depth;
269 minNorm *= penetration_relaxation;
273 pa = res.m_pointInWorld - minNorm * correctedMinNorm;
274 pb = res.m_pointInWorld;
280 btVector3
color(1, 0, 0);
285 return res.m_hasResult;