Bullet Collision Detection & Physics Library
btMultiBodyWorldImporter.cpp
Go to the documentation of this file.
2 
4 #include "../BulletFileLoader/btBulletFile.h"
10 
12 {
15 };
16 
18  :btBulletWorldImporter(world)
19 {
21  m_data->m_mbDynamicsWorld = world;
22 }
23 
24 
26 {
27  delete m_data;
28 }
29 
31 {
33 }
34 
35 
37 {
38  return (btCollisionObjectDoubleData*)manifold->m_body0;
39 }
41 {
42  return (btCollisionObjectDoubleData*)manifold->m_body1;
43 }
45 {
46  return (btCollisionObjectFloatData*)manifold->m_body0;
47 }
49 {
50  return (btCollisionObjectFloatData*)manifold->m_body1;
51 }
52 
53 
54 template<class T> void syncContactManifolds(T** contactManifolds, int numContactManifolds, btMultiBodyWorldImporterInternalData* m_data)
55 {
56  m_data->m_mbDynamicsWorld->updateAabbs();
58  btDispatcher* dispatcher = m_data->m_mbDynamicsWorld->getDispatcher();
59 
60  btDispatcherInfo& dispatchInfo = m_data->m_mbDynamicsWorld->getDispatchInfo();
61 
62 
63  if (dispatcher)
64  {
66  if (dispatcher)
67  {
68  dispatcher->dispatchAllCollisionPairs(pairCache, dispatchInfo, dispatcher);
69  }
70  int numExistingManifolds = m_data->m_mbDynamicsWorld->getDispatcher()->getNumManifolds();
71  btManifoldArray manifoldArray;
72  for (int i = 0; i < pairCache->getNumOverlappingPairs(); i++)
73  {
74  btBroadphasePair& pair = pairCache->getOverlappingPairArray()[i];
75  if (pair.m_algorithm)
76  {
77  pair.m_algorithm->getAllContactManifolds(manifoldArray);
78  //for each existing manifold, search a matching manifoldData and reconstruct
79  for (int m = 0; m < manifoldArray.size(); m++)
80  {
81  btPersistentManifold* existingManifold = manifoldArray[m];
82  int uid0 = existingManifold->getBody0()->getBroadphaseHandle()->m_uniqueId;
83  int uid1 = existingManifold->getBody1()->getBroadphaseHandle()->m_uniqueId;
84  int matchingManifoldIndex = -1;
85  for (int q = 0; q < numContactManifolds; q++)
86  {
87  if (uid0 == getBody0FromContactManifold(contactManifolds[q])->m_uniqueId && uid1 == getBody1FromContactManifold(contactManifolds[q])->m_uniqueId)
88  {
89  matchingManifoldIndex = q;
90  }
91  }
92  if (matchingManifoldIndex >= 0)
93  {
94  existingManifold->deSerialize(contactManifolds[matchingManifoldIndex]);
95  }
96  else
97  {
98  existingManifold->setNumContacts(0);
99  //printf("Issue: cannot find maching contact manifold (%d, %d), may cause issues in determinism.\n", uid0, uid1);
100  }
101 
102  manifoldArray.clear();
103  }
104  }
105  }
106  }
107 
108 }
109 
111 {
112  bool isFixedBase = mbd->m_baseMass == 0;
113  bool canSleep = false;
114  btVector3 baseInertia;
115  baseInertia.deSerialize(mbd->m_baseInertia);
116 
117  btVector3 baseWorldPos;
118  baseWorldPos.deSerialize(mbd->m_baseWorldPosition);
119  mb->setBasePos(baseWorldPos);
120  btQuaternion baseWorldRot;
121  baseWorldRot.deSerialize(mbd->m_baseWorldOrientation);
122  mb->setWorldToBaseRot(baseWorldRot.inverse());
123  btVector3 baseLinVal;
124  baseLinVal.deSerialize(mbd->m_baseLinearVelocity);
125  btVector3 baseAngVel;
126  baseAngVel.deSerialize(mbd->m_baseAngularVelocity);
127  mb->setBaseVel(baseLinVal);
128  mb->setBaseOmega(baseAngVel);
129 
130  for (int i = 0; i < mbd->m_numLinks; i++)
131  {
132 
133  mb->getLink(i).m_absFrameTotVelocity.m_topVec.deSerialize(mbd->m_links[i].m_absFrameTotVelocityTop);
134  mb->getLink(i).m_absFrameTotVelocity.m_bottomVec.deSerialize(mbd->m_links[i].m_absFrameTotVelocityBottom);
135  mb->getLink(i).m_absFrameLocVelocity.m_topVec.deSerialize(mbd->m_links[i].m_absFrameLocVelocityTop);
136  mb->getLink(i).m_absFrameLocVelocity.m_bottomVec.deSerialize(mbd->m_links[i].m_absFrameLocVelocityBottom);
137 
138  switch (mbd->m_links[i].m_jointType)
139  {
141  {
142  break;
143  }
145  {
146  mb->setJointPos(i, mbd->m_links[i].m_jointPos[0]);
147  mb->setJointVel(i, mbd->m_links[i].m_jointVel[0]);
148  break;
149  }
151  {
152  mb->setJointPos(i, mbd->m_links[i].m_jointPos[0]);
153  mb->setJointVel(i, mbd->m_links[i].m_jointVel[0]);
154  break;
155  }
157  {
158  btScalar jointPos[4] = { (btScalar)mbd->m_links[i].m_jointPos[0], (btScalar)mbd->m_links[i].m_jointPos[1], (btScalar)mbd->m_links[i].m_jointPos[2], (btScalar)mbd->m_links[i].m_jointPos[3] };
159  btScalar jointVel[3] = { (btScalar)mbd->m_links[i].m_jointVel[0], (btScalar)mbd->m_links[i].m_jointVel[1], (btScalar)mbd->m_links[i].m_jointVel[2] };
160  mb->setJointPosMultiDof(i, jointPos);
161  mb->setJointVelMultiDof(i, jointVel);
162 
163  break;
164  }
166  {
167  break;
168  }
169  default:
170  {
171  }
172  }
173  }
174  mb->forwardKinematics(scratchQ, scratchM);
175  mb->updateCollisionObjectWorldTransforms(scratchQ, scratchM);
176 }
177 
179 {
180  bool isFixedBase = mbd->m_baseMass == 0;
181  bool canSleep = false;
182  btVector3 baseInertia;
183  baseInertia.deSerialize(mbd->m_baseInertia);
184  btMultiBody* mb = new btMultiBody(mbd->m_numLinks, mbd->m_baseMass, baseInertia, isFixedBase, canSleep);
185  mb->setHasSelfCollision(false);
186 
187  btVector3 baseWorldPos;
188  baseWorldPos.deSerialize(mbd->m_baseWorldPosition);
189 
190  btQuaternion baseWorldOrn;
191  baseWorldOrn.deSerialize(mbd->m_baseWorldOrientation);
192  mb->setBasePos(baseWorldPos);
193  mb->setWorldToBaseRot(baseWorldOrn.inverse());
194 
195  m_data->m_mbMap.insert(mbd, mb);
196  for (int i = 0; i < mbd->m_numLinks; i++)
197  {
198  btVector3 localInertiaDiagonal;
199  localInertiaDiagonal.deSerialize(mbd->m_links[i].m_linkInertia);
200  btQuaternion parentRotToThis;
201  parentRotToThis.deSerialize(mbd->m_links[i].m_zeroRotParentToThis);
202  btVector3 parentComToThisPivotOffset;
203  parentComToThisPivotOffset.deSerialize(mbd->m_links[i].m_parentComToThisPivotOffset);
204  btVector3 thisPivotToThisComOffset;
205  thisPivotToThisComOffset.deSerialize(mbd->m_links[i].m_thisPivotToThisComOffset);
206 
207  switch (mbd->m_links[i].m_jointType)
208  {
210  {
211 
212 
213  mb->setupFixed(i, mbd->m_links[i].m_linkMass, localInertiaDiagonal, mbd->m_links[i].m_parentIndex,
214  parentRotToThis, parentComToThisPivotOffset, thisPivotToThisComOffset);
215  //search for the collider
216  //mbd->m_links[i].m_linkCollider
217  break;
218  }
220  {
221  btVector3 jointAxis;
222  jointAxis.deSerialize(mbd->m_links[i].m_jointAxisBottom[0]);
223  bool disableParentCollision = true;//todo
224  mb->setupPrismatic(i, mbd->m_links[i].m_linkMass, localInertiaDiagonal, mbd->m_links[i].m_parentIndex,
225  parentRotToThis, jointAxis, parentComToThisPivotOffset, thisPivotToThisComOffset, disableParentCollision);
226  mb->setJointPos(i, mbd->m_links[i].m_jointPos[0]);
227  mb->setJointVel(i, mbd->m_links[i].m_jointVel[0]);
228  break;
229  }
231  {
232  btVector3 jointAxis;
233  jointAxis.deSerialize(mbd->m_links[i].m_jointAxisTop[0]);
234  bool disableParentCollision = true;//todo
235  mb->setupRevolute(i, mbd->m_links[i].m_linkMass, localInertiaDiagonal, mbd->m_links[i].m_parentIndex,
236  parentRotToThis, jointAxis, parentComToThisPivotOffset, thisPivotToThisComOffset, disableParentCollision);
237  mb->setJointPos(i, mbd->m_links[i].m_jointPos[0]);
238  mb->setJointVel(i, mbd->m_links[i].m_jointVel[0]);
239  break;
240  }
242  {
243  btAssert(0);
244  bool disableParentCollision = true;//todo
245  mb->setupSpherical(i, mbd->m_links[i].m_linkMass, localInertiaDiagonal, mbd->m_links[i].m_parentIndex,
246  parentRotToThis, parentComToThisPivotOffset, thisPivotToThisComOffset, disableParentCollision);
247  btScalar jointPos[4] = { (btScalar)mbd->m_links[i].m_jointPos[0], (btScalar)mbd->m_links[i].m_jointPos[1], (btScalar)mbd->m_links[i].m_jointPos[2], (btScalar)mbd->m_links[i].m_jointPos[3] };
248  btScalar jointVel[3] = { (btScalar)mbd->m_links[i].m_jointVel[0], (btScalar)mbd->m_links[i].m_jointVel[1], (btScalar)mbd->m_links[i].m_jointVel[2] };
249  mb->setJointPosMultiDof(i, jointPos);
250  mb->setJointVelMultiDof(i, jointVel);
251 
252  break;
253  }
255  {
256  btAssert(0);
257  break;
258  }
259  default:
260  {
261  btAssert(0);
262  }
263  }
264  }
265 }
266 
268 {
269  bool result = false;
272 
274  {
275  //check if the snapshot is valid for the existing world
276  //equal number of objects, # links etc
277  if ((bulletFile2->m_multiBodies.size() != m_data->m_mbDynamicsWorld->getNumMultibodies()))
278  {
279  result = false;
280  return result;
281  }
282  result = true;
283 
284  //convert all multibodies
285  if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION)
286  {
287 
288  //for (int i = 0; i < bulletFile2->m_multiBodies.size(); i++)
289  for (int i = bulletFile2->m_multiBodies.size() - 1; i >= 0; i--)
290  {
293  syncMultiBody(mbd, mb, m_data, scratchQ, scratchM);
294  }
295 
296  for (int i = bulletFile2->m_rigidBodies.size() - 1; i >= 0; i--)
297  {
299  int foundRb = -1;
300  int uid = rbd->m_collisionObjectData.m_uniqueId;
301  for (int i = 0; i < m_data->m_mbDynamicsWorld->getNumCollisionObjects(); i++)
302  {
303  if (uid == m_data->m_mbDynamicsWorld->getCollisionObjectArray()[i]->getBroadphaseHandle()->m_uniqueId)
304  {
305  foundRb = i;
306  break;
307  }
308  }
309  if (foundRb >= 0)
310  {
312  if (rb)
313  {
314  btTransform tr;
316  rb->setWorldTransform(tr);
317  btVector3 linVel, angVel;
318  linVel.deSerializeDouble(rbd->m_linearVelocity);
320  rb->setLinearVelocity(linVel);
321  rb->setAngularVelocity(angVel);
322  }
323  else
324  {
325  result = false;
326  }
327  }
328  else
329  {
330  result = false;
331  }
332  }
333 
334  //todo: check why body1 pointer is not properly deserialized
335  for (int i = 0; i < bulletFile2->m_contactManifolds.size(); i++)
336  {
338  {
339  void* ptr = bulletFile2->findLibPointer(manifoldData->m_body0);
340  if (ptr)
341  {
342  manifoldData->m_body0 = (btCollisionObjectDoubleData*)ptr;
343  }
344  }
345 
346  {
347  void* ptr = bulletFile2->findLibPointer(manifoldData->m_body1);
348  if (ptr)
349  {
350  manifoldData->m_body1 = (btCollisionObjectDoubleData*)ptr;
351  }
352  }
353  }
354 
355 
356  if (bulletFile2->m_contactManifolds.size())
357  {
359  }
360  }
361  else
362  {
363  //single precision version
364  //for (int i = 0; i < bulletFile2->m_multiBodies.size(); i++)
365  for (int i = bulletFile2->m_multiBodies.size() - 1; i >= 0; i--)
366  {
369  syncMultiBody(mbd, mb, m_data, scratchQ, scratchM);
370  }
371 
372  //todo: check why body1 pointer is not properly deserialized
373  for (int i = 0; i < bulletFile2->m_contactManifolds.size(); i++)
374  {
376  {
377  void* ptr = bulletFile2->findLibPointer(manifoldData->m_body0);
378  if (ptr)
379  {
380  manifoldData->m_body0 = (btCollisionObjectFloatData*)ptr;
381  }
382  }
383  {
384  void* ptr = bulletFile2->findLibPointer(manifoldData->m_body1);
385  if (ptr)
386  {
387  manifoldData->m_body1 = (btCollisionObjectFloatData*)ptr;
388  }
389  }
390  }
391 
392 
393  if (bulletFile2->m_contactManifolds.size())
394  {
396  }
397 
398  }
399  }
400  else
401  {
402  result = btBulletWorldImporter::convertAllObjects(bulletFile2);
403 
404 
405  //convert all multibodies
406  for (int i = 0; i < bulletFile2->m_multiBodies.size(); i++)
407  {
408 
409  if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION)
410  {
411  btMultiBodyDoubleData* mbd = (btMultiBodyDoubleData*)bulletFile2->m_multiBodies[i];
412  convertMultiBody(mbd, m_data);
413  }
414  else
415  {
416  btMultiBodyFloatData* mbd = (btMultiBodyFloatData*)bulletFile2->m_multiBodies[i];
417  convertMultiBody(mbd, m_data);
418  }
419  }
420 
421  //forward kinematics, so that the link world transforms are valid, for collision detection
422  for (int i = 0; i < m_data->m_mbMap.size(); i++)
423  {
425  if (ptr)
426  {
427  btMultiBody* mb = *ptr;
428  mb->finalizeMultiDof();
429  btVector3 linvel = mb->getBaseVel();
430  btVector3 angvel = mb->getBaseOmega();
431  mb->forwardKinematics(scratchQ, scratchM);
432  }
433  }
434 
435  //convert all multibody link colliders
436  for (int i = 0; i < bulletFile2->m_multiBodyLinkColliders.size(); i++)
437  {
438  if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION)
439  {
440  btMultiBodyLinkColliderDoubleData* mblcd = (btMultiBodyLinkColliderDoubleData*)bulletFile2->m_multiBodyLinkColliders[i];
441 
442  btMultiBody** ptr = m_data->m_mbMap[mblcd->m_multiBody];
443  if (ptr)
444  {
445  btMultiBody* multiBody = *ptr;
446 
447 
449  if (shapePtr && *shapePtr)
450  {
451  btTransform startTransform;
453  startTransform.deSerializeDouble(mblcd->m_colObjData.m_worldTransform);
454 
455  btCollisionShape* shape = (btCollisionShape*)*shapePtr;
456  if (shape)
457  {
458  btMultiBodyLinkCollider* col = new btMultiBodyLinkCollider(multiBody, mblcd->m_link);
459  col->setCollisionShape(shape);
460  //btCollisionObject* body = createCollisionObject(startTransform,shape,mblcd->m_colObjData.m_name);
463  //m_bodyMap.insert(colObjData,body);
464  if (mblcd->m_link == -1)
465  {
466  col->setWorldTransform(multiBody->getBaseWorldTransform());
467  multiBody->setBaseCollider(col);
468  }
469  else
470  {
471  col->setWorldTransform(multiBody->getLink(mblcd->m_link).m_cachedWorldTransform);
472  multiBody->getLink(mblcd->m_link).m_collider = col;
473  }
474  int mbLinkIndex = mblcd->m_link;
475 
476  bool isDynamic = (mbLinkIndex < 0 && multiBody->hasFixedBase()) ? false : true;
477  int collisionFilterGroup = isDynamic ? int(btBroadphaseProxy::DefaultFilter) : int(btBroadphaseProxy::StaticFilter);
478  int collisionFilterMask = isDynamic ? int(btBroadphaseProxy::AllFilter) : int(btBroadphaseProxy::AllFilter ^ btBroadphaseProxy::StaticFilter);
479 
480 #if 0
481  int colGroup = 0, colMask = 0;
482  int collisionFlags = mblcd->m_colObjData.m_collisionFlags;
483  if (collisionFlags & URDF_HAS_COLLISION_GROUP)
484  {
485  collisionFilterGroup = colGroup;
486  }
487  if (collisionFlags & URDF_HAS_COLLISION_MASK)
488  {
489  collisionFilterMask = colMask;
490  }
491 #endif
492  m_data->m_mbDynamicsWorld->addCollisionObject(col, collisionFilterGroup, collisionFilterMask);
493  }
494 
495  }
496  else
497  {
498  printf("error: no shape found\n");
499  }
500 #if 0
501  //base and fixed? -> static, otherwise flag as dynamic
502 
503  world1->addCollisionObject(col, collisionFilterGroup, collisionFilterMask);
504 #endif
505  }
506 
507  }
508  }
509 
510  for (int i = 0; i < m_data->m_mbMap.size(); i++)
511  {
513  if (ptr)
514  {
515  btMultiBody* mb = *ptr;
516  mb->finalizeMultiDof();
517 
519  }
520  }
521  }
522  return result;
523 }
static const btRigidBody * upcast(const btCollisionObject *colObj)
to keep collision detection and dynamics separate we don&#39;t store a rigidbody pointer but a rigidbody ...
Definition: btRigidBody.h:203
void deSerialize(const struct btQuaternionFloatData &dataIn)
btPersistentManifold is a contact point cache, it stays persistent as long as objects are overlapping...
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
void setupRevolute(int linkIndex, btScalar mass, const btVector3 &inertia, int parentIndex, const btQuaternion &rotParentToThis, const btVector3 &jointAxis, const btVector3 &parentComToThisPivotOffset, const btVector3 &thisPivotToThisComOffset, bool disableParentCollision=false)
btAlignedObjectArray< bStructHandle * > m_contactManifolds
Definition: btBulletFile.h:62
const btMultibodyLink & getLink(int index) const
Definition: btMultiBody.h:119
void setupFixed(int linkIndex, btScalar mass, const btVector3 &inertia, int parent, const btQuaternion &rotParentToThis, const btVector3 &parentComToThisPivotOffset, const btVector3 &thisPivotToThisComOffset, bool deprecatedDisableParentCollision=true)
void deSerializeDouble(const struct btVector3DoubleData &dataIn)
Definition: btVector3.h:1345
const btVector3 getBaseVel() const
Definition: btMultiBody.h:187
btCollisionObjectDoubleData * m_body1
virtual void updateAabbs()
void finalizeMultiDof()
double m_floats[4]
Definition: btVector3.h:1320
static btCollisionObjectDoubleData * getBody1FromContactManifold(btPersistentManifoldDoubleData *manifold)
virtual void dispatchAllCollisionPairs(btOverlappingPairCache *pairCache, const btDispatcherInfo &dispatchInfo, btDispatcher *dispatcher)=0
btCollisionObjectFloatData * m_body1
btTransform getBaseWorldTransform() const
Definition: btMultiBody.h:209
int size() const
Definition: btHashMap.h:372
virtual void addMultiBody(btMultiBody *body, int group=btBroadphaseProxy::DefaultFilter, int mask=btBroadphaseProxy::AllFilter)
btCollisionObjectDoubleData m_colObjData
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
Definition: btMultiBody.h:798
void setupSpherical(int linkIndex, btScalar mass, const btVector3 &inertia, int parent, const btQuaternion &rotParentToThis, const btVector3 &parentComToThisPivotOffset, const btVector3 &thisPivotToThisComOffset, bool disableParentCollision=false)
#define btAssert(x)
Definition: btScalar.h:131
The btCollisionShape class provides an interface for collision shapes that can be shared among btColl...
btCollisionObjectArray & getCollisionObjectArray()
int getNumCollisionObjects() const
void setBaseCollider(btMultiBodyLinkCollider *collider)
Definition: btMultiBody.h:130
const btCollisionObject * getBody0() const
btVector3DoubleData m_linearVelocity
Definition: btRigidBody.h:594
struct btMultiBodyWorldImporterInternalData * m_data
void setJointPosMultiDof(int i, btScalar *q)
void updateCollisionObjectWorldTransforms(btAlignedObjectArray< btQuaternion > &scratch_q, btAlignedObjectArray< btVector3 > &scratch_m)
void setWorldToBaseRot(const btQuaternion &rot)
Definition: btMultiBody.h:222
virtual void computeOverlappingPairs()
the computeOverlappingPairs is usually already called by performDiscreteCollisionDetection (or stepSi...
void setRestitution(btScalar rest)
virtual void deleteAllData()
delete all memory collision shapes, rigid bodies, constraints etc.
void setBaseVel(const btVector3 &vel)
Definition: btMultiBody.h:217
void clear()
clear the array, deallocated memory. Generally it is better to use array.resize(0), to reduce performance overhead of run-time memory (de)allocations.
The btOverlappingPairCache provides an interface for overlapping pair management (add, remove, storage), used by the btBroadphaseInterface broadphases.
virtual void setCollisionShape(btCollisionShape *collisionShape)
virtual btOverlappingPairCache * getOverlappingPairCache()=0
void forwardKinematics(btAlignedObjectArray< btQuaternion > &scratch_q, btAlignedObjectArray< btVector3 > &scratch_m)
void setNumContacts(int cachedPoints)
the setNumContacts API is usually not used, except when you gather/fill all contacts manually ...
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
void setupPrismatic(int i, btScalar mass, const btVector3 &inertia, int parent, const btQuaternion &rotParentToThis, const btVector3 &jointAxis, const btVector3 &parentComToThisPivotOffset, const btVector3 &thisPivotToThisComOffset, bool disableParentCollision)
void setHasSelfCollision(bool hasSelfCollision)
Definition: btMultiBody.h:539
int size() const
return the number of elements in the array
btBroadphaseProxy * getBroadphaseHandle()
void syncMultiBody(T *mbd, btMultiBody *mb, btMultiBodyWorldImporterInternalData *m_data, btAlignedObjectArray< btQuaternion > &scratchQ, btAlignedObjectArray< btVector3 > &scratchM)
void setFriction(btScalar frict)
virtual btBroadphasePairArray & getOverlappingPairArray()=0
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
Definition: btRigidBody.h:590
void setBaseOmega(const btVector3 &omega)
Definition: btMultiBody.h:226
btHashMap< btHashPtr, btCollisionShape * > m_shapeMap
bool hasFixedBase() const
Definition: btMultiBody.h:477
virtual void deleteAllData()
delete all memory collision shapes, rigid bodies, constraints etc.
btMultiBody * getMultiBody(int mbIndex)
void deSerialize(const struct btVector3DoubleData &dataIn)
Definition: btVector3.h:1367
void insert(const Key &key, const Value &value)
Definition: btHashMap.h:262
void setLinearVelocity(const btVector3 &lin_vel)
Definition: btRigidBody.h:370
btQuaternion inverse() const
Return the inverse of this quaternion.
Definition: btQuaternion.h:500
The btRigidBody is the main class for rigid body objects.
Definition: btRigidBody.h:62
void setJointVel(int i, btScalar qdot)
void setJointPos(int i, btScalar q)
void syncContactManifolds(T **contactManifolds, int numContactManifolds, btMultiBodyWorldImporterInternalData *m_data)
btCollisionObjectDoubleData * m_body0
void setWorldTransform(const btTransform &worldTrans)
btDispatcher * getDispatcher()
virtual int getNumOverlappingPairs() const =0
btCollisionAlgorithm * m_algorithm
btVector3 can be used to represent 3D points and vectors.
Definition: btVector3.h:83
const Value * find(const Key &key) const
Definition: btHashMap.h:422
btVector3DoubleData m_angularVelocity
Definition: btRigidBody.h:595
virtual void getAllContactManifolds(btManifoldArray &manifoldArray)=0
const Value * getAtIndex(int index) const
Definition: btHashMap.h:377
btHashMap< btHashPtr, btMultiBody * > m_mbMap
btMultiBodyWorldImporter(class btMultiBodyDynamicsWorld *world)
virtual int getNumManifolds() const =0
The btBulletWorldImporter is a starting point to import .bullet files.
const btBroadphaseInterface * getBroadphase() const
The btTransform class supports rigid transforms with only translation and rotation and no scaling/she...
Definition: btTransform.h:34
virtual bool convertAllObjects(bParse::btBulletFile *bulletFile2)
virtual bool convertAllObjects(bParse::btBulletFile *file)
btCollisionObjectDoubleData m_collisionObjectData
Definition: btRigidBody.h:592
btDispatcherInfo & getDispatchInfo()
btVector3 getBaseOmega() const
Definition: btMultiBody.h:195
btTransformDoubleData m_worldTransform
btAlignedObjectArray< bStructHandle * > m_multiBodies
Definition: btBulletFile.h:42
void setAngularVelocity(const btVector3 &ang_vel)
Definition: btRigidBody.h:376
static btCollisionObjectDoubleData * getBody0FromContactManifold(btPersistentManifoldDoubleData *manifold)
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
Definition: btMultiBody.h:817
void setJointVelMultiDof(int i, btScalar *qdot)
void * findLibPointer(void *ptr)
Definition: bFile.cpp:1510
The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatr...
Definition: btQuaternion.h:55
void deSerialize(const struct btPersistentManifoldDoubleData *manifoldDataPtr)
btCollisionObjectFloatData * m_body0
void deSerializeDouble(const struct btTransformDoubleData &dataIn)
Definition: btTransform.h:292
The btDispatcher interface class can be used in combination with broadphase to dispatch calculations ...
Definition: btDispatcher.h:77
void setBasePos(const btVector3 &pos)
Definition: btMultiBody.h:197
btAlignedObjectArray< bStructHandle * > m_rigidBodies
Definition: btBulletFile.h:48
int getFlags() const
Definition: bFile.h:127
btVector3DoubleData m_origin
Definition: btTransform.h:262
virtual int getNumMultibodies() const
const btCollisionObject * getBody1() const
virtual void addCollisionObject(btCollisionObject *collisionObject, int collisionFilterGroup=btBroadphaseProxy::StaticFilter, int collisionFilterMask=btBroadphaseProxy::AllFilter^btBroadphaseProxy::StaticFilter)
The btMultiBodyDynamicsWorld adds Featherstone multi body dynamics to Bullet This implementation is s...
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
Definition: btScalar.h:292
void convertMultiBody(T *mbd, btMultiBodyWorldImporterInternalData *m_data)
The btBroadphasePair class contains a pair of aabb-overlapping objects.