tesseract_compound_collision_algorithm.cpp
Go to the documentation of this file.
1 /*
2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
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 <BulletCollision/CollisionDispatch/btCollisionObject.h>
23 #include <BulletCollision/CollisionShapes/btCompoundShape.h>
24 #include <BulletCollision/CollisionShapes/btCollisionShape.h>
25 #include <BulletCollision/BroadphaseCollision/btDbvt.h>
26 #include <LinearMath/btIDebugDraw.h>
27 #include <LinearMath/btAabbUtil2.h>
28 #include <BulletCollision/CollisionDispatch/btManifoldResult.h>
29 #include <BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h>
31 
34 
35 // LCOV_EXCL_START
36 // See tesseract issue: https://github.com/tesseract-robotics/tesseract/issues/934
39 {
40 TesseractCompoundCollisionAlgorithm::TesseractCompoundCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci,
41  const btCollisionObjectWrapper* body0Wrap,
42  const btCollisionObjectWrapper* body1Wrap,
43  bool isSwapped)
44  : btActivatingCollisionAlgorithm(ci, body0Wrap, body1Wrap), m_isSwapped(isSwapped), m_sharedManifold(ci.m_manifold)
45 {
46  const btCollisionObjectWrapper* colObjWrap = m_isSwapped ? body1Wrap : body0Wrap;
47  btAssert(colObjWrap->getCollisionShape()->isCompound());
48 
49  const auto* compoundShape = static_cast<const btCompoundShape*>(colObjWrap->getCollisionShape());
50  m_compoundShapeRevision = compoundShape->getUpdateRevision();
51 
52  preallocateChildAlgorithms(body0Wrap, body1Wrap);
53 }
54 
55 void TesseractCompoundCollisionAlgorithm::preallocateChildAlgorithms(const btCollisionObjectWrapper* body0Wrap,
56  const btCollisionObjectWrapper* body1Wrap)
57 {
58  const btCollisionObjectWrapper* colObjWrap = m_isSwapped ? body1Wrap : body0Wrap;
59  const btCollisionObjectWrapper* otherObjWrap = m_isSwapped ? body0Wrap : body1Wrap;
60  btAssert(colObjWrap->getCollisionShape()->isCompound());
61 
62  const auto* compoundShape = static_cast<const btCompoundShape*>(colObjWrap->getCollisionShape());
63 
64  int numChildren = compoundShape->getNumChildShapes();
65 
66  m_childCollisionAlgorithms.resize(numChildren);
67  for (int i = 0; i < numChildren; i++)
68  {
69  if (compoundShape->getDynamicAabbTree() != nullptr)
70  {
71  m_childCollisionAlgorithms[i] = nullptr;
72  }
73  else
74  {
75  const btCollisionShape* childShape = compoundShape->getChildShape(i);
76 
77  btCollisionObjectWrapper childWrap(colObjWrap,
78  childShape,
79  colObjWrap->getCollisionObject(),
80  colObjWrap->getWorldTransform(),
81  -1,
82  i); // wrong child trans, but unused (hopefully)
84  m_dispatcher->findAlgorithm(&childWrap, otherObjWrap, m_sharedManifold, BT_CONTACT_POINT_ALGORITHMS);
85 
86  btAlignedObjectArray<btCollisionAlgorithm*> m_childCollisionAlgorithmsContact;
87  btAlignedObjectArray<btCollisionAlgorithm*> m_childCollisionAlgorithmsClosestPoints;
88  }
89  }
90 }
91 
93 {
94  int numChildren = m_childCollisionAlgorithms.size();
95  for (int i = 0; i < numChildren; i++)
96  {
97  if (m_childCollisionAlgorithms[i] != nullptr)
98  {
99  m_childCollisionAlgorithms[i]->~btCollisionAlgorithm();
100  m_dispatcher->freeCollisionAlgorithm(m_childCollisionAlgorithms[i]);
101  }
102  }
103 }
104 
106 
107 struct TesseractCompoundLeafCallback : btDbvt::ICollide
108 {
109 public:
110  const btCollisionObjectWrapper* m_compoundColObjWrap;
111  const btCollisionObjectWrapper* m_otherObjWrap;
112  btDispatcher* m_dispatcher;
113  const btDispatcherInfo& m_dispatchInfo; // NOLINT
114  btManifoldResult* m_resultOut;
115  btCollisionAlgorithm** m_childCollisionAlgorithms;
116  btPersistentManifold* m_sharedManifold;
118 
119  TesseractCompoundLeafCallback(const btCollisionObjectWrapper* compoundObjWrap,
120  const btCollisionObjectWrapper* otherObjWrap,
121  btDispatcher* dispatcher,
122  const btDispatcherInfo& dispatchInfo,
123  btManifoldResult* resultOut,
124  btCollisionAlgorithm** childCollisionAlgorithms,
125  btPersistentManifold* sharedManifold)
126  : m_compoundColObjWrap(compoundObjWrap)
127  , m_otherObjWrap(otherObjWrap)
128  , m_dispatcher(dispatcher)
129  , m_dispatchInfo(dispatchInfo)
130  , m_resultOut(resultOut)
131  , m_childCollisionAlgorithms(childCollisionAlgorithms)
132  , m_sharedManifold(sharedManifold)
133  , m_contact_test_data(static_cast<ContactTestData*>(compoundObjWrap->m_collisionObject->getUserPointer()))
134  {
135  }
136 
137  void ProcessChildShape(const btCollisionShape* childShape, int index)
138  {
139  btAssert(index >= 0);
140  const auto* compoundShape = static_cast<const btCompoundShape*>(m_compoundColObjWrap->getCollisionShape());
141  btAssert(index < compoundShape->getNumChildShapes());
142 
144  return;
145 
146  // backup
147  btTransform orgTrans = m_compoundColObjWrap->getWorldTransform();
148 
149  const btTransform& childTrans = compoundShape->getChildTransform(index);
150  btTransform newChildWorldTrans = orgTrans * childTrans;
151 
152  // perform an AABB check first
153  btVector3 aabbMin0, aabbMax0;
154  childShape->getAabb(newChildWorldTrans, aabbMin0, aabbMax0);
155 
156  btVector3 extendAabb(m_resultOut->m_closestPointDistanceThreshold,
157  m_resultOut->m_closestPointDistanceThreshold,
158  m_resultOut->m_closestPointDistanceThreshold);
159  aabbMin0 -= extendAabb;
160  aabbMax0 += extendAabb;
161 
162  btVector3 aabbMin1, aabbMax1;
163  m_otherObjWrap->getCollisionShape()->getAabb(m_otherObjWrap->getWorldTransform(), aabbMin1, aabbMax1);
164 
165  if (TestAabbAgainstAabb2(aabbMin0, aabbMax0, aabbMin1, aabbMax1))
166  {
167 #if BT_BULLET_VERSION >= 300
168  btTransform preTransform = childTrans;
169  if (this->m_compoundColObjWrap->m_preTransform != nullptr)
170  {
171  preTransform = preTransform * (*(this->m_compoundColObjWrap->m_preTransform));
172  }
173  btCollisionObjectWrapper compoundWrap(this->m_compoundColObjWrap,
174  childShape,
175  m_compoundColObjWrap->getCollisionObject(),
176  newChildWorldTrans,
177  preTransform,
178  -1,
179  index);
180 #else
181  btCollisionObjectWrapper compoundWrap(this->m_compoundColObjWrap,
182  childShape,
183  m_compoundColObjWrap->getCollisionObject(),
184  newChildWorldTrans,
185  -1,
186  index);
187 #endif
188 
189  btCollisionAlgorithm* algo = nullptr;
190  bool allocatedAlgorithm = false;
191 
192  if (m_resultOut->m_closestPointDistanceThreshold > 0)
193  {
194  algo = m_dispatcher->findAlgorithm(&compoundWrap, m_otherObjWrap, nullptr, BT_CLOSEST_POINT_ALGORITHMS);
195  allocatedAlgorithm = true;
196  }
197  else
198  {
199  // the contactpoint is still projected back using the original inverted worldtrans
200  if (m_childCollisionAlgorithms[index] == nullptr)
201  {
203  m_dispatcher->findAlgorithm(&compoundWrap, m_otherObjWrap, m_sharedManifold, BT_CONTACT_POINT_ALGORITHMS);
204  }
205  algo = m_childCollisionAlgorithms[index];
206  }
207 
208  const btCollisionObjectWrapper* tmpWrap = nullptr;
209 
211  if (m_resultOut->getBody0Internal() == m_compoundColObjWrap->getCollisionObject())
212  {
213  tmpWrap = m_resultOut->getBody0Wrap();
214  m_resultOut->setBody0Wrap(&compoundWrap);
215  m_resultOut->setShapeIdentifiersA(-1, index);
216  }
217  else
218  {
219  tmpWrap = m_resultOut->getBody1Wrap();
220  m_resultOut->setBody1Wrap(&compoundWrap);
221  m_resultOut->setShapeIdentifiersB(-1, index);
222  }
223 
224  algo->processCollision(&compoundWrap, m_otherObjWrap, m_dispatchInfo, m_resultOut);
225 
226 #if 0 // NOLINT
227  if (m_dispatchInfo.m_debugDraw && (m_dispatchInfo.m_debugDraw->getDebugMode() & btIDebugDraw::DBG_DrawAabb))
228  {
229  btVector3 worldAabbMin,worldAabbMax;
230  m_dispatchInfo.m_debugDraw->drawAabb(aabbMin0,aabbMax0,btVector3(1,1,1));
231  m_dispatchInfo.m_debugDraw->drawAabb(aabbMin1,aabbMax1,btVector3(1,1,1));
232  }
233 #endif
234 
235  if (m_resultOut->getBody0Internal() == m_compoundColObjWrap->getCollisionObject())
236  {
237  m_resultOut->setBody0Wrap(tmpWrap);
238  }
239  else
240  {
241  m_resultOut->setBody1Wrap(tmpWrap);
242  }
243  if (allocatedAlgorithm)
244  {
245  algo->~btCollisionAlgorithm();
246  m_dispatcher->freeCollisionAlgorithm(algo);
247  }
248  }
249  }
250  void Process(const btDbvtNode* leaf) // NOLINT
251  {
252  int index = leaf->dataAsInt;
253 
254  const auto* compoundShape = static_cast<const btCompoundShape*>(m_compoundColObjWrap->getCollisionShape());
255  const btCollisionShape* childShape = compoundShape->getChildShape(index);
256 
257 #if 0 // NOLINT
258  if (m_dispatchInfo.m_debugDraw && (m_dispatchInfo.m_debugDraw->getDebugMode() & btIDebugDraw::DBG_DrawAabb))
259  {
260  btVector3 worldAabbMin,worldAabbMax;
261  btTransform orgTrans = m_compoundColObjWrap->getWorldTransform();
262  btTransformAabb(leaf->volume.Mins(),leaf->volume.Maxs(),0.,orgTrans,worldAabbMin,worldAabbMax);
263  m_dispatchInfo.m_debugDraw->drawAabb(worldAabbMin,worldAabbMax,btVector3(1,0,0));
264  }
265 #endif
266 
267  ProcessChildShape(childShape, index);
268  }
269 };
270 
271 void TesseractCompoundCollisionAlgorithm::processCollision(const btCollisionObjectWrapper* body0Wrap,
272  const btCollisionObjectWrapper* body1Wrap,
273  const btDispatcherInfo& dispatchInfo,
274  btManifoldResult* resultOut)
275 {
276  const btCollisionObjectWrapper* colObjWrap = m_isSwapped ? body1Wrap : body0Wrap;
277  const btCollisionObjectWrapper* otherObjWrap = m_isSwapped ? body0Wrap : body1Wrap;
278 
279  btAssert(colObjWrap->getCollisionShape()->isCompound());
280  const auto* compoundShape = static_cast<const btCompoundShape*>(colObjWrap->getCollisionShape());
281 
284  if (compoundShape->getUpdateRevision() != m_compoundShapeRevision)
285  {
288 
289  preallocateChildAlgorithms(body0Wrap, body1Wrap);
290  m_compoundShapeRevision = compoundShape->getUpdateRevision();
291  }
292 
293  if (m_childCollisionAlgorithms.size() == 0)
294  return;
295 
296  const btDbvt* tree = compoundShape->getDynamicAabbTree();
297  // use a dynamic aabb tree to cull potential child-overlaps
298  TesseractCompoundLeafCallback callback(colObjWrap,
299  otherObjWrap,
300  m_dispatcher,
301  dispatchInfo,
302  resultOut,
305 
309  {
310  manifoldArray.resize(0);
311  for (int i = 0; i < m_childCollisionAlgorithms.size(); i++)
312  {
313  if (m_childCollisionAlgorithms[i] != nullptr)
314  {
315  // See tesseract issue: https://github.com/tesseract-robotics/tesseract/issues/934
316  m_childCollisionAlgorithms[i]->getAllContactManifolds(manifoldArray);
317  for (int m = 0; m < manifoldArray.size(); m++)
318  {
319  if (manifoldArray[m]->getNumContacts() != 0)
320  {
321  resultOut->setPersistentManifold(manifoldArray[m]);
322  resultOut->refreshContactPoints();
323  resultOut->setPersistentManifold(nullptr); //??necessary?
324  }
325  }
326  manifoldArray.resize(0);
327  }
328  }
329  }
330 
331  if (tree != nullptr)
332  {
333  btVector3 localAabbMin, localAabbMax;
334  btTransform otherInCompoundSpace;
335  otherInCompoundSpace = colObjWrap->getWorldTransform().inverse() * otherObjWrap->getWorldTransform();
336  otherObjWrap->getCollisionShape()->getAabb(otherInCompoundSpace, localAabbMin, localAabbMax);
337  btVector3 extraExtends(resultOut->m_closestPointDistanceThreshold,
338  resultOut->m_closestPointDistanceThreshold,
339  resultOut->m_closestPointDistanceThreshold);
340  localAabbMin -= extraExtends;
341  localAabbMax += extraExtends;
342 
343  const ATTRIBUTE_ALIGNED16(btDbvtVolume) bounds = btDbvtVolume::FromMM(localAabbMin, localAabbMax);
344  // process all children, that overlap with the given AABB bounds
345  tree->collideTVNoStackAlloc(tree->m_root, bounds, stack2, callback);
346  }
347  else
348  {
349  // iterate over all children, perform an AABB check inside ProcessChildShape
350  int numChildren = m_childCollisionAlgorithms.size();
351  for (int i = 0; i < numChildren; i++)
352  {
353  callback.ProcessChildShape(compoundShape->getChildShape(i), i);
354  }
355  }
356 
357  {
358  // iterate over all children, perform an AABB check inside ProcessChildShape
359  int numChildren = m_childCollisionAlgorithms.size();
360  manifoldArray.resize(0);
361  const btCollisionShape* childShape = nullptr;
362  btTransform orgTrans;
363 
364  btTransform newChildWorldTrans;
365  btVector3 aabbMin0, aabbMax0, aabbMin1, aabbMax1;
366 
367  for (int i = 0; i < numChildren; i++)
368  {
369  if (m_childCollisionAlgorithms[i] != nullptr)
370  {
371  childShape = compoundShape->getChildShape(i);
372  // if not longer overlapping, remove the algorithm
373  orgTrans = colObjWrap->getWorldTransform();
374 
375  const btTransform& childTrans = compoundShape->getChildTransform(i);
376  newChildWorldTrans = orgTrans * childTrans;
377 
378  // perform an AABB check first
379  childShape->getAabb(newChildWorldTrans, aabbMin0, aabbMax0);
380  otherObjWrap->getCollisionShape()->getAabb(otherObjWrap->getWorldTransform(), aabbMin1, aabbMax1);
381 
382  if (!TestAabbAgainstAabb2(aabbMin0, aabbMax0, aabbMin1, aabbMax1))
383  {
384  m_childCollisionAlgorithms[i]->~btCollisionAlgorithm();
385  m_dispatcher->freeCollisionAlgorithm(m_childCollisionAlgorithms[i]);
386  m_childCollisionAlgorithms[i] = nullptr;
387  }
388  }
389  }
390  }
391 }
392 
394  btCollisionObject* body1,
395  const btDispatcherInfo& dispatchInfo,
396  btManifoldResult* resultOut)
397 {
398  btAssert(0);
399  // needs to be fixed, using btCollisionObjectWrapper and NOT modifying internal data structures
400  btCollisionObject* colObj = m_isSwapped ? body1 : body0;
401  btCollisionObject* otherObj = m_isSwapped ? body0 : body1;
402 
403  btAssert(colObj->getCollisionShape()->isCompound());
404 
405  auto* compoundShape = static_cast<btCompoundShape*>(colObj->getCollisionShape());
406 
407  // We will use the OptimizedBVH, AABB tree to cull potential child-overlaps
408  // If both proxies are Compound, we will deal with that directly, by performing sequential/parallel tree traversals
409  // given Proxy0 and Proxy1, if both have a tree, Tree0 and Tree1, this means:
410  // determine overlapping nodes of Proxy1 using Proxy0 AABB against Tree1
411  // then use each overlapping node AABB against Tree0
412  // and vise versa.
413 
414  auto hitFraction = btScalar(1.);
415 
416  int numChildren = m_childCollisionAlgorithms.size();
417  btTransform orgTrans;
418  for (int i = 0; i < numChildren; i++)
419  {
420  // btCollisionShape* childShape = compoundShape->getChildShape(i);
421 
422  // backup
423  orgTrans = colObj->getWorldTransform();
424 
425  const btTransform& childTrans = compoundShape->getChildTransform(i);
426  // btTransform newChildWorldTrans = orgTrans*childTrans ;
427  colObj->setWorldTransform(orgTrans * childTrans);
428 
429  // btCollisionShape* tmpShape = colObj->getCollisionShape();
430  // colObj->internalSetTemporaryCollisionShape( childShape );
431  btScalar frac = m_childCollisionAlgorithms[i]->calculateTimeOfImpact(colObj, otherObj, dispatchInfo, resultOut);
432  hitFraction = std::min(frac, hitFraction);
433 
434  // revert back
435  // colObj->internalSetTemporaryCollisionShape( tmpShape);
436  colObj->setWorldTransform(orgTrans);
437  }
438  return hitFraction;
439 }
440 } // namespace tesseract_collision::tesseract_collision_bullet
442 // LCOV_EXCL_STOP
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCollisionAlgorithm::~TesseractCompoundCollisionAlgorithm
~TesseractCompoundCollisionAlgorithm() override
Definition: tesseract_compound_collision_algorithm.cpp:105
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::ContactTestData::done
bool done
Indicate if search is finished.
Definition: types.h:355
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCollisionAlgorithm::removeChildAlgorithms
void removeChildAlgorithms()
Definition: tesseract_compound_collision_algorithm.cpp:92
types.h
Tesseracts Collision Forward Declarations.
tesseract_compound_collision_algorithm.h
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCollisionAlgorithm::calculateTimeOfImpact
btScalar calculateTimeOfImpact(btCollisionObject *body0, btCollisionObject *body1, const btDispatcherInfo &dispatchInfo, btManifoldResult *resultOut) override
Definition: tesseract_compound_collision_algorithm.cpp:393
tesseract_collision::tesseract_collision_bullet::TesseractCompoundLeafCallback::m_dispatchInfo
const btDispatcherInfo & m_dispatchInfo
Definition: tesseract_compound_collision_algorithm.cpp:113
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCollisionAlgorithm::m_childCollisionAlgorithms
btAlignedObjectArray< btCollisionAlgorithm * > m_childCollisionAlgorithms
Definition: tesseract_compound_collision_algorithm.h:58
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCollisionAlgorithm::preallocateChildAlgorithms
void preallocateChildAlgorithms(const btCollisionObjectWrapper *body0Wrap, const btCollisionObjectWrapper *body1Wrap)
Definition: tesseract_compound_collision_algorithm.cpp:55
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCollisionAlgorithm::m_compoundShapeRevision
int m_compoundShapeRevision
Definition: tesseract_compound_collision_algorithm.h:64
tesseract_collision::tesseract_collision_bullet::TesseractCompoundLeafCallback::Process
void Process(const btDbvtNode *leaf)
Definition: tesseract_compound_collision_algorithm.cpp:250
tesseract_collision::tesseract_collision_bullet::TesseractCompoundLeafCallback::m_otherObjWrap
const btCollisionObjectWrapper * m_otherObjWrap
Definition: tesseract_compound_collision_algorithm.cpp:111
tesseract_collision::tesseract_collision_bullet::TesseractCompoundLeafCallback::m_compoundColObjWrap
const btCollisionObjectWrapper * m_compoundColObjWrap
Definition: tesseract_compound_collision_algorithm.cpp:110
tesseract_collision::tesseract_collision_bullet::TesseractCompoundLeafCallback
Definition: tesseract_compound_collision_algorithm.cpp:107
tesseract_collision::tesseract_collision_bullet::TesseractCompoundLeafCallback::TesseractCompoundLeafCallback
TesseractCompoundLeafCallback(const btCollisionObjectWrapper *compoundObjWrap, const btCollisionObjectWrapper *otherObjWrap, btDispatcher *dispatcher, const btDispatcherInfo &dispatchInfo, btManifoldResult *resultOut, btCollisionAlgorithm **childCollisionAlgorithms, btPersistentManifold *sharedManifold)
Definition: tesseract_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::TesseractCompoundCollisionAlgorithm::TesseractCompoundCollisionAlgorithm
TesseractCompoundCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo &ci, const btCollisionObjectWrapper *body0Wrap, const btCollisionObjectWrapper *body1Wrap, bool isSwapped)
Definition: tesseract_compound_collision_algorithm.cpp:40
tesseract_collision::tesseract_collision_bullet::TesseractCompoundLeafCallback::m_sharedManifold
btPersistentManifold * m_sharedManifold
Definition: tesseract_compound_collision_algorithm.cpp:116
tesseract_collision::tesseract_collision_bullet::TesseractCompoundLeafCallback::m_resultOut
btManifoldResult * m_resultOut
Definition: tesseract_compound_collision_algorithm.cpp:114
tesseract_collision::tesseract_collision_bullet::TesseractCompoundLeafCallback::m_dispatcher
btDispatcher * m_dispatcher
Definition: tesseract_compound_collision_algorithm.cpp:112
TESSERACT_COMMON_IGNORE_WARNINGS_POP
Definition: create_convex_hull.cpp:37
tesseract_collision::tesseract_collision_bullet::TesseractCompoundLeafCallback::ProcessChildShape
void ProcessChildShape(const btCollisionShape *childShape, int index)
Definition: tesseract_compound_collision_algorithm.cpp:137
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCollisionAlgorithm::stack2
btNodeStack stack2
Definition: tesseract_compound_collision_algorithm.h:54
tesseract_collision::tesseract_collision_bullet::TesseractCompoundLeafCallback::m_childCollisionAlgorithms
btCollisionAlgorithm ** m_childCollisionAlgorithms
Definition: tesseract_compound_collision_algorithm.cpp:115
tesseract_collision::tesseract_collision_bullet::TesseractCompoundCollisionAlgorithm::m_isSwapped
bool m_isSwapped
Definition: tesseract_compound_collision_algorithm.h:59
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::TesseractCompoundCollisionAlgorithm::m_sharedManifold
class btPersistentManifold * m_sharedManifold
Definition: tesseract_compound_collision_algorithm.h:61
macros.h
tesseract_collision::tesseract_collision_bullet::TesseractCompoundLeafCallback::m_contact_test_data
ContactTestData * m_contact_test_data
Definition: tesseract_compound_collision_algorithm.cpp:117


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