68
68
class btCollisionShape;
69
69
class btConvexShape;
70
70
class btBroadphaseInterface;
71
#include "../../LinearMath/btVector3.h"
72
#include "../../LinearMath/btTransform.h"
71
#include "LinearMath/btVector3.h"
72
#include "LinearMath/btTransform.h"
73
73
#include "btCollisionObject.h"
74
74
#include "btCollisionDispatcher.h" //for definition of btCollisionObjectArray
75
#include "../BroadphaseCollision/btOverlappingPairCache.h"
76
#include "../../LinearMath/btAlignedObjectArray.h"
75
#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h"
76
#include "LinearMath/btAlignedObjectArray.h"
78
78
///CollisionWorld is interface and container for the collision detection
79
79
class btCollisionWorld
91
91
btStackAlloc* m_stackAlloc;
93
btOverlappingPairCache* m_broadphasePairCache;
93
btBroadphaseInterface* m_broadphasePairCache;
95
btIDebugDraw* m_debugDrawer;
95
bool m_ownsDispatcher;
96
bool m_ownsBroadphasePairCache;
100
100
//this constructor doesn't own the dispatcher and paircache/broadphase
101
btCollisionWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache, int stackSize = 2*1024*1024);
101
btCollisionWorld(btDispatcher* dispatcher,btBroadphaseInterface* broadphasePairCache, btCollisionConfiguration* collisionConfiguration);
103
103
virtual ~btCollisionWorld();
105
void setBroadphase(btBroadphaseInterface* pairCache)
107
m_broadphasePairCache = pairCache;
106
110
btBroadphaseInterface* getBroadphase()
153
175
///RayResultCallback is used to report new raycast results
154
176
struct RayResultCallback
178
btScalar m_closestHitFraction;
179
btCollisionObject* m_collisionObject;
180
short int m_collisionFilterGroup;
181
short int m_collisionFilterMask;
156
183
virtual ~RayResultCallback()
159
btScalar m_closestHitFraction;
162
return (m_closestHitFraction < btScalar(1.));
188
return (m_collisionObject != 0);
165
191
RayResultCallback()
166
:m_closestHitFraction(btScalar(1.))
169
virtual btScalar AddSingleResult(LocalRayResult& rayResult) = 0;
192
:m_closestHitFraction(btScalar(1.)),
193
m_collisionObject(0),
194
m_collisionFilterGroup(btBroadphaseProxy::DefaultFilter),
195
m_collisionFilterMask(btBroadphaseProxy::AllFilter)
199
virtual bool needsCollision(btBroadphaseProxy* proxy0) const
201
bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0;
202
collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask);
207
virtual btScalar addSingleResult(LocalRayResult& rayResult,bool normalInWorldSpace) = 0;
172
210
struct ClosestRayResultCallback : public RayResultCallback
174
212
ClosestRayResultCallback(const btVector3& rayFromWorld,const btVector3& rayToWorld)
175
213
:m_rayFromWorld(rayFromWorld),
176
m_rayToWorld(rayToWorld),
214
m_rayToWorld(rayToWorld)
184
221
btVector3 m_hitNormalWorld;
185
222
btVector3 m_hitPointWorld;
186
btCollisionObject* m_collisionObject;
188
virtual btScalar AddSingleResult(LocalRayResult& rayResult)
224
virtual btScalar addSingleResult(LocalRayResult& rayResult,bool normalInWorldSpace)
191
//caller already does the filter on the m_closestHitFraction
192
assert(rayResult.m_hitFraction <= m_closestHitFraction);
226
//caller already does the filter on the m_closestHitFraction
227
btAssert(rayResult.m_hitFraction <= m_closestHitFraction);
194
229
m_closestHitFraction = rayResult.m_hitFraction;
195
230
m_collisionObject = rayResult.m_collisionObject;
196
m_hitNormalWorld = m_collisionObject->getWorldTransform().getBasis()*rayResult.m_hitNormalLocal;
231
if (normalInWorldSpace)
233
m_hitNormalWorld = rayResult.m_hitNormalLocal;
236
///need to transform normal into worldspace
237
m_hitNormalWorld = m_collisionObject->getWorldTransform().getBasis()*rayResult.m_hitNormalLocal;
197
239
m_hitPointWorld.setInterpolate3(m_rayFromWorld,m_rayToWorld,rayResult.m_hitFraction);
198
240
return rayResult.m_hitFraction;
245
struct LocalConvexResult
247
LocalConvexResult(btCollisionObject* hitCollisionObject,
248
LocalShapeInfo* localShapeInfo,
249
const btVector3& hitNormalLocal,
250
const btVector3& hitPointLocal,
253
:m_hitCollisionObject(hitCollisionObject),
254
m_localShapeInfo(localShapeInfo),
255
m_hitNormalLocal(hitNormalLocal),
256
m_hitPointLocal(hitPointLocal),
257
m_hitFraction(hitFraction)
261
btCollisionObject* m_hitCollisionObject;
262
LocalShapeInfo* m_localShapeInfo;
263
btVector3 m_hitNormalLocal;
264
btVector3 m_hitPointLocal;
265
btScalar m_hitFraction;
268
///RayResultCallback is used to report new raycast results
269
struct ConvexResultCallback
271
btScalar m_closestHitFraction;
272
short int m_collisionFilterGroup;
273
short int m_collisionFilterMask;
275
ConvexResultCallback()
276
:m_closestHitFraction(btScalar(1.)),
277
m_collisionFilterGroup(btBroadphaseProxy::DefaultFilter),
278
m_collisionFilterMask(btBroadphaseProxy::AllFilter)
282
virtual ~ConvexResultCallback()
288
return (m_closestHitFraction < btScalar(1.));
293
virtual bool needsCollision(btBroadphaseProxy* proxy0) const
295
bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0;
296
collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask);
300
virtual btScalar addSingleResult(LocalConvexResult& convexResult,bool normalInWorldSpace) = 0;
303
struct ClosestConvexResultCallback : public ConvexResultCallback
305
ClosestConvexResultCallback(const btVector3& convexFromWorld,const btVector3& convexToWorld)
306
:m_convexFromWorld(convexFromWorld),
307
m_convexToWorld(convexToWorld),
308
m_hitCollisionObject(0)
312
btVector3 m_convexFromWorld;//used to calculate hitPointWorld from hitFraction
313
btVector3 m_convexToWorld;
315
btVector3 m_hitNormalWorld;
316
btVector3 m_hitPointWorld;
317
btCollisionObject* m_hitCollisionObject;
319
virtual btScalar addSingleResult(LocalConvexResult& convexResult,bool normalInWorldSpace)
321
//caller already does the filter on the m_closestHitFraction
322
btAssert(convexResult.m_hitFraction <= m_closestHitFraction);
324
m_closestHitFraction = convexResult.m_hitFraction;
325
m_hitCollisionObject = convexResult.m_hitCollisionObject;
326
if (normalInWorldSpace)
328
m_hitNormalWorld = convexResult.m_hitNormalLocal;
331
///need to transform normal into worldspace
332
m_hitNormalWorld = m_hitCollisionObject->getWorldTransform().getBasis()*convexResult.m_hitNormalLocal;
334
m_hitPointWorld = convexResult.m_hitPointLocal;
335
return convexResult.m_hitFraction;
205
339
int getNumCollisionObjects() const
210
344
/// rayTest performs a raycast on all objects in the btCollisionWorld, and calls the resultCallback
211
345
/// This allows for several queries: first hit, all hits, any hit, dependent on the value returned by the callback.
212
void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback, short int collisionFilterMask=-1);
346
void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const;
348
// convexTest performs a swept convex cast on all objects in the btCollisionWorld, and calls the resultCallback
349
// This allows for several queries: first hit, all hits, any hit, dependent on the value return by the callback.
350
void convexSweepTest (const btConvexShape* castShape, const btTransform& from, const btTransform& to, ConvexResultCallback& resultCallback) const;
214
353
/// rayTestSingle performs a raycast call and calls the resultCallback. It is used internally by rayTest.
215
354
/// In a future implementation, we consider moving the ray test as a virtual method in btCollisionShape.
218
357
btCollisionObject* collisionObject,
219
358
const btCollisionShape* collisionShape,
220
359
const btTransform& colObjWorldTransform,
221
RayResultCallback& resultCallback, short int collisionFilterMask=-1);
360
RayResultCallback& resultCallback);
223
362
/// objectQuerySingle performs a collision detection query and calls the resultCallback. It is used internally by rayTest.
224
363
static void objectQuerySingle(const btConvexShape* castShape, const btTransform& rayFromTrans,const btTransform& rayToTrans,
225
364
btCollisionObject* collisionObject,
226
365
const btCollisionShape* collisionShape,
227
366
const btTransform& colObjWorldTransform,
228
RayResultCallback& resultCallback, short int collisionFilterMask=-1);
367
ConvexResultCallback& resultCallback, btScalar allowedPenetration);
230
void addCollisionObject(btCollisionObject* collisionObject,short int collisionFilterGroup=1,short int collisionFilterMask=1);
369
void addCollisionObject(btCollisionObject* collisionObject,short int collisionFilterGroup=btBroadphaseProxy::DefaultFilter,short int collisionFilterMask=btBroadphaseProxy::AllFilter);
232
371
btCollisionObjectArray& getCollisionObjectArray()