Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef BT_COLLISION__DISPATCHER_H
00017 #define BT_COLLISION__DISPATCHER_H
00018
00019 #include "BulletCollision/BroadphaseCollision/btDispatcher.h"
00020 #include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h"
00021
00022 #include "BulletCollision/CollisionDispatch/btManifoldResult.h"
00023
00024 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
00025 #include "LinearMath/btAlignedObjectArray.h"
00026
00027 class btIDebugDraw;
00028 class btOverlappingPairCache;
00029 class btPoolAllocator;
00030 class btCollisionConfiguration;
00031
00032 #include "btCollisionCreateFunc.h"
00033
00034 #define USE_DISPATCH_REGISTRY_ARRAY 1
00035
00036 class btCollisionDispatcher;
00038 typedef void (*btNearCallback)(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo);
00039
00040
00043 class btCollisionDispatcher : public btDispatcher
00044 {
00045
00046 protected:
00047
00048 int m_dispatcherFlags;
00049
00050 btAlignedObjectArray<btPersistentManifold*> m_manifoldsPtr;
00051
00052 btManifoldResult m_defaultManifoldResult;
00053
00054 btNearCallback m_nearCallback;
00055
00056 btPoolAllocator* m_collisionAlgorithmPoolAllocator;
00057
00058 btPoolAllocator* m_persistentManifoldPoolAllocator;
00059
00060 btCollisionAlgorithmCreateFunc* m_doubleDispatch[MAX_BROADPHASE_COLLISION_TYPES][MAX_BROADPHASE_COLLISION_TYPES];
00061
00062 btCollisionConfiguration* m_collisionConfiguration;
00063
00064
00065 public:
00066
00067 enum DispatcherFlags
00068 {
00069 CD_STATIC_STATIC_REPORTED = 1,
00070 CD_USE_RELATIVE_CONTACT_BREAKING_THRESHOLD = 2,
00071 CD_DISABLE_CONTACTPOOL_DYNAMIC_ALLOCATION = 4
00072 };
00073
00074 int getDispatcherFlags() const
00075 {
00076 return m_dispatcherFlags;
00077 }
00078
00079 void setDispatcherFlags(int flags)
00080 {
00081 m_dispatcherFlags = flags;
00082 }
00083
00085 void registerCollisionCreateFunc(int proxyType0,int proxyType1, btCollisionAlgorithmCreateFunc* createFunc);
00086
00087 int getNumManifolds() const
00088 {
00089 return int( m_manifoldsPtr.size());
00090 }
00091
00092 btPersistentManifold** getInternalManifoldPointer()
00093 {
00094 return m_manifoldsPtr.size()? &m_manifoldsPtr[0] : 0;
00095 }
00096
00097 btPersistentManifold* getManifoldByIndexInternal(int index)
00098 {
00099 return m_manifoldsPtr[index];
00100 }
00101
00102 const btPersistentManifold* getManifoldByIndexInternal(int index) const
00103 {
00104 return m_manifoldsPtr[index];
00105 }
00106
00107 btCollisionDispatcher (btCollisionConfiguration* collisionConfiguration);
00108
00109 virtual ~btCollisionDispatcher();
00110
00111 virtual btPersistentManifold* getNewManifold(const btCollisionObject* b0,const btCollisionObject* b1);
00112
00113 virtual void releaseManifold(btPersistentManifold* manifold);
00114
00115
00116 virtual void clearManifold(btPersistentManifold* manifold);
00117
00118 btCollisionAlgorithm* findAlgorithm(const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,btPersistentManifold* sharedManifold = 0);
00119
00120 virtual bool needsCollision(const btCollisionObject* body0,const btCollisionObject* body1);
00121
00122 virtual bool needsResponse(const btCollisionObject* body0,const btCollisionObject* body1);
00123
00124 virtual void dispatchAllCollisionPairs(btOverlappingPairCache* pairCache,const btDispatcherInfo& dispatchInfo,btDispatcher* dispatcher) ;
00125
00126 void setNearCallback(btNearCallback nearCallback)
00127 {
00128 m_nearCallback = nearCallback;
00129 }
00130
00131 btNearCallback getNearCallback() const
00132 {
00133 return m_nearCallback;
00134 }
00135
00136
00137 static void defaultNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo);
00138
00139 virtual void* allocateCollisionAlgorithm(int size);
00140
00141 virtual void freeCollisionAlgorithm(void* ptr);
00142
00143 btCollisionConfiguration* getCollisionConfiguration()
00144 {
00145 return m_collisionConfiguration;
00146 }
00147
00148 const btCollisionConfiguration* getCollisionConfiguration() const
00149 {
00150 return m_collisionConfiguration;
00151 }
00152
00153 void setCollisionConfiguration(btCollisionConfiguration* config)
00154 {
00155 m_collisionConfiguration = config;
00156 }
00157
00158 virtual btPoolAllocator* getInternalManifoldPool()
00159 {
00160 return m_persistentManifoldPoolAllocator;
00161 }
00162
00163 virtual const btPoolAllocator* getInternalManifoldPool() const
00164 {
00165 return m_persistentManifoldPoolAllocator;
00166 }
00167
00168 };
00169
00170 #endif //BT_COLLISION__DISPATCHER_H
00171