collisiondetect.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include "collisiondetect.h"
  2. namespace{
  3. void *_colls[65536];
  4. void **_collp=_colls;
  5. }
  6. /*
  7. void collisionCallback( btDynamicsWorld *world,btScalar timeStep ){
  8. int numManifolds=world->getDispatcher()->getNumManifolds();
  9. for( int i=0;i<numManifolds;++i ){
  10. btPersistentManifold *contactManifold=world->getDispatcher()->getManifoldByIndexInternal( i );
  11. // printf( "procing %f breaking %f\n",contactManifold->getContactProcessingThreshold(),contactManifold->getContactBreakingThreshold() );
  12. // fflush( stdout );
  13. int numContacts=contactManifold->getNumContacts();
  14. if( !numContacts ) continue;
  15. for( int j=0;j<numContacts;++j ){
  16. btManifoldPoint &pt=contactManifold->getContactPoint( j );
  17. printf( "pt.distance %f \n",pt.getDistance() );fflush( stdout );
  18. if( contactManifold->validContactDistance( pt ) ){
  19. // if( pt.getDistance()<0.0f ){
  20. printf( "pt.distance %f \n",pt.getDistance() );fflush( stdout );
  21. const btCollisionObject *body0=contactManifold->getBody0();
  22. const btCollisionObject *body1=contactManifold->getBody1();
  23. *_collp++=body0->getUserPointer(); //nasty global somewhere
  24. *_collp++=body1->getUserPointer();
  25. break;
  26. }
  27. }
  28. }
  29. }
  30. */
  31. ///*
  32. void collisionCallback( btDynamicsWorld *world,btScalar timeStep ){
  33. int numManifolds=world->getDispatcher()->getNumManifolds();
  34. for( int i=0;i<numManifolds;++i ){
  35. btPersistentManifold *contactManifold=world->getDispatcher()->getManifoldByIndexInternal( i );
  36. int numContacts=contactManifold->getNumContacts();
  37. if( !numContacts ) continue;
  38. const btCollisionObject *body0=contactManifold->getBody0();
  39. const btCollisionObject *body1=contactManifold->getBody1();
  40. *_collp++=body0->getUserPointer();
  41. *_collp++=body1->getUserPointer();
  42. }
  43. }
  44. //*/
  45. bool contactAddedCallback( btManifoldPoint &cp,const btCollisionObjectWrapper *colObj0,int partId0,int index0,const btCollisionObjectWrapper *colObj1,int partId1,int index1 ){
  46. printf( "contact added!\n" );fflush( stdout );
  47. return true;
  48. }
  49. bool contactProcessedCallback( btManifoldPoint &cp,void *body0,void *body1 ){
  50. printf( "contact processed!\n" );fflush( stdout );
  51. return true;
  52. }
  53. bool contactDestroyedCallback( void *userPersistentData ){
  54. printf( "contact destroyed!\n" );fflush( stdout );
  55. return true;
  56. }
  57. /*
  58. void collisionCallback( btDynamicsWorld *world,btScalar timeStep )
  59. {
  60. int numManifolds = world->getDispatcher()->getNumManifolds();
  61. for (int i = 0; i < numManifolds; i++)
  62. {
  63. btPersistentManifold* contactManifold = world->getDispatcher()->getManifoldByIndexInternal(i);
  64. const btCollisionObject* obA = contactManifold->getBody0();
  65. const btCollisionObject* obB = contactManifold->getBody1();
  66. int numContacts = contactManifold->getNumContacts();
  67. for (int j = 0; j < numContacts; j++)
  68. {
  69. btManifoldPoint& pt = contactManifold->getContactPoint(j);
  70. if (pt.getDistance() < 0.f)
  71. {
  72. const btVector3& ptA = pt.getPositionWorldOnA();
  73. const btVector3& ptB = pt.getPositionWorldOnB();
  74. const btVector3& normalOnB = pt.m_normalWorldOnB;
  75. printf( "Collision!\n" );fflush( stdout );
  76. }
  77. }
  78. }
  79. }
  80. */
  81. void initCollisions( btDynamicsWorld *world ){
  82. world->setInternalTickCallback( &collisionCallback,0,false );
  83. // gContactAddedCallback=&contactAddedCallback;
  84. // gContactProcessedCallback=&contactProcessedCallback;
  85. // gContactDestroyedCallback=&contactDestroyedCallback;
  86. }
  87. void resetCollisions(){
  88. _collp=_colls;
  89. }
  90. int getNumCollisions(){
  91. return (_collp-_colls)/2;
  92. }
  93. void **getCollisions(){
  94. return _colls;
  95. }