chipmunk_glue.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #include "chipmunk_glue.h"
  2. // ***** cpCollisionHandler *****
  3. namespace{
  4. cpBool collisionTrueFunc( cpArbiter *arbiter,cpSpace *space,cpDataPointer data ){
  5. return true;
  6. }
  7. void collisionVoidFunc( cpArbiter *arbiter,cpSpace *space,cpDataPointer data ){
  8. }
  9. cpBool collisionBeginFunc( cpArbiter *arbiter,cpSpace *space,cpDataPointer data ){
  10. bb_cpCollisionHandler *handler=(bb_cpCollisionHandler*)data;
  11. return handler->beginFunc( arbiter,space,handler->userData );
  12. }
  13. cpBool collisionPreSolveFunc( cpArbiter *arbiter,cpSpace *space,cpDataPointer data ){
  14. bb_cpCollisionHandler *handler=(bb_cpCollisionHandler*)data;
  15. return handler->preSolveFunc( arbiter,space,handler->userData );
  16. }
  17. void collisionPostSolveFunc( cpArbiter *arbiter,cpSpace *space,cpDataPointer data ){
  18. bb_cpCollisionHandler *handler=(bb_cpCollisionHandler*)data;
  19. handler->postSolveFunc( arbiter,space,handler->userData );
  20. }
  21. void collisionSeparateFunc( cpArbiter *arbiter,cpSpace *space,cpDataPointer data ){
  22. bb_cpCollisionHandler *handler=(bb_cpCollisionHandler*)data;
  23. handler->separateFunc( arbiter,space,handler->userData );
  24. }
  25. bb_cpCollisionHandler *bbHandler( cpCollisionHandler *handler ){
  26. bb_cpCollisionHandler *bbhandler=(bb_cpCollisionHandler*)handler->userData;
  27. if( bbhandler ) return bbhandler;
  28. bbhandler=new bb_cpCollisionHandler; //FIXME: GC leak!
  29. bbhandler->typeA=handler->typeA; //assume these are const-ish?
  30. bbhandler->typeB=handler->typeB;
  31. bbhandler->beginFunc=bbMakefunc( collisionTrueFunc );
  32. bbhandler->preSolveFunc=bbMakefunc( collisionTrueFunc );
  33. bbhandler->postSolveFunc=bbMakefunc( collisionVoidFunc );
  34. bbhandler->separateFunc=bbMakefunc( collisionVoidFunc );
  35. handler->beginFunc=collisionBeginFunc;
  36. handler->preSolveFunc=collisionPreSolveFunc;
  37. handler->postSolveFunc=collisionPostSolveFunc;
  38. handler->separateFunc=collisionSeparateFunc;
  39. handler->userData=bbhandler;
  40. return bbhandler;
  41. }
  42. }
  43. void bb_cpCollisionHandler::gcMark(){
  44. bbGCMark( beginFunc );
  45. bbGCMark( preSolveFunc );
  46. bbGCMark( postSolveFunc );
  47. bbGCMark( separateFunc );
  48. }
  49. bb_cpCollisionHandler *bb_cpSpaceAddDefaultCollisionHandler( cpSpace *space ){
  50. cpCollisionHandler *handler=cpSpaceAddDefaultCollisionHandler( space );
  51. return bbHandler( handler );
  52. }
  53. bb_cpCollisionHandler *bb_cpSpaceAddCollisionHandler( cpSpace *space,cpCollisionType a,cpCollisionType b ){
  54. cpCollisionHandler *handler=cpSpaceAddCollisionHandler( space,a,b );
  55. return bbHandler( handler );
  56. }
  57. bb_cpCollisionHandler *bb_cpSpaceAddWildcardHandler( cpSpace *space,cpCollisionType t ){
  58. cpCollisionHandler *handler=cpSpaceAddWildcardHandler( space,t );
  59. return bbHandler( handler );
  60. }
  61. // ***** cpSpaceDebugDraw *****
  62. namespace{
  63. void debugDrawCircle(cpVect pos, cpFloat angle, cpFloat radius, cpSpaceDebugColor outlineColor, cpSpaceDebugColor fillColor, cpDataPointer data ){
  64. bb_cpSpaceDebugDrawOptions *opts=(bb_cpSpaceDebugDrawOptions*)data;
  65. opts->drawCircle( pos,angle,radius,outlineColor,fillColor,opts->userData );
  66. }
  67. void debugDrawSegment(cpVect a, cpVect b, cpSpaceDebugColor color, cpDataPointer data){
  68. bb_cpSpaceDebugDrawOptions *opts=(bb_cpSpaceDebugDrawOptions*)data;
  69. opts->drawSegment( a,b,color,opts->userData );
  70. }
  71. void debugDrawFatSegment(cpVect a, cpVect b, cpFloat radius, cpSpaceDebugColor outlineColor, cpSpaceDebugColor fillColor, cpDataPointer data){
  72. bb_cpSpaceDebugDrawOptions *opts=(bb_cpSpaceDebugDrawOptions*)data;
  73. opts->drawFatSegment( a,b,radius,outlineColor,fillColor,opts->userData );
  74. }
  75. void debugDrawPolygon(int count, const cpVect *verts, cpFloat radius, cpSpaceDebugColor outlineColor, cpSpaceDebugColor fillColor, cpDataPointer data){
  76. bb_cpSpaceDebugDrawOptions *opts=(bb_cpSpaceDebugDrawOptions*)data;
  77. opts->drawPolygon( count,(cpVect*)verts,radius,outlineColor,fillColor,opts->userData );
  78. }
  79. void debugDrawDot(cpFloat size, cpVect pos, cpSpaceDebugColor color, cpDataPointer data){
  80. bb_cpSpaceDebugDrawOptions *opts=(bb_cpSpaceDebugDrawOptions*)data;
  81. opts->drawDot( size,pos,color,opts->userData );
  82. }
  83. cpSpaceDebugColor debugDrawColorForShape(cpShape *shape, cpDataPointer data){
  84. bb_cpSpaceDebugDrawOptions *opts=(bb_cpSpaceDebugDrawOptions*)data;
  85. return opts->colorForShape( shape,opts->userData );
  86. }
  87. }
  88. void bb_cpSpaceDebugDrawOptions::gcMark(){
  89. bbGCMark( drawCircle );
  90. bbGCMark( drawSegment );
  91. bbGCMark( drawFatSegment );
  92. bbGCMark( drawPolygon );
  93. bbGCMark( colorForShape );
  94. }
  95. void bb_cpSpaceDebugDraw( cpSpace *space,bb_cpSpaceDebugDrawOptions *options ){
  96. cpSpaceDebugDrawOptions opts;
  97. opts.drawCircle=debugDrawCircle;
  98. opts.drawSegment=debugDrawSegment;
  99. opts.drawFatSegment=debugDrawFatSegment;
  100. opts.drawPolygon=debugDrawPolygon;
  101. opts.drawDot=debugDrawDot;
  102. opts.flags=options->flags;
  103. opts.shapeOutlineColor=options->shapeOutlineColor;
  104. opts.colorForShape=debugDrawColorForShape;
  105. opts.constraintColor=options->constraintColor;
  106. opts.collisionPointColor=options->collisionPointColor;
  107. opts.data=options;
  108. cpSpaceDebugDraw( space,&opts );
  109. }