reflexion 0.1.7 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (223) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/reflex/application.cpp +5 -5
  3. data/.doc/ext/reflex/body.cpp +167 -0
  4. data/.doc/ext/reflex/capture_event.cpp +4 -4
  5. data/.doc/ext/reflex/draw_event.cpp +4 -4
  6. data/.doc/ext/reflex/event.cpp +4 -4
  7. data/.doc/ext/reflex/fixture.cpp +101 -0
  8. data/.doc/ext/reflex/focus_event.cpp +4 -4
  9. data/.doc/ext/reflex/frame_event.cpp +4 -4
  10. data/.doc/ext/reflex/image_view.cpp +22 -5
  11. data/.doc/ext/reflex/key_event.cpp +4 -4
  12. data/.doc/ext/reflex/native.cpp +6 -0
  13. data/.doc/ext/reflex/pointer_event.cpp +4 -4
  14. data/.doc/ext/reflex/reflex.cpp +2 -3
  15. data/.doc/ext/reflex/scroll_event.cpp +4 -4
  16. data/.doc/ext/reflex/selector.cpp +4 -4
  17. data/.doc/ext/reflex/style.cpp +4 -4
  18. data/.doc/ext/reflex/style_length.cpp +4 -4
  19. data/.doc/ext/reflex/style_length2.cpp +4 -4
  20. data/.doc/ext/reflex/style_length4.cpp +4 -4
  21. data/.doc/ext/reflex/update_event.cpp +4 -4
  22. data/.doc/ext/reflex/view.cpp +110 -8
  23. data/.doc/ext/reflex/wheel_event.cpp +4 -4
  24. data/.doc/ext/reflex/window.cpp +36 -12
  25. data/README.md +2 -2
  26. data/Rakefile +2 -1
  27. data/VERSION +1 -1
  28. data/ext/reflex/application.cpp +8 -8
  29. data/ext/reflex/body.cpp +181 -0
  30. data/ext/reflex/capture_event.cpp +4 -4
  31. data/ext/reflex/draw_event.cpp +4 -4
  32. data/ext/reflex/event.cpp +4 -4
  33. data/ext/reflex/fixture.cpp +108 -0
  34. data/ext/reflex/focus_event.cpp +4 -4
  35. data/ext/reflex/frame_event.cpp +4 -4
  36. data/ext/reflex/image_view.cpp +24 -5
  37. data/ext/reflex/key_event.cpp +4 -4
  38. data/ext/reflex/native.cpp +6 -0
  39. data/ext/reflex/pointer_event.cpp +4 -4
  40. data/ext/reflex/reflex.cpp +2 -3
  41. data/ext/reflex/scroll_event.cpp +4 -4
  42. data/ext/reflex/selector.cpp +4 -4
  43. data/ext/reflex/style.cpp +4 -4
  44. data/ext/reflex/style_length.cpp +4 -4
  45. data/ext/reflex/style_length2.cpp +4 -4
  46. data/ext/reflex/style_length4.cpp +4 -4
  47. data/ext/reflex/update_event.cpp +4 -4
  48. data/ext/reflex/view.cpp +126 -12
  49. data/ext/reflex/wheel_event.cpp +4 -4
  50. data/ext/reflex/window.cpp +39 -12
  51. data/include/reflex/bitmap.h +20 -0
  52. data/include/reflex/body.h +82 -0
  53. data/include/reflex/bounds.h +20 -0
  54. data/include/reflex/color.h +20 -0
  55. data/include/reflex/color_space.h +20 -0
  56. data/include/reflex/defs.h +5 -1
  57. data/include/reflex/event.h +16 -25
  58. data/include/reflex/fixture.h +116 -0
  59. data/include/reflex/font.h +20 -0
  60. data/include/reflex/image.h +20 -0
  61. data/include/reflex/image_view.h +1 -1
  62. data/include/reflex/matrix.h +20 -0
  63. data/include/reflex/painter.h +20 -0
  64. data/include/reflex/point.h +24 -0
  65. data/include/reflex/ruby/application.h +6 -0
  66. data/include/reflex/ruby/body.h +41 -0
  67. data/include/reflex/ruby/event.h +68 -0
  68. data/include/reflex/ruby/fixture.h +41 -0
  69. data/include/reflex/ruby/image_view.h +14 -0
  70. data/include/reflex/ruby/selector.h +14 -0
  71. data/include/reflex/ruby/style.h +14 -0
  72. data/include/reflex/ruby/style_length.h +26 -0
  73. data/include/reflex/ruby/view.h +43 -39
  74. data/include/reflex/ruby/window.h +27 -21
  75. data/include/reflex/ruby.h +2 -0
  76. data/include/reflex/shader.h +20 -0
  77. data/include/reflex/style.h +2 -3
  78. data/include/reflex/texture.h +20 -0
  79. data/include/reflex/view.h +45 -24
  80. data/include/reflex/window.h +11 -14
  81. data/include/reflex.h +3 -0
  82. data/lib/reflex/application.rb +6 -2
  83. data/lib/reflex/body.rb +17 -0
  84. data/lib/reflex/fixture.rb +17 -0
  85. data/lib/reflex/view.rb +16 -1
  86. data/lib/reflex/window.rb +13 -1
  87. data/lib/reflex.rb +2 -0
  88. data/reflex.gemspec +1 -1
  89. data/samples/bats.rb +4 -3
  90. data/samples/checker.rb +4 -3
  91. data/samples/fans.rb +4 -3
  92. data/samples/fps.rb +5 -3
  93. data/samples/grid.rb +5 -4
  94. data/samples/hello.rb +1 -1
  95. data/samples/image.rb +3 -2
  96. data/samples/ios/hello/hello/main.cpp +12 -3
  97. data/samples/ios/hello/hello.xcodeproj/project.pbxproj +376 -123
  98. data/samples/key.rb +5 -4
  99. data/samples/layout.rb +3 -2
  100. data/samples/model.rb +3 -2
  101. data/samples/osx/hello/hello/main.cpp +12 -3
  102. data/samples/osx/hello/hello.xcodeproj/project.pbxproj +375 -120
  103. data/samples/physics.rb +37 -0
  104. data/samples/repl.rb +3 -2
  105. data/samples/shader.rb +4 -4
  106. data/samples/shapes.rb +4 -4
  107. data/samples/text.rb +6 -4
  108. data/samples/tree.rb +5 -4
  109. data/samples/views.rb +3 -2
  110. data/samples/visuals.rb +1 -2
  111. data/src/body.cpp +244 -0
  112. data/src/event.cpp +18 -18
  113. data/src/fixture.cpp +108 -0
  114. data/src/image_view.cpp +1 -1
  115. data/src/ios/native_window.h +2 -0
  116. data/src/ios/native_window.mm +18 -1
  117. data/src/ios/opengl_view.mm +8 -0
  118. data/src/ios/window.mm +24 -3
  119. data/src/ios/window_data.h +3 -3
  120. data/src/osx/native_window.mm +17 -1
  121. data/src/osx/window.mm +24 -3
  122. data/src/osx/window_data.h +3 -3
  123. data/src/physics/Box2D/Box2D.h +68 -0
  124. data/src/physics/Box2D/Collision/Shapes/b2ChainShape.cpp +193 -0
  125. data/src/physics/Box2D/Collision/Shapes/b2ChainShape.h +105 -0
  126. data/src/physics/Box2D/Collision/Shapes/b2CircleShape.cpp +99 -0
  127. data/src/physics/Box2D/Collision/Shapes/b2CircleShape.h +91 -0
  128. data/src/physics/Box2D/Collision/Shapes/b2EdgeShape.cpp +138 -0
  129. data/src/physics/Box2D/Collision/Shapes/b2EdgeShape.h +74 -0
  130. data/src/physics/Box2D/Collision/Shapes/b2PolygonShape.cpp +467 -0
  131. data/src/physics/Box2D/Collision/Shapes/b2PolygonShape.h +101 -0
  132. data/src/physics/Box2D/Collision/Shapes/b2Shape.h +101 -0
  133. data/src/physics/Box2D/Collision/b2BroadPhase.cpp +119 -0
  134. data/src/physics/Box2D/Collision/b2BroadPhase.h +257 -0
  135. data/src/physics/Box2D/Collision/b2CollideCircle.cpp +154 -0
  136. data/src/physics/Box2D/Collision/b2CollideEdge.cpp +698 -0
  137. data/src/physics/Box2D/Collision/b2CollidePolygon.cpp +239 -0
  138. data/src/physics/Box2D/Collision/b2Collision.cpp +252 -0
  139. data/src/physics/Box2D/Collision/b2Collision.h +277 -0
  140. data/src/physics/Box2D/Collision/b2Distance.cpp +603 -0
  141. data/src/physics/Box2D/Collision/b2Distance.h +141 -0
  142. data/src/physics/Box2D/Collision/b2DynamicTree.cpp +778 -0
  143. data/src/physics/Box2D/Collision/b2DynamicTree.h +289 -0
  144. data/src/physics/Box2D/Collision/b2TimeOfImpact.cpp +486 -0
  145. data/src/physics/Box2D/Collision/b2TimeOfImpact.h +58 -0
  146. data/src/physics/Box2D/Common/b2BlockAllocator.cpp +215 -0
  147. data/src/physics/Box2D/Common/b2BlockAllocator.h +62 -0
  148. data/src/physics/Box2D/Common/b2Draw.cpp +44 -0
  149. data/src/physics/Box2D/Common/b2Draw.h +86 -0
  150. data/src/physics/Box2D/Common/b2GrowableStack.h +85 -0
  151. data/src/physics/Box2D/Common/b2Math.cpp +94 -0
  152. data/src/physics/Box2D/Common/b2Math.h +720 -0
  153. data/src/physics/Box2D/Common/b2Settings.cpp +44 -0
  154. data/src/physics/Box2D/Common/b2Settings.h +151 -0
  155. data/src/physics/Box2D/Common/b2StackAllocator.cpp +83 -0
  156. data/src/physics/Box2D/Common/b2StackAllocator.h +60 -0
  157. data/src/physics/Box2D/Common/b2Timer.cpp +101 -0
  158. data/src/physics/Box2D/Common/b2Timer.h +50 -0
  159. data/src/physics/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp +53 -0
  160. data/src/physics/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h +39 -0
  161. data/src/physics/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp +53 -0
  162. data/src/physics/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h +39 -0
  163. data/src/physics/Box2D/Dynamics/Contacts/b2CircleContact.cpp +52 -0
  164. data/src/physics/Box2D/Dynamics/Contacts/b2CircleContact.h +39 -0
  165. data/src/physics/Box2D/Dynamics/Contacts/b2Contact.cpp +247 -0
  166. data/src/physics/Box2D/Dynamics/Contacts/b2Contact.h +349 -0
  167. data/src/physics/Box2D/Dynamics/Contacts/b2ContactSolver.cpp +838 -0
  168. data/src/physics/Box2D/Dynamics/Contacts/b2ContactSolver.h +95 -0
  169. data/src/physics/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp +49 -0
  170. data/src/physics/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h +39 -0
  171. data/src/physics/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp +49 -0
  172. data/src/physics/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h +39 -0
  173. data/src/physics/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp +49 -0
  174. data/src/physics/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h +38 -0
  175. data/src/physics/Box2D/Dynamics/Contacts/b2PolygonContact.cpp +52 -0
  176. data/src/physics/Box2D/Dynamics/Contacts/b2PolygonContact.h +39 -0
  177. data/src/physics/Box2D/Dynamics/Joints/b2DistanceJoint.cpp +260 -0
  178. data/src/physics/Box2D/Dynamics/Joints/b2DistanceJoint.h +169 -0
  179. data/src/physics/Box2D/Dynamics/Joints/b2FrictionJoint.cpp +251 -0
  180. data/src/physics/Box2D/Dynamics/Joints/b2FrictionJoint.h +119 -0
  181. data/src/physics/Box2D/Dynamics/Joints/b2GearJoint.cpp +419 -0
  182. data/src/physics/Box2D/Dynamics/Joints/b2GearJoint.h +125 -0
  183. data/src/physics/Box2D/Dynamics/Joints/b2Joint.cpp +211 -0
  184. data/src/physics/Box2D/Dynamics/Joints/b2Joint.h +226 -0
  185. data/src/physics/Box2D/Dynamics/Joints/b2MotorJoint.cpp +304 -0
  186. data/src/physics/Box2D/Dynamics/Joints/b2MotorJoint.h +133 -0
  187. data/src/physics/Box2D/Dynamics/Joints/b2MouseJoint.cpp +222 -0
  188. data/src/physics/Box2D/Dynamics/Joints/b2MouseJoint.h +129 -0
  189. data/src/physics/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp +629 -0
  190. data/src/physics/Box2D/Dynamics/Joints/b2PrismaticJoint.h +196 -0
  191. data/src/physics/Box2D/Dynamics/Joints/b2PulleyJoint.cpp +348 -0
  192. data/src/physics/Box2D/Dynamics/Joints/b2PulleyJoint.h +152 -0
  193. data/src/physics/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp +502 -0
  194. data/src/physics/Box2D/Dynamics/Joints/b2RevoluteJoint.h +204 -0
  195. data/src/physics/Box2D/Dynamics/Joints/b2RopeJoint.cpp +241 -0
  196. data/src/physics/Box2D/Dynamics/Joints/b2RopeJoint.h +114 -0
  197. data/src/physics/Box2D/Dynamics/Joints/b2WeldJoint.cpp +344 -0
  198. data/src/physics/Box2D/Dynamics/Joints/b2WeldJoint.h +126 -0
  199. data/src/physics/Box2D/Dynamics/Joints/b2WheelJoint.cpp +419 -0
  200. data/src/physics/Box2D/Dynamics/Joints/b2WheelJoint.h +210 -0
  201. data/src/physics/Box2D/Dynamics/b2Body.cpp +549 -0
  202. data/src/physics/Box2D/Dynamics/b2Body.h +860 -0
  203. data/src/physics/Box2D/Dynamics/b2ContactManager.cpp +296 -0
  204. data/src/physics/Box2D/Dynamics/b2ContactManager.h +52 -0
  205. data/src/physics/Box2D/Dynamics/b2Fixture.cpp +303 -0
  206. data/src/physics/Box2D/Dynamics/b2Fixture.h +345 -0
  207. data/src/physics/Box2D/Dynamics/b2Island.cpp +539 -0
  208. data/src/physics/Box2D/Dynamics/b2Island.h +93 -0
  209. data/src/physics/Box2D/Dynamics/b2TimeStep.h +70 -0
  210. data/src/physics/Box2D/Dynamics/b2World.cpp +1339 -0
  211. data/src/physics/Box2D/Dynamics/b2World.h +354 -0
  212. data/src/physics/Box2D/Dynamics/b2WorldCallbacks.cpp +36 -0
  213. data/src/physics/Box2D/Dynamics/b2WorldCallbacks.h +155 -0
  214. data/src/physics/Box2D/Rope/b2Rope.cpp +259 -0
  215. data/src/physics/Box2D/Rope/b2Rope.h +115 -0
  216. data/src/style.cpp +2 -2
  217. data/src/view.cpp +217 -17
  218. data/src/window.cpp +25 -15
  219. data/src/world.cpp +206 -0
  220. data/src/world.h +96 -0
  221. data/task/box2d.rake +25 -0
  222. data/test/test_view.rb +5 -5
  223. metadata +125 -3
@@ -0,0 +1,119 @@
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/b2BroadPhase.h>
20
+
21
+ b2BroadPhase::b2BroadPhase()
22
+ {
23
+ m_proxyCount = 0;
24
+
25
+ m_pairCapacity = 16;
26
+ m_pairCount = 0;
27
+ m_pairBuffer = (b2Pair*)b2Alloc(m_pairCapacity * sizeof(b2Pair));
28
+
29
+ m_moveCapacity = 16;
30
+ m_moveCount = 0;
31
+ m_moveBuffer = (int32*)b2Alloc(m_moveCapacity * sizeof(int32));
32
+ }
33
+
34
+ b2BroadPhase::~b2BroadPhase()
35
+ {
36
+ b2Free(m_moveBuffer);
37
+ b2Free(m_pairBuffer);
38
+ }
39
+
40
+ int32 b2BroadPhase::CreateProxy(const b2AABB& aabb, void* userData)
41
+ {
42
+ int32 proxyId = m_tree.CreateProxy(aabb, userData);
43
+ ++m_proxyCount;
44
+ BufferMove(proxyId);
45
+ return proxyId;
46
+ }
47
+
48
+ void b2BroadPhase::DestroyProxy(int32 proxyId)
49
+ {
50
+ UnBufferMove(proxyId);
51
+ --m_proxyCount;
52
+ m_tree.DestroyProxy(proxyId);
53
+ }
54
+
55
+ void b2BroadPhase::MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement)
56
+ {
57
+ bool buffer = m_tree.MoveProxy(proxyId, aabb, displacement);
58
+ if (buffer)
59
+ {
60
+ BufferMove(proxyId);
61
+ }
62
+ }
63
+
64
+ void b2BroadPhase::TouchProxy(int32 proxyId)
65
+ {
66
+ BufferMove(proxyId);
67
+ }
68
+
69
+ void b2BroadPhase::BufferMove(int32 proxyId)
70
+ {
71
+ if (m_moveCount == m_moveCapacity)
72
+ {
73
+ int32* oldBuffer = m_moveBuffer;
74
+ m_moveCapacity *= 2;
75
+ m_moveBuffer = (int32*)b2Alloc(m_moveCapacity * sizeof(int32));
76
+ memcpy(m_moveBuffer, oldBuffer, m_moveCount * sizeof(int32));
77
+ b2Free(oldBuffer);
78
+ }
79
+
80
+ m_moveBuffer[m_moveCount] = proxyId;
81
+ ++m_moveCount;
82
+ }
83
+
84
+ void b2BroadPhase::UnBufferMove(int32 proxyId)
85
+ {
86
+ for (int32 i = 0; i < m_moveCount; ++i)
87
+ {
88
+ if (m_moveBuffer[i] == proxyId)
89
+ {
90
+ m_moveBuffer[i] = e_nullProxy;
91
+ }
92
+ }
93
+ }
94
+
95
+ // This is called from b2DynamicTree::Query when we are gathering pairs.
96
+ bool b2BroadPhase::QueryCallback(int32 proxyId)
97
+ {
98
+ // A proxy cannot form a pair with itself.
99
+ if (proxyId == m_queryProxyId)
100
+ {
101
+ return true;
102
+ }
103
+
104
+ // Grow the pair buffer as needed.
105
+ if (m_pairCount == m_pairCapacity)
106
+ {
107
+ b2Pair* oldBuffer = m_pairBuffer;
108
+ m_pairCapacity *= 2;
109
+ m_pairBuffer = (b2Pair*)b2Alloc(m_pairCapacity * sizeof(b2Pair));
110
+ memcpy(m_pairBuffer, oldBuffer, m_pairCount * sizeof(b2Pair));
111
+ b2Free(oldBuffer);
112
+ }
113
+
114
+ m_pairBuffer[m_pairCount].proxyIdA = b2Min(proxyId, m_queryProxyId);
115
+ m_pairBuffer[m_pairCount].proxyIdB = b2Max(proxyId, m_queryProxyId);
116
+ ++m_pairCount;
117
+
118
+ return true;
119
+ }
@@ -0,0 +1,257 @@
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_BROAD_PHASE_H
20
+ #define B2_BROAD_PHASE_H
21
+
22
+ #include <Box2D/Common/b2Settings.h>
23
+ #include <Box2D/Collision/b2Collision.h>
24
+ #include <Box2D/Collision/b2DynamicTree.h>
25
+ #include <algorithm>
26
+
27
+ struct b2Pair
28
+ {
29
+ int32 proxyIdA;
30
+ int32 proxyIdB;
31
+ };
32
+
33
+ /// The broad-phase is used for computing pairs and performing volume queries and ray casts.
34
+ /// This broad-phase does not persist pairs. Instead, this reports potentially new pairs.
35
+ /// It is up to the client to consume the new pairs and to track subsequent overlap.
36
+ class b2BroadPhase
37
+ {
38
+ public:
39
+
40
+ enum
41
+ {
42
+ e_nullProxy = -1
43
+ };
44
+
45
+ b2BroadPhase();
46
+ ~b2BroadPhase();
47
+
48
+ /// Create a proxy with an initial AABB. Pairs are not reported until
49
+ /// UpdatePairs is called.
50
+ int32 CreateProxy(const b2AABB& aabb, void* userData);
51
+
52
+ /// Destroy a proxy. It is up to the client to remove any pairs.
53
+ void DestroyProxy(int32 proxyId);
54
+
55
+ /// Call MoveProxy as many times as you like, then when you are done
56
+ /// call UpdatePairs to finalized the proxy pairs (for your time step).
57
+ void MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement);
58
+
59
+ /// Call to trigger a re-processing of it's pairs on the next call to UpdatePairs.
60
+ void TouchProxy(int32 proxyId);
61
+
62
+ /// Get the fat AABB for a proxy.
63
+ const b2AABB& GetFatAABB(int32 proxyId) const;
64
+
65
+ /// Get user data from a proxy. Returns NULL if the id is invalid.
66
+ void* GetUserData(int32 proxyId) const;
67
+
68
+ /// Test overlap of fat AABBs.
69
+ bool TestOverlap(int32 proxyIdA, int32 proxyIdB) const;
70
+
71
+ /// Get the number of proxies.
72
+ int32 GetProxyCount() const;
73
+
74
+ /// Update the pairs. This results in pair callbacks. This can only add pairs.
75
+ template <typename T>
76
+ void UpdatePairs(T* callback);
77
+
78
+ /// Query an AABB for overlapping proxies. The callback class
79
+ /// is called for each proxy that overlaps the supplied AABB.
80
+ template <typename T>
81
+ void Query(T* callback, const b2AABB& aabb) const;
82
+
83
+ /// Ray-cast against the proxies in the tree. This relies on the callback
84
+ /// to perform a exact ray-cast in the case were the proxy contains a shape.
85
+ /// The callback also performs the any collision filtering. This has performance
86
+ /// roughly equal to k * log(n), where k is the number of collisions and n is the
87
+ /// number of proxies in the tree.
88
+ /// @param input the ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1).
89
+ /// @param callback a callback class that is called for each proxy that is hit by the ray.
90
+ template <typename T>
91
+ void RayCast(T* callback, const b2RayCastInput& input) const;
92
+
93
+ /// Get the height of the embedded tree.
94
+ int32 GetTreeHeight() const;
95
+
96
+ /// Get the balance of the embedded tree.
97
+ int32 GetTreeBalance() const;
98
+
99
+ /// Get the quality metric of the embedded tree.
100
+ float32 GetTreeQuality() const;
101
+
102
+ /// Shift the world origin. Useful for large worlds.
103
+ /// The shift formula is: position -= newOrigin
104
+ /// @param newOrigin the new origin with respect to the old origin
105
+ void ShiftOrigin(const b2Vec2& newOrigin);
106
+
107
+ private:
108
+
109
+ friend class b2DynamicTree;
110
+
111
+ void BufferMove(int32 proxyId);
112
+ void UnBufferMove(int32 proxyId);
113
+
114
+ bool QueryCallback(int32 proxyId);
115
+
116
+ b2DynamicTree m_tree;
117
+
118
+ int32 m_proxyCount;
119
+
120
+ int32* m_moveBuffer;
121
+ int32 m_moveCapacity;
122
+ int32 m_moveCount;
123
+
124
+ b2Pair* m_pairBuffer;
125
+ int32 m_pairCapacity;
126
+ int32 m_pairCount;
127
+
128
+ int32 m_queryProxyId;
129
+ };
130
+
131
+ /// This is used to sort pairs.
132
+ inline bool b2PairLessThan(const b2Pair& pair1, const b2Pair& pair2)
133
+ {
134
+ if (pair1.proxyIdA < pair2.proxyIdA)
135
+ {
136
+ return true;
137
+ }
138
+
139
+ if (pair1.proxyIdA == pair2.proxyIdA)
140
+ {
141
+ return pair1.proxyIdB < pair2.proxyIdB;
142
+ }
143
+
144
+ return false;
145
+ }
146
+
147
+ inline void* b2BroadPhase::GetUserData(int32 proxyId) const
148
+ {
149
+ return m_tree.GetUserData(proxyId);
150
+ }
151
+
152
+ inline bool b2BroadPhase::TestOverlap(int32 proxyIdA, int32 proxyIdB) const
153
+ {
154
+ const b2AABB& aabbA = m_tree.GetFatAABB(proxyIdA);
155
+ const b2AABB& aabbB = m_tree.GetFatAABB(proxyIdB);
156
+ return b2TestOverlap(aabbA, aabbB);
157
+ }
158
+
159
+ inline const b2AABB& b2BroadPhase::GetFatAABB(int32 proxyId) const
160
+ {
161
+ return m_tree.GetFatAABB(proxyId);
162
+ }
163
+
164
+ inline int32 b2BroadPhase::GetProxyCount() const
165
+ {
166
+ return m_proxyCount;
167
+ }
168
+
169
+ inline int32 b2BroadPhase::GetTreeHeight() const
170
+ {
171
+ return m_tree.GetHeight();
172
+ }
173
+
174
+ inline int32 b2BroadPhase::GetTreeBalance() const
175
+ {
176
+ return m_tree.GetMaxBalance();
177
+ }
178
+
179
+ inline float32 b2BroadPhase::GetTreeQuality() const
180
+ {
181
+ return m_tree.GetAreaRatio();
182
+ }
183
+
184
+ template <typename T>
185
+ void b2BroadPhase::UpdatePairs(T* callback)
186
+ {
187
+ // Reset pair buffer
188
+ m_pairCount = 0;
189
+
190
+ // Perform tree queries for all moving proxies.
191
+ for (int32 i = 0; i < m_moveCount; ++i)
192
+ {
193
+ m_queryProxyId = m_moveBuffer[i];
194
+ if (m_queryProxyId == e_nullProxy)
195
+ {
196
+ continue;
197
+ }
198
+
199
+ // We have to query the tree with the fat AABB so that
200
+ // we don't fail to create a pair that may touch later.
201
+ const b2AABB& fatAABB = m_tree.GetFatAABB(m_queryProxyId);
202
+
203
+ // Query tree, create pairs and add them pair buffer.
204
+ m_tree.Query(this, fatAABB);
205
+ }
206
+
207
+ // Reset move buffer
208
+ m_moveCount = 0;
209
+
210
+ // Sort the pair buffer to expose duplicates.
211
+ std::sort(m_pairBuffer, m_pairBuffer + m_pairCount, b2PairLessThan);
212
+
213
+ // Send the pairs back to the client.
214
+ int32 i = 0;
215
+ while (i < m_pairCount)
216
+ {
217
+ b2Pair* primaryPair = m_pairBuffer + i;
218
+ void* userDataA = m_tree.GetUserData(primaryPair->proxyIdA);
219
+ void* userDataB = m_tree.GetUserData(primaryPair->proxyIdB);
220
+
221
+ callback->AddPair(userDataA, userDataB);
222
+ ++i;
223
+
224
+ // Skip any duplicate pairs.
225
+ while (i < m_pairCount)
226
+ {
227
+ b2Pair* pair = m_pairBuffer + i;
228
+ if (pair->proxyIdA != primaryPair->proxyIdA || pair->proxyIdB != primaryPair->proxyIdB)
229
+ {
230
+ break;
231
+ }
232
+ ++i;
233
+ }
234
+ }
235
+
236
+ // Try to keep the tree balanced.
237
+ //m_tree.Rebalance(4);
238
+ }
239
+
240
+ template <typename T>
241
+ inline void b2BroadPhase::Query(T* callback, const b2AABB& aabb) const
242
+ {
243
+ m_tree.Query(callback, aabb);
244
+ }
245
+
246
+ template <typename T>
247
+ inline void b2BroadPhase::RayCast(T* callback, const b2RayCastInput& input) const
248
+ {
249
+ m_tree.RayCast(callback, input);
250
+ }
251
+
252
+ inline void b2BroadPhase::ShiftOrigin(const b2Vec2& newOrigin)
253
+ {
254
+ m_tree.ShiftOrigin(newOrigin);
255
+ }
256
+
257
+ #endif
@@ -0,0 +1,154 @@
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/Shapes/b2CircleShape.h>
21
+ #include <Box2D/Collision/Shapes/b2PolygonShape.h>
22
+
23
+ void b2CollideCircles(
24
+ b2Manifold* manifold,
25
+ const b2CircleShape* circleA, const b2Transform& xfA,
26
+ const b2CircleShape* circleB, const b2Transform& xfB)
27
+ {
28
+ manifold->pointCount = 0;
29
+
30
+ b2Vec2 pA = b2Mul(xfA, circleA->m_p);
31
+ b2Vec2 pB = b2Mul(xfB, circleB->m_p);
32
+
33
+ b2Vec2 d = pB - pA;
34
+ float32 distSqr = b2Dot(d, d);
35
+ float32 rA = circleA->m_radius, rB = circleB->m_radius;
36
+ float32 radius = rA + rB;
37
+ if (distSqr > radius * radius)
38
+ {
39
+ return;
40
+ }
41
+
42
+ manifold->type = b2Manifold::e_circles;
43
+ manifold->localPoint = circleA->m_p;
44
+ manifold->localNormal.SetZero();
45
+ manifold->pointCount = 1;
46
+
47
+ manifold->points[0].localPoint = circleB->m_p;
48
+ manifold->points[0].id.key = 0;
49
+ }
50
+
51
+ void b2CollidePolygonAndCircle(
52
+ b2Manifold* manifold,
53
+ const b2PolygonShape* polygonA, const b2Transform& xfA,
54
+ const b2CircleShape* circleB, const b2Transform& xfB)
55
+ {
56
+ manifold->pointCount = 0;
57
+
58
+ // Compute circle position in the frame of the polygon.
59
+ b2Vec2 c = b2Mul(xfB, circleB->m_p);
60
+ b2Vec2 cLocal = b2MulT(xfA, c);
61
+
62
+ // Find the min separating edge.
63
+ int32 normalIndex = 0;
64
+ float32 separation = -b2_maxFloat;
65
+ float32 radius = polygonA->m_radius + circleB->m_radius;
66
+ int32 vertexCount = polygonA->m_count;
67
+ const b2Vec2* vertices = polygonA->m_vertices;
68
+ const b2Vec2* normals = polygonA->m_normals;
69
+
70
+ for (int32 i = 0; i < vertexCount; ++i)
71
+ {
72
+ float32 s = b2Dot(normals[i], cLocal - vertices[i]);
73
+
74
+ if (s > radius)
75
+ {
76
+ // Early out.
77
+ return;
78
+ }
79
+
80
+ if (s > separation)
81
+ {
82
+ separation = s;
83
+ normalIndex = i;
84
+ }
85
+ }
86
+
87
+ // Vertices that subtend the incident face.
88
+ int32 vertIndex1 = normalIndex;
89
+ int32 vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0;
90
+ b2Vec2 v1 = vertices[vertIndex1];
91
+ b2Vec2 v2 = vertices[vertIndex2];
92
+
93
+ // If the center is inside the polygon ...
94
+ if (separation < b2_epsilon)
95
+ {
96
+ manifold->pointCount = 1;
97
+ manifold->type = b2Manifold::e_faceA;
98
+ manifold->localNormal = normals[normalIndex];
99
+ manifold->localPoint = 0.5f * (v1 + v2);
100
+ manifold->points[0].localPoint = circleB->m_p;
101
+ manifold->points[0].id.key = 0;
102
+ return;
103
+ }
104
+
105
+ // Compute barycentric coordinates
106
+ float32 u1 = b2Dot(cLocal - v1, v2 - v1);
107
+ float32 u2 = b2Dot(cLocal - v2, v1 - v2);
108
+ if (u1 <= 0.0f)
109
+ {
110
+ if (b2DistanceSquared(cLocal, v1) > radius * radius)
111
+ {
112
+ return;
113
+ }
114
+
115
+ manifold->pointCount = 1;
116
+ manifold->type = b2Manifold::e_faceA;
117
+ manifold->localNormal = cLocal - v1;
118
+ manifold->localNormal.Normalize();
119
+ manifold->localPoint = v1;
120
+ manifold->points[0].localPoint = circleB->m_p;
121
+ manifold->points[0].id.key = 0;
122
+ }
123
+ else if (u2 <= 0.0f)
124
+ {
125
+ if (b2DistanceSquared(cLocal, v2) > radius * radius)
126
+ {
127
+ return;
128
+ }
129
+
130
+ manifold->pointCount = 1;
131
+ manifold->type = b2Manifold::e_faceA;
132
+ manifold->localNormal = cLocal - v2;
133
+ manifold->localNormal.Normalize();
134
+ manifold->localPoint = v2;
135
+ manifold->points[0].localPoint = circleB->m_p;
136
+ manifold->points[0].id.key = 0;
137
+ }
138
+ else
139
+ {
140
+ b2Vec2 faceCenter = 0.5f * (v1 + v2);
141
+ float32 separation = b2Dot(cLocal - faceCenter, normals[vertIndex1]);
142
+ if (separation > radius)
143
+ {
144
+ return;
145
+ }
146
+
147
+ manifold->pointCount = 1;
148
+ manifold->type = b2Manifold::e_faceA;
149
+ manifold->localNormal = normals[vertIndex1];
150
+ manifold->localPoint = faceCenter;
151
+ manifold->points[0].localPoint = circleB->m_p;
152
+ manifold->points[0].id.key = 0;
153
+ }
154
+ }