reflexion 0.1.12 → 0.1.13

Sign up to get free protection for your applications and to get access to all the features.
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,603 +0,0 @@
1
- /*
2
- * Copyright (c) 2007-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/b2Distance.h>
20
- #include <Box2D/Collision/Shapes/b2CircleShape.h>
21
- #include <Box2D/Collision/Shapes/b2EdgeShape.h>
22
- #include <Box2D/Collision/Shapes/b2ChainShape.h>
23
- #include <Box2D/Collision/Shapes/b2PolygonShape.h>
24
-
25
- // GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates.
26
- int32 b2_gjkCalls, b2_gjkIters, b2_gjkMaxIters;
27
-
28
- void b2DistanceProxy::Set(const b2Shape* shape, int32 index)
29
- {
30
- switch (shape->GetType())
31
- {
32
- case b2Shape::e_circle:
33
- {
34
- const b2CircleShape* circle = static_cast<const b2CircleShape*>(shape);
35
- m_vertices = &circle->m_p;
36
- m_count = 1;
37
- m_radius = circle->m_radius;
38
- }
39
- break;
40
-
41
- case b2Shape::e_polygon:
42
- {
43
- const b2PolygonShape* polygon = static_cast<const b2PolygonShape*>(shape);
44
- m_vertices = polygon->m_vertices;
45
- m_count = polygon->m_count;
46
- m_radius = polygon->m_radius;
47
- }
48
- break;
49
-
50
- case b2Shape::e_chain:
51
- {
52
- const b2ChainShape* chain = static_cast<const b2ChainShape*>(shape);
53
- b2Assert(0 <= index && index < chain->m_count);
54
-
55
- m_buffer[0] = chain->m_vertices[index];
56
- if (index + 1 < chain->m_count)
57
- {
58
- m_buffer[1] = chain->m_vertices[index + 1];
59
- }
60
- else
61
- {
62
- m_buffer[1] = chain->m_vertices[0];
63
- }
64
-
65
- m_vertices = m_buffer;
66
- m_count = 2;
67
- m_radius = chain->m_radius;
68
- }
69
- break;
70
-
71
- case b2Shape::e_edge:
72
- {
73
- const b2EdgeShape* edge = static_cast<const b2EdgeShape*>(shape);
74
- m_vertices = &edge->m_vertex1;
75
- m_count = 2;
76
- m_radius = edge->m_radius;
77
- }
78
- break;
79
-
80
- default:
81
- b2Assert(false);
82
- }
83
- }
84
-
85
-
86
- struct b2SimplexVertex
87
- {
88
- b2Vec2 wA; // support point in proxyA
89
- b2Vec2 wB; // support point in proxyB
90
- b2Vec2 w; // wB - wA
91
- float32 a; // barycentric coordinate for closest point
92
- int32 indexA; // wA index
93
- int32 indexB; // wB index
94
- };
95
-
96
- struct b2Simplex
97
- {
98
- void ReadCache( const b2SimplexCache* cache,
99
- const b2DistanceProxy* proxyA, const b2Transform& transformA,
100
- const b2DistanceProxy* proxyB, const b2Transform& transformB)
101
- {
102
- b2Assert(cache->count <= 3);
103
-
104
- // Copy data from cache.
105
- m_count = cache->count;
106
- b2SimplexVertex* vertices = &m_v1;
107
- for (int32 i = 0; i < m_count; ++i)
108
- {
109
- b2SimplexVertex* v = vertices + i;
110
- v->indexA = cache->indexA[i];
111
- v->indexB = cache->indexB[i];
112
- b2Vec2 wALocal = proxyA->GetVertex(v->indexA);
113
- b2Vec2 wBLocal = proxyB->GetVertex(v->indexB);
114
- v->wA = b2Mul(transformA, wALocal);
115
- v->wB = b2Mul(transformB, wBLocal);
116
- v->w = v->wB - v->wA;
117
- v->a = 0.0f;
118
- }
119
-
120
- // Compute the new simplex metric, if it is substantially different than
121
- // old metric then flush the simplex.
122
- if (m_count > 1)
123
- {
124
- float32 metric1 = cache->metric;
125
- float32 metric2 = GetMetric();
126
- if (metric2 < 0.5f * metric1 || 2.0f * metric1 < metric2 || metric2 < b2_epsilon)
127
- {
128
- // Reset the simplex.
129
- m_count = 0;
130
- }
131
- }
132
-
133
- // If the cache is empty or invalid ...
134
- if (m_count == 0)
135
- {
136
- b2SimplexVertex* v = vertices + 0;
137
- v->indexA = 0;
138
- v->indexB = 0;
139
- b2Vec2 wALocal = proxyA->GetVertex(0);
140
- b2Vec2 wBLocal = proxyB->GetVertex(0);
141
- v->wA = b2Mul(transformA, wALocal);
142
- v->wB = b2Mul(transformB, wBLocal);
143
- v->w = v->wB - v->wA;
144
- v->a = 1.0f;
145
- m_count = 1;
146
- }
147
- }
148
-
149
- void WriteCache(b2SimplexCache* cache) const
150
- {
151
- cache->metric = GetMetric();
152
- cache->count = uint16(m_count);
153
- const b2SimplexVertex* vertices = &m_v1;
154
- for (int32 i = 0; i < m_count; ++i)
155
- {
156
- cache->indexA[i] = uint8(vertices[i].indexA);
157
- cache->indexB[i] = uint8(vertices[i].indexB);
158
- }
159
- }
160
-
161
- b2Vec2 GetSearchDirection() const
162
- {
163
- switch (m_count)
164
- {
165
- case 1:
166
- return -m_v1.w;
167
-
168
- case 2:
169
- {
170
- b2Vec2 e12 = m_v2.w - m_v1.w;
171
- float32 sgn = b2Cross(e12, -m_v1.w);
172
- if (sgn > 0.0f)
173
- {
174
- // Origin is left of e12.
175
- return b2Cross(1.0f, e12);
176
- }
177
- else
178
- {
179
- // Origin is right of e12.
180
- return b2Cross(e12, 1.0f);
181
- }
182
- }
183
-
184
- default:
185
- b2Assert(false);
186
- return b2Vec2_zero;
187
- }
188
- }
189
-
190
- b2Vec2 GetClosestPoint() const
191
- {
192
- switch (m_count)
193
- {
194
- case 0:
195
- b2Assert(false);
196
- return b2Vec2_zero;
197
-
198
- case 1:
199
- return m_v1.w;
200
-
201
- case 2:
202
- return m_v1.a * m_v1.w + m_v2.a * m_v2.w;
203
-
204
- case 3:
205
- return b2Vec2_zero;
206
-
207
- default:
208
- b2Assert(false);
209
- return b2Vec2_zero;
210
- }
211
- }
212
-
213
- void GetWitnessPoints(b2Vec2* pA, b2Vec2* pB) const
214
- {
215
- switch (m_count)
216
- {
217
- case 0:
218
- b2Assert(false);
219
- break;
220
-
221
- case 1:
222
- *pA = m_v1.wA;
223
- *pB = m_v1.wB;
224
- break;
225
-
226
- case 2:
227
- *pA = m_v1.a * m_v1.wA + m_v2.a * m_v2.wA;
228
- *pB = m_v1.a * m_v1.wB + m_v2.a * m_v2.wB;
229
- break;
230
-
231
- case 3:
232
- *pA = m_v1.a * m_v1.wA + m_v2.a * m_v2.wA + m_v3.a * m_v3.wA;
233
- *pB = *pA;
234
- break;
235
-
236
- default:
237
- b2Assert(false);
238
- break;
239
- }
240
- }
241
-
242
- float32 GetMetric() const
243
- {
244
- switch (m_count)
245
- {
246
- case 0:
247
- b2Assert(false);
248
- return 0.0f;
249
-
250
- case 1:
251
- return 0.0f;
252
-
253
- case 2:
254
- return b2Distance(m_v1.w, m_v2.w);
255
-
256
- case 3:
257
- return b2Cross(m_v2.w - m_v1.w, m_v3.w - m_v1.w);
258
-
259
- default:
260
- b2Assert(false);
261
- return 0.0f;
262
- }
263
- }
264
-
265
- void Solve2();
266
- void Solve3();
267
-
268
- b2SimplexVertex m_v1, m_v2, m_v3;
269
- int32 m_count;
270
- };
271
-
272
-
273
- // Solve a line segment using barycentric coordinates.
274
- //
275
- // p = a1 * w1 + a2 * w2
276
- // a1 + a2 = 1
277
- //
278
- // The vector from the origin to the closest point on the line is
279
- // perpendicular to the line.
280
- // e12 = w2 - w1
281
- // dot(p, e) = 0
282
- // a1 * dot(w1, e) + a2 * dot(w2, e) = 0
283
- //
284
- // 2-by-2 linear system
285
- // [1 1 ][a1] = [1]
286
- // [w1.e12 w2.e12][a2] = [0]
287
- //
288
- // Define
289
- // d12_1 = dot(w2, e12)
290
- // d12_2 = -dot(w1, e12)
291
- // d12 = d12_1 + d12_2
292
- //
293
- // Solution
294
- // a1 = d12_1 / d12
295
- // a2 = d12_2 / d12
296
- void b2Simplex::Solve2()
297
- {
298
- b2Vec2 w1 = m_v1.w;
299
- b2Vec2 w2 = m_v2.w;
300
- b2Vec2 e12 = w2 - w1;
301
-
302
- // w1 region
303
- float32 d12_2 = -b2Dot(w1, e12);
304
- if (d12_2 <= 0.0f)
305
- {
306
- // a2 <= 0, so we clamp it to 0
307
- m_v1.a = 1.0f;
308
- m_count = 1;
309
- return;
310
- }
311
-
312
- // w2 region
313
- float32 d12_1 = b2Dot(w2, e12);
314
- if (d12_1 <= 0.0f)
315
- {
316
- // a1 <= 0, so we clamp it to 0
317
- m_v2.a = 1.0f;
318
- m_count = 1;
319
- m_v1 = m_v2;
320
- return;
321
- }
322
-
323
- // Must be in e12 region.
324
- float32 inv_d12 = 1.0f / (d12_1 + d12_2);
325
- m_v1.a = d12_1 * inv_d12;
326
- m_v2.a = d12_2 * inv_d12;
327
- m_count = 2;
328
- }
329
-
330
- // Possible regions:
331
- // - points[2]
332
- // - edge points[0]-points[2]
333
- // - edge points[1]-points[2]
334
- // - inside the triangle
335
- void b2Simplex::Solve3()
336
- {
337
- b2Vec2 w1 = m_v1.w;
338
- b2Vec2 w2 = m_v2.w;
339
- b2Vec2 w3 = m_v3.w;
340
-
341
- // Edge12
342
- // [1 1 ][a1] = [1]
343
- // [w1.e12 w2.e12][a2] = [0]
344
- // a3 = 0
345
- b2Vec2 e12 = w2 - w1;
346
- float32 w1e12 = b2Dot(w1, e12);
347
- float32 w2e12 = b2Dot(w2, e12);
348
- float32 d12_1 = w2e12;
349
- float32 d12_2 = -w1e12;
350
-
351
- // Edge13
352
- // [1 1 ][a1] = [1]
353
- // [w1.e13 w3.e13][a3] = [0]
354
- // a2 = 0
355
- b2Vec2 e13 = w3 - w1;
356
- float32 w1e13 = b2Dot(w1, e13);
357
- float32 w3e13 = b2Dot(w3, e13);
358
- float32 d13_1 = w3e13;
359
- float32 d13_2 = -w1e13;
360
-
361
- // Edge23
362
- // [1 1 ][a2] = [1]
363
- // [w2.e23 w3.e23][a3] = [0]
364
- // a1 = 0
365
- b2Vec2 e23 = w3 - w2;
366
- float32 w2e23 = b2Dot(w2, e23);
367
- float32 w3e23 = b2Dot(w3, e23);
368
- float32 d23_1 = w3e23;
369
- float32 d23_2 = -w2e23;
370
-
371
- // Triangle123
372
- float32 n123 = b2Cross(e12, e13);
373
-
374
- float32 d123_1 = n123 * b2Cross(w2, w3);
375
- float32 d123_2 = n123 * b2Cross(w3, w1);
376
- float32 d123_3 = n123 * b2Cross(w1, w2);
377
-
378
- // w1 region
379
- if (d12_2 <= 0.0f && d13_2 <= 0.0f)
380
- {
381
- m_v1.a = 1.0f;
382
- m_count = 1;
383
- return;
384
- }
385
-
386
- // e12
387
- if (d12_1 > 0.0f && d12_2 > 0.0f && d123_3 <= 0.0f)
388
- {
389
- float32 inv_d12 = 1.0f / (d12_1 + d12_2);
390
- m_v1.a = d12_1 * inv_d12;
391
- m_v2.a = d12_2 * inv_d12;
392
- m_count = 2;
393
- return;
394
- }
395
-
396
- // e13
397
- if (d13_1 > 0.0f && d13_2 > 0.0f && d123_2 <= 0.0f)
398
- {
399
- float32 inv_d13 = 1.0f / (d13_1 + d13_2);
400
- m_v1.a = d13_1 * inv_d13;
401
- m_v3.a = d13_2 * inv_d13;
402
- m_count = 2;
403
- m_v2 = m_v3;
404
- return;
405
- }
406
-
407
- // w2 region
408
- if (d12_1 <= 0.0f && d23_2 <= 0.0f)
409
- {
410
- m_v2.a = 1.0f;
411
- m_count = 1;
412
- m_v1 = m_v2;
413
- return;
414
- }
415
-
416
- // w3 region
417
- if (d13_1 <= 0.0f && d23_1 <= 0.0f)
418
- {
419
- m_v3.a = 1.0f;
420
- m_count = 1;
421
- m_v1 = m_v3;
422
- return;
423
- }
424
-
425
- // e23
426
- if (d23_1 > 0.0f && d23_2 > 0.0f && d123_1 <= 0.0f)
427
- {
428
- float32 inv_d23 = 1.0f / (d23_1 + d23_2);
429
- m_v2.a = d23_1 * inv_d23;
430
- m_v3.a = d23_2 * inv_d23;
431
- m_count = 2;
432
- m_v1 = m_v3;
433
- return;
434
- }
435
-
436
- // Must be in triangle123
437
- float32 inv_d123 = 1.0f / (d123_1 + d123_2 + d123_3);
438
- m_v1.a = d123_1 * inv_d123;
439
- m_v2.a = d123_2 * inv_d123;
440
- m_v3.a = d123_3 * inv_d123;
441
- m_count = 3;
442
- }
443
-
444
- void b2Distance(b2DistanceOutput* output,
445
- b2SimplexCache* cache,
446
- const b2DistanceInput* input)
447
- {
448
- ++b2_gjkCalls;
449
-
450
- const b2DistanceProxy* proxyA = &input->proxyA;
451
- const b2DistanceProxy* proxyB = &input->proxyB;
452
-
453
- b2Transform transformA = input->transformA;
454
- b2Transform transformB = input->transformB;
455
-
456
- // Initialize the simplex.
457
- b2Simplex simplex;
458
- simplex.ReadCache(cache, proxyA, transformA, proxyB, transformB);
459
-
460
- // Get simplex vertices as an array.
461
- b2SimplexVertex* vertices = &simplex.m_v1;
462
- const int32 k_maxIters = 20;
463
-
464
- // These store the vertices of the last simplex so that we
465
- // can check for duplicates and prevent cycling.
466
- int32 saveA[3], saveB[3];
467
- int32 saveCount = 0;
468
-
469
- float32 distanceSqr1 = b2_maxFloat;
470
- float32 distanceSqr2 = distanceSqr1;
471
-
472
- // Main iteration loop.
473
- int32 iter = 0;
474
- while (iter < k_maxIters)
475
- {
476
- // Copy simplex so we can identify duplicates.
477
- saveCount = simplex.m_count;
478
- for (int32 i = 0; i < saveCount; ++i)
479
- {
480
- saveA[i] = vertices[i].indexA;
481
- saveB[i] = vertices[i].indexB;
482
- }
483
-
484
- switch (simplex.m_count)
485
- {
486
- case 1:
487
- break;
488
-
489
- case 2:
490
- simplex.Solve2();
491
- break;
492
-
493
- case 3:
494
- simplex.Solve3();
495
- break;
496
-
497
- default:
498
- b2Assert(false);
499
- }
500
-
501
- // If we have 3 points, then the origin is in the corresponding triangle.
502
- if (simplex.m_count == 3)
503
- {
504
- break;
505
- }
506
-
507
- // Compute closest point.
508
- b2Vec2 p = simplex.GetClosestPoint();
509
- distanceSqr2 = p.LengthSquared();
510
-
511
- // Ensure progress
512
- if (distanceSqr2 >= distanceSqr1)
513
- {
514
- //break;
515
- }
516
- distanceSqr1 = distanceSqr2;
517
-
518
- // Get search direction.
519
- b2Vec2 d = simplex.GetSearchDirection();
520
-
521
- // Ensure the search direction is numerically fit.
522
- if (d.LengthSquared() < b2_epsilon * b2_epsilon)
523
- {
524
- // The origin is probably contained by a line segment
525
- // or triangle. Thus the shapes are overlapped.
526
-
527
- // We can't return zero here even though there may be overlap.
528
- // In case the simplex is a point, segment, or triangle it is difficult
529
- // to determine if the origin is contained in the CSO or very close to it.
530
- break;
531
- }
532
-
533
- // Compute a tentative new simplex vertex using support points.
534
- b2SimplexVertex* vertex = vertices + simplex.m_count;
535
- vertex->indexA = proxyA->GetSupport(b2MulT(transformA.q, -d));
536
- vertex->wA = b2Mul(transformA, proxyA->GetVertex(vertex->indexA));
537
- b2Vec2 wBLocal;
538
- vertex->indexB = proxyB->GetSupport(b2MulT(transformB.q, d));
539
- vertex->wB = b2Mul(transformB, proxyB->GetVertex(vertex->indexB));
540
- vertex->w = vertex->wB - vertex->wA;
541
-
542
- // Iteration count is equated to the number of support point calls.
543
- ++iter;
544
- ++b2_gjkIters;
545
-
546
- // Check for duplicate support points. This is the main termination criteria.
547
- bool duplicate = false;
548
- for (int32 i = 0; i < saveCount; ++i)
549
- {
550
- if (vertex->indexA == saveA[i] && vertex->indexB == saveB[i])
551
- {
552
- duplicate = true;
553
- break;
554
- }
555
- }
556
-
557
- // If we found a duplicate support point we must exit to avoid cycling.
558
- if (duplicate)
559
- {
560
- break;
561
- }
562
-
563
- // New vertex is ok and needed.
564
- ++simplex.m_count;
565
- }
566
-
567
- b2_gjkMaxIters = b2Max(b2_gjkMaxIters, iter);
568
-
569
- // Prepare output.
570
- simplex.GetWitnessPoints(&output->pointA, &output->pointB);
571
- output->distance = b2Distance(output->pointA, output->pointB);
572
- output->iterations = iter;
573
-
574
- // Cache the simplex.
575
- simplex.WriteCache(cache);
576
-
577
- // Apply radii if requested.
578
- if (input->useRadii)
579
- {
580
- float32 rA = proxyA->m_radius;
581
- float32 rB = proxyB->m_radius;
582
-
583
- if (output->distance > rA + rB && output->distance > b2_epsilon)
584
- {
585
- // Shapes are still no overlapped.
586
- // Move the witness points to the outer surface.
587
- output->distance -= rA + rB;
588
- b2Vec2 normal = output->pointB - output->pointA;
589
- normal.Normalize();
590
- output->pointA += rA * normal;
591
- output->pointB -= rB * normal;
592
- }
593
- else
594
- {
595
- // Shapes are overlapped when radii are considered.
596
- // Move the witness points to the middle.
597
- b2Vec2 p = 0.5f * (output->pointA + output->pointB);
598
- output->pointA = p;
599
- output->pointB = p;
600
- output->distance = 0.0f;
601
- }
602
- }
603
- }