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
@@ -1,467 +0,0 @@
1
- /*
2
- * Copyright (c) 2006-2009 Erin Catto http://www.box2d.org
3
- *
4
- * This software is provided 'as-is', without any express or implied
5
- * warranty. In no event will the authors be held liable for any damages
6
- * arising from the use of this software.
7
- * Permission is granted to anyone to use this software for any purpose,
8
- * including commercial applications, and to alter it and redistribute it
9
- * freely, subject to the following restrictions:
10
- * 1. The origin of this software must not be misrepresented; you must not
11
- * claim that you wrote the original software. If you use this software
12
- * in a product, an acknowledgment in the product documentation would be
13
- * appreciated but is not required.
14
- * 2. Altered source versions must be plainly marked as such, and must not be
15
- * misrepresented as being the original software.
16
- * 3. This notice may not be removed or altered from any source distribution.
17
- */
18
-
19
- #include <Box2D/Collision/Shapes/b2PolygonShape.h>
20
- #include <new>
21
-
22
- b2Shape* b2PolygonShape::Clone(b2BlockAllocator* allocator) const
23
- {
24
- void* mem = allocator->Allocate(sizeof(b2PolygonShape));
25
- b2PolygonShape* clone = new (mem) b2PolygonShape;
26
- *clone = *this;
27
- return clone;
28
- }
29
-
30
- void b2PolygonShape::SetAsBox(float32 hx, float32 hy)
31
- {
32
- m_count = 4;
33
- m_vertices[0].Set(-hx, -hy);
34
- m_vertices[1].Set( hx, -hy);
35
- m_vertices[2].Set( hx, hy);
36
- m_vertices[3].Set(-hx, hy);
37
- m_normals[0].Set(0.0f, -1.0f);
38
- m_normals[1].Set(1.0f, 0.0f);
39
- m_normals[2].Set(0.0f, 1.0f);
40
- m_normals[3].Set(-1.0f, 0.0f);
41
- m_centroid.SetZero();
42
- }
43
-
44
- void b2PolygonShape::SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle)
45
- {
46
- m_count = 4;
47
- m_vertices[0].Set(-hx, -hy);
48
- m_vertices[1].Set( hx, -hy);
49
- m_vertices[2].Set( hx, hy);
50
- m_vertices[3].Set(-hx, hy);
51
- m_normals[0].Set(0.0f, -1.0f);
52
- m_normals[1].Set(1.0f, 0.0f);
53
- m_normals[2].Set(0.0f, 1.0f);
54
- m_normals[3].Set(-1.0f, 0.0f);
55
- m_centroid = center;
56
-
57
- b2Transform xf;
58
- xf.p = center;
59
- xf.q.Set(angle);
60
-
61
- // Transform vertices and normals.
62
- for (int32 i = 0; i < m_count; ++i)
63
- {
64
- m_vertices[i] = b2Mul(xf, m_vertices[i]);
65
- m_normals[i] = b2Mul(xf.q, m_normals[i]);
66
- }
67
- }
68
-
69
- int32 b2PolygonShape::GetChildCount() const
70
- {
71
- return 1;
72
- }
73
-
74
- static b2Vec2 ComputeCentroid(const b2Vec2* vs, int32 count)
75
- {
76
- b2Assert(count >= 3);
77
-
78
- b2Vec2 c; c.Set(0.0f, 0.0f);
79
- float32 area = 0.0f;
80
-
81
- // pRef is the reference point for forming triangles.
82
- // It's location doesn't change the result (except for rounding error).
83
- b2Vec2 pRef(0.0f, 0.0f);
84
- #if 0
85
- // This code would put the reference point inside the polygon.
86
- for (int32 i = 0; i < count; ++i)
87
- {
88
- pRef += vs[i];
89
- }
90
- pRef *= 1.0f / count;
91
- #endif
92
-
93
- const float32 inv3 = 1.0f / 3.0f;
94
-
95
- for (int32 i = 0; i < count; ++i)
96
- {
97
- // Triangle vertices.
98
- b2Vec2 p1 = pRef;
99
- b2Vec2 p2 = vs[i];
100
- b2Vec2 p3 = i + 1 < count ? vs[i+1] : vs[0];
101
-
102
- b2Vec2 e1 = p2 - p1;
103
- b2Vec2 e2 = p3 - p1;
104
-
105
- float32 D = b2Cross(e1, e2);
106
-
107
- float32 triangleArea = 0.5f * D;
108
- area += triangleArea;
109
-
110
- // Area weighted centroid
111
- c += triangleArea * inv3 * (p1 + p2 + p3);
112
- }
113
-
114
- // Centroid
115
- b2Assert(area > b2_epsilon);
116
- c *= 1.0f / area;
117
- return c;
118
- }
119
-
120
- void b2PolygonShape::Set(const b2Vec2* vertices, int32 count)
121
- {
122
- b2Assert(3 <= count && count <= b2_maxPolygonVertices);
123
- if (count < 3)
124
- {
125
- SetAsBox(1.0f, 1.0f);
126
- return;
127
- }
128
-
129
- int32 n = b2Min(count, b2_maxPolygonVertices);
130
-
131
- // Perform welding and copy vertices into local buffer.
132
- b2Vec2 ps[b2_maxPolygonVertices];
133
- int32 tempCount = 0;
134
- for (int32 i = 0; i < n; ++i)
135
- {
136
- b2Vec2 v = vertices[i];
137
-
138
- bool unique = true;
139
- for (int32 j = 0; j < tempCount; ++j)
140
- {
141
- if (b2DistanceSquared(v, ps[j]) < 0.5f * b2_linearSlop)
142
- {
143
- unique = false;
144
- break;
145
- }
146
- }
147
-
148
- if (unique)
149
- {
150
- ps[tempCount++] = v;
151
- }
152
- }
153
-
154
- n = tempCount;
155
- if (n < 3)
156
- {
157
- // Polygon is degenerate.
158
- b2Assert(false);
159
- SetAsBox(1.0f, 1.0f);
160
- return;
161
- }
162
-
163
- // Create the convex hull using the Gift wrapping algorithm
164
- // http://en.wikipedia.org/wiki/Gift_wrapping_algorithm
165
-
166
- // Find the right most point on the hull
167
- int32 i0 = 0;
168
- float32 x0 = ps[0].x;
169
- for (int32 i = 1; i < n; ++i)
170
- {
171
- float32 x = ps[i].x;
172
- if (x > x0 || (x == x0 && ps[i].y < ps[i0].y))
173
- {
174
- i0 = i;
175
- x0 = x;
176
- }
177
- }
178
-
179
- int32 hull[b2_maxPolygonVertices];
180
- int32 m = 0;
181
- int32 ih = i0;
182
-
183
- for (;;)
184
- {
185
- hull[m] = ih;
186
-
187
- int32 ie = 0;
188
- for (int32 j = 1; j < n; ++j)
189
- {
190
- if (ie == ih)
191
- {
192
- ie = j;
193
- continue;
194
- }
195
-
196
- b2Vec2 r = ps[ie] - ps[hull[m]];
197
- b2Vec2 v = ps[j] - ps[hull[m]];
198
- float32 c = b2Cross(r, v);
199
- if (c < 0.0f)
200
- {
201
- ie = j;
202
- }
203
-
204
- // Collinearity check
205
- if (c == 0.0f && v.LengthSquared() > r.LengthSquared())
206
- {
207
- ie = j;
208
- }
209
- }
210
-
211
- ++m;
212
- ih = ie;
213
-
214
- if (ie == i0)
215
- {
216
- break;
217
- }
218
- }
219
-
220
- if (m < 3)
221
- {
222
- // Polygon is degenerate.
223
- b2Assert(false);
224
- SetAsBox(1.0f, 1.0f);
225
- return;
226
- }
227
-
228
- m_count = m;
229
-
230
- // Copy vertices.
231
- for (int32 i = 0; i < m; ++i)
232
- {
233
- m_vertices[i] = ps[hull[i]];
234
- }
235
-
236
- // Compute normals. Ensure the edges have non-zero length.
237
- for (int32 i = 0; i < m; ++i)
238
- {
239
- int32 i1 = i;
240
- int32 i2 = i + 1 < m ? i + 1 : 0;
241
- b2Vec2 edge = m_vertices[i2] - m_vertices[i1];
242
- b2Assert(edge.LengthSquared() > b2_epsilon * b2_epsilon);
243
- m_normals[i] = b2Cross(edge, 1.0f);
244
- m_normals[i].Normalize();
245
- }
246
-
247
- // Compute the polygon centroid.
248
- m_centroid = ComputeCentroid(m_vertices, m);
249
- }
250
-
251
- bool b2PolygonShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const
252
- {
253
- b2Vec2 pLocal = b2MulT(xf.q, p - xf.p);
254
-
255
- for (int32 i = 0; i < m_count; ++i)
256
- {
257
- float32 dot = b2Dot(m_normals[i], pLocal - m_vertices[i]);
258
- if (dot > 0.0f)
259
- {
260
- return false;
261
- }
262
- }
263
-
264
- return true;
265
- }
266
-
267
- bool b2PolygonShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input,
268
- const b2Transform& xf, int32 childIndex) const
269
- {
270
- B2_NOT_USED(childIndex);
271
-
272
- // Put the ray into the polygon's frame of reference.
273
- b2Vec2 p1 = b2MulT(xf.q, input.p1 - xf.p);
274
- b2Vec2 p2 = b2MulT(xf.q, input.p2 - xf.p);
275
- b2Vec2 d = p2 - p1;
276
-
277
- float32 lower = 0.0f, upper = input.maxFraction;
278
-
279
- int32 index = -1;
280
-
281
- for (int32 i = 0; i < m_count; ++i)
282
- {
283
- // p = p1 + a * d
284
- // dot(normal, p - v) = 0
285
- // dot(normal, p1 - v) + a * dot(normal, d) = 0
286
- float32 numerator = b2Dot(m_normals[i], m_vertices[i] - p1);
287
- float32 denominator = b2Dot(m_normals[i], d);
288
-
289
- if (denominator == 0.0f)
290
- {
291
- if (numerator < 0.0f)
292
- {
293
- return false;
294
- }
295
- }
296
- else
297
- {
298
- // Note: we want this predicate without division:
299
- // lower < numerator / denominator, where denominator < 0
300
- // Since denominator < 0, we have to flip the inequality:
301
- // lower < numerator / denominator <==> denominator * lower > numerator.
302
- if (denominator < 0.0f && numerator < lower * denominator)
303
- {
304
- // Increase lower.
305
- // The segment enters this half-space.
306
- lower = numerator / denominator;
307
- index = i;
308
- }
309
- else if (denominator > 0.0f && numerator < upper * denominator)
310
- {
311
- // Decrease upper.
312
- // The segment exits this half-space.
313
- upper = numerator / denominator;
314
- }
315
- }
316
-
317
- // The use of epsilon here causes the assert on lower to trip
318
- // in some cases. Apparently the use of epsilon was to make edge
319
- // shapes work, but now those are handled separately.
320
- //if (upper < lower - b2_epsilon)
321
- if (upper < lower)
322
- {
323
- return false;
324
- }
325
- }
326
-
327
- b2Assert(0.0f <= lower && lower <= input.maxFraction);
328
-
329
- if (index >= 0)
330
- {
331
- output->fraction = lower;
332
- output->normal = b2Mul(xf.q, m_normals[index]);
333
- return true;
334
- }
335
-
336
- return false;
337
- }
338
-
339
- void b2PolygonShape::ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const
340
- {
341
- B2_NOT_USED(childIndex);
342
-
343
- b2Vec2 lower = b2Mul(xf, m_vertices[0]);
344
- b2Vec2 upper = lower;
345
-
346
- for (int32 i = 1; i < m_count; ++i)
347
- {
348
- b2Vec2 v = b2Mul(xf, m_vertices[i]);
349
- lower = b2Min(lower, v);
350
- upper = b2Max(upper, v);
351
- }
352
-
353
- b2Vec2 r(m_radius, m_radius);
354
- aabb->lowerBound = lower - r;
355
- aabb->upperBound = upper + r;
356
- }
357
-
358
- void b2PolygonShape::ComputeMass(b2MassData* massData, float32 density) const
359
- {
360
- // Polygon mass, centroid, and inertia.
361
- // Let rho be the polygon density in mass per unit area.
362
- // Then:
363
- // mass = rho * int(dA)
364
- // centroid.x = (1/mass) * rho * int(x * dA)
365
- // centroid.y = (1/mass) * rho * int(y * dA)
366
- // I = rho * int((x*x + y*y) * dA)
367
- //
368
- // We can compute these integrals by summing all the integrals
369
- // for each triangle of the polygon. To evaluate the integral
370
- // for a single triangle, we make a change of variables to
371
- // the (u,v) coordinates of the triangle:
372
- // x = x0 + e1x * u + e2x * v
373
- // y = y0 + e1y * u + e2y * v
374
- // where 0 <= u && 0 <= v && u + v <= 1.
375
- //
376
- // We integrate u from [0,1-v] and then v from [0,1].
377
- // We also need to use the Jacobian of the transformation:
378
- // D = cross(e1, e2)
379
- //
380
- // Simplification: triangle centroid = (1/3) * (p1 + p2 + p3)
381
- //
382
- // The rest of the derivation is handled by computer algebra.
383
-
384
- b2Assert(m_count >= 3);
385
-
386
- b2Vec2 center; center.Set(0.0f, 0.0f);
387
- float32 area = 0.0f;
388
- float32 I = 0.0f;
389
-
390
- // s is the reference point for forming triangles.
391
- // It's location doesn't change the result (except for rounding error).
392
- b2Vec2 s(0.0f, 0.0f);
393
-
394
- // This code would put the reference point inside the polygon.
395
- for (int32 i = 0; i < m_count; ++i)
396
- {
397
- s += m_vertices[i];
398
- }
399
- s *= 1.0f / m_count;
400
-
401
- const float32 k_inv3 = 1.0f / 3.0f;
402
-
403
- for (int32 i = 0; i < m_count; ++i)
404
- {
405
- // Triangle vertices.
406
- b2Vec2 e1 = m_vertices[i] - s;
407
- b2Vec2 e2 = i + 1 < m_count ? m_vertices[i+1] - s : m_vertices[0] - s;
408
-
409
- float32 D = b2Cross(e1, e2);
410
-
411
- float32 triangleArea = 0.5f * D;
412
- area += triangleArea;
413
-
414
- // Area weighted centroid
415
- center += triangleArea * k_inv3 * (e1 + e2);
416
-
417
- float32 ex1 = e1.x, ey1 = e1.y;
418
- float32 ex2 = e2.x, ey2 = e2.y;
419
-
420
- float32 intx2 = ex1*ex1 + ex2*ex1 + ex2*ex2;
421
- float32 inty2 = ey1*ey1 + ey2*ey1 + ey2*ey2;
422
-
423
- I += (0.25f * k_inv3 * D) * (intx2 + inty2);
424
- }
425
-
426
- // Total mass
427
- massData->mass = density * area;
428
-
429
- // Center of mass
430
- b2Assert(area > b2_epsilon);
431
- center *= 1.0f / area;
432
- massData->center = center + s;
433
-
434
- // Inertia tensor relative to the local origin (point s).
435
- massData->I = density * I;
436
-
437
- // Shift to center of mass then to original body origin.
438
- massData->I += massData->mass * (b2Dot(massData->center, massData->center) - b2Dot(center, center));
439
- }
440
-
441
- bool b2PolygonShape::Validate() const
442
- {
443
- for (int32 i = 0; i < m_count; ++i)
444
- {
445
- int32 i1 = i;
446
- int32 i2 = i < m_count - 1 ? i1 + 1 : 0;
447
- b2Vec2 p = m_vertices[i1];
448
- b2Vec2 e = m_vertices[i2] - p;
449
-
450
- for (int32 j = 0; j < m_count; ++j)
451
- {
452
- if (j == i1 || j == i2)
453
- {
454
- continue;
455
- }
456
-
457
- b2Vec2 v = m_vertices[j] - p;
458
- float32 c = b2Cross(e, v);
459
- if (c < 0.0f)
460
- {
461
- return false;
462
- }
463
- }
464
- }
465
-
466
- return true;
467
- }
@@ -1,101 +0,0 @@
1
- /*
2
- * Copyright (c) 2006-2009 Erin Catto http://www.box2d.org
3
- *
4
- * This software is provided 'as-is', without any express or implied
5
- * warranty. In no event will the authors be held liable for any damages
6
- * arising from the use of this software.
7
- * Permission is granted to anyone to use this software for any purpose,
8
- * including commercial applications, and to alter it and redistribute it
9
- * freely, subject to the following restrictions:
10
- * 1. The origin of this software must not be misrepresented; you must not
11
- * claim that you wrote the original software. If you use this software
12
- * in a product, an acknowledgment in the product documentation would be
13
- * appreciated but is not required.
14
- * 2. Altered source versions must be plainly marked as such, and must not be
15
- * misrepresented as being the original software.
16
- * 3. This notice may not be removed or altered from any source distribution.
17
- */
18
-
19
- #ifndef B2_POLYGON_SHAPE_H
20
- #define B2_POLYGON_SHAPE_H
21
-
22
- #include <Box2D/Collision/Shapes/b2Shape.h>
23
-
24
- /// A convex polygon. It is assumed that the interior of the polygon is to
25
- /// the left of each edge.
26
- /// Polygons have a maximum number of vertices equal to b2_maxPolygonVertices.
27
- /// In most cases you should not need many vertices for a convex polygon.
28
- class b2PolygonShape : public b2Shape
29
- {
30
- public:
31
- b2PolygonShape();
32
-
33
- /// Implement b2Shape.
34
- b2Shape* Clone(b2BlockAllocator* allocator) const;
35
-
36
- /// @see b2Shape::GetChildCount
37
- int32 GetChildCount() const;
38
-
39
- /// Create a convex hull from the given array of local points.
40
- /// The count must be in the range [3, b2_maxPolygonVertices].
41
- /// @warning the points may be re-ordered, even if they form a convex polygon
42
- /// @warning collinear points are handled but not removed. Collinear points
43
- /// may lead to poor stacking behavior.
44
- void Set(const b2Vec2* points, int32 count);
45
-
46
- /// Build vertices to represent an axis-aligned box centered on the local origin.
47
- /// @param hx the half-width.
48
- /// @param hy the half-height.
49
- void SetAsBox(float32 hx, float32 hy);
50
-
51
- /// Build vertices to represent an oriented box.
52
- /// @param hx the half-width.
53
- /// @param hy the half-height.
54
- /// @param center the center of the box in local coordinates.
55
- /// @param angle the rotation of the box in local coordinates.
56
- void SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle);
57
-
58
- /// @see b2Shape::TestPoint
59
- bool TestPoint(const b2Transform& transform, const b2Vec2& p) const;
60
-
61
- /// Implement b2Shape.
62
- bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input,
63
- const b2Transform& transform, int32 childIndex) const;
64
-
65
- /// @see b2Shape::ComputeAABB
66
- void ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const;
67
-
68
- /// @see b2Shape::ComputeMass
69
- void ComputeMass(b2MassData* massData, float32 density) const;
70
-
71
- /// Get the vertex count.
72
- int32 GetVertexCount() const { return m_count; }
73
-
74
- /// Get a vertex by index.
75
- const b2Vec2& GetVertex(int32 index) const;
76
-
77
- /// Validate convexity. This is a very time consuming operation.
78
- /// @returns true if valid
79
- bool Validate() const;
80
-
81
- b2Vec2 m_centroid;
82
- b2Vec2 m_vertices[b2_maxPolygonVertices];
83
- b2Vec2 m_normals[b2_maxPolygonVertices];
84
- int32 m_count;
85
- };
86
-
87
- inline b2PolygonShape::b2PolygonShape()
88
- {
89
- m_type = e_polygon;
90
- m_radius = b2_polygonRadius;
91
- m_count = 0;
92
- m_centroid.SetZero();
93
- }
94
-
95
- inline const b2Vec2& b2PolygonShape::GetVertex(int32 index) const
96
- {
97
- b2Assert(0 <= index && index < m_count);
98
- return m_vertices[index];
99
- }
100
-
101
- #endif
@@ -1,101 +0,0 @@
1
- /*
2
- * Copyright (c) 2006-2009 Erin Catto http://www.box2d.org
3
- *
4
- * This software is provided 'as-is', without any express or implied
5
- * warranty. In no event will the authors be held liable for any damages
6
- * arising from the use of this software.
7
- * Permission is granted to anyone to use this software for any purpose,
8
- * including commercial applications, and to alter it and redistribute it
9
- * freely, subject to the following restrictions:
10
- * 1. The origin of this software must not be misrepresented; you must not
11
- * claim that you wrote the original software. If you use this software
12
- * in a product, an acknowledgment in the product documentation would be
13
- * appreciated but is not required.
14
- * 2. Altered source versions must be plainly marked as such, and must not be
15
- * misrepresented as being the original software.
16
- * 3. This notice may not be removed or altered from any source distribution.
17
- */
18
-
19
- #ifndef B2_SHAPE_H
20
- #define B2_SHAPE_H
21
-
22
- #include <Box2D/Common/b2BlockAllocator.h>
23
- #include <Box2D/Common/b2Math.h>
24
- #include <Box2D/Collision/b2Collision.h>
25
-
26
- /// This holds the mass data computed for a shape.
27
- struct b2MassData
28
- {
29
- /// The mass of the shape, usually in kilograms.
30
- float32 mass;
31
-
32
- /// The position of the shape's centroid relative to the shape's origin.
33
- b2Vec2 center;
34
-
35
- /// The rotational inertia of the shape about the local origin.
36
- float32 I;
37
- };
38
-
39
- /// A shape is used for collision detection. You can create a shape however you like.
40
- /// Shapes used for simulation in b2World are created automatically when a b2Fixture
41
- /// is created. Shapes may encapsulate a one or more child shapes.
42
- class b2Shape
43
- {
44
- public:
45
-
46
- enum Type
47
- {
48
- e_circle = 0,
49
- e_edge = 1,
50
- e_polygon = 2,
51
- e_chain = 3,
52
- e_typeCount = 4
53
- };
54
-
55
- virtual ~b2Shape() {}
56
-
57
- /// Clone the concrete shape using the provided allocator.
58
- virtual b2Shape* Clone(b2BlockAllocator* allocator) const = 0;
59
-
60
- /// Get the type of this shape. You can use this to down cast to the concrete shape.
61
- /// @return the shape type.
62
- Type GetType() const;
63
-
64
- /// Get the number of child primitives.
65
- virtual int32 GetChildCount() const = 0;
66
-
67
- /// Test a point for containment in this shape. This only works for convex shapes.
68
- /// @param xf the shape world transform.
69
- /// @param p a point in world coordinates.
70
- virtual bool TestPoint(const b2Transform& xf, const b2Vec2& p) const = 0;
71
-
72
- /// Cast a ray against a child shape.
73
- /// @param output the ray-cast results.
74
- /// @param input the ray-cast input parameters.
75
- /// @param transform the transform to be applied to the shape.
76
- /// @param childIndex the child shape index
77
- virtual bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input,
78
- const b2Transform& transform, int32 childIndex) const = 0;
79
-
80
- /// Given a transform, compute the associated axis aligned bounding box for a child shape.
81
- /// @param aabb returns the axis aligned box.
82
- /// @param xf the world transform of the shape.
83
- /// @param childIndex the child shape
84
- virtual void ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const = 0;
85
-
86
- /// Compute the mass properties of this shape using its dimensions and density.
87
- /// The inertia tensor is computed about the local origin.
88
- /// @param massData returns the mass data for this shape.
89
- /// @param density the density in kilograms per meter squared.
90
- virtual void ComputeMass(b2MassData* massData, float32 density) const = 0;
91
-
92
- Type m_type;
93
- float32 m_radius;
94
- };
95
-
96
- inline b2Shape::Type b2Shape::GetType() const
97
- {
98
- return m_type;
99
- }
100
-
101
- #endif