chipmunkdebugger.monkey2 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #Import "<std>"
  2. #Import "<mojo>"
  3. #Import "<chipmunk>"
  4. Using std..
  5. Using mojo..
  6. Using chipmunk..
  7. Class ChipmunkDebugger
  8. Method New()
  9. _options.drawCircle=DrawCircle
  10. _options.drawSegment=DrawSegment
  11. _options.drawFatSegment=DrawFatSegment
  12. _options.drawPolygon=DrawPolygon
  13. _options.drawDot=DrawDot
  14. _options.colorForShape=ColorForShape
  15. _options.flags=CP_SPACE_DEBUG_DRAW_SHAPES '|CP_SPACE_DEBUG_DRAW_CONSTRAINTS|CP_SPACE_DEBUG_DRAW_COLLISION_POINTS
  16. End
  17. Method DebugDraw( canvas:Canvas,space:cpSpace )
  18. _canvas=canvas
  19. cpSpaceDebugDraw( space,_options )
  20. End
  21. Protected
  22. Method DrawCircle( pos:cpVect,angle:cpFloat,radius:cpFloat,outlineColor:cpSpaceDebugColor,fillColor:cpSpaceDebugColor,data:cpDataPointer )
  23. _canvas.Color=New Color( fillColor.r,fillColor.g,fillColor.b,fillColor.a )
  24. _canvas.DrawCircle( pos.x,pos.y,radius )
  25. _canvas.Color=Color.Black
  26. _canvas.DrawLine( pos.x,pos.y,pos.x+Cos( angle )*radius,pos.y+Sin( angle )*radius )
  27. End
  28. Method DrawSegment( a:cpVect,b:cpVect,color:cpSpaceDebugColor,data:cpDataPointer )
  29. _canvas.Color=New Color( color.r,color.g,color.b,color.a )
  30. _canvas.LineWidth=1
  31. _canvas.DrawLine( a.x,a.y,b.x,b.y )
  32. End
  33. Method DrawFatSegment( a:cpVect,b:cpVect,radius:cpFloat,outlineColor:cpSpaceDebugColor,fillColor:cpSpaceDebugColor,data:cpDataPointer )
  34. _canvas.Color=New Color( fillColor.r,fillColor.g,fillColor.b,fillColor.a )
  35. _canvas.LineWidth=radius
  36. _canvas.DrawLine( a.x,a.y,b.x,b.y )
  37. End
  38. Method DrawPolygon( count:Int,verts:cpVect Ptr,radius:cpFloat,outlineColor:cpSpaceDebugColor,fillColor:cpSpaceDebugColor,data:cpDataPointer )
  39. Local vs:=New Float[count*2]
  40. For Local i:=0 Until count
  41. vs[i*2]=verts[i].x
  42. vs[i*2+1]=verts[i].y
  43. Next
  44. _canvas.Color=New Color( fillColor.r,fillColor.g,fillColor.b,fillColor.a )
  45. _canvas.DrawPolys( count,1,vs )
  46. End
  47. Method DrawDot( size:cpFloat,pos:cpVect,color:cpSpaceDebugColor,data:cpDataPointer )
  48. _canvas.Color=New Color( color.r,color.g,color.b,color.a )
  49. _canvas.PointSize=size
  50. _canvas.DrawPoint( pos.x,pos.y )
  51. End
  52. Method ColorForShape:cpSpaceDebugColor( shape:cpShape,data:cpDataPointer )
  53. Local color:=_colors[shape]
  54. If color.a Return color
  55. color.r=Rnd( 1 )
  56. color.g=Rnd( 1-color.r )
  57. color.b=Rnd( 1-color.r-color.g )
  58. color.a=1
  59. _colors[shape]=color
  60. Return color
  61. End
  62. Private
  63. Field _options:=New cpSpaceDebugDrawOptions
  64. Field _colors:=New Map<cpShape,cpSpaceDebugColor>
  65. Field _canvas:Canvas
  66. End