tesseract_compound_compound_collision_algorithm.cpp
Go to the documentation of this file.
1 /*
2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org
4 
5 This software is provided 'as-is', without any express or implied warranty.
6 In no event will the authors be held liable for any damages arising from the use of this software.
7 Permission is granted to anyone to use this software for any purpose,
8 including commercial applications, and to alter it and redistribute it freely,
9 subject to the following restrictions:
10 
11 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If
12 you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not
13 required.
14 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original
15 software.
16 3. This notice may not be removed or altered from any source distribution.
17 
18 */
19 
22 #include <LinearMath/btQuickprof.h>
23 #include <BulletCollision/CollisionDispatch/btCollisionObject.h>
24 #include <BulletCollision/CollisionShapes/btCompoundShape.h>
25 #include <BulletCollision/CollisionShapes/btCollisionShape.h>
26 #include <BulletCollision/BroadphaseCollision/btDbvt.h>
27 #include <BulletCollision/NarrowPhaseCollision/btPersistentManifold.h>
28 #include <LinearMath/btIDebugDraw.h>
29 #include <LinearMath/btAabbUtil2.h>
30 #include <BulletCollision/CollisionDispatch/btManifoldResult.h>
31 #include <BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h>
33 
34 // USE_LOCAL_STACK will avoid most (often all) dynamic memory allocations due to resizing in processCollision and
35 // MycollideTT
36 #define USE_LOCAL_STACK 1
37 
40 
41 // LCOV_EXCL_START
42 // See tesseract issue: https://github.com/tesseract-robotics/tesseract/issues/934
45 {
47  const btCollisionAlgorithmConstructionInfo& ci,
48  const btCollisionObjectWrapper* body0Wrap,
49  const btCollisionObjectWrapper* body1Wrap,
50  bool isSwapped)
51  : TesseractCompoundCollisionAlgorithm(ci, body0Wrap, body1Wrap, isSwapped)
52 {
53  void* ptr = btAlignedAlloc(sizeof(btHashedSimplePairCache), 16);
54  m_childCollisionAlgorithmCache = new (ptr) btHashedSimplePairCache(); // NOLINT
55 
56  const btCollisionObjectWrapper* col0ObjWrap = body0Wrap;
57  btAssert(col0ObjWrap->getCollisionShape()->isCompound());
58 
59  const btCollisionObjectWrapper* col1ObjWrap = body1Wrap;
60  btAssert(col1ObjWrap->getCollisionShape()->isCompound());
61 
62  const auto* compoundShape0 = static_cast<const btCompoundShape*>(col0ObjWrap->getCollisionShape()); // NOLINT
63  m_compoundShapeRevision0 = compoundShape0->getUpdateRevision();
64 
65  const auto* compoundShape1 = static_cast<const btCompoundShape*>(col1ObjWrap->getCollisionShape()); // NOLINT
66  m_compoundShapeRevision1 = compoundShape1->getUpdateRevision();
67 }
68 
70 {
72  m_childCollisionAlgorithmCache->~btHashedSimplePairCache();
73  btAlignedFree(m_childCollisionAlgorithmCache);
74 }
75 
77 {
78  btSimplePairArray& pairs = m_childCollisionAlgorithmCache->getOverlappingPairArray();
79  for (int i = 0; i < pairs.size(); i++)
80  {
81  if (pairs[i].m_userPointer != nullptr)
82  {
83  ((btCollisionAlgorithm*)pairs[i].m_userPointer)->getAllContactManifolds(manifoldArray); // NOLINT
84  }
85  }
86 }
87 
89 {
90  btSimplePairArray& pairs = m_childCollisionAlgorithmCache->getOverlappingPairArray();
91 
92  int numChildren = pairs.size();
93  for (int i = 0; i < numChildren; i++)
94  {
95  if (pairs[i].m_userPointer != nullptr)
96  {
97  auto* algo = (btCollisionAlgorithm*)pairs[i].m_userPointer; // NOLINT
98  algo->~btCollisionAlgorithm();
99  m_dispatcher->freeCollisionAlgorithm(algo);
100  }
101  }
102  m_childCollisionAlgorithmCache->removeAllPairs();
103 }
104 
105 struct TesseractCompoundCompoundLeafCallback : btDbvt::ICollide
106 {
108 
109  const btCollisionObjectWrapper* m_compound0ColObjWrap;
110  const btCollisionObjectWrapper* m_compound1ColObjWrap;
111  btDispatcher* m_dispatcher;
112  const btDispatcherInfo& m_dispatchInfo; // NOLINT
113  btManifoldResult* m_resultOut;
114 
115  class btHashedSimplePairCache* m_childCollisionAlgorithmCache;
116 
117  btPersistentManifold* m_sharedManifold;
118 
120 
121  TesseractCompoundCompoundLeafCallback(const btCollisionObjectWrapper* compound1ObjWrap,
122  const btCollisionObjectWrapper* compound0ObjWrap,
123  btDispatcher* dispatcher,
124  const btDispatcherInfo& dispatchInfo,
125  btManifoldResult* resultOut,
126  btHashedSimplePairCache* childAlgorithmsCache,
127  btPersistentManifold* sharedManifold)
128  : m_compound0ColObjWrap(compound1ObjWrap)
129  , m_compound1ColObjWrap(compound0ObjWrap)
130  , m_dispatcher(dispatcher)
131  , m_dispatchInfo(dispatchInfo)
132  , m_resultOut(resultOut)
133  , m_childCollisionAlgorithmCache(childAlgorithmsCache)
134  , m_sharedManifold(sharedManifold)
135  , m_contact_test_data(static_cast<ContactTestData*>(compound1ObjWrap->m_collisionObject->getUserPointer()))
136  {
137  }
138 
139  void Process(const btDbvtNode* leaf0, const btDbvtNode* leaf1) // NOLINT
140  {
141  BT_PROFILE("TesseractCompoundCompoundLeafCallback::Process");
143 
144  int childIndex0 = leaf0->dataAsInt;
145  int childIndex1 = leaf1->dataAsInt;
146 
147  btAssert(childIndex0 >= 0);
148  btAssert(childIndex1 >= 0);
149 
150  const auto* compoundShape0 = static_cast<const btCompoundShape*>(m_compound0ColObjWrap->getCollisionShape());
151  btAssert(childIndex0 < compoundShape0->getNumChildShapes());
152 
153  const auto* compoundShape1 = static_cast<const btCompoundShape*>(m_compound1ColObjWrap->getCollisionShape());
154  btAssert(childIndex1 < compoundShape1->getNumChildShapes());
155 
156  const btCollisionShape* childShape0 = compoundShape0->getChildShape(childIndex0);
157  const btCollisionShape* childShape1 = compoundShape1->getChildShape(childIndex1);
158 
159  // backup
160  btTransform orgTrans0 = m_compound0ColObjWrap->getWorldTransform();
161  const btTransform& childTrans0 = compoundShape0->getChildTransform(childIndex0);
162  btTransform newChildWorldTrans0 = orgTrans0 * childTrans0;
163 
164  btTransform orgTrans1 = m_compound1ColObjWrap->getWorldTransform();
165  const btTransform& childTrans1 = compoundShape1->getChildTransform(childIndex1);
166  btTransform newChildWorldTrans1 = orgTrans1 * childTrans1;
167 
168  // perform an AABB check first
169  btVector3 aabbMin0, aabbMax0, aabbMin1, aabbMax1;
170  childShape0->getAabb(newChildWorldTrans0, aabbMin0, aabbMax0);
171  childShape1->getAabb(newChildWorldTrans1, aabbMin1, aabbMax1);
172 
173  btVector3 thresholdVec(m_resultOut->m_closestPointDistanceThreshold,
174  m_resultOut->m_closestPointDistanceThreshold,
175  m_resultOut->m_closestPointDistanceThreshold);
176 
177  aabbMin0 -= thresholdVec;
178  aabbMax0 += thresholdVec;
179 
181  return;
182 
183  if (TestAabbAgainstAabb2(aabbMin0, aabbMax0, aabbMin1, aabbMax1))
184  {
185  btCollisionObjectWrapper compoundWrap0(this->m_compound0ColObjWrap,
186  childShape0,
187  m_compound0ColObjWrap->getCollisionObject(),
188  newChildWorldTrans0,
189  -1,
190  childIndex0);
191  btCollisionObjectWrapper compoundWrap1(this->m_compound1ColObjWrap,
192  childShape1,
193  m_compound1ColObjWrap->getCollisionObject(),
194  newChildWorldTrans1,
195  -1,
196  childIndex1);
197 
198  btSimplePair* pair = m_childCollisionAlgorithmCache->findPair(childIndex0, childIndex1);
199  bool removePair = false;
200  btCollisionAlgorithm* colAlgo = nullptr;
201  if (m_resultOut->m_closestPointDistanceThreshold > 0)
202  {
203  colAlgo = m_dispatcher->findAlgorithm(&compoundWrap0, &compoundWrap1, nullptr, BT_CLOSEST_POINT_ALGORITHMS);
204  removePair = true;
205  }
206  else
207  {
208  if (pair != nullptr)
209  {
210  colAlgo = (btCollisionAlgorithm*)pair->m_userPointer; // NOLINT
211  }
212  else
213  {
214  colAlgo = m_dispatcher->findAlgorithm(
215  &compoundWrap0, &compoundWrap1, m_sharedManifold, BT_CONTACT_POINT_ALGORITHMS);
216  pair = m_childCollisionAlgorithmCache->addOverlappingPair(childIndex0, childIndex1);
217  btAssert(pair);
218  pair->m_userPointer = colAlgo;
219  }
220  }
221 
222  btAssert(colAlgo);
223 
224  const btCollisionObjectWrapper* tmpWrap0 = nullptr;
225  const btCollisionObjectWrapper* tmpWrap1 = nullptr;
226 
227  tmpWrap0 = m_resultOut->getBody0Wrap();
228  tmpWrap1 = m_resultOut->getBody1Wrap();
229 
230  m_resultOut->setBody0Wrap(&compoundWrap0);
231  m_resultOut->setBody1Wrap(&compoundWrap1);
232 
233  m_resultOut->setShapeIdentifiersA(-1, childIndex0);
234  m_resultOut->setShapeIdentifiersB(-1, childIndex1);
235 
236  colAlgo->processCollision(&compoundWrap0, &compoundWrap1, m_dispatchInfo, m_resultOut);
237 
238  m_resultOut->setBody0Wrap(tmpWrap0);
239  m_resultOut->setBody1Wrap(tmpWrap1);
240 
241  if (removePair)
242  {
243  colAlgo->~btCollisionAlgorithm();
244  m_dispatcher->freeCollisionAlgorithm(colAlgo);
245  }
246  }
247  }
248 };
249 
250 static DBVT_INLINE bool
251 MyIntersect(const btDbvtAabbMm& a, const btDbvtAabbMm& b, const btTransform& xform, btScalar distanceThreshold)
252 {
253  btVector3 newmin, newmax;
254  btTransformAabb(b.Mins(), b.Maxs(), btScalar(0), xform, newmin, newmax);
255  newmin -= btVector3(distanceThreshold, distanceThreshold, distanceThreshold);
256  newmax += btVector3(distanceThreshold, distanceThreshold, distanceThreshold);
257  btDbvtAabbMm newb = btDbvtAabbMm::FromMM(newmin, newmax);
258  return Intersect(a, newb);
259 }
260 
261 static inline void MycollideTT(const btDbvtNode* root0,
262  const btDbvtNode* root1,
263  const btTransform& xform,
265  btScalar distanceThreshold)
266 {
267  if (root0 != nullptr && root1 != nullptr)
268  {
269  int depth = 1;
270  int treshold = btDbvt::DOUBLE_STACKSIZE - 4;
271  btAlignedObjectArray<btDbvt::sStkNN> stkStack;
272 #ifdef USE_LOCAL_STACK
273  ATTRIBUTE_ALIGNED16(btDbvt::sStkNN localStack[btDbvt::DOUBLE_STACKSIZE]); // NOLINT
274  stkStack.initializeFromBuffer(&localStack, btDbvt::DOUBLE_STACKSIZE, btDbvt::DOUBLE_STACKSIZE);
275 #else
276  stkStack.resize(btDbvt::DOUBLE_STACKSIZE);
277 #endif
278  stkStack[0] = btDbvt::sStkNN(root0, root1);
279  do // NOLINT(cppcoreguidelines-avoid-do-while)
280  {
281  btDbvt::sStkNN p = stkStack[--depth];
282  if (MyIntersect(p.a->volume, p.b->volume, xform, distanceThreshold))
283  {
284  if (depth > treshold)
285  {
286  stkStack.resize(stkStack.size() * 2);
287  treshold = stkStack.size() - 4;
288  }
289  if (p.a->isinternal())
290  {
291  if (p.b->isinternal())
292  {
293  stkStack[depth++] = btDbvt::sStkNN(p.a->childs[0], p.b->childs[0]);
294  stkStack[depth++] = btDbvt::sStkNN(p.a->childs[1], p.b->childs[0]);
295  stkStack[depth++] = btDbvt::sStkNN(p.a->childs[0], p.b->childs[1]);
296  stkStack[depth++] = btDbvt::sStkNN(p.a->childs[1], p.b->childs[1]);
297  }
298  else
299  {
300  stkStack[depth++] = btDbvt::sStkNN(p.a->childs[0], p.b);
301  stkStack[depth++] = btDbvt::sStkNN(p.a->childs[1], p.b);
302  }
303  }
304  else
305  {
306  if (p.b->isinternal())
307  {
308  stkStack[depth++] = btDbvt::sStkNN(p.a, p.b->childs[0]);
309  stkStack[depth++] = btDbvt::sStkNN(p.a, p.b->childs[1]);
310  }
311  else
312  {
313  callback->Process(p.a, p.b);
314  }
315  }
316  }
317  } while (depth != 0);
318  }
319 }
320 
321 void TesseractCompoundCompoundCollisionAlgorithm::processCollision(const btCollisionObjectWrapper* body0Wrap,
322  const btCollisionObjectWrapper* body1Wrap,
323  const btDispatcherInfo& dispatchInfo,
324  btManifoldResult* resultOut)
325 {
326  const btCollisionObjectWrapper* col0ObjWrap = body0Wrap;
327  const btCollisionObjectWrapper* col1ObjWrap = body1Wrap;
328 
329  btAssert(col0ObjWrap->getCollisionShape()->isCompound());
330  btAssert(col1ObjWrap->getCollisionShape()->isCompound());
331  const auto* compoundShape0 = static_cast<const btCompoundShape*>(col0ObjWrap->getCollisionShape());
332  const auto* compoundShape1 = static_cast<const btCompoundShape*>(col1ObjWrap->getCollisionShape());
333 
334  const btDbvt* tree0 = compoundShape0->getDynamicAabbTree();
335  const btDbvt* tree1 = compoundShape1->getDynamicAabbTree();
336  if (tree0 == nullptr || tree1 == nullptr)
337  {
338  TesseractCompoundCollisionAlgorithm::processCollision(body0Wrap, body1Wrap, dispatchInfo, resultOut);
339  return;
340  }
343  if ((compoundShape0->getUpdateRevision() != m_compoundShapeRevision0) ||
344  (compoundShape1->getUpdateRevision() != m_compoundShapeRevision1))
345  {
348  m_compoundShapeRevision0 = compoundShape0->getUpdateRevision();
349  m_compoundShapeRevision1 = compoundShape1->getUpdateRevision();
350  }
351 
355  {
356  btManifoldArray manifoldArray;
357 #ifdef USE_LOCAL_STACK
358  btPersistentManifold localManifolds[4]; // NOLINT
359  manifoldArray.initializeFromBuffer(&localManifolds, 0, 4);
360 #endif
361  btSimplePairArray& pairs = m_childCollisionAlgorithmCache->getOverlappingPairArray();
362  for (int i = 0; i < pairs.size(); i++)
363  {
364  if (pairs[i].m_userPointer != nullptr)
365  {
366  auto* algo = (btCollisionAlgorithm*)pairs[i].m_userPointer; // NOLINT
367  algo->getAllContactManifolds(manifoldArray);
368  for (int m = 0; m < manifoldArray.size(); m++)
369  {
370  if (manifoldArray[m]->getNumContacts() != 0)
371  {
372  resultOut->setPersistentManifold(manifoldArray[m]);
373  resultOut->refreshContactPoints();
374  resultOut->setPersistentManifold(nullptr);
375  }
376  }
377  manifoldArray.resize(0);
378  }
379  }
380  }
381 
382  TesseractCompoundCompoundLeafCallback callback(col0ObjWrap,
383  col1ObjWrap,
384  this->m_dispatcher,
385  dispatchInfo,
386  resultOut,
389 
390  const btTransform xform = col0ObjWrap->getWorldTransform().inverse() * col1ObjWrap->getWorldTransform();
391  MycollideTT(tree0->m_root, tree1->m_root, xform, &callback, resultOut->m_closestPointDistanceThreshold);
392 
393  // printf("#compound-compound child/leaf overlap =%d \r",callback.m_numOverlapPairs);
394 
395  // remove non-overlapping child pairs
396 
397  {
398  btAssert(m_removePairs.size() == 0);
399 
400  // iterate over all children, perform an AABB check inside ProcessChildShape
401  btSimplePairArray& pairs = m_childCollisionAlgorithmCache->getOverlappingPairArray();
402 
403  btManifoldArray manifoldArray;
404 
405  btVector3 aabbMin0, aabbMax0, aabbMin1, aabbMax1;
406 
407  for (int i = 0; i < pairs.size(); i++)
408  {
409  if (pairs[i].m_userPointer != nullptr)
410  {
411  auto* algo = (btCollisionAlgorithm*)pairs[i].m_userPointer; // NOLINT
412 
413  {
414  const btCollisionShape* childShape0 = nullptr;
415 
416  btTransform newChildWorldTrans0;
417  childShape0 = compoundShape0->getChildShape(pairs[i].m_indexA);
418  const btTransform& childTrans0 = compoundShape0->getChildTransform(pairs[i].m_indexA);
419  newChildWorldTrans0 = col0ObjWrap->getWorldTransform() * childTrans0;
420  childShape0->getAabb(newChildWorldTrans0, aabbMin0, aabbMax0);
421  }
422  btVector3 thresholdVec(resultOut->m_closestPointDistanceThreshold,
423  resultOut->m_closestPointDistanceThreshold,
424  resultOut->m_closestPointDistanceThreshold);
425  aabbMin0 -= thresholdVec;
426  aabbMax0 += thresholdVec;
427  {
428  const btCollisionShape* childShape1 = nullptr;
429  btTransform newChildWorldTrans1;
430 
431  childShape1 = compoundShape1->getChildShape(pairs[i].m_indexB);
432  const btTransform& childTrans1 = compoundShape1->getChildTransform(pairs[i].m_indexB);
433  newChildWorldTrans1 = col1ObjWrap->getWorldTransform() * childTrans1;
434  childShape1->getAabb(newChildWorldTrans1, aabbMin1, aabbMax1);
435  }
436 
437  aabbMin1 -= thresholdVec;
438  aabbMax1 += thresholdVec;
439 
440  if (!TestAabbAgainstAabb2(aabbMin0, aabbMax0, aabbMin1, aabbMax1))
441  {
442  algo->~btCollisionAlgorithm();
443  m_dispatcher->freeCollisionAlgorithm(algo);
444  m_removePairs.push_back(btSimplePair(pairs[i].m_indexA, pairs[i].m_indexB));
445  }
446  }
447  }
448  for (int i = 0; i < m_removePairs.size(); i++)
449  {
450  m_childCollisionAlgorithmCache->removeOverlappingPair(m_removePairs[i].m_indexA, m_removePairs[i].m_indexB);
451  }
452  m_removePairs.clear();
453  }
454 }
455 
457  btCollisionObject* /*body1*/,
458  const btDispatcherInfo& /*dispatchInfo*/,
459  btManifoldResult* /*resultOut*/)
460 {
461  btAssert(0);
462  return btScalar(0);
463 }
464 } // namespace tesseract_collision::tesseract_collision_bullet
466 // LCOV_EXCL_STOP
tesseract_collision::tesseract_collision_bullet
Definition: bullet_cast_bvh_manager.h:48
tesseract_collision::ContactTestData
This data is intended only to be used internal to the collision checkers as a container and should no...
Definition: types.h:328
tesseract_collision::tesseract_collision_bullet::MyIntersect
static DBVT_INLINE bool MyIntersect(const btDbvtAabbMm &a, const btDbvtAabbMm &b, const btTransform &xform, btScalar distanceThreshold)
Definition: tesseract_compound_compound_collision_algorithm.cpp:251
tesseract_collision::ContactTestData::done
bool done
Indicate if search is finished.
Definition: types.h:355
types.h
Tesseracts Collision Forward Declarations.
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundCollisionAlgorithm::m_childCollisionAlgorithmCache
class btHashedSimplePairCache * m_childCollisionAlgorithmCache
Definition: tesseract_compound_compound_collision_algorithm.h:57
tesseract_compound_compound_collision_algorithm.h
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundLeafCallback::m_dispatcher
btDispatcher * m_dispatcher
Definition: tesseract_compound_compound_collision_algorithm.cpp:111
tesseract_collision::tesseract_collision_bullet::MycollideTT
static void MycollideTT(const btDbvtNode *root0, const btDbvtNode *root1, const btTransform &xform, TesseractCompoundCompoundLeafCallback *callback, btScalar distanceThreshold)
Definition: tesseract_compound_compound_collision_algorithm.cpp:261
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundLeafCallback::TesseractCompoundCompoundLeafCallback
TesseractCompoundCompoundLeafCallback(const btCollisionObjectWrapper *compound1ObjWrap, const btCollisionObjectWrapper *compound0ObjWrap, btDispatcher *dispatcher, const btDispatcherInfo &dispatchInfo, btManifoldResult *resultOut, btHashedSimplePairCache *childAlgorithmsCache, btPersistentManifold *sharedManifold)
Definition: tesseract_compound_compound_collision_algorithm.cpp:121
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundCollisionAlgorithm::TesseractCompoundCompoundCollisionAlgorithm
TesseractCompoundCompoundCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo &ci, const btCollisionObjectWrapper *body0Wrap, const btCollisionObjectWrapper *body1Wrap, bool isSwapped)
Definition: tesseract_compound_compound_collision_algorithm.cpp:46
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundLeafCallback::m_childCollisionAlgorithmCache
class btHashedSimplePairCache * m_childCollisionAlgorithmCache
Definition: tesseract_compound_compound_collision_algorithm.cpp:115
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundCollisionAlgorithm::m_compoundShapeRevision1
int m_compoundShapeRevision1
Definition: tesseract_compound_compound_collision_algorithm.h:61
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundCollisionAlgorithm::getAllContactManifolds
void getAllContactManifolds(btManifoldArray &manifoldArray) override
Definition: tesseract_compound_compound_collision_algorithm.cpp:76
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundLeafCallback::m_dispatchInfo
const btDispatcherInfo & m_dispatchInfo
Definition: tesseract_compound_compound_collision_algorithm.cpp:112
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundLeafCallback::m_numOverlapPairs
int m_numOverlapPairs
Definition: tesseract_compound_compound_collision_algorithm.cpp:107
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundCollisionAlgorithm::m_removePairs
btSimplePairArray m_removePairs
Definition: tesseract_compound_compound_collision_algorithm.h:58
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundLeafCallback::m_compound0ColObjWrap
const btCollisionObjectWrapper * m_compound0ColObjWrap
Definition: tesseract_compound_compound_collision_algorithm.cpp:109
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundLeafCallback::m_contact_test_data
ContactTestData * m_contact_test_data
Definition: tesseract_compound_compound_collision_algorithm.cpp:119
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCollisionAlgorithm::manifoldArray
btManifoldArray manifoldArray
Definition: tesseract_compound_collision_algorithm.h:55
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundCollisionAlgorithm::calculateTimeOfImpact
btScalar calculateTimeOfImpact(btCollisionObject *body0, btCollisionObject *body1, const btDispatcherInfo &dispatchInfo, btManifoldResult *resultOut) override
Definition: tesseract_compound_compound_collision_algorithm.cpp:456
TESSERACT_COMMON_IGNORE_WARNINGS_POP
Definition: create_convex_hull.cpp:37
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundLeafCallback::m_sharedManifold
btPersistentManifold * m_sharedManifold
Definition: tesseract_compound_compound_collision_algorithm.cpp:117
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundCollisionAlgorithm::processCollision
void processCollision(const btCollisionObjectWrapper *body0Wrap, const btCollisionObjectWrapper *body1Wrap, const btDispatcherInfo &dispatchInfo, btManifoldResult *resultOut) override
Definition: tesseract_compound_compound_collision_algorithm.cpp:321
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundLeafCallback::m_resultOut
btManifoldResult * m_resultOut
Definition: tesseract_compound_compound_collision_algorithm.cpp:113
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundCollisionAlgorithm::removeChildAlgorithms
void removeChildAlgorithms()
Definition: tesseract_compound_compound_collision_algorithm.cpp:88
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCollisionAlgorithm::processCollision
void processCollision(const btCollisionObjectWrapper *body0Wrap, const btCollisionObjectWrapper *body1Wrap, const btDispatcherInfo &dispatchInfo, btManifoldResult *resultOut) override
Definition: tesseract_compound_collision_algorithm.cpp:271
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundCollisionAlgorithm::m_compoundShapeRevision0
int m_compoundShapeRevision0
Definition: tesseract_compound_compound_collision_algorithm.h:60
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCollisionAlgorithm::m_sharedManifold
class btPersistentManifold * m_sharedManifold
Definition: tesseract_compound_collision_algorithm.h:61
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundLeafCallback
Definition: tesseract_compound_compound_collision_algorithm.cpp:105
macros.h
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundLeafCallback::Process
void Process(const btDbvtNode *leaf0, const btDbvtNode *leaf1)
Definition: tesseract_compound_compound_collision_algorithm.cpp:139
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundLeafCallback::m_compound1ColObjWrap
const btCollisionObjectWrapper * m_compound1ColObjWrap
Definition: tesseract_compound_compound_collision_algorithm.cpp:110
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCompoundCollisionAlgorithm::~TesseractCompoundCompoundCollisionAlgorithm
~TesseractCompoundCompoundCollisionAlgorithm() override
Definition: tesseract_compound_compound_collision_algorithm.cpp:69
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCollisionAlgorithm
Supports collision between CompoundCollisionShapes and other collision shapes.
Definition: tesseract_compound_collision_algorithm.h:52


tesseract_collision
Author(s): Levi Armstrong
autogenerated on Sun May 18 2025 03:01:52