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_CONVEX_CONCAVE_COLLISION_ALGORITHM_H
00017 #define BT_CONVEX_CONCAVE_COLLISION_ALGORITHM_H
00018
00019 #include "btActivatingCollisionAlgorithm.h"
00020 #include "BulletCollision/BroadphaseCollision/btDispatcher.h"
00021 #include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h"
00022 #include "BulletCollision/CollisionShapes/btTriangleCallback.h"
00023 #include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h"
00024 class btDispatcher;
00025 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
00026 #include "btCollisionCreateFunc.h"
00027
00029 class btConvexTriangleCallback : public btTriangleCallback
00030 {
00031 btCollisionObject* m_convexBody;
00032 btCollisionObject* m_triBody;
00033
00034 btVector3 m_aabbMin;
00035 btVector3 m_aabbMax ;
00036
00037
00038 btManifoldResult* m_resultOut;
00039 btDispatcher* m_dispatcher;
00040 const btDispatcherInfo* m_dispatchInfoPtr;
00041 btScalar m_collisionMarginTriangle;
00042
00043 public:
00044 int m_triangleCount;
00045
00046 btPersistentManifold* m_manifoldPtr;
00047
00048 btConvexTriangleCallback(btDispatcher* dispatcher,btCollisionObject* body0,btCollisionObject* body1,bool isSwapped);
00049
00050 void setTimeStepAndCounters(btScalar collisionMarginTriangle,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
00051
00052 virtual ~btConvexTriangleCallback();
00053
00054 virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex);
00055
00056 void clearCache();
00057
00058 SIMD_FORCE_INLINE const btVector3& getAabbMin() const
00059 {
00060 return m_aabbMin;
00061 }
00062 SIMD_FORCE_INLINE const btVector3& getAabbMax() const
00063 {
00064 return m_aabbMax;
00065 }
00066
00067 };
00068
00069
00070
00071
00073 class btConvexConcaveCollisionAlgorithm : public btActivatingCollisionAlgorithm
00074 {
00075
00076 bool m_isSwapped;
00077
00078 btConvexTriangleCallback m_btConvexTriangleCallback;
00079
00080
00081
00082 public:
00083
00084 btConvexConcaveCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1,bool isSwapped);
00085
00086 virtual ~btConvexConcaveCollisionAlgorithm();
00087
00088 virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
00089
00090 btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
00091
00092 virtual void getAllContactManifolds(btManifoldArray& manifoldArray);
00093
00094 void clearCache();
00095
00096 struct CreateFunc :public btCollisionAlgorithmCreateFunc
00097 {
00098 virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1)
00099 {
00100 void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btConvexConcaveCollisionAlgorithm));
00101 return new(mem) btConvexConcaveCollisionAlgorithm(ci,body0,body1,false);
00102 }
00103 };
00104
00105 struct SwappedCreateFunc :public btCollisionAlgorithmCreateFunc
00106 {
00107 virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1)
00108 {
00109 void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btConvexConcaveCollisionAlgorithm));
00110 return new(mem) btConvexConcaveCollisionAlgorithm(ci,body0,body1,true);
00111 }
00112 };
00113
00114 };
00115
00116 #endif //BT_CONVEX_CONCAVE_COLLISION_ALGORITHM_H