reflexion 0.1.12 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. checksums.yaml +5 -5
  2. data/.doc/ext/reflex/application.cpp +9 -5
  3. data/.doc/ext/reflex/capture_event.cpp +0 -4
  4. data/.doc/ext/reflex/contact_event.cpp +17 -10
  5. data/.doc/ext/reflex/draw_event.cpp +1 -5
  6. data/.doc/ext/reflex/ellipse_shape.cpp +51 -24
  7. data/.doc/ext/reflex/event.cpp +0 -4
  8. data/.doc/ext/reflex/filter.cpp +81 -0
  9. data/.doc/ext/reflex/focus_event.cpp +9 -13
  10. data/.doc/ext/reflex/frame_event.cpp +40 -6
  11. data/.doc/ext/reflex/image_view.cpp +1 -10
  12. data/.doc/ext/reflex/key_event.cpp +2 -6
  13. data/.doc/ext/reflex/line_shape.cpp +99 -0
  14. data/.doc/ext/reflex/motion_event.cpp +75 -0
  15. data/.doc/ext/reflex/native.cpp +18 -18
  16. data/.doc/ext/reflex/pointer_event.cpp +5 -11
  17. data/.doc/ext/reflex/polygon_shape.cpp +65 -0
  18. data/.doc/ext/reflex/rect_shape.cpp +102 -23
  19. data/.doc/ext/reflex/reflex.cpp +21 -2
  20. data/.doc/ext/reflex/scroll_event.cpp +0 -6
  21. data/.doc/ext/reflex/selector.cpp +43 -15
  22. data/.doc/ext/reflex/shape.cpp +211 -0
  23. data/.doc/ext/reflex/style.cpp +359 -185
  24. data/.doc/ext/reflex/style_length.cpp +163 -35
  25. data/.doc/ext/reflex/timer.cpp +101 -0
  26. data/.doc/ext/reflex/timer_event.cpp +123 -0
  27. data/.doc/ext/reflex/update_event.cpp +11 -6
  28. data/.doc/ext/reflex/view.cpp +548 -144
  29. data/.doc/ext/reflex/wheel_event.cpp +0 -22
  30. data/.doc/ext/reflex/window.cpp +7 -15
  31. data/README.md +1 -1
  32. data/Rakefile +14 -12
  33. data/VERSION +1 -1
  34. data/ext/reflex/application.cpp +10 -5
  35. data/ext/reflex/capture_event.cpp +1 -5
  36. data/ext/reflex/contact_event.cpp +19 -11
  37. data/ext/reflex/defs.h +5 -2
  38. data/ext/reflex/draw_event.cpp +2 -6
  39. data/ext/reflex/ellipse_shape.cpp +56 -25
  40. data/ext/reflex/event.cpp +0 -4
  41. data/ext/reflex/extconf.rb +1 -2
  42. data/ext/reflex/filter.cpp +86 -0
  43. data/ext/reflex/focus_event.cpp +11 -15
  44. data/ext/reflex/frame_event.cpp +46 -7
  45. data/ext/reflex/image_view.cpp +1 -10
  46. data/ext/reflex/key_event.cpp +3 -7
  47. data/ext/reflex/line_shape.cpp +104 -0
  48. data/ext/reflex/motion_event.cpp +79 -0
  49. data/ext/reflex/native.cpp +18 -18
  50. data/ext/reflex/pointer_event.cpp +6 -12
  51. data/ext/reflex/polygon_shape.cpp +68 -0
  52. data/ext/reflex/rect_shape.cpp +113 -24
  53. data/ext/reflex/reflex.cpp +21 -2
  54. data/ext/reflex/scroll_event.cpp +1 -7
  55. data/ext/reflex/selector.cpp +46 -16
  56. data/ext/reflex/selector.h +130 -0
  57. data/ext/reflex/shape.cpp +231 -0
  58. data/ext/reflex/style.cpp +363 -192
  59. data/ext/reflex/style_length.cpp +164 -37
  60. data/ext/reflex/timer.cpp +108 -0
  61. data/ext/reflex/timer_event.cpp +133 -0
  62. data/ext/reflex/update_event.cpp +13 -7
  63. data/ext/reflex/view.cpp +594 -150
  64. data/ext/reflex/wheel_event.cpp +1 -25
  65. data/ext/reflex/window.cpp +7 -15
  66. data/include/reflex/application.h +2 -0
  67. data/include/reflex/debug.h +22 -0
  68. data/include/reflex/defs.h +45 -0
  69. data/include/reflex/event.h +60 -16
  70. data/include/reflex/exception.h +9 -0
  71. data/include/reflex/filter.h +56 -0
  72. data/include/reflex/image_view.h +1 -1
  73. data/include/reflex/ruby/application.h +17 -9
  74. data/include/reflex/ruby/event.h +22 -0
  75. data/include/reflex/ruby/filter.h +69 -0
  76. data/include/reflex/ruby/selector.h +1 -1
  77. data/include/reflex/ruby/shape.h +140 -0
  78. data/include/reflex/ruby/style.h +1 -1
  79. data/include/reflex/ruby/timer.h +69 -0
  80. data/include/reflex/ruby/view.h +43 -76
  81. data/include/reflex/ruby/window.h +17 -32
  82. data/include/reflex/ruby.h +6 -4
  83. data/include/reflex/selector.h +54 -2
  84. data/include/reflex/shape.h +211 -0
  85. data/include/reflex/style.h +111 -77
  86. data/include/reflex/timer.h +73 -0
  87. data/include/reflex/view.h +181 -59
  88. data/include/reflex/window.h +4 -3
  89. data/include/reflex.h +5 -4
  90. data/lib/reflex/application.rb +6 -3
  91. data/lib/reflex/button.rb +2 -2
  92. data/lib/reflex/capture_event.rb +7 -6
  93. data/lib/reflex/contact_event.rb +10 -12
  94. data/lib/reflex/draw_event.rb +6 -1
  95. data/lib/reflex/ellipse_shape.rb +27 -0
  96. data/lib/reflex/filter.rb +18 -0
  97. data/lib/reflex/fixture.rb +4 -0
  98. data/lib/reflex/focus_event.rb +10 -12
  99. data/lib/reflex/frame_event.rb +1 -1
  100. data/lib/reflex/helper.rb +17 -29
  101. data/lib/reflex/key_event.rb +13 -11
  102. data/lib/reflex/line_shape.rb +18 -0
  103. data/lib/reflex/{texture.rb → matrix.rb} +2 -2
  104. data/lib/reflex/module.rb +4 -19
  105. data/lib/reflex/pointer_event.rb +26 -37
  106. data/lib/reflex/polygon.rb +14 -0
  107. data/lib/reflex/polygon_shape.rb +23 -0
  108. data/lib/reflex/polyline.rb +13 -0
  109. data/lib/reflex/rect_shape.rb +20 -0
  110. data/lib/reflex/reflex.rb +1 -3
  111. data/lib/reflex/scroll_event.rb +1 -1
  112. data/lib/reflex/selector.rb +2 -2
  113. data/lib/reflex/shape.rb +62 -0
  114. data/lib/reflex/style.rb +78 -11
  115. data/lib/reflex/style_length.rb +0 -11
  116. data/lib/reflex/text_view.rb +7 -24
  117. data/lib/reflex/timer.rb +30 -0
  118. data/lib/reflex/timer_event.rb +29 -0
  119. data/lib/reflex/update_event.rb +1 -1
  120. data/lib/reflex/view.rb +127 -32
  121. data/lib/reflex/wheel_event.rb +9 -1
  122. data/lib/reflex/window.rb +29 -9
  123. data/lib/reflex.rb +11 -5
  124. data/lib/reflexion.rb +23 -7
  125. data/reflex.gemspec +8 -10
  126. data/samples/bats.rb +4 -4
  127. data/samples/fans.rb +1 -1
  128. data/samples/fps.rb +5 -3
  129. data/samples/hello.rb +4 -6
  130. data/samples/image.rb +5 -4
  131. data/samples/ios/hello/hello.xcodeproj/project.pbxproj +0 -2
  132. data/samples/layout.rb +16 -7
  133. data/samples/model.rb +10 -7
  134. data/samples/physics.rb +22 -20
  135. data/samples/reflexion/breakout.rb +4 -5
  136. data/samples/reflexion/hello.rb +2 -2
  137. data/samples/reflexion/jump_action.rb +191 -0
  138. data/samples/reflexion/noise.rb +23 -0
  139. data/samples/reflexion/paint.rb +7 -6
  140. data/samples/reflexion/physics.rb +15 -8
  141. data/samples/reflexion/pulse.rb +24 -10
  142. data/samples/shader.rb +8 -6
  143. data/samples/shapes.rb +63 -14
  144. data/samples/tree.rb +9 -10
  145. data/samples/views.rb +3 -3
  146. data/samples/visuals.rb +2 -5
  147. data/src/body.cpp +146 -345
  148. data/src/body.h +91 -0
  149. data/src/event.cpp +66 -16
  150. data/src/exception.cpp +13 -3
  151. data/src/filter.cpp +76 -0
  152. data/src/fixture.cpp +164 -39
  153. data/src/fixture.h +85 -0
  154. data/src/image_view.cpp +4 -4
  155. data/src/ios/app_delegate.h +5 -10
  156. data/src/ios/app_delegate.mm +79 -41
  157. data/src/ios/application.h +32 -0
  158. data/src/ios/application.mm +35 -25
  159. data/src/ios/event.mm +8 -4
  160. data/src/ios/reflex.mm +0 -7
  161. data/src/ios/view_controller.h +33 -0
  162. data/src/ios/view_controller.mm +436 -0
  163. data/src/ios/window.h +40 -0
  164. data/src/ios/window.mm +59 -250
  165. data/src/osx/app_delegate.h +5 -10
  166. data/src/osx/app_delegate.mm +52 -55
  167. data/src/osx/application.h +32 -0
  168. data/src/osx/application.mm +44 -39
  169. data/src/osx/native_window.h +0 -15
  170. data/src/osx/native_window.mm +131 -115
  171. data/src/osx/opengl_view.h +0 -2
  172. data/src/osx/opengl_view.mm +12 -3
  173. data/src/osx/reflex.mm +0 -9
  174. data/src/osx/window.h +42 -0
  175. data/src/osx/window.mm +45 -252
  176. data/src/selector.cpp +232 -7
  177. data/src/selector.h +52 -0
  178. data/src/shape.cpp +1191 -0
  179. data/src/shape.h +61 -0
  180. data/src/style.cpp +571 -374
  181. data/src/style.h +39 -0
  182. data/src/timer.cpp +291 -0
  183. data/src/timer.h +55 -0
  184. data/src/view.cpp +1624 -984
  185. data/src/view.h +56 -0
  186. data/src/win32/window.cpp +3 -4
  187. data/src/window.cpp +275 -20
  188. data/src/window.h +92 -0
  189. data/src/world.cpp +112 -111
  190. data/src/world.h +34 -53
  191. data/task/box2d.rake +31 -10
  192. data/test/test_capture_event.rb +8 -6
  193. data/test/test_pointer_event.rb +85 -0
  194. data/test/test_selector.rb +1 -1
  195. data/test/test_shape.rb +71 -0
  196. data/test/test_style.rb +77 -11
  197. data/test/test_style_length.rb +42 -13
  198. data/test/test_view.rb +138 -14
  199. metadata +109 -210
  200. data/.doc/ext/reflex/arc_shape.cpp +0 -89
  201. data/.doc/ext/reflex/body.cpp +0 -299
  202. data/.doc/ext/reflex/fixture.cpp +0 -101
  203. data/.doc/ext/reflex/shape_view.cpp +0 -153
  204. data/ext/reflex/arc_shape.cpp +0 -94
  205. data/ext/reflex/body.cpp +0 -328
  206. data/ext/reflex/fixture.cpp +0 -108
  207. data/ext/reflex/shape_view.cpp +0 -161
  208. data/include/reflex/bitmap.h +0 -20
  209. data/include/reflex/body.h +0 -128
  210. data/include/reflex/bounds.h +0 -20
  211. data/include/reflex/color.h +0 -20
  212. data/include/reflex/color_space.h +0 -20
  213. data/include/reflex/fixture.h +0 -117
  214. data/include/reflex/font.h +0 -20
  215. data/include/reflex/image.h +0 -20
  216. data/include/reflex/matrix.h +0 -20
  217. data/include/reflex/painter.h +0 -20
  218. data/include/reflex/point.h +0 -24
  219. data/include/reflex/ruby/body.h +0 -41
  220. data/include/reflex/ruby/fixture.h +0 -41
  221. data/include/reflex/ruby/shape_view.h +0 -96
  222. data/include/reflex/shader.h +0 -20
  223. data/include/reflex/shape_view.h +0 -146
  224. data/include/reflex/texture.h +0 -20
  225. data/lib/reflex/body.rb +0 -22
  226. data/lib/reflex/flags.rb +0 -18
  227. data/lib/reflex/shape_view.rb +0 -25
  228. data/src/ios/application_data.h +0 -45
  229. data/src/ios/native_window.h +0 -39
  230. data/src/ios/native_window.mm +0 -224
  231. data/src/ios/opengl_view.h +0 -13
  232. data/src/ios/opengl_view.mm +0 -139
  233. data/src/ios/window_data.h +0 -75
  234. data/src/osx/application_data.h +0 -45
  235. data/src/osx/window_data.h +0 -75
  236. data/src/physics/Box2D/Box2D.h +0 -68
  237. data/src/physics/Box2D/Collision/Shapes/b2ChainShape.cpp +0 -193
  238. data/src/physics/Box2D/Collision/Shapes/b2ChainShape.h +0 -105
  239. data/src/physics/Box2D/Collision/Shapes/b2CircleShape.cpp +0 -99
  240. data/src/physics/Box2D/Collision/Shapes/b2CircleShape.h +0 -91
  241. data/src/physics/Box2D/Collision/Shapes/b2EdgeShape.cpp +0 -138
  242. data/src/physics/Box2D/Collision/Shapes/b2EdgeShape.h +0 -74
  243. data/src/physics/Box2D/Collision/Shapes/b2PolygonShape.cpp +0 -467
  244. data/src/physics/Box2D/Collision/Shapes/b2PolygonShape.h +0 -101
  245. data/src/physics/Box2D/Collision/Shapes/b2Shape.h +0 -101
  246. data/src/physics/Box2D/Collision/b2BroadPhase.cpp +0 -119
  247. data/src/physics/Box2D/Collision/b2BroadPhase.h +0 -257
  248. data/src/physics/Box2D/Collision/b2CollideCircle.cpp +0 -154
  249. data/src/physics/Box2D/Collision/b2CollideEdge.cpp +0 -698
  250. data/src/physics/Box2D/Collision/b2CollidePolygon.cpp +0 -239
  251. data/src/physics/Box2D/Collision/b2Collision.cpp +0 -252
  252. data/src/physics/Box2D/Collision/b2Collision.h +0 -277
  253. data/src/physics/Box2D/Collision/b2Distance.cpp +0 -603
  254. data/src/physics/Box2D/Collision/b2Distance.h +0 -141
  255. data/src/physics/Box2D/Collision/b2DynamicTree.cpp +0 -778
  256. data/src/physics/Box2D/Collision/b2DynamicTree.h +0 -289
  257. data/src/physics/Box2D/Collision/b2TimeOfImpact.cpp +0 -486
  258. data/src/physics/Box2D/Collision/b2TimeOfImpact.h +0 -58
  259. data/src/physics/Box2D/Common/b2BlockAllocator.cpp +0 -215
  260. data/src/physics/Box2D/Common/b2BlockAllocator.h +0 -62
  261. data/src/physics/Box2D/Common/b2Draw.cpp +0 -44
  262. data/src/physics/Box2D/Common/b2Draw.h +0 -86
  263. data/src/physics/Box2D/Common/b2GrowableStack.h +0 -85
  264. data/src/physics/Box2D/Common/b2Math.cpp +0 -94
  265. data/src/physics/Box2D/Common/b2Math.h +0 -720
  266. data/src/physics/Box2D/Common/b2Settings.cpp +0 -44
  267. data/src/physics/Box2D/Common/b2Settings.h +0 -151
  268. data/src/physics/Box2D/Common/b2StackAllocator.cpp +0 -83
  269. data/src/physics/Box2D/Common/b2StackAllocator.h +0 -60
  270. data/src/physics/Box2D/Common/b2Timer.cpp +0 -101
  271. data/src/physics/Box2D/Common/b2Timer.h +0 -50
  272. data/src/physics/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp +0 -53
  273. data/src/physics/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h +0 -39
  274. data/src/physics/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp +0 -53
  275. data/src/physics/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h +0 -39
  276. data/src/physics/Box2D/Dynamics/Contacts/b2CircleContact.cpp +0 -52
  277. data/src/physics/Box2D/Dynamics/Contacts/b2CircleContact.h +0 -39
  278. data/src/physics/Box2D/Dynamics/Contacts/b2Contact.cpp +0 -247
  279. data/src/physics/Box2D/Dynamics/Contacts/b2Contact.h +0 -349
  280. data/src/physics/Box2D/Dynamics/Contacts/b2ContactSolver.cpp +0 -838
  281. data/src/physics/Box2D/Dynamics/Contacts/b2ContactSolver.h +0 -95
  282. data/src/physics/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp +0 -49
  283. data/src/physics/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h +0 -39
  284. data/src/physics/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp +0 -49
  285. data/src/physics/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h +0 -39
  286. data/src/physics/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp +0 -49
  287. data/src/physics/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h +0 -38
  288. data/src/physics/Box2D/Dynamics/Contacts/b2PolygonContact.cpp +0 -52
  289. data/src/physics/Box2D/Dynamics/Contacts/b2PolygonContact.h +0 -39
  290. data/src/physics/Box2D/Dynamics/Joints/b2DistanceJoint.cpp +0 -260
  291. data/src/physics/Box2D/Dynamics/Joints/b2DistanceJoint.h +0 -169
  292. data/src/physics/Box2D/Dynamics/Joints/b2FrictionJoint.cpp +0 -251
  293. data/src/physics/Box2D/Dynamics/Joints/b2FrictionJoint.h +0 -119
  294. data/src/physics/Box2D/Dynamics/Joints/b2GearJoint.cpp +0 -419
  295. data/src/physics/Box2D/Dynamics/Joints/b2GearJoint.h +0 -125
  296. data/src/physics/Box2D/Dynamics/Joints/b2Joint.cpp +0 -211
  297. data/src/physics/Box2D/Dynamics/Joints/b2Joint.h +0 -226
  298. data/src/physics/Box2D/Dynamics/Joints/b2MotorJoint.cpp +0 -304
  299. data/src/physics/Box2D/Dynamics/Joints/b2MotorJoint.h +0 -133
  300. data/src/physics/Box2D/Dynamics/Joints/b2MouseJoint.cpp +0 -222
  301. data/src/physics/Box2D/Dynamics/Joints/b2MouseJoint.h +0 -129
  302. data/src/physics/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp +0 -629
  303. data/src/physics/Box2D/Dynamics/Joints/b2PrismaticJoint.h +0 -196
  304. data/src/physics/Box2D/Dynamics/Joints/b2PulleyJoint.cpp +0 -348
  305. data/src/physics/Box2D/Dynamics/Joints/b2PulleyJoint.h +0 -152
  306. data/src/physics/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp +0 -502
  307. data/src/physics/Box2D/Dynamics/Joints/b2RevoluteJoint.h +0 -204
  308. data/src/physics/Box2D/Dynamics/Joints/b2RopeJoint.cpp +0 -241
  309. data/src/physics/Box2D/Dynamics/Joints/b2RopeJoint.h +0 -114
  310. data/src/physics/Box2D/Dynamics/Joints/b2WeldJoint.cpp +0 -344
  311. data/src/physics/Box2D/Dynamics/Joints/b2WeldJoint.h +0 -126
  312. data/src/physics/Box2D/Dynamics/Joints/b2WheelJoint.cpp +0 -419
  313. data/src/physics/Box2D/Dynamics/Joints/b2WheelJoint.h +0 -210
  314. data/src/physics/Box2D/Dynamics/b2Body.cpp +0 -549
  315. data/src/physics/Box2D/Dynamics/b2Body.h +0 -860
  316. data/src/physics/Box2D/Dynamics/b2ContactManager.cpp +0 -296
  317. data/src/physics/Box2D/Dynamics/b2ContactManager.h +0 -52
  318. data/src/physics/Box2D/Dynamics/b2Fixture.cpp +0 -303
  319. data/src/physics/Box2D/Dynamics/b2Fixture.h +0 -345
  320. data/src/physics/Box2D/Dynamics/b2Island.cpp +0 -539
  321. data/src/physics/Box2D/Dynamics/b2Island.h +0 -93
  322. data/src/physics/Box2D/Dynamics/b2TimeStep.h +0 -70
  323. data/src/physics/Box2D/Dynamics/b2World.cpp +0 -1339
  324. data/src/physics/Box2D/Dynamics/b2World.h +0 -354
  325. data/src/physics/Box2D/Dynamics/b2WorldCallbacks.cpp +0 -36
  326. data/src/physics/Box2D/Dynamics/b2WorldCallbacks.h +0 -155
  327. data/src/physics/Box2D/Rope/b2Rope.cpp +0 -259
  328. data/src/physics/Box2D/Rope/b2Rope.h +0 -115
  329. data/src/shape_view.cpp +0 -306
data/samples/views.rb CHANGED
@@ -14,9 +14,9 @@ win = Window.new do
14
14
  images = [:red, :blue].map do |col|
15
15
  Image.new(32, 32).tap do |img|
16
16
  img.paint do
17
- color :white
17
+ fill :white
18
18
  rect img.bounds
19
- color col
19
+ fill col
20
20
  ellipse img.bounds.inset_by(2, 2)
21
21
  end
22
22
  end
@@ -33,7 +33,7 @@ win = Window.new do
33
33
  image1.image = images[count % 2]
34
34
  end
35
35
 
36
- set title: 'Many View Sample', frame: [100, 100, 500, 400]
36
+ set title: 'Many View Sample', frame: [100, 100, 500, 400], flow: :right
37
37
  end
38
38
 
39
39
 
data/samples/visuals.rb CHANGED
@@ -10,12 +10,9 @@ require 'reflex'
10
10
 
11
11
  Reflex::Application.start name: 'Visuals' do |app|
12
12
  Reflex::Window.new title: app.name, frame: [100, 100, 600, 500] do |win|
13
- win.painter.background = 0.8
13
+ win.style.background 0.1
14
14
  10.times do |i|
15
- Reflex::TextView.new name: 'hello', data: 'HELLO WORLD!' do |v|
16
- v.move_to *([i * 5] * 2)
17
- win.add v
18
- end
15
+ win.add Reflex::TextView.new name: 'hello', pos: [i * 5] * 2, data: 'HELLO WORLD!'
19
16
  end
20
17
  end.show
21
18
  end
data/src/body.cpp CHANGED
@@ -1,505 +1,306 @@
1
- #include "reflex/body.h"
1
+ #include "body.h"
2
2
 
3
3
 
4
- #include <math.h>
5
4
  #include <assert.h>
6
- #include <vector>
7
- #include <Box2D/Common/b2Math.h>
8
5
  #include <Box2D/Dynamics/b2Body.h>
9
- #include <Box2D/Dynamics/b2Fixture.h>
10
- #include <Box2D/Collision/Shapes/b2CircleShape.h>
11
- #include <Box2D/Collision/Shapes/b2EdgeShape.h>
12
- #include <Box2D/Collision/Shapes/b2ChainShape.h>
13
- #include <Box2D/Collision/Shapes/b2PolygonShape.h>
6
+ #include <Box2D/Dynamics/b2World.h>
14
7
  #include <xot/util.h>
15
8
  #include "reflex/exception.h"
16
- #include "reflex/painter.h"
17
9
  #include "world.h"
18
10
 
19
11
 
20
- #define PTR ((b2Body*) handle)
21
-
22
-
23
12
  namespace Reflex
24
13
  {
25
14
 
26
15
 
27
- static const float PI = M_PI;
28
-
29
- static const float PI_2 = PI * 2;
30
-
31
-
32
- Body::Body (Handle h, float pixels_per_meter)
33
- : handle(h), ppm(pixels_per_meter)
16
+ struct Body::Data
34
17
  {
35
- assert(h);
36
- }
37
-
38
- Fixture
39
- Body::add_box (coord width, coord height)
40
- {
41
- assert(PTR && PTR->GetWorld());
42
-
43
- if (PTR->GetWorld()->IsLocked())
44
- invalid_state_error(__FILE__, __LINE__);
45
18
 
46
- b2Vec2 size(width / ppm / 2, height / ppm / 2);
19
+ b2Body* b2body;
47
20
 
48
- b2PolygonShape shape;
49
- shape.SetAsBox(size.x, size.y);
50
- for (int i = 0; i < 4; ++i)
51
- shape.m_vertices[i] += size;
52
-
53
- b2FixtureDef fixture;
54
- fixture.shape = &shape;
55
-
56
- return PTR->CreateFixture(&fixture);
57
- }
58
-
59
- Fixture
60
- add_circle (b2Body* handle, coord size, float ppm)
61
- {
62
- coord radius = size / ppm / 2.f;
63
-
64
- b2CircleShape shape;
65
- shape.m_radius = radius;
66
- shape.m_p.Set(radius, radius);
67
-
68
- b2FixtureDef fixture;
69
- fixture.shape = &shape;
70
-
71
- return PTR->CreateFixture(&fixture);
72
- }
21
+ float ppm;
73
22
 
74
- Fixture
75
- add_ellipse (
76
- b2Body* handle, coord width, coord height, float from, float to,
77
- coord radius_min, uint nsegment, float ppm)
78
- {
79
- coord w = width / 2, h = height / 2;
80
-
81
- if (nsegment == 0) nsegment = Painter::ELLIPSE_NSEGMENT;
23
+ Data ()
24
+ : b2body(NULL), ppm(0)
25
+ {
26
+ }
82
27
 
83
- std::vector<b2Vec2> vecs;
84
- vecs.reserve(nsegment);
85
- for (uint seg = 0; seg < nsegment; ++seg)
28
+ bool is_valid () const
86
29
  {
87
- float pos = (float) seg / (float) nsegment;
88
- float radian = (from + (to - from) * pos) * PI_2;
89
- float x = cos(radian);
90
- float y = -sin(radian);
91
- vecs.push_back(b2Vec2(to_b2coord(w + w * x, ppm), to_b2coord(h + h * y, ppm)));
30
+ return b2body && ppm > 0;
92
31
  }
93
32
 
94
- b2PolygonShape shape;
95
- shape.Set(&vecs[0], (int32) nsegment);
33
+ };// Body::Data
96
34
 
97
- b2FixtureDef fixture;
98
- fixture.shape = &shape;
99
35
 
100
- return PTR->CreateFixture(&fixture);
101
- }
102
-
103
- Fixture
104
- Body::add_ellipse (coord width, coord height, coord radius_min, uint nsegment)
36
+ static void
37
+ validate (const Body* body, bool check_world_lock = false)
105
38
  {
106
- assert(PTR && PTR->GetWorld());
39
+ assert(body);
107
40
 
108
- if (PTR->GetWorld()->IsLocked())
41
+ if (!body->self->is_valid())
109
42
  invalid_state_error(__FILE__, __LINE__);
110
43
 
111
- if (width == height && radius_min == 0)
112
- return add_circle(PTR, width, ppm);
113
- else
44
+ if (check_world_lock)
114
45
  {
115
- return Reflex::add_ellipse(
116
- PTR, width, height, 0, 360, radius_min, nsegment, ppm);
117
- }
118
- }
119
-
120
- Fixture
121
- Body::add_arc (
122
- coord width, coord height, float angle_from, float angle_to,
123
- coord radius_min, uint nsegment)
124
- {
125
- assert(PTR && PTR->GetWorld());
126
-
127
- if (PTR->GetWorld()->IsLocked())
128
- invalid_state_error(__FILE__, __LINE__);
46
+ assert(body->self->b2body->GetWorld());
129
47
 
130
- if (width == height && angle_from == 0 && angle_to == 360 && radius_min == 0)
131
- return add_circle(PTR, width, ppm);
132
- else
133
- {
134
- return Reflex::add_ellipse(
135
- PTR, width, height, angle_from, angle_to, radius_min, nsegment, ppm);
48
+ if (body->self->b2body->GetWorld()->IsLocked())
49
+ physics_error(__FILE__, __LINE__);
136
50
  }
137
51
  }
138
52
 
139
- Fixture
140
- Body::add_edge (const Point& begin, const Point& end)
141
- {
142
- assert(PTR && PTR->GetWorld());
143
-
144
- if (PTR->GetWorld()->IsLocked())
145
- invalid_state_error(__FILE__, __LINE__);
146
-
147
- b2EdgeShape shape;
148
- shape.Set(to_b2vec2(begin, ppm), to_b2vec2(end, ppm));
149
-
150
- b2FixtureDef fixture;
151
- fixture.shape = &shape;
152
53
 
153
- return PTR->CreateFixture(&fixture);
154
- }
155
-
156
- Fixture
157
- Body::add_edge (const Point* points, size_t size, bool loop)
54
+ Body::Body (World* world, const Point& position, float angle)
158
55
  {
159
- assert(PTR && PTR->GetWorld());
160
-
161
- if (PTR->GetWorld()->IsLocked())
162
- invalid_state_error(__FILE__, __LINE__);
163
-
164
- if (size == 2)
165
- return add_edge(points[0], points[1]);
56
+ assert(world);
166
57
 
167
- std::vector<b2Vec2> vecs;
168
- vecs.reserve(size);
169
- for (size_t i = 0; i < size; ++i)
170
- vecs.push_back(to_b2vec2(points[i], ppm));
58
+ b2World* b2world = World_get_b2ptr(world);
59
+ float ppm = world->meter2pixel();
60
+ assert(b2world && ppm > 0);
171
61
 
172
- b2ChainShape shape;
173
- if (loop)
174
- shape.CreateLoop(&vecs[0], (int32) size);
175
- else
176
- shape.CreateChain(&vecs[0], (int32) size);
177
-
178
- b2FixtureDef fixture;
179
- fixture.shape = &shape;
180
-
181
- return PTR->CreateFixture(&fixture);
182
- }
183
-
184
- Fixture
185
- Body::add_polygon (const Point* points, size_t size)
186
- {
187
- assert(PTR && PTR->GetWorld());
188
-
189
- if (PTR->GetWorld()->IsLocked())
62
+ if (b2world->IsLocked())
190
63
  invalid_state_error(__FILE__, __LINE__);
191
64
 
192
- std::vector<b2Vec2> vecs;
193
- vecs.reserve(size);
194
- for (size_t i = 0; i < size; ++i)
195
- vecs.push_back(to_b2vec2(points[i], ppm));
196
-
197
- b2PolygonShape shape;
198
- shape.Set(&vecs[0], (int32) size);
65
+ b2BodyDef def;
66
+ def.position = to_b2vec2(position, ppm);
67
+ def.angle = Xot::deg2rad(angle);
199
68
 
200
- b2FixtureDef fixture;
201
- fixture.shape = &shape;
69
+ b2Body* b2body = b2world->CreateBody(&def);
70
+ if (!b2body)
71
+ physics_error(__FILE__, __LINE__);
202
72
 
203
- return PTR->CreateFixture(&fixture);
73
+ self->b2body = b2body;
74
+ self->ppm = ppm;
204
75
  }
205
76
 
206
- void
207
- Body::clear_fixtures ()
77
+ Body::~Body ()
208
78
  {
209
- assert(PTR && PTR->GetWorld());
210
-
211
- if (PTR->GetWorld()->IsLocked())
212
- invalid_state_error(__FILE__, __LINE__);
79
+ validate(this, true);
213
80
 
214
- b2Fixture* f;
215
- while ((f = PTR->GetFixtureList()))
216
- PTR->DestroyFixture(f);
81
+ self->b2body->GetWorld()->DestroyBody(self->b2body);
217
82
  }
218
83
 
219
- float
220
- Body::meter2pixel (float meter) const
84
+ void
85
+ Body::apply_force (coord x, coord y)
221
86
  {
222
- return meter * ppm;
87
+ apply_force(Point(x, y));
223
88
  }
224
89
 
225
90
  void
226
- Body::set_static (bool state)
91
+ Body::apply_force (const Point& force)
227
92
  {
228
- assert(PTR && PTR->GetWorld());
93
+ validate(this);
229
94
 
230
- if (PTR->GetWorld()->IsLocked())
231
- invalid_state_error(__FILE__, __LINE__);
232
-
233
- PTR->SetType(state ? b2_staticBody : b2_dynamicBody);
95
+ self->b2body->ApplyForceToCenter(to_b2vec2(force, self->ppm), true);
234
96
  }
235
97
 
236
- bool
237
- Body::is_static () const
98
+ void
99
+ Body::apply_torque (float torque)
238
100
  {
239
- assert(PTR);
101
+ validate(this);
240
102
 
241
- return PTR->GetType() == b2_staticBody;
103
+ self->b2body->ApplyTorque(torque, true);
242
104
  }
243
105
 
244
106
  void
245
- Body::set_dynamic (bool state)
107
+ Body::apply_linear_impulse (coord x, coord y)
246
108
  {
247
- assert(PTR && PTR->GetWorld());
248
-
249
- if (PTR->GetWorld()->IsLocked())
250
- invalid_state_error(__FILE__, __LINE__);
251
-
252
- PTR->SetType(state ? b2_dynamicBody : b2_staticBody);
109
+ apply_linear_impulse(Point(x, y));
253
110
  }
254
111
 
255
- bool
256
- Body::is_dynamic () const
112
+ void
113
+ Body::apply_linear_impulse (const Point& impulse)
257
114
  {
258
- assert(PTR);
115
+ validate(this);
259
116
 
260
- return PTR->GetType() == b2_dynamicBody;
117
+ self->b2body->ApplyLinearImpulse(
118
+ to_b2vec2(impulse, self->ppm), self->b2body->GetWorldCenter(), true);
261
119
  }
262
120
 
263
- Point
264
- Body::position () const
121
+ void
122
+ Body::apply_angular_impulse (float impulse)
265
123
  {
266
- assert(PTR);
124
+ validate(this);
267
125
 
268
- return to_point(PTR->GetPosition(), ppm);
126
+ self->b2body->ApplyAngularImpulse(impulse, true);
269
127
  }
270
128
 
271
129
  float
272
- Body::angle () const
130
+ Body::meter2pixel (float meter) const
273
131
  {
274
- assert(PTR);
275
-
276
- return Xot::rad2deg(PTR->GetAngle());
132
+ return meter * self->ppm;
277
133
  }
278
134
 
279
135
  void
280
- Body::set_linear_velocity (coord x, coord y)
281
- {
282
- set_linear_velocity(Point(x, y));
283
- }
284
-
285
- void
286
- Body::set_linear_velocity (const Point& velocity)
136
+ Body::set_transform (coord x, coord y, float degree)
287
137
  {
288
- assert(PTR);
138
+ validate(this, true);
289
139
 
290
- PTR->SetLinearVelocity(to_b2vec2(velocity, ppm));
140
+ self->b2body->SetTransform(
141
+ to_b2vec2(x, y, self->ppm), Xot::deg2rad(degree));
291
142
  }
292
143
 
293
144
  Point
294
- Body::linear_velocity () const
145
+ Body::position () const
295
146
  {
296
- assert(PTR);
147
+ validate(this);
297
148
 
298
- return to_point(PTR->GetLinearVelocity(), ppm);
149
+ return to_point(self->b2body->GetPosition(), self->ppm);
299
150
  }
300
151
 
301
- void
302
- Body::set_angular_velocity (float velocity)
152
+ float
153
+ Body::angle () const
303
154
  {
304
- assert(PTR);
155
+ validate(this);
305
156
 
306
- PTR->SetAngularVelocity(Xot::deg2rad(velocity));
157
+ return Xot::rad2deg(self->b2body->GetAngle());
307
158
  }
308
159
 
309
- float
310
- Body::angular_velocity () const
160
+ static bool
161
+ is_body_dynamic (const Body* body)
311
162
  {
312
- assert(PTR);
163
+ assert(body);
313
164
 
314
- return Xot::rad2deg(PTR->GetAngularVelocity());
165
+ return body->self->b2body->GetType() == b2_dynamicBody;
315
166
  }
316
167
 
317
168
  void
318
- Body::apply_force (coord x, coord y)
169
+ Body::set_dynamic (bool dynamic)
319
170
  {
320
- apply_force(Point(x, y));
321
- }
171
+ if (dynamic == is_body_dynamic(this))
172
+ return;
322
173
 
323
- void
324
- Body::apply_force (const Point& force)
325
- {
326
- assert(PTR);
174
+ validate(this, true);
327
175
 
328
- PTR->ApplyForceToCenter(to_b2vec2(force, ppm), true);
176
+ self->b2body->SetType(dynamic ? b2_dynamicBody : b2_staticBody);
329
177
  }
330
178
 
331
- void
332
- Body::apply_torque (float torque)
179
+ bool
180
+ Body::is_dynamic () const
333
181
  {
334
- assert(PTR);
182
+ validate(this);
335
183
 
336
- PTR->ApplyTorque(torque, true);
184
+ return is_body_dynamic(this);
337
185
  }
338
186
 
339
- void
340
- Body::apply_linear_impulse (coord x, coord y)
187
+ static void
188
+ make_body_kinematic (Body* body)
341
189
  {
342
- apply_linear_impulse(Point(x, y));
190
+ if (body->self->b2body->GetType() == b2_staticBody)
191
+ body->self->b2body->SetType(b2_kinematicBody);
343
192
  }
344
193
 
345
194
  void
346
- Body::apply_linear_impulse (const Point& impulse)
195
+ Body::set_linear_velocity (coord x, coord y)
347
196
  {
348
- assert(PTR);
349
-
350
- PTR->ApplyLinearImpulse(
351
- to_b2vec2(impulse, ppm), PTR->GetWorldCenter(), true);
197
+ set_linear_velocity(Point(x, y));
352
198
  }
353
199
 
354
200
  void
355
- Body::apply_angular_impulse (float impulse)
201
+ Body::set_linear_velocity (const Point& velocity)
356
202
  {
357
- assert(PTR);
203
+ validate(this);
358
204
 
359
- PTR->ApplyAngularImpulse(impulse, true);
360
- }
205
+ make_body_kinematic(this);
361
206
 
362
- void
363
- Body::set_density (float density)
364
- {
365
- iterator end_ = end();
366
- for (iterator it = begin(); it != end_; ++it)
367
- it->set_density(density);
207
+ self->b2body->SetLinearVelocity(to_b2vec2(velocity, self->ppm));
368
208
  }
369
209
 
370
- float
371
- Body::density () const
210
+ Point
211
+ Body::linear_velocity () const
372
212
  {
373
- const_iterator it = begin(), end_ = end();
374
- if (it == end_)
375
- invalid_state_error(__FILE__, __LINE__, "no fixture.");
213
+ validate(this);
376
214
 
377
- float val = it->density();
378
- for (; it != end_; ++it)
379
- {
380
- if (val != it->density())
381
- {
382
- invalid_state_error(
383
- __FILE__, __LINE__,
384
- "each fixture have different values.");
385
- }
386
- }
387
- return val;
215
+ return to_point(self->b2body->GetLinearVelocity(), self->ppm);
388
216
  }
389
217
 
390
218
  void
391
- Body::set_friction (float friction)
219
+ Body::set_angular_velocity (float velocity)
392
220
  {
393
- iterator end_ = end();
394
- for (iterator it = begin(); it != end_; ++it)
395
- it->set_friction(friction);
396
- }
221
+ validate(this);
397
222
 
398
- float
399
- Body::friction () const
400
- {
401
- const_iterator it = begin(), end_ = end();
402
- if (it == end_)
403
- invalid_state_error(__FILE__, __LINE__, "no fixture.");
223
+ make_body_kinematic(this);
404
224
 
405
- float val = it->friction();
406
- for (; it != end_; ++it)
407
- {
408
- if (val != it->friction())
409
- {
410
- invalid_state_error(
411
- __FILE__, __LINE__,
412
- "each fixture have different values.");
413
- }
414
- }
415
- return val;
416
- }
417
-
418
- void
419
- Body::set_restitution (float restitution)
420
- {
421
- iterator end_ = end();
422
- for (iterator it = begin(); it != end_; ++it)
423
- it->set_restitution(restitution);
225
+ self->b2body->SetAngularVelocity(Xot::deg2rad(velocity));
424
226
  }
425
227
 
426
228
  float
427
- Body::restitution () const
229
+ Body::angular_velocity () const
428
230
  {
429
- const_iterator it = begin(), end_ = end();
430
- if (it == end_)
431
- invalid_state_error(__FILE__, __LINE__, "no fixture.");
231
+ validate(this);
432
232
 
433
- float val = it->restitution();
434
- for (; it != end_; ++it)
435
- {
436
- if (val != it->restitution())
437
- {
438
- invalid_state_error(
439
- __FILE__, __LINE__,
440
- "each fixture have different values.");
441
- }
442
- }
443
- return val;
233
+ return Xot::rad2deg(self->b2body->GetAngularVelocity());
444
234
  }
445
235
 
446
236
  void
447
237
  Body::set_gravity_scale (float scale)
448
238
  {
449
- assert(PTR);
239
+ validate(this);
450
240
 
451
- return PTR->SetGravityScale(scale);
241
+ if (scale == self->b2body->GetGravityScale())
242
+ return;
243
+
244
+ return self->b2body->SetGravityScale(scale);
452
245
  }
453
246
 
454
247
  float
455
248
  Body::gravity_scale () const
456
249
  {
457
- assert(PTR);
250
+ validate(this);
458
251
 
459
- return PTR->GetGravityScale();
252
+ return self->b2body->GetGravityScale();
460
253
  }
461
254
 
462
- Body::iterator
463
- Body::begin ()
255
+
256
+ void
257
+ Body_copy_attributes (Body* to, const Body& from)
464
258
  {
465
- assert(PTR);
259
+ if (!to)
260
+ return;
466
261
 
467
- return Fixture(PTR->GetFixtureList());
468
- }
262
+ if (to->self->ppm != from.self->ppm)
263
+ physics_error(__FILE__, __LINE__);
469
264
 
470
- Body::const_iterator
471
- Body::begin () const
472
- {
473
- assert(PTR);
265
+ b2Body* b2to = Body_get_b2ptr(to);
266
+ const b2Body* b2from = Body_get_b2ptr(&from);
267
+ assert(b2to && b2from);
474
268
 
475
- return Fixture(PTR->GetFixtureList());
269
+ b2to->SetType( b2from->GetType());
270
+ b2to->SetTransform( b2from->GetPosition(), b2from->GetAngle());
271
+ b2to->SetLinearVelocity( b2from->GetLinearVelocity());
272
+ b2to->SetAngularVelocity(b2from->GetAngularVelocity());
273
+ b2to->SetLinearDamping( b2from->GetLinearDamping());
274
+ b2to->SetAngularDamping( b2from->GetAngularDamping());
275
+ b2to->SetGravityScale( b2from->GetGravityScale());
276
+ b2to->SetBullet( b2from->IsBullet());
476
277
  }
477
278
 
478
- Body::iterator
479
- Body::end ()
279
+ Body*
280
+ Body_create_temporary ()
480
281
  {
481
- assert(PTR);
482
-
483
- return Fixture(NULL);
282
+ return new Body(World_get_temporary());
484
283
  }
485
284
 
486
- Body::const_iterator
487
- Body::end () const
285
+ bool
286
+ Body_is_temporary (const Body& body)
488
287
  {
489
- assert(PTR);
288
+ const b2Body* b2body = Body_get_b2ptr(&body);
289
+ if (!b2body) return false;
490
290
 
491
- return Fixture(NULL);
291
+ return b2body->GetWorld() == World_get_b2ptr(World_get_temporary());
492
292
  }
493
293
 
494
- void
495
- Body::set_transform (coord x, coord y, float degree)
294
+ b2Body*
295
+ Body_get_b2ptr (Body* body)
496
296
  {
497
- assert(PTR && PTR->GetWorld());
498
-
499
- if (PTR->GetWorld()->IsLocked())
500
- invalid_state_error(__FILE__, __LINE__);
297
+ return body ? body->self->b2body : NULL;
298
+ }
501
299
 
502
- PTR->SetTransform(to_b2vec2(x, y, ppm), Xot::deg2rad(degree));
300
+ const b2Body*
301
+ Body_get_b2ptr (const Body* body)
302
+ {
303
+ return Body_get_b2ptr(const_cast<Body*>(body));
503
304
  }
504
305
 
505
306