chipmunkdebugger.monkey2 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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. canvas.OutlineMode=OutlineMode.Smooth
  20. canvas.OutlineWidth=3
  21. cpSpaceDebugDraw( space,_options )
  22. End
  23. Protected
  24. Method DrawCircle( pos:cpVect,angle:cpFloat,radius:cpFloat,outlineColor:cpSpaceDebugColor,fillColor:cpSpaceDebugColor,data:cpDataPointer )
  25. _canvas.OutlineColor=New Color( outlineColor.r,outlineColor.g,outlineColor.b )
  26. _canvas.Color=New Color( fillColor.r,fillColor.g,fillColor.b )
  27. _canvas.DrawCircle( pos.x,pos.y,radius )
  28. _canvas.Color=Color.Black
  29. _canvas.DrawLine( pos.x,pos.y,pos.x+Cos( angle )*radius,pos.y+Sin( angle )*radius )
  30. End
  31. Method DrawSegment( a:cpVect,b:cpVect,color:cpSpaceDebugColor,data:cpDataPointer )
  32. _canvas.Color=New Color( color.r,color.g,color.b )
  33. _canvas.LineWidth=1
  34. _canvas.DrawLine( a.x,a.y,b.x,b.y )
  35. End
  36. Method DrawFatSegment( a:cpVect,b:cpVect,radius:cpFloat,outlineColor:cpSpaceDebugColor,fillColor:cpSpaceDebugColor,data:cpDataPointer )
  37. _canvas.OutlineColor=New Color( outlineColor.r,outlineColor.g,outlineColor.b )
  38. _canvas.Color=New Color( fillColor.r,fillColor.g,fillColor.b )
  39. _canvas.LineWidth=radius
  40. _canvas.DrawLine( a.x,a.y,b.x,b.y )
  41. End
  42. Method DrawPolygon( count:Int,verts:cpVect Ptr,radius:cpFloat,outlineColor:cpSpaceDebugColor,fillColor:cpSpaceDebugColor,data:cpDataPointer )
  43. Local vs:=New Float[count*2]
  44. For Local i:=0 Until count
  45. vs[i*2]=verts[i].x
  46. vs[i*2+1]=verts[i].y
  47. Next
  48. _canvas.OutlineColor=New Color( outlineColor.r,outlineColor.g,outlineColor.b )
  49. _canvas.Color=New Color( fillColor.r,fillColor.g,fillColor.b )
  50. _canvas.DrawPolys( count,1,vs )
  51. End
  52. Method DrawDot( size:cpFloat,pos:cpVect,color:cpSpaceDebugColor,data:cpDataPointer )
  53. _canvas.Color=New Color( color.r,color.g,color.b )
  54. _canvas.PointSize=size
  55. _canvas.DrawPoint( pos.x,pos.y )
  56. End
  57. Method ColorForShape:cpSpaceDebugColor( shape:cpShape,data:cpDataPointer )
  58. Local color:=_colors[shape]
  59. If color.a Return color
  60. color.r=Rnd( 1 )
  61. color.g=Rnd( 1-color.r )
  62. color.b=Rnd( 1-color.r-color.g )
  63. color.a=1
  64. _colors[shape]=color
  65. Return color
  66. End
  67. Private
  68. Field _options:=New cpSpaceDebugDrawOptions
  69. Field _colors:=New Map<cpShape,cpSpaceDebugColor>
  70. Field _canvas:Canvas
  71. End