collisiondetect.cpp 2.7 KB

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