Bullet Collision Detection & Physics Library
btCollisionWorld.h
Go to the documentation of this file.
1 /*
2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2006 Erwin Coumans http://bulletphysics.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 you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
13 3. This notice may not be removed or altered from any source distribution.
14 */
15 
16 
65 #ifndef BT_COLLISION_WORLD_H
66 #define BT_COLLISION_WORLD_H
67 
68 class btStackAlloc;
69 class btCollisionShape;
70 class btConvexShape;
72 class btSerializer;
73 
74 #include "LinearMath/btVector3.h"
75 #include "LinearMath/btTransform.h"
76 #include "btCollisionObject.h"
77 #include "btCollisionDispatcher.h"
80 
83 {
84 
85 
86 protected:
87 
89 
91 
93 
95 
97 
99 
103 
104  void serializeCollisionObjects(btSerializer* serializer);
105 
106 public:
107 
108  //this constructor doesn't own the dispatcher and paircache/broadphase
109  btCollisionWorld(btDispatcher* dispatcher,btBroadphaseInterface* broadphasePairCache, btCollisionConfiguration* collisionConfiguration);
110 
111  virtual ~btCollisionWorld();
112 
114  {
115  m_broadphasePairCache = pairCache;
116  }
117 
119  {
120  return m_broadphasePairCache;
121  }
122 
124  {
125  return m_broadphasePairCache;
126  }
127 
129  {
131  }
132 
133 
135  {
136  return m_dispatcher1;
137  }
138 
140  {
141  return m_dispatcher1;
142  }
143 
144  void updateSingleAabb(btCollisionObject* colObj);
145 
146  virtual void updateAabbs();
147 
150  virtual void computeOverlappingPairs();
151 
152 
153  virtual void setDebugDrawer(btIDebugDraw* debugDrawer)
154  {
155  m_debugDrawer = debugDrawer;
156  }
157 
159  {
160  return m_debugDrawer;
161  }
162 
163  virtual void debugDrawWorld();
164 
165  virtual void debugDrawObject(const btTransform& worldTransform, const btCollisionShape* shape, const btVector3& color);
166 
167 
171  {
174 
175  //const btCollisionShape* m_shapeTemp;
176  //const btTransform* m_shapeLocalTransform;
177  };
178 
180  {
181  LocalRayResult(const btCollisionObject* collisionObject,
182  LocalShapeInfo* localShapeInfo,
183  const btVector3& hitNormalLocal,
184  btScalar hitFraction)
185  :m_collisionObject(collisionObject),
186  m_localShapeInfo(localShapeInfo),
187  m_hitNormalLocal(hitNormalLocal),
188  m_hitFraction(hitFraction)
189  {
190  }
191 
196 
197  };
198 
201  {
206  //@BP Mod - Custom flags, currently used to enable backface culling on tri-meshes, see btRaycastCallback.h. Apply any of the EFlags defined there on m_flags here to invoke.
207  unsigned int m_flags;
208 
210  {
211  }
212  bool hasHit() const
213  {
214  return (m_collisionObject != 0);
215  }
216 
222  //@BP Mod
223  m_flags(0)
224  {
225  }
226 
227  virtual bool needsCollision(btBroadphaseProxy* proxy0) const
228  {
229  bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0;
230  collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask);
231  return collides;
232  }
233 
234 
235  virtual btScalar addSingleResult(LocalRayResult& rayResult,bool normalInWorldSpace) = 0;
236  };
237 
239  {
240  ClosestRayResultCallback(const btVector3& rayFromWorld,const btVector3& rayToWorld)
241  :m_rayFromWorld(rayFromWorld),
242  m_rayToWorld(rayToWorld)
243  {
244  }
245 
246  btVector3 m_rayFromWorld;//used to calculate hitPointWorld from hitFraction
248 
251 
252  virtual btScalar addSingleResult(LocalRayResult& rayResult,bool normalInWorldSpace)
253  {
254  //caller already does the filter on the m_closestHitFraction
256 
259  if (normalInWorldSpace)
260  {
262  } else
263  {
266  }
268  return rayResult.m_hitFraction;
269  }
270  };
271 
273  {
274  AllHitsRayResultCallback(const btVector3& rayFromWorld,const btVector3& rayToWorld)
275  :m_rayFromWorld(rayFromWorld),
276  m_rayToWorld(rayToWorld)
277  {
278  }
279 
281 
282  btVector3 m_rayFromWorld;//used to calculate hitPointWorld from hitFraction
284 
288 
289  virtual btScalar addSingleResult(LocalRayResult& rayResult,bool normalInWorldSpace)
290  {
293  btVector3 hitNormalWorld;
294  if (normalInWorldSpace)
295  {
296  hitNormalWorld = rayResult.m_hitNormalLocal;
297  } else
298  {
300  hitNormalWorld = m_collisionObject->getWorldTransform().getBasis()*rayResult.m_hitNormalLocal;
301  }
302  m_hitNormalWorld.push_back(hitNormalWorld);
303  btVector3 hitPointWorld;
304  hitPointWorld.setInterpolate3(m_rayFromWorld,m_rayToWorld,rayResult.m_hitFraction);
305  m_hitPointWorld.push_back(hitPointWorld);
307  return m_closestHitFraction;
308  }
309  };
310 
311 
313  {
314  LocalConvexResult(const btCollisionObject* hitCollisionObject,
315  LocalShapeInfo* localShapeInfo,
316  const btVector3& hitNormalLocal,
317  const btVector3& hitPointLocal,
318  btScalar hitFraction
319  )
320  :m_hitCollisionObject(hitCollisionObject),
321  m_localShapeInfo(localShapeInfo),
322  m_hitNormalLocal(hitNormalLocal),
323  m_hitPointLocal(hitPointLocal),
324  m_hitFraction(hitFraction)
325  {
326  }
327 
333  };
334 
337  {
341 
346  {
347  }
348 
350  {
351  }
352 
353  bool hasHit() const
354  {
355  return (m_closestHitFraction < btScalar(1.));
356  }
357 
358 
359 
360  virtual bool needsCollision(btBroadphaseProxy* proxy0) const
361  {
362  bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0;
363  collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask);
364  return collides;
365  }
366 
367  virtual btScalar addSingleResult(LocalConvexResult& convexResult,bool normalInWorldSpace) = 0;
368  };
369 
371  {
372  ClosestConvexResultCallback(const btVector3& convexFromWorld,const btVector3& convexToWorld)
373  :m_convexFromWorld(convexFromWorld),
374  m_convexToWorld(convexToWorld),
376  {
377  }
378 
379  btVector3 m_convexFromWorld;//used to calculate hitPointWorld from hitFraction
381 
385 
386  virtual btScalar addSingleResult(LocalConvexResult& convexResult,bool normalInWorldSpace)
387  {
388 //caller already does the filter on the m_closestHitFraction
390 
391  m_closestHitFraction = convexResult.m_hitFraction;
393  if (normalInWorldSpace)
394  {
395  m_hitNormalWorld = convexResult.m_hitNormalLocal;
396  } else
397  {
400  }
401  m_hitPointWorld = convexResult.m_hitPointLocal;
402  return convexResult.m_hitFraction;
403  }
404  };
405 
408  {
411 
413  :m_collisionFilterGroup(btBroadphaseProxy::DefaultFilter),
415  {
416  }
417 
419  {
420  }
421 
422  virtual bool needsCollision(btBroadphaseProxy* proxy0) const
423  {
424  bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0;
425  collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask);
426  return collides;
427  }
428 
429  virtual btScalar addSingleResult(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId1,int index1) = 0;
430  };
431 
432 
433 
435  {
436  return int(m_collisionObjects.size());
437  }
438 
441  virtual void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const;
442 
445  void convexSweepTest (const btConvexShape* castShape, const btTransform& from, const btTransform& to, ConvexResultCallback& resultCallback, btScalar allowedCcdPenetration = btScalar(0.)) const;
446 
449  void contactTest(btCollisionObject* colObj, ContactResultCallback& resultCallback);
450 
453  void contactPairTest(btCollisionObject* colObjA, btCollisionObject* colObjB, ContactResultCallback& resultCallback);
454 
455 
459  static void rayTestSingle(const btTransform& rayFromTrans,const btTransform& rayToTrans,
460  btCollisionObject* collisionObject,
461  const btCollisionShape* collisionShape,
462  const btTransform& colObjWorldTransform,
463  RayResultCallback& resultCallback);
464 
465  static void rayTestSingleInternal(const btTransform& rayFromTrans,const btTransform& rayToTrans,
466  const btCollisionObjectWrapper* collisionObjectWrap,
467  RayResultCallback& resultCallback);
468 
470  static void objectQuerySingle(const btConvexShape* castShape, const btTransform& rayFromTrans,const btTransform& rayToTrans,
471  btCollisionObject* collisionObject,
472  const btCollisionShape* collisionShape,
473  const btTransform& colObjWorldTransform,
474  ConvexResultCallback& resultCallback, btScalar allowedPenetration);
475 
476  static void objectQuerySingleInternal(const btConvexShape* castShape,const btTransform& convexFromTrans,const btTransform& convexToTrans,
477  const btCollisionObjectWrapper* colObjWrap,
478  ConvexResultCallback& resultCallback, btScalar allowedPenetration);
479 
480  virtual void addCollisionObject(btCollisionObject* collisionObject,short int collisionFilterGroup=btBroadphaseProxy::DefaultFilter,short int collisionFilterMask=btBroadphaseProxy::AllFilter);
481 
483  {
484  return m_collisionObjects;
485  }
486 
488  {
489  return m_collisionObjects;
490  }
491 
492 
493  virtual void removeCollisionObject(btCollisionObject* collisionObject);
494 
495  virtual void performDiscreteCollisionDetection();
496 
498  {
499  return m_dispatchInfo;
500  }
501 
503  {
504  return m_dispatchInfo;
505  }
506 
508  {
509  return m_forceUpdateAllAabbs;
510  }
511  void setForceUpdateAllAabbs( bool forceUpdateAllAabbs)
512  {
513  m_forceUpdateAllAabbs = forceUpdateAllAabbs;
514  }
515 
517  virtual void serialize(btSerializer* serializer);
518 
519 };
520 
521 
522 #endif //BT_COLLISION_WORLD_H