reflexion 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,239 @@
1
+ /*
2
+ * Copyright (c) 2006-2009 Erin Catto http://www.box2d.org
3
+ *
4
+ * This software is provided 'as-is', without any express or implied
5
+ * warranty. In no event will the authors be held liable for any damages
6
+ * arising from the use of this software.
7
+ * Permission is granted to anyone to use this software for any purpose,
8
+ * including commercial applications, and to alter it and redistribute it
9
+ * freely, subject to the following restrictions:
10
+ * 1. The origin of this software must not be misrepresented; you must not
11
+ * claim that you wrote the original software. If you use this software
12
+ * in a product, an acknowledgment in the product documentation would be
13
+ * appreciated but is not required.
14
+ * 2. Altered source versions must be plainly marked as such, and must not be
15
+ * misrepresented as being the original software.
16
+ * 3. This notice may not be removed or altered from any source distribution.
17
+ */
18
+
19
+ #include <Box2D/Collision/b2Collision.h>
20
+ #include <Box2D/Collision/Shapes/b2PolygonShape.h>
21
+
22
+ // Find the max separation between poly1 and poly2 using edge normals from poly1.
23
+ static float32 b2FindMaxSeparation(int32* edgeIndex,
24
+ const b2PolygonShape* poly1, const b2Transform& xf1,
25
+ const b2PolygonShape* poly2, const b2Transform& xf2)
26
+ {
27
+ int32 count1 = poly1->m_count;
28
+ int32 count2 = poly2->m_count;
29
+ const b2Vec2* n1s = poly1->m_normals;
30
+ const b2Vec2* v1s = poly1->m_vertices;
31
+ const b2Vec2* v2s = poly2->m_vertices;
32
+ b2Transform xf = b2MulT(xf2, xf1);
33
+
34
+ int32 bestIndex = 0;
35
+ float32 maxSeparation = -b2_maxFloat;
36
+ for (int32 i = 0; i < count1; ++i)
37
+ {
38
+ // Get poly1 normal in frame2.
39
+ b2Vec2 n = b2Mul(xf.q, n1s[i]);
40
+ b2Vec2 v1 = b2Mul(xf, v1s[i]);
41
+
42
+ // Find deepest point for normal i.
43
+ float32 si = b2_maxFloat;
44
+ for (int32 j = 0; j < count2; ++j)
45
+ {
46
+ float32 sij = b2Dot(n, v2s[j] - v1);
47
+ if (sij < si)
48
+ {
49
+ si = sij;
50
+ }
51
+ }
52
+
53
+ if (si > maxSeparation)
54
+ {
55
+ maxSeparation = si;
56
+ bestIndex = i;
57
+ }
58
+ }
59
+
60
+ *edgeIndex = bestIndex;
61
+ return maxSeparation;
62
+ }
63
+
64
+ static void b2FindIncidentEdge(b2ClipVertex c[2],
65
+ const b2PolygonShape* poly1, const b2Transform& xf1, int32 edge1,
66
+ const b2PolygonShape* poly2, const b2Transform& xf2)
67
+ {
68
+ const b2Vec2* normals1 = poly1->m_normals;
69
+
70
+ int32 count2 = poly2->m_count;
71
+ const b2Vec2* vertices2 = poly2->m_vertices;
72
+ const b2Vec2* normals2 = poly2->m_normals;
73
+
74
+ b2Assert(0 <= edge1 && edge1 < poly1->m_count);
75
+
76
+ // Get the normal of the reference edge in poly2's frame.
77
+ b2Vec2 normal1 = b2MulT(xf2.q, b2Mul(xf1.q, normals1[edge1]));
78
+
79
+ // Find the incident edge on poly2.
80
+ int32 index = 0;
81
+ float32 minDot = b2_maxFloat;
82
+ for (int32 i = 0; i < count2; ++i)
83
+ {
84
+ float32 dot = b2Dot(normal1, normals2[i]);
85
+ if (dot < minDot)
86
+ {
87
+ minDot = dot;
88
+ index = i;
89
+ }
90
+ }
91
+
92
+ // Build the clip vertices for the incident edge.
93
+ int32 i1 = index;
94
+ int32 i2 = i1 + 1 < count2 ? i1 + 1 : 0;
95
+
96
+ c[0].v = b2Mul(xf2, vertices2[i1]);
97
+ c[0].id.cf.indexA = (uint8)edge1;
98
+ c[0].id.cf.indexB = (uint8)i1;
99
+ c[0].id.cf.typeA = b2ContactFeature::e_face;
100
+ c[0].id.cf.typeB = b2ContactFeature::e_vertex;
101
+
102
+ c[1].v = b2Mul(xf2, vertices2[i2]);
103
+ c[1].id.cf.indexA = (uint8)edge1;
104
+ c[1].id.cf.indexB = (uint8)i2;
105
+ c[1].id.cf.typeA = b2ContactFeature::e_face;
106
+ c[1].id.cf.typeB = b2ContactFeature::e_vertex;
107
+ }
108
+
109
+ // Find edge normal of max separation on A - return if separating axis is found
110
+ // Find edge normal of max separation on B - return if separation axis is found
111
+ // Choose reference edge as min(minA, minB)
112
+ // Find incident edge
113
+ // Clip
114
+
115
+ // The normal points from 1 to 2
116
+ void b2CollidePolygons(b2Manifold* manifold,
117
+ const b2PolygonShape* polyA, const b2Transform& xfA,
118
+ const b2PolygonShape* polyB, const b2Transform& xfB)
119
+ {
120
+ manifold->pointCount = 0;
121
+ float32 totalRadius = polyA->m_radius + polyB->m_radius;
122
+
123
+ int32 edgeA = 0;
124
+ float32 separationA = b2FindMaxSeparation(&edgeA, polyA, xfA, polyB, xfB);
125
+ if (separationA > totalRadius)
126
+ return;
127
+
128
+ int32 edgeB = 0;
129
+ float32 separationB = b2FindMaxSeparation(&edgeB, polyB, xfB, polyA, xfA);
130
+ if (separationB > totalRadius)
131
+ return;
132
+
133
+ const b2PolygonShape* poly1; // reference polygon
134
+ const b2PolygonShape* poly2; // incident polygon
135
+ b2Transform xf1, xf2;
136
+ int32 edge1; // reference edge
137
+ uint8 flip;
138
+ const float32 k_tol = 0.1f * b2_linearSlop;
139
+
140
+ if (separationB > separationA + k_tol)
141
+ {
142
+ poly1 = polyB;
143
+ poly2 = polyA;
144
+ xf1 = xfB;
145
+ xf2 = xfA;
146
+ edge1 = edgeB;
147
+ manifold->type = b2Manifold::e_faceB;
148
+ flip = 1;
149
+ }
150
+ else
151
+ {
152
+ poly1 = polyA;
153
+ poly2 = polyB;
154
+ xf1 = xfA;
155
+ xf2 = xfB;
156
+ edge1 = edgeA;
157
+ manifold->type = b2Manifold::e_faceA;
158
+ flip = 0;
159
+ }
160
+
161
+ b2ClipVertex incidentEdge[2];
162
+ b2FindIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2);
163
+
164
+ int32 count1 = poly1->m_count;
165
+ const b2Vec2* vertices1 = poly1->m_vertices;
166
+
167
+ int32 iv1 = edge1;
168
+ int32 iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0;
169
+
170
+ b2Vec2 v11 = vertices1[iv1];
171
+ b2Vec2 v12 = vertices1[iv2];
172
+
173
+ b2Vec2 localTangent = v12 - v11;
174
+ localTangent.Normalize();
175
+
176
+ b2Vec2 localNormal = b2Cross(localTangent, 1.0f);
177
+ b2Vec2 planePoint = 0.5f * (v11 + v12);
178
+
179
+ b2Vec2 tangent = b2Mul(xf1.q, localTangent);
180
+ b2Vec2 normal = b2Cross(tangent, 1.0f);
181
+
182
+ v11 = b2Mul(xf1, v11);
183
+ v12 = b2Mul(xf1, v12);
184
+
185
+ // Face offset.
186
+ float32 frontOffset = b2Dot(normal, v11);
187
+
188
+ // Side offsets, extended by polytope skin thickness.
189
+ float32 sideOffset1 = -b2Dot(tangent, v11) + totalRadius;
190
+ float32 sideOffset2 = b2Dot(tangent, v12) + totalRadius;
191
+
192
+ // Clip incident edge against extruded edge1 side edges.
193
+ b2ClipVertex clipPoints1[2];
194
+ b2ClipVertex clipPoints2[2];
195
+ int np;
196
+
197
+ // Clip to box side 1
198
+ np = b2ClipSegmentToLine(clipPoints1, incidentEdge, -tangent, sideOffset1, iv1);
199
+
200
+ if (np < 2)
201
+ return;
202
+
203
+ // Clip to negative box side 1
204
+ np = b2ClipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2);
205
+
206
+ if (np < 2)
207
+ {
208
+ return;
209
+ }
210
+
211
+ // Now clipPoints2 contains the clipped points.
212
+ manifold->localNormal = localNormal;
213
+ manifold->localPoint = planePoint;
214
+
215
+ int32 pointCount = 0;
216
+ for (int32 i = 0; i < b2_maxManifoldPoints; ++i)
217
+ {
218
+ float32 separation = b2Dot(normal, clipPoints2[i].v) - frontOffset;
219
+
220
+ if (separation <= totalRadius)
221
+ {
222
+ b2ManifoldPoint* cp = manifold->points + pointCount;
223
+ cp->localPoint = b2MulT(xf2, clipPoints2[i].v);
224
+ cp->id = clipPoints2[i].id;
225
+ if (flip)
226
+ {
227
+ // Swap features
228
+ b2ContactFeature cf = cp->id.cf;
229
+ cp->id.cf.indexA = cf.indexB;
230
+ cp->id.cf.indexB = cf.indexA;
231
+ cp->id.cf.typeA = cf.typeB;
232
+ cp->id.cf.typeB = cf.typeA;
233
+ }
234
+ ++pointCount;
235
+ }
236
+ }
237
+
238
+ manifold->pointCount = pointCount;
239
+ }
@@ -0,0 +1,252 @@
1
+ /*
2
+ * Copyright (c) 2007-2009 Erin Catto http://www.box2d.org
3
+ *
4
+ * This software is provided 'as-is', without any express or implied
5
+ * warranty. In no event will the authors be held liable for any damages
6
+ * arising from the use of this software.
7
+ * Permission is granted to anyone to use this software for any purpose,
8
+ * including commercial applications, and to alter it and redistribute it
9
+ * freely, subject to the following restrictions:
10
+ * 1. The origin of this software must not be misrepresented; you must not
11
+ * claim that you wrote the original software. If you use this software
12
+ * in a product, an acknowledgment in the product documentation would be
13
+ * appreciated but is not required.
14
+ * 2. Altered source versions must be plainly marked as such, and must not be
15
+ * misrepresented as being the original software.
16
+ * 3. This notice may not be removed or altered from any source distribution.
17
+ */
18
+
19
+ #include <Box2D/Collision/b2Collision.h>
20
+ #include <Box2D/Collision/b2Distance.h>
21
+
22
+ void b2WorldManifold::Initialize(const b2Manifold* manifold,
23
+ const b2Transform& xfA, float32 radiusA,
24
+ const b2Transform& xfB, float32 radiusB)
25
+ {
26
+ if (manifold->pointCount == 0)
27
+ {
28
+ return;
29
+ }
30
+
31
+ switch (manifold->type)
32
+ {
33
+ case b2Manifold::e_circles:
34
+ {
35
+ normal.Set(1.0f, 0.0f);
36
+ b2Vec2 pointA = b2Mul(xfA, manifold->localPoint);
37
+ b2Vec2 pointB = b2Mul(xfB, manifold->points[0].localPoint);
38
+ if (b2DistanceSquared(pointA, pointB) > b2_epsilon * b2_epsilon)
39
+ {
40
+ normal = pointB - pointA;
41
+ normal.Normalize();
42
+ }
43
+
44
+ b2Vec2 cA = pointA + radiusA * normal;
45
+ b2Vec2 cB = pointB - radiusB * normal;
46
+ points[0] = 0.5f * (cA + cB);
47
+ separations[0] = b2Dot(cB - cA, normal);
48
+ }
49
+ break;
50
+
51
+ case b2Manifold::e_faceA:
52
+ {
53
+ normal = b2Mul(xfA.q, manifold->localNormal);
54
+ b2Vec2 planePoint = b2Mul(xfA, manifold->localPoint);
55
+
56
+ for (int32 i = 0; i < manifold->pointCount; ++i)
57
+ {
58
+ b2Vec2 clipPoint = b2Mul(xfB, manifold->points[i].localPoint);
59
+ b2Vec2 cA = clipPoint + (radiusA - b2Dot(clipPoint - planePoint, normal)) * normal;
60
+ b2Vec2 cB = clipPoint - radiusB * normal;
61
+ points[i] = 0.5f * (cA + cB);
62
+ separations[i] = b2Dot(cB - cA, normal);
63
+ }
64
+ }
65
+ break;
66
+
67
+ case b2Manifold::e_faceB:
68
+ {
69
+ normal = b2Mul(xfB.q, manifold->localNormal);
70
+ b2Vec2 planePoint = b2Mul(xfB, manifold->localPoint);
71
+
72
+ for (int32 i = 0; i < manifold->pointCount; ++i)
73
+ {
74
+ b2Vec2 clipPoint = b2Mul(xfA, manifold->points[i].localPoint);
75
+ b2Vec2 cB = clipPoint + (radiusB - b2Dot(clipPoint - planePoint, normal)) * normal;
76
+ b2Vec2 cA = clipPoint - radiusA * normal;
77
+ points[i] = 0.5f * (cA + cB);
78
+ separations[i] = b2Dot(cA - cB, normal);
79
+ }
80
+
81
+ // Ensure normal points from A to B.
82
+ normal = -normal;
83
+ }
84
+ break;
85
+ }
86
+ }
87
+
88
+ void b2GetPointStates(b2PointState state1[b2_maxManifoldPoints], b2PointState state2[b2_maxManifoldPoints],
89
+ const b2Manifold* manifold1, const b2Manifold* manifold2)
90
+ {
91
+ for (int32 i = 0; i < b2_maxManifoldPoints; ++i)
92
+ {
93
+ state1[i] = b2_nullState;
94
+ state2[i] = b2_nullState;
95
+ }
96
+
97
+ // Detect persists and removes.
98
+ for (int32 i = 0; i < manifold1->pointCount; ++i)
99
+ {
100
+ b2ContactID id = manifold1->points[i].id;
101
+
102
+ state1[i] = b2_removeState;
103
+
104
+ for (int32 j = 0; j < manifold2->pointCount; ++j)
105
+ {
106
+ if (manifold2->points[j].id.key == id.key)
107
+ {
108
+ state1[i] = b2_persistState;
109
+ break;
110
+ }
111
+ }
112
+ }
113
+
114
+ // Detect persists and adds.
115
+ for (int32 i = 0; i < manifold2->pointCount; ++i)
116
+ {
117
+ b2ContactID id = manifold2->points[i].id;
118
+
119
+ state2[i] = b2_addState;
120
+
121
+ for (int32 j = 0; j < manifold1->pointCount; ++j)
122
+ {
123
+ if (manifold1->points[j].id.key == id.key)
124
+ {
125
+ state2[i] = b2_persistState;
126
+ break;
127
+ }
128
+ }
129
+ }
130
+ }
131
+
132
+ // From Real-time Collision Detection, p179.
133
+ bool b2AABB::RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const
134
+ {
135
+ float32 tmin = -b2_maxFloat;
136
+ float32 tmax = b2_maxFloat;
137
+
138
+ b2Vec2 p = input.p1;
139
+ b2Vec2 d = input.p2 - input.p1;
140
+ b2Vec2 absD = b2Abs(d);
141
+
142
+ b2Vec2 normal;
143
+
144
+ for (int32 i = 0; i < 2; ++i)
145
+ {
146
+ if (absD(i) < b2_epsilon)
147
+ {
148
+ // Parallel.
149
+ if (p(i) < lowerBound(i) || upperBound(i) < p(i))
150
+ {
151
+ return false;
152
+ }
153
+ }
154
+ else
155
+ {
156
+ float32 inv_d = 1.0f / d(i);
157
+ float32 t1 = (lowerBound(i) - p(i)) * inv_d;
158
+ float32 t2 = (upperBound(i) - p(i)) * inv_d;
159
+
160
+ // Sign of the normal vector.
161
+ float32 s = -1.0f;
162
+
163
+ if (t1 > t2)
164
+ {
165
+ b2Swap(t1, t2);
166
+ s = 1.0f;
167
+ }
168
+
169
+ // Push the min up
170
+ if (t1 > tmin)
171
+ {
172
+ normal.SetZero();
173
+ normal(i) = s;
174
+ tmin = t1;
175
+ }
176
+
177
+ // Pull the max down
178
+ tmax = b2Min(tmax, t2);
179
+
180
+ if (tmin > tmax)
181
+ {
182
+ return false;
183
+ }
184
+ }
185
+ }
186
+
187
+ // Does the ray start inside the box?
188
+ // Does the ray intersect beyond the max fraction?
189
+ if (tmin < 0.0f || input.maxFraction < tmin)
190
+ {
191
+ return false;
192
+ }
193
+
194
+ // Intersection.
195
+ output->fraction = tmin;
196
+ output->normal = normal;
197
+ return true;
198
+ }
199
+
200
+ // Sutherland-Hodgman clipping.
201
+ int32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2],
202
+ const b2Vec2& normal, float32 offset, int32 vertexIndexA)
203
+ {
204
+ // Start with no output points
205
+ int32 numOut = 0;
206
+
207
+ // Calculate the distance of end points to the line
208
+ float32 distance0 = b2Dot(normal, vIn[0].v) - offset;
209
+ float32 distance1 = b2Dot(normal, vIn[1].v) - offset;
210
+
211
+ // If the points are behind the plane
212
+ if (distance0 <= 0.0f) vOut[numOut++] = vIn[0];
213
+ if (distance1 <= 0.0f) vOut[numOut++] = vIn[1];
214
+
215
+ // If the points are on different sides of the plane
216
+ if (distance0 * distance1 < 0.0f)
217
+ {
218
+ // Find intersection point of edge and plane
219
+ float32 interp = distance0 / (distance0 - distance1);
220
+ vOut[numOut].v = vIn[0].v + interp * (vIn[1].v - vIn[0].v);
221
+
222
+ // VertexA is hitting edgeB.
223
+ vOut[numOut].id.cf.indexA = static_cast<uint8>(vertexIndexA);
224
+ vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB;
225
+ vOut[numOut].id.cf.typeA = b2ContactFeature::e_vertex;
226
+ vOut[numOut].id.cf.typeB = b2ContactFeature::e_face;
227
+ ++numOut;
228
+ }
229
+
230
+ return numOut;
231
+ }
232
+
233
+ bool b2TestOverlap( const b2Shape* shapeA, int32 indexA,
234
+ const b2Shape* shapeB, int32 indexB,
235
+ const b2Transform& xfA, const b2Transform& xfB)
236
+ {
237
+ b2DistanceInput input;
238
+ input.proxyA.Set(shapeA, indexA);
239
+ input.proxyB.Set(shapeB, indexB);
240
+ input.transformA = xfA;
241
+ input.transformB = xfB;
242
+ input.useRadii = true;
243
+
244
+ b2SimplexCache cache;
245
+ cache.count = 0;
246
+
247
+ b2DistanceOutput output;
248
+
249
+ b2Distance(&output, &cache, &input);
250
+
251
+ return output.distance < 10.0f * b2_epsilon;
252
+ }