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,296 @@
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/Dynamics/b2ContactManager.h>
20
+ #include <Box2D/Dynamics/b2Body.h>
21
+ #include <Box2D/Dynamics/b2Fixture.h>
22
+ #include <Box2D/Dynamics/b2WorldCallbacks.h>
23
+ #include <Box2D/Dynamics/Contacts/b2Contact.h>
24
+
25
+ b2ContactFilter b2_defaultFilter;
26
+ b2ContactListener b2_defaultListener;
27
+
28
+ b2ContactManager::b2ContactManager()
29
+ {
30
+ m_contactList = NULL;
31
+ m_contactCount = 0;
32
+ m_contactFilter = &b2_defaultFilter;
33
+ m_contactListener = &b2_defaultListener;
34
+ m_allocator = NULL;
35
+ }
36
+
37
+ void b2ContactManager::Destroy(b2Contact* c)
38
+ {
39
+ b2Fixture* fixtureA = c->GetFixtureA();
40
+ b2Fixture* fixtureB = c->GetFixtureB();
41
+ b2Body* bodyA = fixtureA->GetBody();
42
+ b2Body* bodyB = fixtureB->GetBody();
43
+
44
+ if (m_contactListener && c->IsTouching())
45
+ {
46
+ m_contactListener->EndContact(c);
47
+ }
48
+
49
+ // Remove from the world.
50
+ if (c->m_prev)
51
+ {
52
+ c->m_prev->m_next = c->m_next;
53
+ }
54
+
55
+ if (c->m_next)
56
+ {
57
+ c->m_next->m_prev = c->m_prev;
58
+ }
59
+
60
+ if (c == m_contactList)
61
+ {
62
+ m_contactList = c->m_next;
63
+ }
64
+
65
+ // Remove from body 1
66
+ if (c->m_nodeA.prev)
67
+ {
68
+ c->m_nodeA.prev->next = c->m_nodeA.next;
69
+ }
70
+
71
+ if (c->m_nodeA.next)
72
+ {
73
+ c->m_nodeA.next->prev = c->m_nodeA.prev;
74
+ }
75
+
76
+ if (&c->m_nodeA == bodyA->m_contactList)
77
+ {
78
+ bodyA->m_contactList = c->m_nodeA.next;
79
+ }
80
+
81
+ // Remove from body 2
82
+ if (c->m_nodeB.prev)
83
+ {
84
+ c->m_nodeB.prev->next = c->m_nodeB.next;
85
+ }
86
+
87
+ if (c->m_nodeB.next)
88
+ {
89
+ c->m_nodeB.next->prev = c->m_nodeB.prev;
90
+ }
91
+
92
+ if (&c->m_nodeB == bodyB->m_contactList)
93
+ {
94
+ bodyB->m_contactList = c->m_nodeB.next;
95
+ }
96
+
97
+ // Call the factory.
98
+ b2Contact::Destroy(c, m_allocator);
99
+ --m_contactCount;
100
+ }
101
+
102
+ // This is the top level collision call for the time step. Here
103
+ // all the narrow phase collision is processed for the world
104
+ // contact list.
105
+ void b2ContactManager::Collide()
106
+ {
107
+ // Update awake contacts.
108
+ b2Contact* c = m_contactList;
109
+ while (c)
110
+ {
111
+ b2Fixture* fixtureA = c->GetFixtureA();
112
+ b2Fixture* fixtureB = c->GetFixtureB();
113
+ int32 indexA = c->GetChildIndexA();
114
+ int32 indexB = c->GetChildIndexB();
115
+ b2Body* bodyA = fixtureA->GetBody();
116
+ b2Body* bodyB = fixtureB->GetBody();
117
+
118
+ // Is this contact flagged for filtering?
119
+ if (c->m_flags & b2Contact::e_filterFlag)
120
+ {
121
+ // Should these bodies collide?
122
+ if (bodyB->ShouldCollide(bodyA) == false)
123
+ {
124
+ b2Contact* cNuke = c;
125
+ c = cNuke->GetNext();
126
+ Destroy(cNuke);
127
+ continue;
128
+ }
129
+
130
+ // Check user filtering.
131
+ if (m_contactFilter && m_contactFilter->ShouldCollide(fixtureA, fixtureB) == false)
132
+ {
133
+ b2Contact* cNuke = c;
134
+ c = cNuke->GetNext();
135
+ Destroy(cNuke);
136
+ continue;
137
+ }
138
+
139
+ // Clear the filtering flag.
140
+ c->m_flags &= ~b2Contact::e_filterFlag;
141
+ }
142
+
143
+ bool activeA = bodyA->IsAwake() && bodyA->m_type != b2_staticBody;
144
+ bool activeB = bodyB->IsAwake() && bodyB->m_type != b2_staticBody;
145
+
146
+ // At least one body must be awake and it must be dynamic or kinematic.
147
+ if (activeA == false && activeB == false)
148
+ {
149
+ c = c->GetNext();
150
+ continue;
151
+ }
152
+
153
+ int32 proxyIdA = fixtureA->m_proxies[indexA].proxyId;
154
+ int32 proxyIdB = fixtureB->m_proxies[indexB].proxyId;
155
+ bool overlap = m_broadPhase.TestOverlap(proxyIdA, proxyIdB);
156
+
157
+ // Here we destroy contacts that cease to overlap in the broad-phase.
158
+ if (overlap == false)
159
+ {
160
+ b2Contact* cNuke = c;
161
+ c = cNuke->GetNext();
162
+ Destroy(cNuke);
163
+ continue;
164
+ }
165
+
166
+ // The contact persists.
167
+ c->Update(m_contactListener);
168
+ c = c->GetNext();
169
+ }
170
+ }
171
+
172
+ void b2ContactManager::FindNewContacts()
173
+ {
174
+ m_broadPhase.UpdatePairs(this);
175
+ }
176
+
177
+ void b2ContactManager::AddPair(void* proxyUserDataA, void* proxyUserDataB)
178
+ {
179
+ b2FixtureProxy* proxyA = (b2FixtureProxy*)proxyUserDataA;
180
+ b2FixtureProxy* proxyB = (b2FixtureProxy*)proxyUserDataB;
181
+
182
+ b2Fixture* fixtureA = proxyA->fixture;
183
+ b2Fixture* fixtureB = proxyB->fixture;
184
+
185
+ int32 indexA = proxyA->childIndex;
186
+ int32 indexB = proxyB->childIndex;
187
+
188
+ b2Body* bodyA = fixtureA->GetBody();
189
+ b2Body* bodyB = fixtureB->GetBody();
190
+
191
+ // Are the fixtures on the same body?
192
+ if (bodyA == bodyB)
193
+ {
194
+ return;
195
+ }
196
+
197
+ // TODO_ERIN use a hash table to remove a potential bottleneck when both
198
+ // bodies have a lot of contacts.
199
+ // Does a contact already exist?
200
+ b2ContactEdge* edge = bodyB->GetContactList();
201
+ while (edge)
202
+ {
203
+ if (edge->other == bodyA)
204
+ {
205
+ b2Fixture* fA = edge->contact->GetFixtureA();
206
+ b2Fixture* fB = edge->contact->GetFixtureB();
207
+ int32 iA = edge->contact->GetChildIndexA();
208
+ int32 iB = edge->contact->GetChildIndexB();
209
+
210
+ if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB)
211
+ {
212
+ // A contact already exists.
213
+ return;
214
+ }
215
+
216
+ if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA)
217
+ {
218
+ // A contact already exists.
219
+ return;
220
+ }
221
+ }
222
+
223
+ edge = edge->next;
224
+ }
225
+
226
+ // Does a joint override collision? Is at least one body dynamic?
227
+ if (bodyB->ShouldCollide(bodyA) == false)
228
+ {
229
+ return;
230
+ }
231
+
232
+ // Check user filtering.
233
+ if (m_contactFilter && m_contactFilter->ShouldCollide(fixtureA, fixtureB) == false)
234
+ {
235
+ return;
236
+ }
237
+
238
+ // Call the factory.
239
+ b2Contact* c = b2Contact::Create(fixtureA, indexA, fixtureB, indexB, m_allocator);
240
+ if (c == NULL)
241
+ {
242
+ return;
243
+ }
244
+
245
+ // Contact creation may swap fixtures.
246
+ fixtureA = c->GetFixtureA();
247
+ fixtureB = c->GetFixtureB();
248
+ indexA = c->GetChildIndexA();
249
+ indexB = c->GetChildIndexB();
250
+ bodyA = fixtureA->GetBody();
251
+ bodyB = fixtureB->GetBody();
252
+
253
+ // Insert into the world.
254
+ c->m_prev = NULL;
255
+ c->m_next = m_contactList;
256
+ if (m_contactList != NULL)
257
+ {
258
+ m_contactList->m_prev = c;
259
+ }
260
+ m_contactList = c;
261
+
262
+ // Connect to island graph.
263
+
264
+ // Connect to body A
265
+ c->m_nodeA.contact = c;
266
+ c->m_nodeA.other = bodyB;
267
+
268
+ c->m_nodeA.prev = NULL;
269
+ c->m_nodeA.next = bodyA->m_contactList;
270
+ if (bodyA->m_contactList != NULL)
271
+ {
272
+ bodyA->m_contactList->prev = &c->m_nodeA;
273
+ }
274
+ bodyA->m_contactList = &c->m_nodeA;
275
+
276
+ // Connect to body B
277
+ c->m_nodeB.contact = c;
278
+ c->m_nodeB.other = bodyA;
279
+
280
+ c->m_nodeB.prev = NULL;
281
+ c->m_nodeB.next = bodyB->m_contactList;
282
+ if (bodyB->m_contactList != NULL)
283
+ {
284
+ bodyB->m_contactList->prev = &c->m_nodeB;
285
+ }
286
+ bodyB->m_contactList = &c->m_nodeB;
287
+
288
+ // Wake up the bodies
289
+ if (fixtureA->IsSensor() == false && fixtureB->IsSensor() == false)
290
+ {
291
+ bodyA->SetAwake(true);
292
+ bodyB->SetAwake(true);
293
+ }
294
+
295
+ ++m_contactCount;
296
+ }
@@ -0,0 +1,52 @@
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_CONTACT_MANAGER_H
20
+ #define B2_CONTACT_MANAGER_H
21
+
22
+ #include <Box2D/Collision/b2BroadPhase.h>
23
+
24
+ class b2Contact;
25
+ class b2ContactFilter;
26
+ class b2ContactListener;
27
+ class b2BlockAllocator;
28
+
29
+ // Delegate of b2World.
30
+ class b2ContactManager
31
+ {
32
+ public:
33
+ b2ContactManager();
34
+
35
+ // Broad-phase callback.
36
+ void AddPair(void* proxyUserDataA, void* proxyUserDataB);
37
+
38
+ void FindNewContacts();
39
+
40
+ void Destroy(b2Contact* c);
41
+
42
+ void Collide();
43
+
44
+ b2BroadPhase m_broadPhase;
45
+ b2Contact* m_contactList;
46
+ int32 m_contactCount;
47
+ b2ContactFilter* m_contactFilter;
48
+ b2ContactListener* m_contactListener;
49
+ b2BlockAllocator* m_allocator;
50
+ };
51
+
52
+ #endif
@@ -0,0 +1,303 @@
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/Dynamics/b2Fixture.h>
20
+ #include <Box2D/Dynamics/Contacts/b2Contact.h>
21
+ #include <Box2D/Dynamics/b2World.h>
22
+ #include <Box2D/Collision/Shapes/b2CircleShape.h>
23
+ #include <Box2D/Collision/Shapes/b2EdgeShape.h>
24
+ #include <Box2D/Collision/Shapes/b2PolygonShape.h>
25
+ #include <Box2D/Collision/Shapes/b2ChainShape.h>
26
+ #include <Box2D/Collision/b2BroadPhase.h>
27
+ #include <Box2D/Collision/b2Collision.h>
28
+ #include <Box2D/Common/b2BlockAllocator.h>
29
+
30
+ b2Fixture::b2Fixture()
31
+ {
32
+ m_userData = NULL;
33
+ m_body = NULL;
34
+ m_next = NULL;
35
+ m_proxies = NULL;
36
+ m_proxyCount = 0;
37
+ m_shape = NULL;
38
+ m_density = 0.0f;
39
+ }
40
+
41
+ void b2Fixture::Create(b2BlockAllocator* allocator, b2Body* body, const b2FixtureDef* def)
42
+ {
43
+ m_userData = def->userData;
44
+ m_friction = def->friction;
45
+ m_restitution = def->restitution;
46
+
47
+ m_body = body;
48
+ m_next = NULL;
49
+
50
+ m_filter = def->filter;
51
+
52
+ m_isSensor = def->isSensor;
53
+
54
+ m_shape = def->shape->Clone(allocator);
55
+
56
+ // Reserve proxy space
57
+ int32 childCount = m_shape->GetChildCount();
58
+ m_proxies = (b2FixtureProxy*)allocator->Allocate(childCount * sizeof(b2FixtureProxy));
59
+ for (int32 i = 0; i < childCount; ++i)
60
+ {
61
+ m_proxies[i].fixture = NULL;
62
+ m_proxies[i].proxyId = b2BroadPhase::e_nullProxy;
63
+ }
64
+ m_proxyCount = 0;
65
+
66
+ m_density = def->density;
67
+ }
68
+
69
+ void b2Fixture::Destroy(b2BlockAllocator* allocator)
70
+ {
71
+ // The proxies must be destroyed before calling this.
72
+ b2Assert(m_proxyCount == 0);
73
+
74
+ // Free the proxy array.
75
+ int32 childCount = m_shape->GetChildCount();
76
+ allocator->Free(m_proxies, childCount * sizeof(b2FixtureProxy));
77
+ m_proxies = NULL;
78
+
79
+ // Free the child shape.
80
+ switch (m_shape->m_type)
81
+ {
82
+ case b2Shape::e_circle:
83
+ {
84
+ b2CircleShape* s = (b2CircleShape*)m_shape;
85
+ s->~b2CircleShape();
86
+ allocator->Free(s, sizeof(b2CircleShape));
87
+ }
88
+ break;
89
+
90
+ case b2Shape::e_edge:
91
+ {
92
+ b2EdgeShape* s = (b2EdgeShape*)m_shape;
93
+ s->~b2EdgeShape();
94
+ allocator->Free(s, sizeof(b2EdgeShape));
95
+ }
96
+ break;
97
+
98
+ case b2Shape::e_polygon:
99
+ {
100
+ b2PolygonShape* s = (b2PolygonShape*)m_shape;
101
+ s->~b2PolygonShape();
102
+ allocator->Free(s, sizeof(b2PolygonShape));
103
+ }
104
+ break;
105
+
106
+ case b2Shape::e_chain:
107
+ {
108
+ b2ChainShape* s = (b2ChainShape*)m_shape;
109
+ s->~b2ChainShape();
110
+ allocator->Free(s, sizeof(b2ChainShape));
111
+ }
112
+ break;
113
+
114
+ default:
115
+ b2Assert(false);
116
+ break;
117
+ }
118
+
119
+ m_shape = NULL;
120
+ }
121
+
122
+ void b2Fixture::CreateProxies(b2BroadPhase* broadPhase, const b2Transform& xf)
123
+ {
124
+ b2Assert(m_proxyCount == 0);
125
+
126
+ // Create proxies in the broad-phase.
127
+ m_proxyCount = m_shape->GetChildCount();
128
+
129
+ for (int32 i = 0; i < m_proxyCount; ++i)
130
+ {
131
+ b2FixtureProxy* proxy = m_proxies + i;
132
+ m_shape->ComputeAABB(&proxy->aabb, xf, i);
133
+ proxy->proxyId = broadPhase->CreateProxy(proxy->aabb, proxy);
134
+ proxy->fixture = this;
135
+ proxy->childIndex = i;
136
+ }
137
+ }
138
+
139
+ void b2Fixture::DestroyProxies(b2BroadPhase* broadPhase)
140
+ {
141
+ // Destroy proxies in the broad-phase.
142
+ for (int32 i = 0; i < m_proxyCount; ++i)
143
+ {
144
+ b2FixtureProxy* proxy = m_proxies + i;
145
+ broadPhase->DestroyProxy(proxy->proxyId);
146
+ proxy->proxyId = b2BroadPhase::e_nullProxy;
147
+ }
148
+
149
+ m_proxyCount = 0;
150
+ }
151
+
152
+ void b2Fixture::Synchronize(b2BroadPhase* broadPhase, const b2Transform& transform1, const b2Transform& transform2)
153
+ {
154
+ if (m_proxyCount == 0)
155
+ {
156
+ return;
157
+ }
158
+
159
+ for (int32 i = 0; i < m_proxyCount; ++i)
160
+ {
161
+ b2FixtureProxy* proxy = m_proxies + i;
162
+
163
+ // Compute an AABB that covers the swept shape (may miss some rotation effect).
164
+ b2AABB aabb1, aabb2;
165
+ m_shape->ComputeAABB(&aabb1, transform1, proxy->childIndex);
166
+ m_shape->ComputeAABB(&aabb2, transform2, proxy->childIndex);
167
+
168
+ proxy->aabb.Combine(aabb1, aabb2);
169
+
170
+ b2Vec2 displacement = transform2.p - transform1.p;
171
+
172
+ broadPhase->MoveProxy(proxy->proxyId, proxy->aabb, displacement);
173
+ }
174
+ }
175
+
176
+ void b2Fixture::SetFilterData(const b2Filter& filter)
177
+ {
178
+ m_filter = filter;
179
+
180
+ Refilter();
181
+ }
182
+
183
+ void b2Fixture::Refilter()
184
+ {
185
+ if (m_body == NULL)
186
+ {
187
+ return;
188
+ }
189
+
190
+ // Flag associated contacts for filtering.
191
+ b2ContactEdge* edge = m_body->GetContactList();
192
+ while (edge)
193
+ {
194
+ b2Contact* contact = edge->contact;
195
+ b2Fixture* fixtureA = contact->GetFixtureA();
196
+ b2Fixture* fixtureB = contact->GetFixtureB();
197
+ if (fixtureA == this || fixtureB == this)
198
+ {
199
+ contact->FlagForFiltering();
200
+ }
201
+
202
+ edge = edge->next;
203
+ }
204
+
205
+ b2World* world = m_body->GetWorld();
206
+
207
+ if (world == NULL)
208
+ {
209
+ return;
210
+ }
211
+
212
+ // Touch each proxy so that new pairs may be created
213
+ b2BroadPhase* broadPhase = &world->m_contactManager.m_broadPhase;
214
+ for (int32 i = 0; i < m_proxyCount; ++i)
215
+ {
216
+ broadPhase->TouchProxy(m_proxies[i].proxyId);
217
+ }
218
+ }
219
+
220
+ void b2Fixture::SetSensor(bool sensor)
221
+ {
222
+ if (sensor != m_isSensor)
223
+ {
224
+ m_body->SetAwake(true);
225
+ m_isSensor = sensor;
226
+ }
227
+ }
228
+
229
+ void b2Fixture::Dump(int32 bodyIndex)
230
+ {
231
+ b2Log(" b2FixtureDef fd;\n");
232
+ b2Log(" fd.friction = %.15lef;\n", m_friction);
233
+ b2Log(" fd.restitution = %.15lef;\n", m_restitution);
234
+ b2Log(" fd.density = %.15lef;\n", m_density);
235
+ b2Log(" fd.isSensor = bool(%d);\n", m_isSensor);
236
+ b2Log(" fd.filter.categoryBits = uint16(%d);\n", m_filter.categoryBits);
237
+ b2Log(" fd.filter.maskBits = uint16(%d);\n", m_filter.maskBits);
238
+ b2Log(" fd.filter.groupIndex = int16(%d);\n", m_filter.groupIndex);
239
+
240
+ switch (m_shape->m_type)
241
+ {
242
+ case b2Shape::e_circle:
243
+ {
244
+ b2CircleShape* s = (b2CircleShape*)m_shape;
245
+ b2Log(" b2CircleShape shape;\n");
246
+ b2Log(" shape.m_radius = %.15lef;\n", s->m_radius);
247
+ b2Log(" shape.m_p.Set(%.15lef, %.15lef);\n", s->m_p.x, s->m_p.y);
248
+ }
249
+ break;
250
+
251
+ case b2Shape::e_edge:
252
+ {
253
+ b2EdgeShape* s = (b2EdgeShape*)m_shape;
254
+ b2Log(" b2EdgeShape shape;\n");
255
+ b2Log(" shape.m_radius = %.15lef;\n", s->m_radius);
256
+ b2Log(" shape.m_vertex0.Set(%.15lef, %.15lef);\n", s->m_vertex0.x, s->m_vertex0.y);
257
+ b2Log(" shape.m_vertex1.Set(%.15lef, %.15lef);\n", s->m_vertex1.x, s->m_vertex1.y);
258
+ b2Log(" shape.m_vertex2.Set(%.15lef, %.15lef);\n", s->m_vertex2.x, s->m_vertex2.y);
259
+ b2Log(" shape.m_vertex3.Set(%.15lef, %.15lef);\n", s->m_vertex3.x, s->m_vertex3.y);
260
+ b2Log(" shape.m_hasVertex0 = bool(%d);\n", s->m_hasVertex0);
261
+ b2Log(" shape.m_hasVertex3 = bool(%d);\n", s->m_hasVertex3);
262
+ }
263
+ break;
264
+
265
+ case b2Shape::e_polygon:
266
+ {
267
+ b2PolygonShape* s = (b2PolygonShape*)m_shape;
268
+ b2Log(" b2PolygonShape shape;\n");
269
+ b2Log(" b2Vec2 vs[%d];\n", b2_maxPolygonVertices);
270
+ for (int32 i = 0; i < s->m_count; ++i)
271
+ {
272
+ b2Log(" vs[%d].Set(%.15lef, %.15lef);\n", i, s->m_vertices[i].x, s->m_vertices[i].y);
273
+ }
274
+ b2Log(" shape.Set(vs, %d);\n", s->m_count);
275
+ }
276
+ break;
277
+
278
+ case b2Shape::e_chain:
279
+ {
280
+ b2ChainShape* s = (b2ChainShape*)m_shape;
281
+ b2Log(" b2ChainShape shape;\n");
282
+ b2Log(" b2Vec2 vs[%d];\n", s->m_count);
283
+ for (int32 i = 0; i < s->m_count; ++i)
284
+ {
285
+ b2Log(" vs[%d].Set(%.15lef, %.15lef);\n", i, s->m_vertices[i].x, s->m_vertices[i].y);
286
+ }
287
+ b2Log(" shape.CreateChain(vs, %d);\n", s->m_count);
288
+ b2Log(" shape.m_prevVertex.Set(%.15lef, %.15lef);\n", s->m_prevVertex.x, s->m_prevVertex.y);
289
+ b2Log(" shape.m_nextVertex.Set(%.15lef, %.15lef);\n", s->m_nextVertex.x, s->m_nextVertex.y);
290
+ b2Log(" shape.m_hasPrevVertex = bool(%d);\n", s->m_hasPrevVertex);
291
+ b2Log(" shape.m_hasNextVertex = bool(%d);\n", s->m_hasNextVertex);
292
+ }
293
+ break;
294
+
295
+ default:
296
+ return;
297
+ }
298
+
299
+ b2Log("\n");
300
+ b2Log(" fd.shape = &shape;\n");
301
+ b2Log("\n");
302
+ b2Log(" bodies[%d]->CreateFixture(&fd);\n", bodyIndex);
303
+ }