00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef BT_GIMPACT_BVH_CONCAVE_COLLISION_ALGORITHM_H
00025 #define BT_GIMPACT_BVH_CONCAVE_COLLISION_ALGORITHM_H
00026
00027 #include "BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h"
00028 #include "BulletCollision/BroadphaseCollision/btDispatcher.h"
00029 #include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h"
00030 #include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h"
00031 class btDispatcher;
00032 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
00033 #include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h"
00034 #include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
00035
00036 #include "LinearMath/btAlignedObjectArray.h"
00037
00038 #include "btGImpactShape.h"
00039 #include "BulletCollision/CollisionShapes/btStaticPlaneShape.h"
00040 #include "BulletCollision/CollisionShapes/btCompoundShape.h"
00041 #include "BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h"
00042 #include "LinearMath/btIDebugDraw.h"
00043
00044
00045
00047
00054 class btGImpactCollisionAlgorithm : public btActivatingCollisionAlgorithm
00055 {
00056 protected:
00057 btCollisionAlgorithm * m_convex_algorithm;
00058 btPersistentManifold * m_manifoldPtr;
00059 btManifoldResult* m_resultOut;
00060 const btDispatcherInfo * m_dispatchInfo;
00061 int m_triface0;
00062 int m_part0;
00063 int m_triface1;
00064 int m_part1;
00065
00066
00068 SIMD_FORCE_INLINE btPersistentManifold* newContactManifold(btCollisionObject* body0,btCollisionObject* body1)
00069 {
00070 m_manifoldPtr = m_dispatcher->getNewManifold(body0,body1);
00071 return m_manifoldPtr;
00072 }
00073
00074 SIMD_FORCE_INLINE void destroyConvexAlgorithm()
00075 {
00076 if(m_convex_algorithm)
00077 {
00078 m_convex_algorithm->~btCollisionAlgorithm();
00079 m_dispatcher->freeCollisionAlgorithm( m_convex_algorithm);
00080 m_convex_algorithm = NULL;
00081 }
00082 }
00083
00084 SIMD_FORCE_INLINE void destroyContactManifolds()
00085 {
00086 if(m_manifoldPtr == NULL) return;
00087 m_dispatcher->releaseManifold(m_manifoldPtr);
00088 m_manifoldPtr = NULL;
00089 }
00090
00091 SIMD_FORCE_INLINE void clearCache()
00092 {
00093 destroyContactManifolds();
00094 destroyConvexAlgorithm();
00095
00096 m_triface0 = -1;
00097 m_part0 = -1;
00098 m_triface1 = -1;
00099 m_part1 = -1;
00100 }
00101
00102 SIMD_FORCE_INLINE btPersistentManifold* getLastManifold()
00103 {
00104 return m_manifoldPtr;
00105 }
00106
00107
00108
00109 SIMD_FORCE_INLINE void checkManifold(btCollisionObject* body0,btCollisionObject* body1)
00110 {
00111 if(getLastManifold() == 0)
00112 {
00113 newContactManifold(body0,body1);
00114 }
00115
00116 m_resultOut->setPersistentManifold(getLastManifold());
00117 }
00118
00119
00120 SIMD_FORCE_INLINE btCollisionAlgorithm * newAlgorithm(btCollisionObject* body0,btCollisionObject* body1)
00121 {
00122 checkManifold(body0,body1);
00123
00124 btCollisionAlgorithm * convex_algorithm = m_dispatcher->findAlgorithm(
00125 body0,body1,getLastManifold());
00126 return convex_algorithm ;
00127 }
00128
00129
00130 SIMD_FORCE_INLINE void checkConvexAlgorithm(btCollisionObject* body0,btCollisionObject* body1)
00131 {
00132 if(m_convex_algorithm) return;
00133 m_convex_algorithm = newAlgorithm(body0,body1);
00134 }
00135
00136
00137
00138
00139 void addContactPoint(btCollisionObject * body0,
00140 btCollisionObject * body1,
00141 const btVector3 & point,
00142 const btVector3 & normal,
00143 btScalar distance);
00144
00147
00148 void collide_gjk_triangles(btCollisionObject * body0,
00149 btCollisionObject * body1,
00150 btGImpactMeshShapePart * shape0,
00151 btGImpactMeshShapePart * shape1,
00152 const int * pairs, int pair_count);
00153
00154 void collide_sat_triangles(btCollisionObject * body0,
00155 btCollisionObject * body1,
00156 btGImpactMeshShapePart * shape0,
00157 btGImpactMeshShapePart * shape1,
00158 const int * pairs, int pair_count);
00159
00160
00161
00162
00163 void shape_vs_shape_collision(
00164 btCollisionObject * body0,
00165 btCollisionObject * body1,
00166 btCollisionShape * shape0,
00167 btCollisionShape * shape1);
00168
00169 void convex_vs_convex_collision(btCollisionObject * body0,
00170 btCollisionObject * body1,
00171 btCollisionShape * shape0,
00172 btCollisionShape * shape1);
00173
00174
00175
00176 void gimpact_vs_gimpact_find_pairs(
00177 const btTransform & trans0,
00178 const btTransform & trans1,
00179 btGImpactShapeInterface * shape0,
00180 btGImpactShapeInterface * shape1,btPairSet & pairset);
00181
00182 void gimpact_vs_shape_find_pairs(
00183 const btTransform & trans0,
00184 const btTransform & trans1,
00185 btGImpactShapeInterface * shape0,
00186 btCollisionShape * shape1,
00187 btAlignedObjectArray<int> & collided_primitives);
00188
00189
00190 void gimpacttrimeshpart_vs_plane_collision(
00191 btCollisionObject * body0,
00192 btCollisionObject * body1,
00193 btGImpactMeshShapePart * shape0,
00194 btStaticPlaneShape * shape1,bool swapped);
00195
00196
00197 public:
00198
00199 btGImpactCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1);
00200
00201 virtual ~btGImpactCollisionAlgorithm();
00202
00203 virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
00204
00205 btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
00206
00207 virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
00208 {
00209 if (m_manifoldPtr)
00210 manifoldArray.push_back(m_manifoldPtr);
00211 }
00212
00213
00214 struct CreateFunc :public btCollisionAlgorithmCreateFunc
00215 {
00216 virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1)
00217 {
00218 void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btGImpactCollisionAlgorithm));
00219 return new(mem) btGImpactCollisionAlgorithm(ci,body0,body1);
00220 }
00221 };
00222
00224 static void registerAlgorithm(btCollisionDispatcher * dispatcher);
00225 #ifdef TRI_COLLISION_PROFILING
00226
00227 static float getAverageTreeCollisionTime();
00228
00230 static float getAverageTriangleCollisionTime();
00231 #endif //TRI_COLLISION_PROFILING
00232
00234
00239 void gimpact_vs_gimpact(btCollisionObject * body0,
00240 btCollisionObject * body1,
00241 btGImpactShapeInterface * shape0,
00242 btGImpactShapeInterface * shape1);
00243
00244 void gimpact_vs_shape(btCollisionObject * body0,
00245 btCollisionObject * body1,
00246 btGImpactShapeInterface * shape0,
00247 btCollisionShape * shape1,bool swapped);
00248
00249 void gimpact_vs_compoundshape(btCollisionObject * body0,
00250 btCollisionObject * body1,
00251 btGImpactShapeInterface * shape0,
00252 btCompoundShape * shape1,bool swapped);
00253
00254 void gimpact_vs_concave(
00255 btCollisionObject * body0,
00256 btCollisionObject * body1,
00257 btGImpactShapeInterface * shape0,
00258 btConcaveShape * shape1,bool swapped);
00259
00260
00261
00262
00264 void setFace0(int value)
00265 {
00266 m_triface0 = value;
00267 }
00268 int getFace0()
00269 {
00270 return m_triface0;
00271 }
00272 void setFace1(int value)
00273 {
00274 m_triface1 = value;
00275 }
00276 int getFace1()
00277 {
00278 return m_triface1;
00279 }
00280 void setPart0(int value)
00281 {
00282 m_part0 = value;
00283 }
00284 int getPart0()
00285 {
00286 return m_part0;
00287 }
00288 void setPart1(int value)
00289 {
00290 m_part1 = value;
00291 }
00292 int getPart1()
00293 {
00294 return m_part1;
00295 }
00296
00297 };
00298
00299
00300
00301
00302 #define GIMPACT_VS_PLANE_COLLISION 1
00303
00304
00305
00306 #endif //BT_GIMPACT_BVH_CONCAVE_COLLISION_ALGORITHM_H