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,486 @@
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
+ #include <Box2D/Collision/b2TimeOfImpact.h>
22
+ #include <Box2D/Collision/Shapes/b2CircleShape.h>
23
+ #include <Box2D/Collision/Shapes/b2PolygonShape.h>
24
+ #include <Box2D/Common/b2Timer.h>
25
+
26
+ #include <stdio.h>
27
+
28
+ float32 b2_toiTime, b2_toiMaxTime;
29
+ int32 b2_toiCalls, b2_toiIters, b2_toiMaxIters;
30
+ int32 b2_toiRootIters, b2_toiMaxRootIters;
31
+
32
+ //
33
+ struct b2SeparationFunction
34
+ {
35
+ enum Type
36
+ {
37
+ e_points,
38
+ e_faceA,
39
+ e_faceB
40
+ };
41
+
42
+ // TODO_ERIN might not need to return the separation
43
+
44
+ float32 Initialize(const b2SimplexCache* cache,
45
+ const b2DistanceProxy* proxyA, const b2Sweep& sweepA,
46
+ const b2DistanceProxy* proxyB, const b2Sweep& sweepB,
47
+ float32 t1)
48
+ {
49
+ m_proxyA = proxyA;
50
+ m_proxyB = proxyB;
51
+ int32 count = cache->count;
52
+ b2Assert(0 < count && count < 3);
53
+
54
+ m_sweepA = sweepA;
55
+ m_sweepB = sweepB;
56
+
57
+ b2Transform xfA, xfB;
58
+ m_sweepA.GetTransform(&xfA, t1);
59
+ m_sweepB.GetTransform(&xfB, t1);
60
+
61
+ if (count == 1)
62
+ {
63
+ m_type = e_points;
64
+ b2Vec2 localPointA = m_proxyA->GetVertex(cache->indexA[0]);
65
+ b2Vec2 localPointB = m_proxyB->GetVertex(cache->indexB[0]);
66
+ b2Vec2 pointA = b2Mul(xfA, localPointA);
67
+ b2Vec2 pointB = b2Mul(xfB, localPointB);
68
+ m_axis = pointB - pointA;
69
+ float32 s = m_axis.Normalize();
70
+ return s;
71
+ }
72
+ else if (cache->indexA[0] == cache->indexA[1])
73
+ {
74
+ // Two points on B and one on A.
75
+ m_type = e_faceB;
76
+ b2Vec2 localPointB1 = proxyB->GetVertex(cache->indexB[0]);
77
+ b2Vec2 localPointB2 = proxyB->GetVertex(cache->indexB[1]);
78
+
79
+ m_axis = b2Cross(localPointB2 - localPointB1, 1.0f);
80
+ m_axis.Normalize();
81
+ b2Vec2 normal = b2Mul(xfB.q, m_axis);
82
+
83
+ m_localPoint = 0.5f * (localPointB1 + localPointB2);
84
+ b2Vec2 pointB = b2Mul(xfB, m_localPoint);
85
+
86
+ b2Vec2 localPointA = proxyA->GetVertex(cache->indexA[0]);
87
+ b2Vec2 pointA = b2Mul(xfA, localPointA);
88
+
89
+ float32 s = b2Dot(pointA - pointB, normal);
90
+ if (s < 0.0f)
91
+ {
92
+ m_axis = -m_axis;
93
+ s = -s;
94
+ }
95
+ return s;
96
+ }
97
+ else
98
+ {
99
+ // Two points on A and one or two points on B.
100
+ m_type = e_faceA;
101
+ b2Vec2 localPointA1 = m_proxyA->GetVertex(cache->indexA[0]);
102
+ b2Vec2 localPointA2 = m_proxyA->GetVertex(cache->indexA[1]);
103
+
104
+ m_axis = b2Cross(localPointA2 - localPointA1, 1.0f);
105
+ m_axis.Normalize();
106
+ b2Vec2 normal = b2Mul(xfA.q, m_axis);
107
+
108
+ m_localPoint = 0.5f * (localPointA1 + localPointA2);
109
+ b2Vec2 pointA = b2Mul(xfA, m_localPoint);
110
+
111
+ b2Vec2 localPointB = m_proxyB->GetVertex(cache->indexB[0]);
112
+ b2Vec2 pointB = b2Mul(xfB, localPointB);
113
+
114
+ float32 s = b2Dot(pointB - pointA, normal);
115
+ if (s < 0.0f)
116
+ {
117
+ m_axis = -m_axis;
118
+ s = -s;
119
+ }
120
+ return s;
121
+ }
122
+ }
123
+
124
+ //
125
+ float32 FindMinSeparation(int32* indexA, int32* indexB, float32 t) const
126
+ {
127
+ b2Transform xfA, xfB;
128
+ m_sweepA.GetTransform(&xfA, t);
129
+ m_sweepB.GetTransform(&xfB, t);
130
+
131
+ switch (m_type)
132
+ {
133
+ case e_points:
134
+ {
135
+ b2Vec2 axisA = b2MulT(xfA.q, m_axis);
136
+ b2Vec2 axisB = b2MulT(xfB.q, -m_axis);
137
+
138
+ *indexA = m_proxyA->GetSupport(axisA);
139
+ *indexB = m_proxyB->GetSupport(axisB);
140
+
141
+ b2Vec2 localPointA = m_proxyA->GetVertex(*indexA);
142
+ b2Vec2 localPointB = m_proxyB->GetVertex(*indexB);
143
+
144
+ b2Vec2 pointA = b2Mul(xfA, localPointA);
145
+ b2Vec2 pointB = b2Mul(xfB, localPointB);
146
+
147
+ float32 separation = b2Dot(pointB - pointA, m_axis);
148
+ return separation;
149
+ }
150
+
151
+ case e_faceA:
152
+ {
153
+ b2Vec2 normal = b2Mul(xfA.q, m_axis);
154
+ b2Vec2 pointA = b2Mul(xfA, m_localPoint);
155
+
156
+ b2Vec2 axisB = b2MulT(xfB.q, -normal);
157
+
158
+ *indexA = -1;
159
+ *indexB = m_proxyB->GetSupport(axisB);
160
+
161
+ b2Vec2 localPointB = m_proxyB->GetVertex(*indexB);
162
+ b2Vec2 pointB = b2Mul(xfB, localPointB);
163
+
164
+ float32 separation = b2Dot(pointB - pointA, normal);
165
+ return separation;
166
+ }
167
+
168
+ case e_faceB:
169
+ {
170
+ b2Vec2 normal = b2Mul(xfB.q, m_axis);
171
+ b2Vec2 pointB = b2Mul(xfB, m_localPoint);
172
+
173
+ b2Vec2 axisA = b2MulT(xfA.q, -normal);
174
+
175
+ *indexB = -1;
176
+ *indexA = m_proxyA->GetSupport(axisA);
177
+
178
+ b2Vec2 localPointA = m_proxyA->GetVertex(*indexA);
179
+ b2Vec2 pointA = b2Mul(xfA, localPointA);
180
+
181
+ float32 separation = b2Dot(pointA - pointB, normal);
182
+ return separation;
183
+ }
184
+
185
+ default:
186
+ b2Assert(false);
187
+ *indexA = -1;
188
+ *indexB = -1;
189
+ return 0.0f;
190
+ }
191
+ }
192
+
193
+ //
194
+ float32 Evaluate(int32 indexA, int32 indexB, float32 t) const
195
+ {
196
+ b2Transform xfA, xfB;
197
+ m_sweepA.GetTransform(&xfA, t);
198
+ m_sweepB.GetTransform(&xfB, t);
199
+
200
+ switch (m_type)
201
+ {
202
+ case e_points:
203
+ {
204
+ b2Vec2 localPointA = m_proxyA->GetVertex(indexA);
205
+ b2Vec2 localPointB = m_proxyB->GetVertex(indexB);
206
+
207
+ b2Vec2 pointA = b2Mul(xfA, localPointA);
208
+ b2Vec2 pointB = b2Mul(xfB, localPointB);
209
+ float32 separation = b2Dot(pointB - pointA, m_axis);
210
+
211
+ return separation;
212
+ }
213
+
214
+ case e_faceA:
215
+ {
216
+ b2Vec2 normal = b2Mul(xfA.q, m_axis);
217
+ b2Vec2 pointA = b2Mul(xfA, m_localPoint);
218
+
219
+ b2Vec2 localPointB = m_proxyB->GetVertex(indexB);
220
+ b2Vec2 pointB = b2Mul(xfB, localPointB);
221
+
222
+ float32 separation = b2Dot(pointB - pointA, normal);
223
+ return separation;
224
+ }
225
+
226
+ case e_faceB:
227
+ {
228
+ b2Vec2 normal = b2Mul(xfB.q, m_axis);
229
+ b2Vec2 pointB = b2Mul(xfB, m_localPoint);
230
+
231
+ b2Vec2 localPointA = m_proxyA->GetVertex(indexA);
232
+ b2Vec2 pointA = b2Mul(xfA, localPointA);
233
+
234
+ float32 separation = b2Dot(pointA - pointB, normal);
235
+ return separation;
236
+ }
237
+
238
+ default:
239
+ b2Assert(false);
240
+ return 0.0f;
241
+ }
242
+ }
243
+
244
+ const b2DistanceProxy* m_proxyA;
245
+ const b2DistanceProxy* m_proxyB;
246
+ b2Sweep m_sweepA, m_sweepB;
247
+ Type m_type;
248
+ b2Vec2 m_localPoint;
249
+ b2Vec2 m_axis;
250
+ };
251
+
252
+ // CCD via the local separating axis method. This seeks progression
253
+ // by computing the largest time at which separation is maintained.
254
+ void b2TimeOfImpact(b2TOIOutput* output, const b2TOIInput* input)
255
+ {
256
+ b2Timer timer;
257
+
258
+ ++b2_toiCalls;
259
+
260
+ output->state = b2TOIOutput::e_unknown;
261
+ output->t = input->tMax;
262
+
263
+ const b2DistanceProxy* proxyA = &input->proxyA;
264
+ const b2DistanceProxy* proxyB = &input->proxyB;
265
+
266
+ b2Sweep sweepA = input->sweepA;
267
+ b2Sweep sweepB = input->sweepB;
268
+
269
+ // Large rotations can make the root finder fail, so we normalize the
270
+ // sweep angles.
271
+ sweepA.Normalize();
272
+ sweepB.Normalize();
273
+
274
+ float32 tMax = input->tMax;
275
+
276
+ float32 totalRadius = proxyA->m_radius + proxyB->m_radius;
277
+ float32 target = b2Max(b2_linearSlop, totalRadius - 3.0f * b2_linearSlop);
278
+ float32 tolerance = 0.25f * b2_linearSlop;
279
+ b2Assert(target > tolerance);
280
+
281
+ float32 t1 = 0.0f;
282
+ const int32 k_maxIterations = 20; // TODO_ERIN b2Settings
283
+ int32 iter = 0;
284
+
285
+ // Prepare input for distance query.
286
+ b2SimplexCache cache;
287
+ cache.count = 0;
288
+ b2DistanceInput distanceInput;
289
+ distanceInput.proxyA = input->proxyA;
290
+ distanceInput.proxyB = input->proxyB;
291
+ distanceInput.useRadii = false;
292
+
293
+ // The outer loop progressively attempts to compute new separating axes.
294
+ // This loop terminates when an axis is repeated (no progress is made).
295
+ for(;;)
296
+ {
297
+ b2Transform xfA, xfB;
298
+ sweepA.GetTransform(&xfA, t1);
299
+ sweepB.GetTransform(&xfB, t1);
300
+
301
+ // Get the distance between shapes. We can also use the results
302
+ // to get a separating axis.
303
+ distanceInput.transformA = xfA;
304
+ distanceInput.transformB = xfB;
305
+ b2DistanceOutput distanceOutput;
306
+ b2Distance(&distanceOutput, &cache, &distanceInput);
307
+
308
+ // If the shapes are overlapped, we give up on continuous collision.
309
+ if (distanceOutput.distance <= 0.0f)
310
+ {
311
+ // Failure!
312
+ output->state = b2TOIOutput::e_overlapped;
313
+ output->t = 0.0f;
314
+ break;
315
+ }
316
+
317
+ if (distanceOutput.distance < target + tolerance)
318
+ {
319
+ // Victory!
320
+ output->state = b2TOIOutput::e_touching;
321
+ output->t = t1;
322
+ break;
323
+ }
324
+
325
+ // Initialize the separating axis.
326
+ b2SeparationFunction fcn;
327
+ fcn.Initialize(&cache, proxyA, sweepA, proxyB, sweepB, t1);
328
+ #if 0
329
+ // Dump the curve seen by the root finder
330
+ {
331
+ const int32 N = 100;
332
+ float32 dx = 1.0f / N;
333
+ float32 xs[N+1];
334
+ float32 fs[N+1];
335
+
336
+ float32 x = 0.0f;
337
+
338
+ for (int32 i = 0; i <= N; ++i)
339
+ {
340
+ sweepA.GetTransform(&xfA, x);
341
+ sweepB.GetTransform(&xfB, x);
342
+ float32 f = fcn.Evaluate(xfA, xfB) - target;
343
+
344
+ printf("%g %g\n", x, f);
345
+
346
+ xs[i] = x;
347
+ fs[i] = f;
348
+
349
+ x += dx;
350
+ }
351
+ }
352
+ #endif
353
+
354
+ // Compute the TOI on the separating axis. We do this by successively
355
+ // resolving the deepest point. This loop is bounded by the number of vertices.
356
+ bool done = false;
357
+ float32 t2 = tMax;
358
+ int32 pushBackIter = 0;
359
+ for (;;)
360
+ {
361
+ // Find the deepest point at t2. Store the witness point indices.
362
+ int32 indexA, indexB;
363
+ float32 s2 = fcn.FindMinSeparation(&indexA, &indexB, t2);
364
+
365
+ // Is the final configuration separated?
366
+ if (s2 > target + tolerance)
367
+ {
368
+ // Victory!
369
+ output->state = b2TOIOutput::e_separated;
370
+ output->t = tMax;
371
+ done = true;
372
+ break;
373
+ }
374
+
375
+ // Has the separation reached tolerance?
376
+ if (s2 > target - tolerance)
377
+ {
378
+ // Advance the sweeps
379
+ t1 = t2;
380
+ break;
381
+ }
382
+
383
+ // Compute the initial separation of the witness points.
384
+ float32 s1 = fcn.Evaluate(indexA, indexB, t1);
385
+
386
+ // Check for initial overlap. This might happen if the root finder
387
+ // runs out of iterations.
388
+ if (s1 < target - tolerance)
389
+ {
390
+ output->state = b2TOIOutput::e_failed;
391
+ output->t = t1;
392
+ done = true;
393
+ break;
394
+ }
395
+
396
+ // Check for touching
397
+ if (s1 <= target + tolerance)
398
+ {
399
+ // Victory! t1 should hold the TOI (could be 0.0).
400
+ output->state = b2TOIOutput::e_touching;
401
+ output->t = t1;
402
+ done = true;
403
+ break;
404
+ }
405
+
406
+ // Compute 1D root of: f(x) - target = 0
407
+ int32 rootIterCount = 0;
408
+ float32 a1 = t1, a2 = t2;
409
+ for (;;)
410
+ {
411
+ // Use a mix of the secant rule and bisection.
412
+ float32 t;
413
+ if (rootIterCount & 1)
414
+ {
415
+ // Secant rule to improve convergence.
416
+ t = a1 + (target - s1) * (a2 - a1) / (s2 - s1);
417
+ }
418
+ else
419
+ {
420
+ // Bisection to guarantee progress.
421
+ t = 0.5f * (a1 + a2);
422
+ }
423
+
424
+ ++rootIterCount;
425
+ ++b2_toiRootIters;
426
+
427
+ float32 s = fcn.Evaluate(indexA, indexB, t);
428
+
429
+ if (b2Abs(s - target) < tolerance)
430
+ {
431
+ // t2 holds a tentative value for t1
432
+ t2 = t;
433
+ break;
434
+ }
435
+
436
+ // Ensure we continue to bracket the root.
437
+ if (s > target)
438
+ {
439
+ a1 = t;
440
+ s1 = s;
441
+ }
442
+ else
443
+ {
444
+ a2 = t;
445
+ s2 = s;
446
+ }
447
+
448
+ if (rootIterCount == 50)
449
+ {
450
+ break;
451
+ }
452
+ }
453
+
454
+ b2_toiMaxRootIters = b2Max(b2_toiMaxRootIters, rootIterCount);
455
+
456
+ ++pushBackIter;
457
+
458
+ if (pushBackIter == b2_maxPolygonVertices)
459
+ {
460
+ break;
461
+ }
462
+ }
463
+
464
+ ++iter;
465
+ ++b2_toiIters;
466
+
467
+ if (done)
468
+ {
469
+ break;
470
+ }
471
+
472
+ if (iter == k_maxIterations)
473
+ {
474
+ // Root finder got stuck. Semi-victory.
475
+ output->state = b2TOIOutput::e_failed;
476
+ output->t = t1;
477
+ break;
478
+ }
479
+ }
480
+
481
+ b2_toiMaxIters = b2Max(b2_toiMaxIters, iter);
482
+
483
+ float32 time = timer.GetMilliseconds();
484
+ b2_toiMaxTime = b2Max(b2_toiMaxTime, time);
485
+ b2_toiTime += time;
486
+ }
@@ -0,0 +1,58 @@
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_TIME_OF_IMPACT_H
20
+ #define B2_TIME_OF_IMPACT_H
21
+
22
+ #include <Box2D/Common/b2Math.h>
23
+ #include <Box2D/Collision/b2Distance.h>
24
+
25
+ /// Input parameters for b2TimeOfImpact
26
+ struct b2TOIInput
27
+ {
28
+ b2DistanceProxy proxyA;
29
+ b2DistanceProxy proxyB;
30
+ b2Sweep sweepA;
31
+ b2Sweep sweepB;
32
+ float32 tMax; // defines sweep interval [0, tMax]
33
+ };
34
+
35
+ // Output parameters for b2TimeOfImpact.
36
+ struct b2TOIOutput
37
+ {
38
+ enum State
39
+ {
40
+ e_unknown,
41
+ e_failed,
42
+ e_overlapped,
43
+ e_touching,
44
+ e_separated
45
+ };
46
+
47
+ State state;
48
+ float32 t;
49
+ };
50
+
51
+ /// Compute the upper bound on time before two shapes penetrate. Time is represented as
52
+ /// a fraction between [0,tMax]. This uses a swept separating axis and may miss some intermediate,
53
+ /// non-tunneling collision. If you change the time interval, you should call this function
54
+ /// again.
55
+ /// Note: use b2Distance to compute the contact point and normal at the time of impact.
56
+ void b2TimeOfImpact(b2TOIOutput* output, const b2TOIInput* input);
57
+
58
+ #endif