Bullet Collision Detection & Physics Library
btCollisionWorld.h
Go to the documentation of this file.
1/*
2Bullet Continuous Collision Detection and Physics Library
3Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org
4
5This software is provided 'as-is', without any express or implied warranty.
6In no event will the authors be held liable for any damages arising from the use of this software.
7Permission is granted to anyone to use this software for any purpose,
8including commercial applications, and to alter it and redistribute it freely,
9subject to the following restrictions:
10
111. 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.
122. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
133. This notice may not be removed or altered from any source distribution.
14*/
15
69#ifndef BT_COLLISION_WORLD_H
70#define BT_COLLISION_WORLD_H
71
73class btConvexShape;
75class btSerializer;
76
79#include "btCollisionObject.h"
83
86{
87protected:
89
91
93
95
97
101
102 void serializeCollisionObjects(btSerializer* serializer);
103
104 void serializeContactManifolds(btSerializer* serializer);
105
106public:
107 //this constructor doesn't own the dispatcher and paircache/broadphase
108 btCollisionWorld(btDispatcher* dispatcher, btBroadphaseInterface* broadphasePairCache, btCollisionConfiguration* collisionConfiguration);
109
110 virtual ~btCollisionWorld();
111
113 {
114 m_broadphasePairCache = pairCache;
115 }
116
118 {
120 }
121
123 {
125 }
126
128 {
130 }
131
133 {
134 return m_dispatcher1;
135 }
136
138 {
139 return m_dispatcher1;
140 }
141
143
144 virtual void updateAabbs();
145
148 virtual void computeOverlappingPairs();
149
150 virtual void setDebugDrawer(btIDebugDraw* debugDrawer)
151 {
152 m_debugDrawer = debugDrawer;
153 }
154
156 {
157 return m_debugDrawer;
158 }
159
160 virtual void debugDrawWorld();
161
162 virtual void debugDrawObject(const btTransform& worldTransform, const btCollisionShape* shape, const btVector3& color);
163
167 {
170
171 //const btCollisionShape* m_shapeTemp;
172 //const btTransform* m_shapeLocalTransform;
173 };
174
176 {
177 LocalRayResult(const btCollisionObject* collisionObject,
178 LocalShapeInfo* localShapeInfo,
179 const btVector3& hitNormalLocal,
180 btScalar hitFraction)
181 : m_collisionObject(collisionObject),
182 m_localShapeInfo(localShapeInfo),
183 m_hitNormalLocal(hitNormalLocal),
184 m_hitFraction(hitFraction)
185 {
186 }
187
192 };
193
196 {
201 //@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.
202 unsigned int m_flags;
203
205 {
206 }
207 bool hasHit() const
208 {
209 return (m_collisionObject != 0);
210 }
211
217 //@BP Mod
218 m_flags(0)
219 {
220 }
221
222 virtual bool needsCollision(btBroadphaseProxy* proxy0) const
223 {
224 bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0;
225 collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask);
226 return collides;
227 }
228
229 virtual btScalar addSingleResult(LocalRayResult& rayResult, bool normalInWorldSpace) = 0;
230 };
231
233 {
234 ClosestRayResultCallback(const btVector3& rayFromWorld, const btVector3& rayToWorld)
235 : m_rayFromWorld(rayFromWorld),
236 m_rayToWorld(rayToWorld)
237 {
238 }
239
240 btVector3 m_rayFromWorld; //used to calculate hitPointWorld from hitFraction
242
245
246 virtual btScalar addSingleResult(LocalRayResult& rayResult, bool normalInWorldSpace)
247 {
248 //caller already does the filter on the m_closestHitFraction
250
253 if (normalInWorldSpace)
254 {
256 }
257 else
258 {
261 }
263 return rayResult.m_hitFraction;
264 }
265 };
266
268 {
269 AllHitsRayResultCallback(const btVector3& rayFromWorld, const btVector3& rayToWorld)
270 : m_rayFromWorld(rayFromWorld),
271 m_rayToWorld(rayToWorld)
272 {
273 }
274
276
277 btVector3 m_rayFromWorld; //used to calculate hitPointWorld from hitFraction
279
283
284 virtual btScalar addSingleResult(LocalRayResult& rayResult, bool normalInWorldSpace)
285 {
288 btVector3 hitNormalWorld;
289 if (normalInWorldSpace)
290 {
291 hitNormalWorld = rayResult.m_hitNormalLocal;
292 }
293 else
294 {
296 hitNormalWorld = m_collisionObject->getWorldTransform().getBasis() * rayResult.m_hitNormalLocal;
297 }
298 m_hitNormalWorld.push_back(hitNormalWorld);
299 btVector3 hitPointWorld;
300 hitPointWorld.setInterpolate3(m_rayFromWorld, m_rayToWorld, rayResult.m_hitFraction);
301 m_hitPointWorld.push_back(hitPointWorld);
304 }
305 };
306
308 {
309 LocalConvexResult(const btCollisionObject* hitCollisionObject,
310 LocalShapeInfo* localShapeInfo,
311 const btVector3& hitNormalLocal,
312 const btVector3& hitPointLocal,
313 btScalar hitFraction)
314 : m_hitCollisionObject(hitCollisionObject),
315 m_localShapeInfo(localShapeInfo),
316 m_hitNormalLocal(hitNormalLocal),
317 m_hitPointLocal(hitPointLocal),
318 m_hitFraction(hitFraction)
319 {
320 }
321
327 };
328
331 {
335
340 {
341 }
342
344 {
345 }
346
347 bool hasHit() const
348 {
349 return (m_closestHitFraction < btScalar(1.));
350 }
351
352 virtual bool needsCollision(btBroadphaseProxy* proxy0) const
353 {
354 bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0;
355 collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask);
356 return collides;
357 }
358
359 virtual btScalar addSingleResult(LocalConvexResult& convexResult, bool normalInWorldSpace) = 0;
360 };
361
363 {
364 ClosestConvexResultCallback(const btVector3& convexFromWorld, const btVector3& convexToWorld)
365 : m_convexFromWorld(convexFromWorld),
366 m_convexToWorld(convexToWorld),
368 {
369 }
370
371 btVector3 m_convexFromWorld; //used to calculate hitPointWorld from hitFraction
373
377
378 virtual btScalar addSingleResult(LocalConvexResult& convexResult, bool normalInWorldSpace)
379 {
380 //caller already does the filter on the m_closestHitFraction
382
383 m_closestHitFraction = convexResult.m_hitFraction;
385 if (normalInWorldSpace)
386 {
387 m_hitNormalWorld = convexResult.m_hitNormalLocal;
388 }
389 else
390 {
393 }
394 m_hitPointWorld = convexResult.m_hitPointLocal;
395 return convexResult.m_hitFraction;
396 }
397 };
398
401 {
405
410 {
411 }
412
414 {
415 }
416
417 virtual bool needsCollision(btBroadphaseProxy* proxy0) const
418 {
419 bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0;
420 collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask);
421 return collides;
422 }
423
424 virtual btScalar addSingleResult(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0Wrap, int partId0, int index0, const btCollisionObjectWrapper* colObj1Wrap, int partId1, int index1) = 0;
425 };
426
428 {
429 return int(m_collisionObjects.size());
430 }
431
434 virtual void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const;
435
438 void convexSweepTest(const btConvexShape* castShape, const btTransform& from, const btTransform& to, ConvexResultCallback& resultCallback, btScalar allowedCcdPenetration = btScalar(0.)) const;
439
442 void contactTest(btCollisionObject* colObj, ContactResultCallback& resultCallback);
443
446 void contactPairTest(btCollisionObject* colObjA, btCollisionObject* colObjB, ContactResultCallback& resultCallback);
447
451 static void rayTestSingle(const btTransform& rayFromTrans, const btTransform& rayToTrans,
452 btCollisionObject* collisionObject,
453 const btCollisionShape* collisionShape,
454 const btTransform& colObjWorldTransform,
455 RayResultCallback& resultCallback);
456
457 static void rayTestSingleInternal(const btTransform& rayFromTrans, const btTransform& rayToTrans,
458 const btCollisionObjectWrapper* collisionObjectWrap,
459 RayResultCallback& resultCallback);
460
462 static void objectQuerySingle(const btConvexShape* castShape, const btTransform& rayFromTrans, const btTransform& rayToTrans,
463 btCollisionObject* collisionObject,
464 const btCollisionShape* collisionShape,
465 const btTransform& colObjWorldTransform,
466 ConvexResultCallback& resultCallback, btScalar allowedPenetration);
467
468 static void objectQuerySingleInternal(const btConvexShape* castShape, const btTransform& convexFromTrans, const btTransform& convexToTrans,
469 const btCollisionObjectWrapper* colObjWrap,
470 ConvexResultCallback& resultCallback, btScalar allowedPenetration);
471
472 virtual void addCollisionObject(btCollisionObject* collisionObject, int collisionFilterGroup = btBroadphaseProxy::DefaultFilter, int collisionFilterMask = btBroadphaseProxy::AllFilter);
473
474 virtual void refreshBroadphaseProxy(btCollisionObject* collisionObject);
475
477 {
478 return m_collisionObjects;
479 }
480
482 {
483 return m_collisionObjects;
484 }
485
486 virtual void removeCollisionObject(btCollisionObject* collisionObject);
487
489
491 {
492 return m_dispatchInfo;
493 }
494
496 {
497 return m_dispatchInfo;
498 }
499
501 {
503 }
504 void setForceUpdateAllAabbs(bool forceUpdateAllAabbs)
505 {
506 m_forceUpdateAllAabbs = forceUpdateAllAabbs;
507 }
508
510 virtual void serialize(btSerializer* serializer);
511};
512
513#endif //BT_COLLISION_WORLD_H
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
Definition: btScalar.h:314
#define btAssert(x)
Definition: btScalar.h:153
int size() const
return the number of elements in the array
void push_back(const T &_Val)
The btBroadphaseInterface class provides an interface to detect aabb-overlapping object pairs.
virtual btOverlappingPairCache * getOverlappingPairCache()=0
btCollisionConfiguration allows to configure Bullet collision detection stack allocator size,...
btCollisionObject can be used to manage collision detection objects.
btTransform & getWorldTransform()
The btCollisionShape class provides an interface for collision shapes that can be shared among btColl...
CollisionWorld is interface and container for the collision detection.
virtual void rayTest(const btVector3 &rayFromWorld, const btVector3 &rayToWorld, RayResultCallback &resultCallback) const
rayTest performs a raycast on all objects in the btCollisionWorld, and calls the resultCallback This ...
virtual void updateAabbs()
btDispatcherInfo m_dispatchInfo
btDispatcher * getDispatcher()
btDispatcherInfo & getDispatchInfo()
virtual void serialize(btSerializer *serializer)
Preliminary serialization test for Bullet 2.76. Loading those files requires a separate parser (Bulle...
virtual void debugDrawWorld()
btOverlappingPairCache * getPairCache()
static void objectQuerySingleInternal(const btConvexShape *castShape, const btTransform &convexFromTrans, const btTransform &convexToTrans, const btCollisionObjectWrapper *colObjWrap, ConvexResultCallback &resultCallback, btScalar allowedPenetration)
virtual btIDebugDraw * getDebugDrawer()
virtual ~btCollisionWorld()
virtual void refreshBroadphaseProxy(btCollisionObject *collisionObject)
btBroadphaseInterface * m_broadphasePairCache
void updateSingleAabb(btCollisionObject *colObj)
void setForceUpdateAllAabbs(bool forceUpdateAllAabbs)
virtual void removeCollisionObject(btCollisionObject *collisionObject)
virtual void addCollisionObject(btCollisionObject *collisionObject, int collisionFilterGroup=btBroadphaseProxy::DefaultFilter, int collisionFilterMask=btBroadphaseProxy::AllFilter)
btAlignedObjectArray< btCollisionObject * > m_collisionObjects
virtual void setDebugDrawer(btIDebugDraw *debugDrawer)
btCollisionWorld(btDispatcher *dispatcher, btBroadphaseInterface *broadphasePairCache, btCollisionConfiguration *collisionConfiguration)
for debug drawing
int getNumCollisionObjects() const
virtual void performDiscreteCollisionDetection()
btCollisionObjectArray & getCollisionObjectArray()
static void rayTestSingleInternal(const btTransform &rayFromTrans, const btTransform &rayToTrans, const btCollisionObjectWrapper *collisionObjectWrap, RayResultCallback &resultCallback)
const btCollisionObjectArray & getCollisionObjectArray() const
void convexSweepTest(const btConvexShape *castShape, const btTransform &from, const btTransform &to, ConvexResultCallback &resultCallback, btScalar allowedCcdPenetration=btScalar(0.)) const
convexTest performs a swept convex cast on all objects in the btCollisionWorld, and calls the resultC...
bool m_forceUpdateAllAabbs
m_forceUpdateAllAabbs can be set to false as an optimization to only update active object AABBs it is...
const btDispatcherInfo & getDispatchInfo() const
btIDebugDraw * m_debugDrawer
btBroadphaseInterface * getBroadphase()
static void objectQuerySingle(const btConvexShape *castShape, const btTransform &rayFromTrans, const btTransform &rayToTrans, btCollisionObject *collisionObject, const btCollisionShape *collisionShape, const btTransform &colObjWorldTransform, ConvexResultCallback &resultCallback, btScalar allowedPenetration)
objectQuerySingle performs a collision detection query and calls the resultCallback....
btDispatcher * m_dispatcher1
void contactPairTest(btCollisionObject *colObjA, btCollisionObject *colObjB, ContactResultCallback &resultCallback)
contactTest performs a discrete collision test between two collision objects and calls the resultCall...
void serializeContactManifolds(btSerializer *serializer)
const btDispatcher * getDispatcher() const
bool getForceUpdateAllAabbs() const
virtual void debugDrawObject(const btTransform &worldTransform, const btCollisionShape *shape, const btVector3 &color)
static void rayTestSingle(const btTransform &rayFromTrans, const btTransform &rayToTrans, btCollisionObject *collisionObject, const btCollisionShape *collisionShape, const btTransform &colObjWorldTransform, RayResultCallback &resultCallback)
rayTestSingle performs a raycast call and calls the resultCallback.
void setBroadphase(btBroadphaseInterface *pairCache)
const btBroadphaseInterface * getBroadphase() const
void contactTest(btCollisionObject *colObj, ContactResultCallback &resultCallback)
contactTest performs a discrete collision test between colObj against all objects in the btCollisionW...
void serializeCollisionObjects(btSerializer *serializer)
virtual void computeOverlappingPairs()
the computeOverlappingPairs is usually already called by performDiscreteCollisionDetection (or stepSi...
The btConvexShape is an abstract shape interface, implemented by all convex shapes such as btBoxShape...
Definition: btConvexShape.h:33
The btDispatcher interface class can be used in combination with broadphase to dispatch calculations ...
Definition: btDispatcher.h:77
The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations.
Definition: btIDebugDraw.h:27
ManifoldContactPoint collects and maintains persistent contactpoints.
The btOverlappingPairCache provides an interface for overlapping pair management (add,...
The btTransform class supports rigid transforms with only translation and rotation and no scaling/she...
Definition: btTransform.h:30
btMatrix3x3 & getBasis()
Return the basis matrix for the rotation.
Definition: btTransform.h:109
btVector3 can be used to represent 3D points and vectors.
Definition: btVector3.h:82
void setInterpolate3(const btVector3 &v0, const btVector3 &v1, btScalar rt)
Definition: btVector3.h:492
The btBroadphaseProxy is the main class that can be used with the Bullet broadphases.
AllHitsRayResultCallback(const btVector3 &rayFromWorld, const btVector3 &rayToWorld)
virtual btScalar addSingleResult(LocalRayResult &rayResult, bool normalInWorldSpace)
btAlignedObjectArray< const btCollisionObject * > m_collisionObjects
btAlignedObjectArray< btScalar > m_hitFractions
btAlignedObjectArray< btVector3 > m_hitPointWorld
btAlignedObjectArray< btVector3 > m_hitNormalWorld
virtual btScalar addSingleResult(LocalConvexResult &convexResult, bool normalInWorldSpace)
ClosestConvexResultCallback(const btVector3 &convexFromWorld, const btVector3 &convexToWorld)
virtual btScalar addSingleResult(LocalRayResult &rayResult, bool normalInWorldSpace)
ClosestRayResultCallback(const btVector3 &rayFromWorld, const btVector3 &rayToWorld)
ContactResultCallback is used to report contact points.
virtual btScalar addSingleResult(btManifoldPoint &cp, const btCollisionObjectWrapper *colObj0Wrap, int partId0, int index0, const btCollisionObjectWrapper *colObj1Wrap, int partId1, int index1)=0
virtual bool needsCollision(btBroadphaseProxy *proxy0) const
RayResultCallback is used to report new raycast results.
virtual bool needsCollision(btBroadphaseProxy *proxy0) const
virtual btScalar addSingleResult(LocalConvexResult &convexResult, bool normalInWorldSpace)=0
const btCollisionObject * m_hitCollisionObject
LocalConvexResult(const btCollisionObject *hitCollisionObject, LocalShapeInfo *localShapeInfo, const btVector3 &hitNormalLocal, const btVector3 &hitPointLocal, btScalar hitFraction)
const btCollisionObject * m_collisionObject
LocalRayResult(const btCollisionObject *collisionObject, LocalShapeInfo *localShapeInfo, const btVector3 &hitNormalLocal, btScalar hitFraction)
LocalShapeInfo gives extra information for complex shapes Currently, only btTriangleMeshShape is avai...
RayResultCallback is used to report new raycast results.
virtual bool needsCollision(btBroadphaseProxy *proxy0) const
virtual btScalar addSingleResult(LocalRayResult &rayResult, bool normalInWorldSpace)=0
const btCollisionObject * m_collisionObject