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,85 +0,0 @@
1
- /*
2
- * Copyright (c) 2010 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_GROWABLE_STACK_H
20
- #define B2_GROWABLE_STACK_H
21
- #include <Box2D/Common/b2Settings.h>
22
- #include <string.h>
23
-
24
- /// This is a growable LIFO stack with an initial capacity of N.
25
- /// If the stack size exceeds the initial capacity, the heap is used
26
- /// to increase the size of the stack.
27
- template <typename T, int32 N>
28
- class b2GrowableStack
29
- {
30
- public:
31
- b2GrowableStack()
32
- {
33
- m_stack = m_array;
34
- m_count = 0;
35
- m_capacity = N;
36
- }
37
-
38
- ~b2GrowableStack()
39
- {
40
- if (m_stack != m_array)
41
- {
42
- b2Free(m_stack);
43
- m_stack = NULL;
44
- }
45
- }
46
-
47
- void Push(const T& element)
48
- {
49
- if (m_count == m_capacity)
50
- {
51
- T* old = m_stack;
52
- m_capacity *= 2;
53
- m_stack = (T*)b2Alloc(m_capacity * sizeof(T));
54
- memcpy(m_stack, old, m_count * sizeof(T));
55
- if (old != m_array)
56
- {
57
- b2Free(old);
58
- }
59
- }
60
-
61
- m_stack[m_count] = element;
62
- ++m_count;
63
- }
64
-
65
- T Pop()
66
- {
67
- b2Assert(m_count > 0);
68
- --m_count;
69
- return m_stack[m_count];
70
- }
71
-
72
- int32 GetCount()
73
- {
74
- return m_count;
75
- }
76
-
77
- private:
78
- T* m_stack;
79
- T m_array[N];
80
- int32 m_count;
81
- int32 m_capacity;
82
- };
83
-
84
-
85
- #endif
@@ -1,94 +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/Common/b2Math.h>
20
-
21
- const b2Vec2 b2Vec2_zero(0.0f, 0.0f);
22
-
23
- /// Solve A * x = b, where b is a column vector. This is more efficient
24
- /// than computing the inverse in one-shot cases.
25
- b2Vec3 b2Mat33::Solve33(const b2Vec3& b) const
26
- {
27
- float32 det = b2Dot(ex, b2Cross(ey, ez));
28
- if (det != 0.0f)
29
- {
30
- det = 1.0f / det;
31
- }
32
- b2Vec3 x;
33
- x.x = det * b2Dot(b, b2Cross(ey, ez));
34
- x.y = det * b2Dot(ex, b2Cross(b, ez));
35
- x.z = det * b2Dot(ex, b2Cross(ey, b));
36
- return x;
37
- }
38
-
39
- /// Solve A * x = b, where b is a column vector. This is more efficient
40
- /// than computing the inverse in one-shot cases.
41
- b2Vec2 b2Mat33::Solve22(const b2Vec2& b) const
42
- {
43
- float32 a11 = ex.x, a12 = ey.x, a21 = ex.y, a22 = ey.y;
44
- float32 det = a11 * a22 - a12 * a21;
45
- if (det != 0.0f)
46
- {
47
- det = 1.0f / det;
48
- }
49
- b2Vec2 x;
50
- x.x = det * (a22 * b.x - a12 * b.y);
51
- x.y = det * (a11 * b.y - a21 * b.x);
52
- return x;
53
- }
54
-
55
- ///
56
- void b2Mat33::GetInverse22(b2Mat33* M) const
57
- {
58
- float32 a = ex.x, b = ey.x, c = ex.y, d = ey.y;
59
- float32 det = a * d - b * c;
60
- if (det != 0.0f)
61
- {
62
- det = 1.0f / det;
63
- }
64
-
65
- M->ex.x = det * d; M->ey.x = -det * b; M->ex.z = 0.0f;
66
- M->ex.y = -det * c; M->ey.y = det * a; M->ey.z = 0.0f;
67
- M->ez.x = 0.0f; M->ez.y = 0.0f; M->ez.z = 0.0f;
68
- }
69
-
70
- /// Returns the zero matrix if singular.
71
- void b2Mat33::GetSymInverse33(b2Mat33* M) const
72
- {
73
- float32 det = b2Dot(ex, b2Cross(ey, ez));
74
- if (det != 0.0f)
75
- {
76
- det = 1.0f / det;
77
- }
78
-
79
- float32 a11 = ex.x, a12 = ey.x, a13 = ez.x;
80
- float32 a22 = ey.y, a23 = ez.y;
81
- float32 a33 = ez.z;
82
-
83
- M->ex.x = det * (a22 * a33 - a23 * a23);
84
- M->ex.y = det * (a13 * a23 - a12 * a33);
85
- M->ex.z = det * (a12 * a23 - a13 * a22);
86
-
87
- M->ey.x = M->ex.y;
88
- M->ey.y = det * (a11 * a33 - a13 * a13);
89
- M->ey.z = det * (a13 * a12 - a11 * a23);
90
-
91
- M->ez.x = M->ex.z;
92
- M->ez.y = M->ey.z;
93
- M->ez.z = det * (a11 * a22 - a12 * a12);
94
- }
@@ -1,720 +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_MATH_H
20
- #define B2_MATH_H
21
-
22
- #include <Box2D/Common/b2Settings.h>
23
- #include <math.h>
24
-
25
- /// This function is used to ensure that a floating point number is not a NaN or infinity.
26
- inline bool b2IsValid(float32 x)
27
- {
28
- int32 ix = *reinterpret_cast<int32*>(&x);
29
- return (ix & 0x7f800000) != 0x7f800000;
30
- }
31
-
32
- /// This is a approximate yet fast inverse square-root.
33
- inline float32 b2InvSqrt(float32 x)
34
- {
35
- union
36
- {
37
- float32 x;
38
- int32 i;
39
- } convert;
40
-
41
- convert.x = x;
42
- float32 xhalf = 0.5f * x;
43
- convert.i = 0x5f3759df - (convert.i >> 1);
44
- x = convert.x;
45
- x = x * (1.5f - xhalf * x * x);
46
- return x;
47
- }
48
-
49
- #define b2Sqrt(x) sqrtf(x)
50
- #define b2Atan2(y, x) atan2f(y, x)
51
-
52
- /// A 2D column vector.
53
- struct b2Vec2
54
- {
55
- /// Default constructor does nothing (for performance).
56
- b2Vec2() {}
57
-
58
- /// Construct using coordinates.
59
- b2Vec2(float32 x, float32 y) : x(x), y(y) {}
60
-
61
- /// Set this vector to all zeros.
62
- void SetZero() { x = 0.0f; y = 0.0f; }
63
-
64
- /// Set this vector to some specified coordinates.
65
- void Set(float32 x_, float32 y_) { x = x_; y = y_; }
66
-
67
- /// Negate this vector.
68
- b2Vec2 operator -() const { b2Vec2 v; v.Set(-x, -y); return v; }
69
-
70
- /// Read from and indexed element.
71
- float32 operator () (int32 i) const
72
- {
73
- return (&x)[i];
74
- }
75
-
76
- /// Write to an indexed element.
77
- float32& operator () (int32 i)
78
- {
79
- return (&x)[i];
80
- }
81
-
82
- /// Add a vector to this vector.
83
- void operator += (const b2Vec2& v)
84
- {
85
- x += v.x; y += v.y;
86
- }
87
-
88
- /// Subtract a vector from this vector.
89
- void operator -= (const b2Vec2& v)
90
- {
91
- x -= v.x; y -= v.y;
92
- }
93
-
94
- /// Multiply this vector by a scalar.
95
- void operator *= (float32 a)
96
- {
97
- x *= a; y *= a;
98
- }
99
-
100
- /// Get the length of this vector (the norm).
101
- float32 Length() const
102
- {
103
- return b2Sqrt(x * x + y * y);
104
- }
105
-
106
- /// Get the length squared. For performance, use this instead of
107
- /// b2Vec2::Length (if possible).
108
- float32 LengthSquared() const
109
- {
110
- return x * x + y * y;
111
- }
112
-
113
- /// Convert this vector into a unit vector. Returns the length.
114
- float32 Normalize()
115
- {
116
- float32 length = Length();
117
- if (length < b2_epsilon)
118
- {
119
- return 0.0f;
120
- }
121
- float32 invLength = 1.0f / length;
122
- x *= invLength;
123
- y *= invLength;
124
-
125
- return length;
126
- }
127
-
128
- /// Does this vector contain finite coordinates?
129
- bool IsValid() const
130
- {
131
- return b2IsValid(x) && b2IsValid(y);
132
- }
133
-
134
- /// Get the skew vector such that dot(skew_vec, other) == cross(vec, other)
135
- b2Vec2 Skew() const
136
- {
137
- return b2Vec2(-y, x);
138
- }
139
-
140
- float32 x, y;
141
- };
142
-
143
- /// A 2D column vector with 3 elements.
144
- struct b2Vec3
145
- {
146
- /// Default constructor does nothing (for performance).
147
- b2Vec3() {}
148
-
149
- /// Construct using coordinates.
150
- b2Vec3(float32 x, float32 y, float32 z) : x(x), y(y), z(z) {}
151
-
152
- /// Set this vector to all zeros.
153
- void SetZero() { x = 0.0f; y = 0.0f; z = 0.0f; }
154
-
155
- /// Set this vector to some specified coordinates.
156
- void Set(float32 x_, float32 y_, float32 z_) { x = x_; y = y_; z = z_; }
157
-
158
- /// Negate this vector.
159
- b2Vec3 operator -() const { b2Vec3 v; v.Set(-x, -y, -z); return v; }
160
-
161
- /// Add a vector to this vector.
162
- void operator += (const b2Vec3& v)
163
- {
164
- x += v.x; y += v.y; z += v.z;
165
- }
166
-
167
- /// Subtract a vector from this vector.
168
- void operator -= (const b2Vec3& v)
169
- {
170
- x -= v.x; y -= v.y; z -= v.z;
171
- }
172
-
173
- /// Multiply this vector by a scalar.
174
- void operator *= (float32 s)
175
- {
176
- x *= s; y *= s; z *= s;
177
- }
178
-
179
- float32 x, y, z;
180
- };
181
-
182
- /// A 2-by-2 matrix. Stored in column-major order.
183
- struct b2Mat22
184
- {
185
- /// The default constructor does nothing (for performance).
186
- b2Mat22() {}
187
-
188
- /// Construct this matrix using columns.
189
- b2Mat22(const b2Vec2& c1, const b2Vec2& c2)
190
- {
191
- ex = c1;
192
- ey = c2;
193
- }
194
-
195
- /// Construct this matrix using scalars.
196
- b2Mat22(float32 a11, float32 a12, float32 a21, float32 a22)
197
- {
198
- ex.x = a11; ex.y = a21;
199
- ey.x = a12; ey.y = a22;
200
- }
201
-
202
- /// Initialize this matrix using columns.
203
- void Set(const b2Vec2& c1, const b2Vec2& c2)
204
- {
205
- ex = c1;
206
- ey = c2;
207
- }
208
-
209
- /// Set this to the identity matrix.
210
- void SetIdentity()
211
- {
212
- ex.x = 1.0f; ey.x = 0.0f;
213
- ex.y = 0.0f; ey.y = 1.0f;
214
- }
215
-
216
- /// Set this matrix to all zeros.
217
- void SetZero()
218
- {
219
- ex.x = 0.0f; ey.x = 0.0f;
220
- ex.y = 0.0f; ey.y = 0.0f;
221
- }
222
-
223
- b2Mat22 GetInverse() const
224
- {
225
- float32 a = ex.x, b = ey.x, c = ex.y, d = ey.y;
226
- b2Mat22 B;
227
- float32 det = a * d - b * c;
228
- if (det != 0.0f)
229
- {
230
- det = 1.0f / det;
231
- }
232
- B.ex.x = det * d; B.ey.x = -det * b;
233
- B.ex.y = -det * c; B.ey.y = det * a;
234
- return B;
235
- }
236
-
237
- /// Solve A * x = b, where b is a column vector. This is more efficient
238
- /// than computing the inverse in one-shot cases.
239
- b2Vec2 Solve(const b2Vec2& b) const
240
- {
241
- float32 a11 = ex.x, a12 = ey.x, a21 = ex.y, a22 = ey.y;
242
- float32 det = a11 * a22 - a12 * a21;
243
- if (det != 0.0f)
244
- {
245
- det = 1.0f / det;
246
- }
247
- b2Vec2 x;
248
- x.x = det * (a22 * b.x - a12 * b.y);
249
- x.y = det * (a11 * b.y - a21 * b.x);
250
- return x;
251
- }
252
-
253
- b2Vec2 ex, ey;
254
- };
255
-
256
- /// A 3-by-3 matrix. Stored in column-major order.
257
- struct b2Mat33
258
- {
259
- /// The default constructor does nothing (for performance).
260
- b2Mat33() {}
261
-
262
- /// Construct this matrix using columns.
263
- b2Mat33(const b2Vec3& c1, const b2Vec3& c2, const b2Vec3& c3)
264
- {
265
- ex = c1;
266
- ey = c2;
267
- ez = c3;
268
- }
269
-
270
- /// Set this matrix to all zeros.
271
- void SetZero()
272
- {
273
- ex.SetZero();
274
- ey.SetZero();
275
- ez.SetZero();
276
- }
277
-
278
- /// Solve A * x = b, where b is a column vector. This is more efficient
279
- /// than computing the inverse in one-shot cases.
280
- b2Vec3 Solve33(const b2Vec3& b) const;
281
-
282
- /// Solve A * x = b, where b is a column vector. This is more efficient
283
- /// than computing the inverse in one-shot cases. Solve only the upper
284
- /// 2-by-2 matrix equation.
285
- b2Vec2 Solve22(const b2Vec2& b) const;
286
-
287
- /// Get the inverse of this matrix as a 2-by-2.
288
- /// Returns the zero matrix if singular.
289
- void GetInverse22(b2Mat33* M) const;
290
-
291
- /// Get the symmetric inverse of this matrix as a 3-by-3.
292
- /// Returns the zero matrix if singular.
293
- void GetSymInverse33(b2Mat33* M) const;
294
-
295
- b2Vec3 ex, ey, ez;
296
- };
297
-
298
- /// Rotation
299
- struct b2Rot
300
- {
301
- b2Rot() {}
302
-
303
- /// Initialize from an angle in radians
304
- explicit b2Rot(float32 angle)
305
- {
306
- /// TODO_ERIN optimize
307
- s = sinf(angle);
308
- c = cosf(angle);
309
- }
310
-
311
- /// Set using an angle in radians.
312
- void Set(float32 angle)
313
- {
314
- /// TODO_ERIN optimize
315
- s = sinf(angle);
316
- c = cosf(angle);
317
- }
318
-
319
- /// Set to the identity rotation
320
- void SetIdentity()
321
- {
322
- s = 0.0f;
323
- c = 1.0f;
324
- }
325
-
326
- /// Get the angle in radians
327
- float32 GetAngle() const
328
- {
329
- return b2Atan2(s, c);
330
- }
331
-
332
- /// Get the x-axis
333
- b2Vec2 GetXAxis() const
334
- {
335
- return b2Vec2(c, s);
336
- }
337
-
338
- /// Get the u-axis
339
- b2Vec2 GetYAxis() const
340
- {
341
- return b2Vec2(-s, c);
342
- }
343
-
344
- /// Sine and cosine
345
- float32 s, c;
346
- };
347
-
348
- /// A transform contains translation and rotation. It is used to represent
349
- /// the position and orientation of rigid frames.
350
- struct b2Transform
351
- {
352
- /// The default constructor does nothing.
353
- b2Transform() {}
354
-
355
- /// Initialize using a position vector and a rotation.
356
- b2Transform(const b2Vec2& position, const b2Rot& rotation) : p(position), q(rotation) {}
357
-
358
- /// Set this to the identity transform.
359
- void SetIdentity()
360
- {
361
- p.SetZero();
362
- q.SetIdentity();
363
- }
364
-
365
- /// Set this based on the position and angle.
366
- void Set(const b2Vec2& position, float32 angle)
367
- {
368
- p = position;
369
- q.Set(angle);
370
- }
371
-
372
- b2Vec2 p;
373
- b2Rot q;
374
- };
375
-
376
- /// This describes the motion of a body/shape for TOI computation.
377
- /// Shapes are defined with respect to the body origin, which may
378
- /// no coincide with the center of mass. However, to support dynamics
379
- /// we must interpolate the center of mass position.
380
- struct b2Sweep
381
- {
382
- /// Get the interpolated transform at a specific time.
383
- /// @param beta is a factor in [0,1], where 0 indicates alpha0.
384
- void GetTransform(b2Transform* xfb, float32 beta) const;
385
-
386
- /// Advance the sweep forward, yielding a new initial state.
387
- /// @param alpha the new initial time.
388
- void Advance(float32 alpha);
389
-
390
- /// Normalize the angles.
391
- void Normalize();
392
-
393
- b2Vec2 localCenter; ///< local center of mass position
394
- b2Vec2 c0, c; ///< center world positions
395
- float32 a0, a; ///< world angles
396
-
397
- /// Fraction of the current time step in the range [0,1]
398
- /// c0 and a0 are the positions at alpha0.
399
- float32 alpha0;
400
- };
401
-
402
- /// Useful constant
403
- extern const b2Vec2 b2Vec2_zero;
404
-
405
- /// Perform the dot product on two vectors.
406
- inline float32 b2Dot(const b2Vec2& a, const b2Vec2& b)
407
- {
408
- return a.x * b.x + a.y * b.y;
409
- }
410
-
411
- /// Perform the cross product on two vectors. In 2D this produces a scalar.
412
- inline float32 b2Cross(const b2Vec2& a, const b2Vec2& b)
413
- {
414
- return a.x * b.y - a.y * b.x;
415
- }
416
-
417
- /// Perform the cross product on a vector and a scalar. In 2D this produces
418
- /// a vector.
419
- inline b2Vec2 b2Cross(const b2Vec2& a, float32 s)
420
- {
421
- return b2Vec2(s * a.y, -s * a.x);
422
- }
423
-
424
- /// Perform the cross product on a scalar and a vector. In 2D this produces
425
- /// a vector.
426
- inline b2Vec2 b2Cross(float32 s, const b2Vec2& a)
427
- {
428
- return b2Vec2(-s * a.y, s * a.x);
429
- }
430
-
431
- /// Multiply a matrix times a vector. If a rotation matrix is provided,
432
- /// then this transforms the vector from one frame to another.
433
- inline b2Vec2 b2Mul(const b2Mat22& A, const b2Vec2& v)
434
- {
435
- return b2Vec2(A.ex.x * v.x + A.ey.x * v.y, A.ex.y * v.x + A.ey.y * v.y);
436
- }
437
-
438
- /// Multiply a matrix transpose times a vector. If a rotation matrix is provided,
439
- /// then this transforms the vector from one frame to another (inverse transform).
440
- inline b2Vec2 b2MulT(const b2Mat22& A, const b2Vec2& v)
441
- {
442
- return b2Vec2(b2Dot(v, A.ex), b2Dot(v, A.ey));
443
- }
444
-
445
- /// Add two vectors component-wise.
446
- inline b2Vec2 operator + (const b2Vec2& a, const b2Vec2& b)
447
- {
448
- return b2Vec2(a.x + b.x, a.y + b.y);
449
- }
450
-
451
- /// Subtract two vectors component-wise.
452
- inline b2Vec2 operator - (const b2Vec2& a, const b2Vec2& b)
453
- {
454
- return b2Vec2(a.x - b.x, a.y - b.y);
455
- }
456
-
457
- inline b2Vec2 operator * (float32 s, const b2Vec2& a)
458
- {
459
- return b2Vec2(s * a.x, s * a.y);
460
- }
461
-
462
- inline bool operator == (const b2Vec2& a, const b2Vec2& b)
463
- {
464
- return a.x == b.x && a.y == b.y;
465
- }
466
-
467
- inline float32 b2Distance(const b2Vec2& a, const b2Vec2& b)
468
- {
469
- b2Vec2 c = a - b;
470
- return c.Length();
471
- }
472
-
473
- inline float32 b2DistanceSquared(const b2Vec2& a, const b2Vec2& b)
474
- {
475
- b2Vec2 c = a - b;
476
- return b2Dot(c, c);
477
- }
478
-
479
- inline b2Vec3 operator * (float32 s, const b2Vec3& a)
480
- {
481
- return b2Vec3(s * a.x, s * a.y, s * a.z);
482
- }
483
-
484
- /// Add two vectors component-wise.
485
- inline b2Vec3 operator + (const b2Vec3& a, const b2Vec3& b)
486
- {
487
- return b2Vec3(a.x + b.x, a.y + b.y, a.z + b.z);
488
- }
489
-
490
- /// Subtract two vectors component-wise.
491
- inline b2Vec3 operator - (const b2Vec3& a, const b2Vec3& b)
492
- {
493
- return b2Vec3(a.x - b.x, a.y - b.y, a.z - b.z);
494
- }
495
-
496
- /// Perform the dot product on two vectors.
497
- inline float32 b2Dot(const b2Vec3& a, const b2Vec3& b)
498
- {
499
- return a.x * b.x + a.y * b.y + a.z * b.z;
500
- }
501
-
502
- /// Perform the cross product on two vectors.
503
- inline b2Vec3 b2Cross(const b2Vec3& a, const b2Vec3& b)
504
- {
505
- return b2Vec3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);
506
- }
507
-
508
- inline b2Mat22 operator + (const b2Mat22& A, const b2Mat22& B)
509
- {
510
- return b2Mat22(A.ex + B.ex, A.ey + B.ey);
511
- }
512
-
513
- // A * B
514
- inline b2Mat22 b2Mul(const b2Mat22& A, const b2Mat22& B)
515
- {
516
- return b2Mat22(b2Mul(A, B.ex), b2Mul(A, B.ey));
517
- }
518
-
519
- // A^T * B
520
- inline b2Mat22 b2MulT(const b2Mat22& A, const b2Mat22& B)
521
- {
522
- b2Vec2 c1(b2Dot(A.ex, B.ex), b2Dot(A.ey, B.ex));
523
- b2Vec2 c2(b2Dot(A.ex, B.ey), b2Dot(A.ey, B.ey));
524
- return b2Mat22(c1, c2);
525
- }
526
-
527
- /// Multiply a matrix times a vector.
528
- inline b2Vec3 b2Mul(const b2Mat33& A, const b2Vec3& v)
529
- {
530
- return v.x * A.ex + v.y * A.ey + v.z * A.ez;
531
- }
532
-
533
- /// Multiply a matrix times a vector.
534
- inline b2Vec2 b2Mul22(const b2Mat33& A, const b2Vec2& v)
535
- {
536
- return b2Vec2(A.ex.x * v.x + A.ey.x * v.y, A.ex.y * v.x + A.ey.y * v.y);
537
- }
538
-
539
- /// Multiply two rotations: q * r
540
- inline b2Rot b2Mul(const b2Rot& q, const b2Rot& r)
541
- {
542
- // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]
543
- // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]
544
- // s = qs * rc + qc * rs
545
- // c = qc * rc - qs * rs
546
- b2Rot qr;
547
- qr.s = q.s * r.c + q.c * r.s;
548
- qr.c = q.c * r.c - q.s * r.s;
549
- return qr;
550
- }
551
-
552
- /// Transpose multiply two rotations: qT * r
553
- inline b2Rot b2MulT(const b2Rot& q, const b2Rot& r)
554
- {
555
- // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]
556
- // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]
557
- // s = qc * rs - qs * rc
558
- // c = qc * rc + qs * rs
559
- b2Rot qr;
560
- qr.s = q.c * r.s - q.s * r.c;
561
- qr.c = q.c * r.c + q.s * r.s;
562
- return qr;
563
- }
564
-
565
- /// Rotate a vector
566
- inline b2Vec2 b2Mul(const b2Rot& q, const b2Vec2& v)
567
- {
568
- return b2Vec2(q.c * v.x - q.s * v.y, q.s * v.x + q.c * v.y);
569
- }
570
-
571
- /// Inverse rotate a vector
572
- inline b2Vec2 b2MulT(const b2Rot& q, const b2Vec2& v)
573
- {
574
- return b2Vec2(q.c * v.x + q.s * v.y, -q.s * v.x + q.c * v.y);
575
- }
576
-
577
- inline b2Vec2 b2Mul(const b2Transform& T, const b2Vec2& v)
578
- {
579
- float32 x = (T.q.c * v.x - T.q.s * v.y) + T.p.x;
580
- float32 y = (T.q.s * v.x + T.q.c * v.y) + T.p.y;
581
-
582
- return b2Vec2(x, y);
583
- }
584
-
585
- inline b2Vec2 b2MulT(const b2Transform& T, const b2Vec2& v)
586
- {
587
- float32 px = v.x - T.p.x;
588
- float32 py = v.y - T.p.y;
589
- float32 x = (T.q.c * px + T.q.s * py);
590
- float32 y = (-T.q.s * px + T.q.c * py);
591
-
592
- return b2Vec2(x, y);
593
- }
594
-
595
- // v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p
596
- // = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p
597
- inline b2Transform b2Mul(const b2Transform& A, const b2Transform& B)
598
- {
599
- b2Transform C;
600
- C.q = b2Mul(A.q, B.q);
601
- C.p = b2Mul(A.q, B.p) + A.p;
602
- return C;
603
- }
604
-
605
- // v2 = A.q' * (B.q * v1 + B.p - A.p)
606
- // = A.q' * B.q * v1 + A.q' * (B.p - A.p)
607
- inline b2Transform b2MulT(const b2Transform& A, const b2Transform& B)
608
- {
609
- b2Transform C;
610
- C.q = b2MulT(A.q, B.q);
611
- C.p = b2MulT(A.q, B.p - A.p);
612
- return C;
613
- }
614
-
615
- template <typename T>
616
- inline T b2Abs(T a)
617
- {
618
- return a > T(0) ? a : -a;
619
- }
620
-
621
- inline b2Vec2 b2Abs(const b2Vec2& a)
622
- {
623
- return b2Vec2(b2Abs(a.x), b2Abs(a.y));
624
- }
625
-
626
- inline b2Mat22 b2Abs(const b2Mat22& A)
627
- {
628
- return b2Mat22(b2Abs(A.ex), b2Abs(A.ey));
629
- }
630
-
631
- template <typename T>
632
- inline T b2Min(T a, T b)
633
- {
634
- return a < b ? a : b;
635
- }
636
-
637
- inline b2Vec2 b2Min(const b2Vec2& a, const b2Vec2& b)
638
- {
639
- return b2Vec2(b2Min(a.x, b.x), b2Min(a.y, b.y));
640
- }
641
-
642
- template <typename T>
643
- inline T b2Max(T a, T b)
644
- {
645
- return a > b ? a : b;
646
- }
647
-
648
- inline b2Vec2 b2Max(const b2Vec2& a, const b2Vec2& b)
649
- {
650
- return b2Vec2(b2Max(a.x, b.x), b2Max(a.y, b.y));
651
- }
652
-
653
- template <typename T>
654
- inline T b2Clamp(T a, T low, T high)
655
- {
656
- return b2Max(low, b2Min(a, high));
657
- }
658
-
659
- inline b2Vec2 b2Clamp(const b2Vec2& a, const b2Vec2& low, const b2Vec2& high)
660
- {
661
- return b2Max(low, b2Min(a, high));
662
- }
663
-
664
- template<typename T> inline void b2Swap(T& a, T& b)
665
- {
666
- T tmp = a;
667
- a = b;
668
- b = tmp;
669
- }
670
-
671
- /// "Next Largest Power of 2
672
- /// Given a binary integer value x, the next largest power of 2 can be computed by a SWAR algorithm
673
- /// that recursively "folds" the upper bits into the lower bits. This process yields a bit vector with
674
- /// the same most significant 1 as x, but all 1's below it. Adding 1 to that value yields the next
675
- /// largest power of 2. For a 32-bit value:"
676
- inline uint32 b2NextPowerOfTwo(uint32 x)
677
- {
678
- x |= (x >> 1);
679
- x |= (x >> 2);
680
- x |= (x >> 4);
681
- x |= (x >> 8);
682
- x |= (x >> 16);
683
- return x + 1;
684
- }
685
-
686
- inline bool b2IsPowerOfTwo(uint32 x)
687
- {
688
- bool result = x > 0 && (x & (x - 1)) == 0;
689
- return result;
690
- }
691
-
692
- inline void b2Sweep::GetTransform(b2Transform* xf, float32 beta) const
693
- {
694
- xf->p = (1.0f - beta) * c0 + beta * c;
695
- float32 angle = (1.0f - beta) * a0 + beta * a;
696
- xf->q.Set(angle);
697
-
698
- // Shift to origin
699
- xf->p -= b2Mul(xf->q, localCenter);
700
- }
701
-
702
- inline void b2Sweep::Advance(float32 alpha)
703
- {
704
- b2Assert(alpha0 < 1.0f);
705
- float32 beta = (alpha - alpha0) / (1.0f - alpha0);
706
- c0 += beta * (c - c0);
707
- a0 += beta * (a - a0);
708
- alpha0 = alpha;
709
- }
710
-
711
- /// Normalize an angle in radians to be between -pi and pi
712
- inline void b2Sweep::Normalize()
713
- {
714
- float32 twoPi = 2.0f * b2_pi;
715
- float32 d = twoPi * floorf(a0 / twoPi);
716
- a0 -= d;
717
- a -= d;
718
- }
719
-
720
- #endif