collisiondetect.cpp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "collisiondetect.h"
  2. namespace{
  3. void *_colls[65536];
  4. void **_collp=_colls;
  5. }
  6. void collisionCallback( btDynamicsWorld *world,btScalar timeStep ){
  7. int numManifolds=world->getDispatcher()->getNumManifolds();
  8. for( int i=0;i<numManifolds;++i ){
  9. btPersistentManifold *manifold=world->getDispatcher()->getManifoldByIndexInternal( i );
  10. const btCollisionObject *body0=manifold->getBody0();
  11. const btCollisionObject *body1=manifold->getBody1();
  12. // printf( "Collision! body0=%p body1=%p\n",body0,body1 );fflush( stdout );
  13. *_collp++=body0->getUserPointer();
  14. *_collp++=body1->getUserPointer();
  15. }
  16. }
  17. bool contactAddedCallback( btManifoldPoint &cp,const btCollisionObjectWrapper *colObj0,int partId0,int index0,const btCollisionObjectWrapper *colObj1,int partId1,int index1 ){
  18. printf( "contact added!\n" );fflush( stdout );
  19. return true;
  20. }
  21. bool contactProcessedCallback( btManifoldPoint &cp,void *body0,void *body1 ){
  22. //printf( "contact processed!\n" );fflush( stdout );
  23. return true;
  24. }
  25. bool contactDestroyedCallback( void *userPersistentData ){
  26. printf( "contact destroyed!\n" );fflush( stdout );
  27. return true;
  28. }
  29. /*
  30. void collisionCallback( btDynamicsWorld *world,btScalar timeStep )
  31. {
  32. int numManifolds = world->getDispatcher()->getNumManifolds();
  33. for (int i = 0; i < numManifolds; i++)
  34. {
  35. btPersistentManifold* contactManifold = world->getDispatcher()->getManifoldByIndexInternal(i);
  36. const btCollisionObject* obA = contactManifold->getBody0();
  37. const btCollisionObject* obB = contactManifold->getBody1();
  38. int numContacts = contactManifold->getNumContacts();
  39. for (int j = 0; j < numContacts; j++)
  40. {
  41. btManifoldPoint& pt = contactManifold->getContactPoint(j);
  42. if (pt.getDistance() < 0.f)
  43. {
  44. const btVector3& ptA = pt.getPositionWorldOnA();
  45. const btVector3& ptB = pt.getPositionWorldOnB();
  46. const btVector3& normalOnB = pt.m_normalWorldOnB;
  47. printf( "Collision!\n" );fflush( stdout );
  48. }
  49. }
  50. }
  51. }
  52. */
  53. void initCollisions( btDynamicsWorld *world ){
  54. world->setInternalTickCallback( &collisionCallback,0,false );
  55. // gContactAddedCallback=&contactAddedCallback;
  56. // gContactProcessedCallback=&contactProcessedCallback;
  57. // gContactDestroyedCallback=&contactDestroyedCallback;
  58. }
  59. void resetCollisions(){
  60. _collp=_colls;
  61. }
  62. int getNumCollisions(){
  63. return (_collp-_colls)/2;
  64. }
  65. void **getCollisions(){
  66. return _colls;
  67. }