reflexion 0.1.11 → 0.1.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (333) hide show
  1. checksums.yaml +5 -5
  2. data/.doc/ext/reflex/application.cpp +9 -5
  3. data/.doc/ext/reflex/capture_event.cpp +4 -9
  4. data/.doc/ext/reflex/contact_event.cpp +17 -13
  5. data/.doc/ext/reflex/draw_event.cpp +3 -8
  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 +47 -14
  11. data/.doc/ext/reflex/image_view.cpp +1 -10
  12. data/.doc/ext/reflex/key_event.cpp +9 -14
  13. data/.doc/ext/reflex/line_shape.cpp +99 -0
  14. data/.doc/ext/reflex/motion_event.cpp +73 -0
  15. data/.doc/ext/reflex/native.cpp +18 -18
  16. data/.doc/ext/reflex/pointer_event.cpp +27 -25
  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 +24 -3
  20. data/.doc/ext/reflex/scroll_event.cpp +8 -15
  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 +12 -8
  28. data/.doc/ext/reflex/view.cpp +548 -144
  29. data/.doc/ext/reflex/wheel_event.cpp +5 -28
  30. data/.doc/ext/reflex/window.cpp +7 -15
  31. data/LICENSE +21 -0
  32. data/README.md +1 -1
  33. data/Rakefile +14 -12
  34. data/VERSION +1 -1
  35. data/ext/reflex/application.cpp +10 -5
  36. data/ext/reflex/capture_event.cpp +4 -9
  37. data/ext/reflex/contact_event.cpp +18 -13
  38. data/ext/reflex/defs.h +5 -2
  39. data/ext/reflex/draw_event.cpp +3 -8
  40. data/ext/reflex/ellipse_shape.cpp +56 -25
  41. data/ext/reflex/event.cpp +0 -4
  42. data/ext/reflex/extconf.rb +1 -2
  43. data/ext/reflex/filter.cpp +86 -0
  44. data/ext/reflex/focus_event.cpp +11 -15
  45. data/ext/reflex/frame_event.cpp +52 -14
  46. data/ext/reflex/image_view.cpp +1 -10
  47. data/ext/reflex/key_event.cpp +9 -14
  48. data/ext/reflex/line_shape.cpp +104 -0
  49. data/ext/reflex/motion_event.cpp +77 -0
  50. data/ext/reflex/native.cpp +18 -18
  51. data/ext/reflex/pointer_event.cpp +27 -25
  52. data/ext/reflex/polygon_shape.cpp +68 -0
  53. data/ext/reflex/rect_shape.cpp +113 -24
  54. data/ext/reflex/reflex.cpp +24 -3
  55. data/ext/reflex/scroll_event.cpp +8 -15
  56. data/ext/reflex/selector.cpp +46 -16
  57. data/ext/reflex/selector.h +130 -0
  58. data/ext/reflex/shape.cpp +231 -0
  59. data/ext/reflex/style.cpp +363 -192
  60. data/ext/reflex/style_length.cpp +164 -37
  61. data/ext/reflex/timer.cpp +108 -0
  62. data/ext/reflex/timer_event.cpp +133 -0
  63. data/ext/reflex/update_event.cpp +13 -8
  64. data/ext/reflex/view.cpp +594 -150
  65. data/ext/reflex/wheel_event.cpp +5 -30
  66. data/ext/reflex/window.cpp +7 -15
  67. data/include/reflex.h +5 -4
  68. data/include/reflex/application.h +2 -0
  69. data/include/reflex/debug.h +22 -0
  70. data/include/reflex/defs.h +45 -2
  71. data/include/reflex/event.h +55 -11
  72. data/include/reflex/exception.h +17 -2
  73. data/include/reflex/filter.h +56 -0
  74. data/include/reflex/image_view.h +1 -1
  75. data/include/reflex/ruby.h +6 -4
  76. data/include/reflex/ruby/application.h +17 -9
  77. data/include/reflex/ruby/event.h +22 -0
  78. data/include/reflex/ruby/filter.h +69 -0
  79. data/include/reflex/ruby/reflex.h +1 -0
  80. data/include/reflex/ruby/selector.h +1 -1
  81. data/include/reflex/ruby/shape.h +140 -0
  82. data/include/reflex/ruby/style.h +1 -1
  83. data/include/reflex/ruby/timer.h +69 -0
  84. data/include/reflex/ruby/view.h +43 -76
  85. data/include/reflex/ruby/window.h +17 -32
  86. data/include/reflex/selector.h +54 -2
  87. data/include/reflex/shape.h +211 -0
  88. data/include/reflex/style.h +136 -76
  89. data/include/reflex/timer.h +73 -0
  90. data/include/reflex/view.h +181 -59
  91. data/include/reflex/window.h +4 -3
  92. data/lib/reflex.rb +13 -6
  93. data/lib/reflex/application.rb +6 -3
  94. data/lib/reflex/button.rb +2 -2
  95. data/lib/reflex/{texture.rb → camera.rb} +2 -2
  96. data/lib/reflex/capture_event.rb +7 -6
  97. data/lib/reflex/contact_event.rb +10 -12
  98. data/lib/reflex/draw_event.rb +6 -1
  99. data/lib/reflex/ellipse_shape.rb +27 -0
  100. data/lib/reflex/filter.rb +18 -0
  101. data/lib/reflex/fixture.rb +4 -0
  102. data/lib/reflex/focus_event.rb +10 -12
  103. data/lib/reflex/frame_event.rb +1 -1
  104. data/lib/reflex/helper.rb +17 -29
  105. data/lib/reflex/key_event.rb +13 -11
  106. data/lib/reflex/line_shape.rb +18 -0
  107. data/lib/reflex/matrix.rb +13 -0
  108. data/lib/reflex/module.rb +4 -19
  109. data/lib/reflex/pointer_event.rb +28 -35
  110. data/lib/reflex/polygon.rb +14 -0
  111. data/lib/reflex/polygon_shape.rb +23 -0
  112. data/lib/reflex/polyline.rb +13 -0
  113. data/lib/reflex/rect_shape.rb +20 -0
  114. data/lib/reflex/reflex.rb +1 -3
  115. data/lib/reflex/scroll_event.rb +1 -1
  116. data/lib/reflex/selector.rb +2 -2
  117. data/lib/reflex/shape.rb +62 -0
  118. data/lib/reflex/style.rb +78 -11
  119. data/lib/reflex/style_length.rb +0 -11
  120. data/lib/reflex/text_view.rb +7 -24
  121. data/lib/reflex/timer.rb +30 -0
  122. data/lib/reflex/timer_event.rb +29 -0
  123. data/lib/reflex/update_event.rb +1 -1
  124. data/lib/reflex/view.rb +127 -32
  125. data/lib/reflex/wheel_event.rb +9 -1
  126. data/lib/reflex/window.rb +29 -9
  127. data/lib/reflexion.rb +23 -7
  128. data/reflex.gemspec +7 -8
  129. data/samples/bats.rb +4 -4
  130. data/samples/camera.rb +32 -0
  131. data/samples/fans.rb +1 -1
  132. data/samples/fps.rb +5 -3
  133. data/samples/hello.rb +4 -6
  134. data/samples/image.rb +5 -4
  135. data/samples/ios/hello/hello.xcodeproj/project.pbxproj +0 -2
  136. data/samples/layout.rb +16 -7
  137. data/samples/model.rb +10 -7
  138. data/samples/physics.rb +22 -20
  139. data/samples/reflexion/breakout.rb +4 -5
  140. data/samples/reflexion/hello.rb +2 -2
  141. data/samples/reflexion/jump_action.rb +191 -0
  142. data/samples/reflexion/noise.rb +23 -0
  143. data/samples/reflexion/paint.rb +7 -6
  144. data/samples/reflexion/physics.rb +15 -8
  145. data/samples/reflexion/pulse.rb +24 -10
  146. data/samples/shader.rb +8 -6
  147. data/samples/shapes.rb +79 -14
  148. data/samples/tree.rb +9 -10
  149. data/samples/views.rb +3 -3
  150. data/samples/visuals.rb +2 -5
  151. data/src/body.cpp +146 -345
  152. data/src/body.h +91 -0
  153. data/src/event.cpp +65 -15
  154. data/src/exception.cpp +13 -3
  155. data/src/filter.cpp +76 -0
  156. data/src/fixture.cpp +164 -39
  157. data/src/fixture.h +85 -0
  158. data/src/image_view.cpp +4 -4
  159. data/src/ios/app_delegate.h +5 -10
  160. data/src/ios/app_delegate.mm +79 -41
  161. data/src/ios/application.h +32 -0
  162. data/src/ios/application.mm +35 -25
  163. data/src/ios/event.mm +8 -4
  164. data/src/ios/reflex.mm +0 -7
  165. data/src/ios/view_controller.h +37 -0
  166. data/src/ios/view_controller.mm +424 -0
  167. data/src/ios/window.h +40 -0
  168. data/src/ios/window.mm +59 -250
  169. data/src/osx/app_delegate.h +5 -10
  170. data/src/osx/app_delegate.mm +52 -55
  171. data/src/osx/application.h +32 -0
  172. data/src/osx/application.mm +44 -39
  173. data/src/osx/native_window.h +0 -15
  174. data/src/osx/native_window.mm +127 -127
  175. data/src/osx/opengl_view.h +0 -2
  176. data/src/osx/opengl_view.mm +12 -3
  177. data/src/osx/reflex.mm +0 -9
  178. data/src/osx/window.h +42 -0
  179. data/src/osx/window.mm +45 -252
  180. data/src/selector.cpp +232 -7
  181. data/src/selector.h +52 -0
  182. data/src/shape.cpp +1191 -0
  183. data/src/shape.h +61 -0
  184. data/src/style.cpp +573 -376
  185. data/src/style.h +39 -0
  186. data/src/timer.cpp +288 -0
  187. data/src/timer.h +55 -0
  188. data/src/view.cpp +1624 -984
  189. data/src/view.h +56 -0
  190. data/src/win32/window.cpp +3 -4
  191. data/src/window.cpp +302 -20
  192. data/src/window.h +94 -0
  193. data/src/world.cpp +112 -111
  194. data/src/world.h +34 -53
  195. data/task/box2d.rake +31 -10
  196. data/test/test_capture_event.rb +8 -6
  197. data/test/test_pointer_event.rb +130 -0
  198. data/test/test_selector.rb +1 -1
  199. data/test/test_shape.rb +71 -0
  200. data/test/test_style.rb +77 -11
  201. data/test/test_style_length.rb +42 -13
  202. data/test/test_view.rb +138 -14
  203. metadata +118 -202
  204. data/.doc/ext/reflex/arc_shape.cpp +0 -89
  205. data/.doc/ext/reflex/body.cpp +0 -299
  206. data/.doc/ext/reflex/fixture.cpp +0 -101
  207. data/.doc/ext/reflex/shape_view.cpp +0 -153
  208. data/ext/reflex/arc_shape.cpp +0 -94
  209. data/ext/reflex/body.cpp +0 -328
  210. data/ext/reflex/fixture.cpp +0 -108
  211. data/ext/reflex/shape_view.cpp +0 -161
  212. data/include/reflex/bitmap.h +0 -20
  213. data/include/reflex/body.h +0 -128
  214. data/include/reflex/bounds.h +0 -20
  215. data/include/reflex/color.h +0 -20
  216. data/include/reflex/color_space.h +0 -20
  217. data/include/reflex/fixture.h +0 -117
  218. data/include/reflex/font.h +0 -20
  219. data/include/reflex/image.h +0 -20
  220. data/include/reflex/matrix.h +0 -20
  221. data/include/reflex/painter.h +0 -20
  222. data/include/reflex/point.h +0 -24
  223. data/include/reflex/ruby/body.h +0 -41
  224. data/include/reflex/ruby/fixture.h +0 -41
  225. data/include/reflex/ruby/shape_view.h +0 -96
  226. data/include/reflex/shader.h +0 -20
  227. data/include/reflex/shape_view.h +0 -146
  228. data/include/reflex/texture.h +0 -20
  229. data/lib/reflex/body.rb +0 -22
  230. data/lib/reflex/flags.rb +0 -18
  231. data/lib/reflex/shape_view.rb +0 -25
  232. data/src/ios/application_data.h +0 -45
  233. data/src/ios/native_window.h +0 -39
  234. data/src/ios/native_window.mm +0 -224
  235. data/src/ios/opengl_view.h +0 -13
  236. data/src/ios/opengl_view.mm +0 -139
  237. data/src/ios/window_data.h +0 -75
  238. data/src/osx/application_data.h +0 -45
  239. data/src/osx/window_data.h +0 -75
  240. data/src/physics/Box2D/Box2D.h +0 -68
  241. data/src/physics/Box2D/Collision/Shapes/b2ChainShape.cpp +0 -193
  242. data/src/physics/Box2D/Collision/Shapes/b2ChainShape.h +0 -105
  243. data/src/physics/Box2D/Collision/Shapes/b2CircleShape.cpp +0 -99
  244. data/src/physics/Box2D/Collision/Shapes/b2CircleShape.h +0 -91
  245. data/src/physics/Box2D/Collision/Shapes/b2EdgeShape.cpp +0 -138
  246. data/src/physics/Box2D/Collision/Shapes/b2EdgeShape.h +0 -74
  247. data/src/physics/Box2D/Collision/Shapes/b2PolygonShape.cpp +0 -467
  248. data/src/physics/Box2D/Collision/Shapes/b2PolygonShape.h +0 -101
  249. data/src/physics/Box2D/Collision/Shapes/b2Shape.h +0 -101
  250. data/src/physics/Box2D/Collision/b2BroadPhase.cpp +0 -119
  251. data/src/physics/Box2D/Collision/b2BroadPhase.h +0 -257
  252. data/src/physics/Box2D/Collision/b2CollideCircle.cpp +0 -154
  253. data/src/physics/Box2D/Collision/b2CollideEdge.cpp +0 -698
  254. data/src/physics/Box2D/Collision/b2CollidePolygon.cpp +0 -239
  255. data/src/physics/Box2D/Collision/b2Collision.cpp +0 -252
  256. data/src/physics/Box2D/Collision/b2Collision.h +0 -277
  257. data/src/physics/Box2D/Collision/b2Distance.cpp +0 -603
  258. data/src/physics/Box2D/Collision/b2Distance.h +0 -141
  259. data/src/physics/Box2D/Collision/b2DynamicTree.cpp +0 -778
  260. data/src/physics/Box2D/Collision/b2DynamicTree.h +0 -289
  261. data/src/physics/Box2D/Collision/b2TimeOfImpact.cpp +0 -486
  262. data/src/physics/Box2D/Collision/b2TimeOfImpact.h +0 -58
  263. data/src/physics/Box2D/Common/b2BlockAllocator.cpp +0 -215
  264. data/src/physics/Box2D/Common/b2BlockAllocator.h +0 -62
  265. data/src/physics/Box2D/Common/b2Draw.cpp +0 -44
  266. data/src/physics/Box2D/Common/b2Draw.h +0 -86
  267. data/src/physics/Box2D/Common/b2GrowableStack.h +0 -85
  268. data/src/physics/Box2D/Common/b2Math.cpp +0 -94
  269. data/src/physics/Box2D/Common/b2Math.h +0 -720
  270. data/src/physics/Box2D/Common/b2Settings.cpp +0 -44
  271. data/src/physics/Box2D/Common/b2Settings.h +0 -151
  272. data/src/physics/Box2D/Common/b2StackAllocator.cpp +0 -83
  273. data/src/physics/Box2D/Common/b2StackAllocator.h +0 -60
  274. data/src/physics/Box2D/Common/b2Timer.cpp +0 -101
  275. data/src/physics/Box2D/Common/b2Timer.h +0 -50
  276. data/src/physics/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp +0 -53
  277. data/src/physics/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h +0 -39
  278. data/src/physics/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp +0 -53
  279. data/src/physics/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h +0 -39
  280. data/src/physics/Box2D/Dynamics/Contacts/b2CircleContact.cpp +0 -52
  281. data/src/physics/Box2D/Dynamics/Contacts/b2CircleContact.h +0 -39
  282. data/src/physics/Box2D/Dynamics/Contacts/b2Contact.cpp +0 -247
  283. data/src/physics/Box2D/Dynamics/Contacts/b2Contact.h +0 -349
  284. data/src/physics/Box2D/Dynamics/Contacts/b2ContactSolver.cpp +0 -838
  285. data/src/physics/Box2D/Dynamics/Contacts/b2ContactSolver.h +0 -95
  286. data/src/physics/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp +0 -49
  287. data/src/physics/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h +0 -39
  288. data/src/physics/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp +0 -49
  289. data/src/physics/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h +0 -39
  290. data/src/physics/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp +0 -49
  291. data/src/physics/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h +0 -38
  292. data/src/physics/Box2D/Dynamics/Contacts/b2PolygonContact.cpp +0 -52
  293. data/src/physics/Box2D/Dynamics/Contacts/b2PolygonContact.h +0 -39
  294. data/src/physics/Box2D/Dynamics/Joints/b2DistanceJoint.cpp +0 -260
  295. data/src/physics/Box2D/Dynamics/Joints/b2DistanceJoint.h +0 -169
  296. data/src/physics/Box2D/Dynamics/Joints/b2FrictionJoint.cpp +0 -251
  297. data/src/physics/Box2D/Dynamics/Joints/b2FrictionJoint.h +0 -119
  298. data/src/physics/Box2D/Dynamics/Joints/b2GearJoint.cpp +0 -419
  299. data/src/physics/Box2D/Dynamics/Joints/b2GearJoint.h +0 -125
  300. data/src/physics/Box2D/Dynamics/Joints/b2Joint.cpp +0 -211
  301. data/src/physics/Box2D/Dynamics/Joints/b2Joint.h +0 -226
  302. data/src/physics/Box2D/Dynamics/Joints/b2MotorJoint.cpp +0 -304
  303. data/src/physics/Box2D/Dynamics/Joints/b2MotorJoint.h +0 -133
  304. data/src/physics/Box2D/Dynamics/Joints/b2MouseJoint.cpp +0 -222
  305. data/src/physics/Box2D/Dynamics/Joints/b2MouseJoint.h +0 -129
  306. data/src/physics/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp +0 -629
  307. data/src/physics/Box2D/Dynamics/Joints/b2PrismaticJoint.h +0 -196
  308. data/src/physics/Box2D/Dynamics/Joints/b2PulleyJoint.cpp +0 -348
  309. data/src/physics/Box2D/Dynamics/Joints/b2PulleyJoint.h +0 -152
  310. data/src/physics/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp +0 -502
  311. data/src/physics/Box2D/Dynamics/Joints/b2RevoluteJoint.h +0 -204
  312. data/src/physics/Box2D/Dynamics/Joints/b2RopeJoint.cpp +0 -241
  313. data/src/physics/Box2D/Dynamics/Joints/b2RopeJoint.h +0 -114
  314. data/src/physics/Box2D/Dynamics/Joints/b2WeldJoint.cpp +0 -344
  315. data/src/physics/Box2D/Dynamics/Joints/b2WeldJoint.h +0 -126
  316. data/src/physics/Box2D/Dynamics/Joints/b2WheelJoint.cpp +0 -419
  317. data/src/physics/Box2D/Dynamics/Joints/b2WheelJoint.h +0 -210
  318. data/src/physics/Box2D/Dynamics/b2Body.cpp +0 -549
  319. data/src/physics/Box2D/Dynamics/b2Body.h +0 -860
  320. data/src/physics/Box2D/Dynamics/b2ContactManager.cpp +0 -296
  321. data/src/physics/Box2D/Dynamics/b2ContactManager.h +0 -52
  322. data/src/physics/Box2D/Dynamics/b2Fixture.cpp +0 -303
  323. data/src/physics/Box2D/Dynamics/b2Fixture.h +0 -345
  324. data/src/physics/Box2D/Dynamics/b2Island.cpp +0 -539
  325. data/src/physics/Box2D/Dynamics/b2Island.h +0 -93
  326. data/src/physics/Box2D/Dynamics/b2TimeStep.h +0 -70
  327. data/src/physics/Box2D/Dynamics/b2World.cpp +0 -1339
  328. data/src/physics/Box2D/Dynamics/b2World.h +0 -354
  329. data/src/physics/Box2D/Dynamics/b2WorldCallbacks.cpp +0 -36
  330. data/src/physics/Box2D/Dynamics/b2WorldCallbacks.h +0 -155
  331. data/src/physics/Box2D/Rope/b2Rope.cpp +0 -259
  332. data/src/physics/Box2D/Rope/b2Rope.h +0 -115
  333. data/src/shape_view.cpp +0 -306
@@ -1,239 +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/b2Collision.h>
20
- #include <Box2D/Collision/Shapes/b2PolygonShape.h>
21
-
22
- // Find the max separation between poly1 and poly2 using edge normals from poly1.
23
- static float32 b2FindMaxSeparation(int32* edgeIndex,
24
- const b2PolygonShape* poly1, const b2Transform& xf1,
25
- const b2PolygonShape* poly2, const b2Transform& xf2)
26
- {
27
- int32 count1 = poly1->m_count;
28
- int32 count2 = poly2->m_count;
29
- const b2Vec2* n1s = poly1->m_normals;
30
- const b2Vec2* v1s = poly1->m_vertices;
31
- const b2Vec2* v2s = poly2->m_vertices;
32
- b2Transform xf = b2MulT(xf2, xf1);
33
-
34
- int32 bestIndex = 0;
35
- float32 maxSeparation = -b2_maxFloat;
36
- for (int32 i = 0; i < count1; ++i)
37
- {
38
- // Get poly1 normal in frame2.
39
- b2Vec2 n = b2Mul(xf.q, n1s[i]);
40
- b2Vec2 v1 = b2Mul(xf, v1s[i]);
41
-
42
- // Find deepest point for normal i.
43
- float32 si = b2_maxFloat;
44
- for (int32 j = 0; j < count2; ++j)
45
- {
46
- float32 sij = b2Dot(n, v2s[j] - v1);
47
- if (sij < si)
48
- {
49
- si = sij;
50
- }
51
- }
52
-
53
- if (si > maxSeparation)
54
- {
55
- maxSeparation = si;
56
- bestIndex = i;
57
- }
58
- }
59
-
60
- *edgeIndex = bestIndex;
61
- return maxSeparation;
62
- }
63
-
64
- static void b2FindIncidentEdge(b2ClipVertex c[2],
65
- const b2PolygonShape* poly1, const b2Transform& xf1, int32 edge1,
66
- const b2PolygonShape* poly2, const b2Transform& xf2)
67
- {
68
- const b2Vec2* normals1 = poly1->m_normals;
69
-
70
- int32 count2 = poly2->m_count;
71
- const b2Vec2* vertices2 = poly2->m_vertices;
72
- const b2Vec2* normals2 = poly2->m_normals;
73
-
74
- b2Assert(0 <= edge1 && edge1 < poly1->m_count);
75
-
76
- // Get the normal of the reference edge in poly2's frame.
77
- b2Vec2 normal1 = b2MulT(xf2.q, b2Mul(xf1.q, normals1[edge1]));
78
-
79
- // Find the incident edge on poly2.
80
- int32 index = 0;
81
- float32 minDot = b2_maxFloat;
82
- for (int32 i = 0; i < count2; ++i)
83
- {
84
- float32 dot = b2Dot(normal1, normals2[i]);
85
- if (dot < minDot)
86
- {
87
- minDot = dot;
88
- index = i;
89
- }
90
- }
91
-
92
- // Build the clip vertices for the incident edge.
93
- int32 i1 = index;
94
- int32 i2 = i1 + 1 < count2 ? i1 + 1 : 0;
95
-
96
- c[0].v = b2Mul(xf2, vertices2[i1]);
97
- c[0].id.cf.indexA = (uint8)edge1;
98
- c[0].id.cf.indexB = (uint8)i1;
99
- c[0].id.cf.typeA = b2ContactFeature::e_face;
100
- c[0].id.cf.typeB = b2ContactFeature::e_vertex;
101
-
102
- c[1].v = b2Mul(xf2, vertices2[i2]);
103
- c[1].id.cf.indexA = (uint8)edge1;
104
- c[1].id.cf.indexB = (uint8)i2;
105
- c[1].id.cf.typeA = b2ContactFeature::e_face;
106
- c[1].id.cf.typeB = b2ContactFeature::e_vertex;
107
- }
108
-
109
- // Find edge normal of max separation on A - return if separating axis is found
110
- // Find edge normal of max separation on B - return if separation axis is found
111
- // Choose reference edge as min(minA, minB)
112
- // Find incident edge
113
- // Clip
114
-
115
- // The normal points from 1 to 2
116
- void b2CollidePolygons(b2Manifold* manifold,
117
- const b2PolygonShape* polyA, const b2Transform& xfA,
118
- const b2PolygonShape* polyB, const b2Transform& xfB)
119
- {
120
- manifold->pointCount = 0;
121
- float32 totalRadius = polyA->m_radius + polyB->m_radius;
122
-
123
- int32 edgeA = 0;
124
- float32 separationA = b2FindMaxSeparation(&edgeA, polyA, xfA, polyB, xfB);
125
- if (separationA > totalRadius)
126
- return;
127
-
128
- int32 edgeB = 0;
129
- float32 separationB = b2FindMaxSeparation(&edgeB, polyB, xfB, polyA, xfA);
130
- if (separationB > totalRadius)
131
- return;
132
-
133
- const b2PolygonShape* poly1; // reference polygon
134
- const b2PolygonShape* poly2; // incident polygon
135
- b2Transform xf1, xf2;
136
- int32 edge1; // reference edge
137
- uint8 flip;
138
- const float32 k_tol = 0.1f * b2_linearSlop;
139
-
140
- if (separationB > separationA + k_tol)
141
- {
142
- poly1 = polyB;
143
- poly2 = polyA;
144
- xf1 = xfB;
145
- xf2 = xfA;
146
- edge1 = edgeB;
147
- manifold->type = b2Manifold::e_faceB;
148
- flip = 1;
149
- }
150
- else
151
- {
152
- poly1 = polyA;
153
- poly2 = polyB;
154
- xf1 = xfA;
155
- xf2 = xfB;
156
- edge1 = edgeA;
157
- manifold->type = b2Manifold::e_faceA;
158
- flip = 0;
159
- }
160
-
161
- b2ClipVertex incidentEdge[2];
162
- b2FindIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2);
163
-
164
- int32 count1 = poly1->m_count;
165
- const b2Vec2* vertices1 = poly1->m_vertices;
166
-
167
- int32 iv1 = edge1;
168
- int32 iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0;
169
-
170
- b2Vec2 v11 = vertices1[iv1];
171
- b2Vec2 v12 = vertices1[iv2];
172
-
173
- b2Vec2 localTangent = v12 - v11;
174
- localTangent.Normalize();
175
-
176
- b2Vec2 localNormal = b2Cross(localTangent, 1.0f);
177
- b2Vec2 planePoint = 0.5f * (v11 + v12);
178
-
179
- b2Vec2 tangent = b2Mul(xf1.q, localTangent);
180
- b2Vec2 normal = b2Cross(tangent, 1.0f);
181
-
182
- v11 = b2Mul(xf1, v11);
183
- v12 = b2Mul(xf1, v12);
184
-
185
- // Face offset.
186
- float32 frontOffset = b2Dot(normal, v11);
187
-
188
- // Side offsets, extended by polytope skin thickness.
189
- float32 sideOffset1 = -b2Dot(tangent, v11) + totalRadius;
190
- float32 sideOffset2 = b2Dot(tangent, v12) + totalRadius;
191
-
192
- // Clip incident edge against extruded edge1 side edges.
193
- b2ClipVertex clipPoints1[2];
194
- b2ClipVertex clipPoints2[2];
195
- int np;
196
-
197
- // Clip to box side 1
198
- np = b2ClipSegmentToLine(clipPoints1, incidentEdge, -tangent, sideOffset1, iv1);
199
-
200
- if (np < 2)
201
- return;
202
-
203
- // Clip to negative box side 1
204
- np = b2ClipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2);
205
-
206
- if (np < 2)
207
- {
208
- return;
209
- }
210
-
211
- // Now clipPoints2 contains the clipped points.
212
- manifold->localNormal = localNormal;
213
- manifold->localPoint = planePoint;
214
-
215
- int32 pointCount = 0;
216
- for (int32 i = 0; i < b2_maxManifoldPoints; ++i)
217
- {
218
- float32 separation = b2Dot(normal, clipPoints2[i].v) - frontOffset;
219
-
220
- if (separation <= totalRadius)
221
- {
222
- b2ManifoldPoint* cp = manifold->points + pointCount;
223
- cp->localPoint = b2MulT(xf2, clipPoints2[i].v);
224
- cp->id = clipPoints2[i].id;
225
- if (flip)
226
- {
227
- // Swap features
228
- b2ContactFeature cf = cp->id.cf;
229
- cp->id.cf.indexA = cf.indexB;
230
- cp->id.cf.indexB = cf.indexA;
231
- cp->id.cf.typeA = cf.typeB;
232
- cp->id.cf.typeB = cf.typeA;
233
- }
234
- ++pointCount;
235
- }
236
- }
237
-
238
- manifold->pointCount = pointCount;
239
- }
@@ -1,252 +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/b2Collision.h>
20
- #include <Box2D/Collision/b2Distance.h>
21
-
22
- void b2WorldManifold::Initialize(const b2Manifold* manifold,
23
- const b2Transform& xfA, float32 radiusA,
24
- const b2Transform& xfB, float32 radiusB)
25
- {
26
- if (manifold->pointCount == 0)
27
- {
28
- return;
29
- }
30
-
31
- switch (manifold->type)
32
- {
33
- case b2Manifold::e_circles:
34
- {
35
- normal.Set(1.0f, 0.0f);
36
- b2Vec2 pointA = b2Mul(xfA, manifold->localPoint);
37
- b2Vec2 pointB = b2Mul(xfB, manifold->points[0].localPoint);
38
- if (b2DistanceSquared(pointA, pointB) > b2_epsilon * b2_epsilon)
39
- {
40
- normal = pointB - pointA;
41
- normal.Normalize();
42
- }
43
-
44
- b2Vec2 cA = pointA + radiusA * normal;
45
- b2Vec2 cB = pointB - radiusB * normal;
46
- points[0] = 0.5f * (cA + cB);
47
- separations[0] = b2Dot(cB - cA, normal);
48
- }
49
- break;
50
-
51
- case b2Manifold::e_faceA:
52
- {
53
- normal = b2Mul(xfA.q, manifold->localNormal);
54
- b2Vec2 planePoint = b2Mul(xfA, manifold->localPoint);
55
-
56
- for (int32 i = 0; i < manifold->pointCount; ++i)
57
- {
58
- b2Vec2 clipPoint = b2Mul(xfB, manifold->points[i].localPoint);
59
- b2Vec2 cA = clipPoint + (radiusA - b2Dot(clipPoint - planePoint, normal)) * normal;
60
- b2Vec2 cB = clipPoint - radiusB * normal;
61
- points[i] = 0.5f * (cA + cB);
62
- separations[i] = b2Dot(cB - cA, normal);
63
- }
64
- }
65
- break;
66
-
67
- case b2Manifold::e_faceB:
68
- {
69
- normal = b2Mul(xfB.q, manifold->localNormal);
70
- b2Vec2 planePoint = b2Mul(xfB, manifold->localPoint);
71
-
72
- for (int32 i = 0; i < manifold->pointCount; ++i)
73
- {
74
- b2Vec2 clipPoint = b2Mul(xfA, manifold->points[i].localPoint);
75
- b2Vec2 cB = clipPoint + (radiusB - b2Dot(clipPoint - planePoint, normal)) * normal;
76
- b2Vec2 cA = clipPoint - radiusA * normal;
77
- points[i] = 0.5f * (cA + cB);
78
- separations[i] = b2Dot(cA - cB, normal);
79
- }
80
-
81
- // Ensure normal points from A to B.
82
- normal = -normal;
83
- }
84
- break;
85
- }
86
- }
87
-
88
- void b2GetPointStates(b2PointState state1[b2_maxManifoldPoints], b2PointState state2[b2_maxManifoldPoints],
89
- const b2Manifold* manifold1, const b2Manifold* manifold2)
90
- {
91
- for (int32 i = 0; i < b2_maxManifoldPoints; ++i)
92
- {
93
- state1[i] = b2_nullState;
94
- state2[i] = b2_nullState;
95
- }
96
-
97
- // Detect persists and removes.
98
- for (int32 i = 0; i < manifold1->pointCount; ++i)
99
- {
100
- b2ContactID id = manifold1->points[i].id;
101
-
102
- state1[i] = b2_removeState;
103
-
104
- for (int32 j = 0; j < manifold2->pointCount; ++j)
105
- {
106
- if (manifold2->points[j].id.key == id.key)
107
- {
108
- state1[i] = b2_persistState;
109
- break;
110
- }
111
- }
112
- }
113
-
114
- // Detect persists and adds.
115
- for (int32 i = 0; i < manifold2->pointCount; ++i)
116
- {
117
- b2ContactID id = manifold2->points[i].id;
118
-
119
- state2[i] = b2_addState;
120
-
121
- for (int32 j = 0; j < manifold1->pointCount; ++j)
122
- {
123
- if (manifold1->points[j].id.key == id.key)
124
- {
125
- state2[i] = b2_persistState;
126
- break;
127
- }
128
- }
129
- }
130
- }
131
-
132
- // From Real-time Collision Detection, p179.
133
- bool b2AABB::RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const
134
- {
135
- float32 tmin = -b2_maxFloat;
136
- float32 tmax = b2_maxFloat;
137
-
138
- b2Vec2 p = input.p1;
139
- b2Vec2 d = input.p2 - input.p1;
140
- b2Vec2 absD = b2Abs(d);
141
-
142
- b2Vec2 normal;
143
-
144
- for (int32 i = 0; i < 2; ++i)
145
- {
146
- if (absD(i) < b2_epsilon)
147
- {
148
- // Parallel.
149
- if (p(i) < lowerBound(i) || upperBound(i) < p(i))
150
- {
151
- return false;
152
- }
153
- }
154
- else
155
- {
156
- float32 inv_d = 1.0f / d(i);
157
- float32 t1 = (lowerBound(i) - p(i)) * inv_d;
158
- float32 t2 = (upperBound(i) - p(i)) * inv_d;
159
-
160
- // Sign of the normal vector.
161
- float32 s = -1.0f;
162
-
163
- if (t1 > t2)
164
- {
165
- b2Swap(t1, t2);
166
- s = 1.0f;
167
- }
168
-
169
- // Push the min up
170
- if (t1 > tmin)
171
- {
172
- normal.SetZero();
173
- normal(i) = s;
174
- tmin = t1;
175
- }
176
-
177
- // Pull the max down
178
- tmax = b2Min(tmax, t2);
179
-
180
- if (tmin > tmax)
181
- {
182
- return false;
183
- }
184
- }
185
- }
186
-
187
- // Does the ray start inside the box?
188
- // Does the ray intersect beyond the max fraction?
189
- if (tmin < 0.0f || input.maxFraction < tmin)
190
- {
191
- return false;
192
- }
193
-
194
- // Intersection.
195
- output->fraction = tmin;
196
- output->normal = normal;
197
- return true;
198
- }
199
-
200
- // Sutherland-Hodgman clipping.
201
- int32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2],
202
- const b2Vec2& normal, float32 offset, int32 vertexIndexA)
203
- {
204
- // Start with no output points
205
- int32 numOut = 0;
206
-
207
- // Calculate the distance of end points to the line
208
- float32 distance0 = b2Dot(normal, vIn[0].v) - offset;
209
- float32 distance1 = b2Dot(normal, vIn[1].v) - offset;
210
-
211
- // If the points are behind the plane
212
- if (distance0 <= 0.0f) vOut[numOut++] = vIn[0];
213
- if (distance1 <= 0.0f) vOut[numOut++] = vIn[1];
214
-
215
- // If the points are on different sides of the plane
216
- if (distance0 * distance1 < 0.0f)
217
- {
218
- // Find intersection point of edge and plane
219
- float32 interp = distance0 / (distance0 - distance1);
220
- vOut[numOut].v = vIn[0].v + interp * (vIn[1].v - vIn[0].v);
221
-
222
- // VertexA is hitting edgeB.
223
- vOut[numOut].id.cf.indexA = static_cast<uint8>(vertexIndexA);
224
- vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB;
225
- vOut[numOut].id.cf.typeA = b2ContactFeature::e_vertex;
226
- vOut[numOut].id.cf.typeB = b2ContactFeature::e_face;
227
- ++numOut;
228
- }
229
-
230
- return numOut;
231
- }
232
-
233
- bool b2TestOverlap( const b2Shape* shapeA, int32 indexA,
234
- const b2Shape* shapeB, int32 indexB,
235
- const b2Transform& xfA, const b2Transform& xfB)
236
- {
237
- b2DistanceInput input;
238
- input.proxyA.Set(shapeA, indexA);
239
- input.proxyB.Set(shapeB, indexB);
240
- input.transformA = xfA;
241
- input.transformB = xfB;
242
- input.useRadii = true;
243
-
244
- b2SimplexCache cache;
245
- cache.count = 0;
246
-
247
- b2DistanceOutput output;
248
-
249
- b2Distance(&output, &cache, &input);
250
-
251
- return output.distance < 10.0f * b2_epsilon;
252
- }