pbox2d 0.6.0-java → 0.8.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/.mvn/extensions.xml +8 -0
  3. data/.mvn/wrapper/maven-wrapper.properties +1 -0
  4. data/.travis.yml +23 -0
  5. data/CHANGELOG.md +8 -0
  6. data/README.md +7 -7
  7. data/Rakefile +1 -2
  8. data/lib/box2d.jar +0 -0
  9. data/lib/pbox2d/version.rb +1 -1
  10. data/lib/pbox2d.rb +1 -0
  11. data/pbox2d.gemspec +6 -11
  12. data/pom.rb +59 -0
  13. data/pom.xml +82 -73
  14. data/src/org/jbox2d/JBox2D.gwt.xml +12 -0
  15. data/src/org/jbox2d/callbacks/ContactAdaptor.java +27 -0
  16. data/src/org/jbox2d/callbacks/ContactFilter.java +59 -0
  17. data/src/org/jbox2d/callbacks/ContactImpulse.java +42 -0
  18. data/src/org/jbox2d/callbacks/ContactListener.java +87 -0
  19. data/src/org/jbox2d/callbacks/DebugDraw.java +297 -0
  20. data/src/org/jbox2d/callbacks/DestructionListener.java +53 -0
  21. data/src/org/jbox2d/callbacks/PairCallback.java +29 -0
  22. data/src/org/jbox2d/callbacks/ParticleDestructionListener.java +20 -0
  23. data/src/org/jbox2d/callbacks/ParticleQueryCallback.java +19 -0
  24. data/src/org/jbox2d/callbacks/ParticleRaycastCallback.java +19 -0
  25. data/src/org/jbox2d/callbacks/QueryCallback.java +45 -0
  26. data/src/org/jbox2d/callbacks/RayCastCallback.java +55 -0
  27. data/src/org/jbox2d/callbacks/TreeCallback.java +42 -0
  28. data/src/org/jbox2d/callbacks/TreeRayCastCallback.java +44 -0
  29. data/src/org/jbox2d/collision/AABB.java +338 -0
  30. data/src/org/jbox2d/collision/Collision.java +1444 -0
  31. data/src/org/jbox2d/collision/ContactID.java +106 -0
  32. data/src/org/jbox2d/collision/Distance.java +773 -0
  33. data/src/org/jbox2d/collision/DistanceInput.java +41 -0
  34. data/src/org/jbox2d/collision/DistanceOutput.java +43 -0
  35. data/src/org/jbox2d/collision/Manifold.java +116 -0
  36. data/src/org/jbox2d/collision/ManifoldPoint.java +104 -0
  37. data/src/org/jbox2d/collision/RayCastInput.java +47 -0
  38. data/src/org/jbox2d/collision/RayCastOutput.java +46 -0
  39. data/src/org/jbox2d/collision/TimeOfImpact.java +526 -0
  40. data/src/org/jbox2d/collision/WorldManifold.java +200 -0
  41. data/src/org/jbox2d/collision/broadphase/BroadPhase.java +92 -0
  42. data/src/org/jbox2d/collision/broadphase/BroadPhaseStrategy.java +88 -0
  43. data/src/org/jbox2d/collision/broadphase/DefaultBroadPhaseBuffer.java +268 -0
  44. data/src/org/jbox2d/collision/broadphase/DynamicTree.java +883 -0
  45. data/src/org/jbox2d/collision/broadphase/DynamicTreeFlatNodes.java +873 -0
  46. data/src/org/jbox2d/collision/broadphase/DynamicTreeNode.java +54 -0
  47. data/src/org/jbox2d/collision/broadphase/Pair.java +46 -0
  48. data/src/org/jbox2d/collision/shapes/ChainShape.java +264 -0
  49. data/src/org/jbox2d/collision/shapes/CircleShape.java +207 -0
  50. data/src/org/jbox2d/collision/shapes/EdgeShape.java +254 -0
  51. data/src/org/jbox2d/collision/shapes/MassData.java +105 -0
  52. data/src/org/jbox2d/collision/shapes/PolygonShape.java +718 -0
  53. data/src/org/jbox2d/collision/shapes/Shape.java +136 -0
  54. data/src/org/jbox2d/collision/shapes/ShapeType.java +32 -0
  55. data/src/org/jbox2d/common/BufferUtils.java +209 -0
  56. data/src/org/jbox2d/common/Color3f.java +88 -0
  57. data/src/org/jbox2d/common/IViewportTransform.java +133 -0
  58. data/src/org/jbox2d/common/Mat22.java +609 -0
  59. data/src/org/jbox2d/common/Mat33.java +290 -0
  60. data/src/org/jbox2d/common/MathUtils.java +335 -0
  61. data/src/org/jbox2d/common/OBBViewportTransform.java +174 -0
  62. data/src/org/jbox2d/common/PlatformMathUtils.java +46 -0
  63. data/src/org/jbox2d/common/RaycastResult.java +37 -0
  64. data/src/org/jbox2d/common/Rot.java +150 -0
  65. data/src/org/jbox2d/common/Settings.java +246 -0
  66. data/src/org/jbox2d/common/Sweep.java +116 -0
  67. data/src/org/jbox2d/common/Timer.java +46 -0
  68. data/src/org/jbox2d/common/Transform.java +203 -0
  69. data/src/org/jbox2d/common/Vec2.java +388 -0
  70. data/src/org/jbox2d/common/Vec3.java +170 -0
  71. data/src/org/jbox2d/dynamics/Body.java +1246 -0
  72. data/src/org/jbox2d/dynamics/BodyDef.java +382 -0
  73. data/src/org/jbox2d/dynamics/BodyType.java +41 -0
  74. data/src/org/jbox2d/dynamics/ContactManager.java +293 -0
  75. data/src/org/jbox2d/dynamics/Filter.java +62 -0
  76. data/src/org/jbox2d/dynamics/Fixture.java +454 -0
  77. data/src/org/jbox2d/dynamics/FixtureDef.java +214 -0
  78. data/src/org/jbox2d/dynamics/FixtureProxy.java +38 -0
  79. data/src/org/jbox2d/dynamics/Island.java +602 -0
  80. data/src/org/jbox2d/dynamics/Profile.java +97 -0
  81. data/src/org/jbox2d/dynamics/SolverData.java +33 -0
  82. data/src/org/jbox2d/dynamics/TimeStep.java +46 -0
  83. data/src/org/jbox2d/dynamics/World.java +2075 -0
  84. data/src/org/jbox2d/dynamics/contacts/ChainAndCircleContact.java +57 -0
  85. data/src/org/jbox2d/dynamics/contacts/ChainAndPolygonContact.java +57 -0
  86. data/src/org/jbox2d/dynamics/contacts/CircleContact.java +50 -0
  87. data/src/org/jbox2d/dynamics/contacts/Contact.java +365 -0
  88. data/src/org/jbox2d/dynamics/contacts/ContactCreator.java +35 -0
  89. data/src/org/jbox2d/dynamics/contacts/ContactEdge.java +56 -0
  90. data/src/org/jbox2d/dynamics/contacts/ContactPositionConstraint.java +49 -0
  91. data/src/org/jbox2d/dynamics/contacts/ContactRegister.java +31 -0
  92. data/src/org/jbox2d/dynamics/contacts/ContactSolver.java +1104 -0
  93. data/src/org/jbox2d/dynamics/contacts/ContactVelocityConstraint.java +60 -0
  94. data/src/org/jbox2d/dynamics/contacts/EdgeAndCircleContact.java +52 -0
  95. data/src/org/jbox2d/dynamics/contacts/EdgeAndPolygonContact.java +52 -0
  96. data/src/org/jbox2d/dynamics/contacts/PolygonAndCircleContact.java +51 -0
  97. data/src/org/jbox2d/dynamics/contacts/PolygonContact.java +50 -0
  98. data/src/org/jbox2d/dynamics/contacts/Position.java +31 -0
  99. data/src/org/jbox2d/dynamics/contacts/Velocity.java +31 -0
  100. data/src/org/jbox2d/dynamics/joints/ConstantVolumeJoint.java +258 -0
  101. data/src/org/jbox2d/dynamics/joints/ConstantVolumeJointDef.java +75 -0
  102. data/src/org/jbox2d/dynamics/joints/DistanceJoint.java +356 -0
  103. data/src/org/jbox2d/dynamics/joints/DistanceJointDef.java +106 -0
  104. data/src/org/jbox2d/dynamics/joints/FrictionJoint.java +294 -0
  105. data/src/org/jbox2d/dynamics/joints/FrictionJointDef.java +78 -0
  106. data/src/org/jbox2d/dynamics/joints/GearJoint.java +520 -0
  107. data/src/org/jbox2d/dynamics/joints/GearJointDef.java +58 -0
  108. data/src/org/jbox2d/dynamics/joints/Jacobian.java +32 -0
  109. data/src/org/jbox2d/dynamics/joints/Joint.java +235 -0
  110. data/src/org/jbox2d/dynamics/joints/JointDef.java +65 -0
  111. data/src/org/jbox2d/dynamics/joints/JointEdge.java +57 -0
  112. data/src/org/jbox2d/dynamics/joints/JointType.java +28 -0
  113. data/src/org/jbox2d/dynamics/joints/LimitState.java +28 -0
  114. data/src/org/jbox2d/dynamics/joints/MotorJoint.java +339 -0
  115. data/src/org/jbox2d/dynamics/joints/MotorJointDef.java +55 -0
  116. data/src/org/jbox2d/dynamics/joints/MouseJoint.java +262 -0
  117. data/src/org/jbox2d/dynamics/joints/MouseJointDef.java +62 -0
  118. data/src/org/jbox2d/dynamics/joints/PrismaticJoint.java +808 -0
  119. data/src/org/jbox2d/dynamics/joints/PrismaticJointDef.java +120 -0
  120. data/src/org/jbox2d/dynamics/joints/PulleyJoint.java +393 -0
  121. data/src/org/jbox2d/dynamics/joints/PulleyJointDef.java +105 -0
  122. data/src/org/jbox2d/dynamics/joints/RevoluteJoint.java +554 -0
  123. data/src/org/jbox2d/dynamics/joints/RevoluteJointDef.java +137 -0
  124. data/src/org/jbox2d/dynamics/joints/RopeJoint.java +276 -0
  125. data/src/org/jbox2d/dynamics/joints/RopeJointDef.java +34 -0
  126. data/src/org/jbox2d/dynamics/joints/WeldJoint.java +424 -0
  127. data/src/org/jbox2d/dynamics/joints/WeldJointDef.java +85 -0
  128. data/src/org/jbox2d/dynamics/joints/WheelJoint.java +498 -0
  129. data/src/org/jbox2d/dynamics/joints/WheelJointDef.java +98 -0
  130. data/src/org/jbox2d/particle/ParticleBodyContact.java +17 -0
  131. data/src/org/jbox2d/particle/ParticleColor.java +52 -0
  132. data/src/org/jbox2d/particle/ParticleContact.java +14 -0
  133. data/src/org/jbox2d/particle/ParticleDef.java +24 -0
  134. data/src/org/jbox2d/particle/ParticleGroup.java +154 -0
  135. data/src/org/jbox2d/particle/ParticleGroupDef.java +62 -0
  136. data/src/org/jbox2d/particle/ParticleGroupType.java +8 -0
  137. data/src/org/jbox2d/particle/ParticleSystem.java +2172 -0
  138. data/src/org/jbox2d/particle/ParticleType.java +28 -0
  139. data/src/org/jbox2d/particle/StackQueue.java +44 -0
  140. data/src/org/jbox2d/particle/VoronoiDiagram.java +209 -0
  141. data/src/org/jbox2d/pooling/IDynamicStack.java +47 -0
  142. data/src/org/jbox2d/pooling/IOrderedStack.java +57 -0
  143. data/src/org/jbox2d/pooling/IWorldPool.java +101 -0
  144. data/src/org/jbox2d/pooling/arrays/FloatArray.java +50 -0
  145. data/src/org/jbox2d/pooling/arrays/GeneratorArray.java +33 -0
  146. data/src/org/jbox2d/pooling/arrays/IntArray.java +53 -0
  147. data/src/org/jbox2d/pooling/arrays/Vec2Array.java +57 -0
  148. data/src/org/jbox2d/pooling/normal/CircleStack.java +77 -0
  149. data/src/org/jbox2d/pooling/normal/DefaultWorldPool.java +331 -0
  150. data/src/org/jbox2d/pooling/normal/MutableStack.java +72 -0
  151. data/src/org/jbox2d/pooling/normal/OrderedStack.java +73 -0
  152. data/src/org/jbox2d/pooling/stacks/DynamicIntStack.java +60 -0
  153. metadata +161 -14
  154. data/lib/jbox2d-library-2.3.1-SNAPSHOT.jar +0 -0
@@ -0,0 +1,382 @@
1
+ /*******************************************************************************
2
+ * Copyright (c) 2013, Daniel Murphy
3
+ * All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without modification,
6
+ * are permitted provided that the following conditions are met:
7
+ * * Redistributions of source code must retain the above copyright notice,
8
+ * this list of conditions and the following disclaimer.
9
+ * * Redistributions in binary form must reproduce the above copyright notice,
10
+ * this list of conditions and the following disclaimer in the documentation
11
+ * and/or other materials provided with the distribution.
12
+ *
13
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
14
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
17
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
19
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
20
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
21
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
22
+ * POSSIBILITY OF SUCH DAMAGE.
23
+ ******************************************************************************/
24
+ package org.jbox2d.dynamics;
25
+
26
+ import org.jbox2d.common.Vec2;
27
+
28
+ /**
29
+ * A body definition holds all the data needed to construct a rigid body. You can safely re-use body
30
+ * definitions. Shapes are added to a body after construction.
31
+ *
32
+ * @author daniel
33
+ */
34
+ public class BodyDef {
35
+
36
+ /**
37
+ * The body type: static, kinematic, or dynamic. Note: if a dynamic body would have zero mass, the
38
+ * mass is set to one.
39
+ */
40
+ public BodyType type;
41
+
42
+ /**
43
+ * Use this to store application specific body data.
44
+ */
45
+ public Object userData;
46
+
47
+ /**
48
+ * The world position of the body. Avoid creating bodies at the origin since this can lead to many
49
+ * overlapping shapes.
50
+ */
51
+ public Vec2 position;
52
+
53
+ /**
54
+ * The world angle of the body in radians.
55
+ */
56
+ public float angle;
57
+
58
+ /**
59
+ * The linear velocity of the body in world co-ordinates.
60
+ */
61
+ public Vec2 linearVelocity;
62
+
63
+ /**
64
+ * The angular velocity of the body.
65
+ */
66
+ public float angularVelocity;
67
+
68
+ /**
69
+ * Linear damping is use to reduce the linear velocity. The damping parameter can be larger than
70
+ * 1.0f but the damping effect becomes sensitive to the time step when the damping parameter is
71
+ * large.
72
+ */
73
+ public float linearDamping;
74
+
75
+ /**
76
+ * Angular damping is use to reduce the angular velocity. The damping parameter can be larger than
77
+ * 1.0f but the damping effect becomes sensitive to the time step when the damping parameter is
78
+ * large.
79
+ */
80
+ public float angularDamping;
81
+
82
+ /**
83
+ * Set this flag to false if this body should never fall asleep. Note that this increases CPU
84
+ * usage.
85
+ */
86
+ public boolean allowSleep;
87
+
88
+ /**
89
+ * Is this body initially sleeping?
90
+ */
91
+ public boolean awake;
92
+
93
+ /**
94
+ * Should this body be prevented from rotating? Useful for characters.
95
+ */
96
+ public boolean fixedRotation;
97
+
98
+ /**
99
+ * Is this a fast moving body that should be prevented from tunneling through other moving bodies?
100
+ * Note that all bodies are prevented from tunneling through kinematic and static bodies. This
101
+ * setting is only considered on dynamic bodies.
102
+ *
103
+ * @warning You should use this flag sparingly since it increases processing time.
104
+ */
105
+ public boolean bullet;
106
+
107
+ /**
108
+ * Does this body start out active?
109
+ */
110
+ public boolean active;
111
+
112
+ /**
113
+ * Experimental: scales the inertia tensor.
114
+ */
115
+ public float gravityScale;
116
+
117
+ /**
118
+ *
119
+ */
120
+ public BodyDef() {
121
+ userData = null;
122
+ position = new Vec2();
123
+ angle = 0f;
124
+ linearVelocity = new Vec2();
125
+ angularVelocity = 0f;
126
+ linearDamping = 0f;
127
+ angularDamping = 0f;
128
+ allowSleep = true;
129
+ awake = true;
130
+ fixedRotation = false;
131
+ bullet = false;
132
+ type = BodyType.STATIC;
133
+ active = true;
134
+ gravityScale = 1.0f;
135
+ }
136
+
137
+ /**
138
+ * The body type: static, kinematic, or dynamic. Note: if a dynamic body would have zero mass, the
139
+ * mass is set to one.
140
+ * @return
141
+ */
142
+ public BodyType getType() {
143
+ return type;
144
+ }
145
+
146
+ /**
147
+ * The body type: static, kinematic, or dynamic. Note: if a dynamic body would have zero mass, the
148
+ * mass is set to one.
149
+ * @param type
150
+ */
151
+ public void setType(BodyType type) {
152
+ this.type = type;
153
+ }
154
+
155
+ /**
156
+ * Use this to store application specific body data.
157
+ * @return
158
+ */
159
+ public Object getUserData() {
160
+ return userData;
161
+ }
162
+
163
+ /**
164
+ * Use this to store application specific body data.
165
+ * @param userData
166
+ */
167
+ public void setUserData(Object userData) {
168
+ this.userData = userData;
169
+ }
170
+
171
+ /**
172
+ * The world position of the body. Avoid creating bodies at the origin since this can lead to many
173
+ * overlapping shapes.
174
+ * @return
175
+ */
176
+ public Vec2 getPosition() {
177
+ return position;
178
+ }
179
+
180
+ /**
181
+ * The world position of the body. Avoid creating bodies at the origin since this can lead to many
182
+ * overlapping shapes.
183
+ * @param position
184
+ */
185
+ public void setPosition(Vec2 position) {
186
+ this.position = position;
187
+ }
188
+
189
+ /**
190
+ * The world angle of the body in radians.
191
+ * @return
192
+ */
193
+ public float getAngle() {
194
+ return angle;
195
+ }
196
+
197
+ /**
198
+ * The world angle of the body in radians.
199
+ * @param angle
200
+ */
201
+ public void setAngle(float angle) {
202
+ this.angle = angle;
203
+ }
204
+
205
+ /**
206
+ * The linear velocity of the body in world co-ordinates.
207
+ * @return
208
+ */
209
+ public Vec2 getLinearVelocity() {
210
+ return linearVelocity;
211
+ }
212
+
213
+ /**
214
+ * The linear velocity of the body in world co-ordinates.
215
+ * @param linearVelocity
216
+ */
217
+ public void setLinearVelocity(Vec2 linearVelocity) {
218
+ this.linearVelocity = linearVelocity;
219
+ }
220
+
221
+ /**
222
+ * The angular velocity of the body.
223
+ * @return
224
+ */
225
+ public float getAngularVelocity() {
226
+ return angularVelocity;
227
+ }
228
+
229
+ /**
230
+ * The angular velocity of the body.
231
+ * @param angularVelocity
232
+ */
233
+ public void setAngularVelocity(float angularVelocity) {
234
+ this.angularVelocity = angularVelocity;
235
+ }
236
+
237
+ /**
238
+ * Linear damping is use to reduce the linear velocity. The damping parameter can be larger than
239
+ * 1.0f but the damping effect becomes sensitive to the time step when the damping parameter is
240
+ * large.
241
+ * @return
242
+ */
243
+ public float getLinearDamping() {
244
+ return linearDamping;
245
+ }
246
+
247
+ /**
248
+ * Linear damping is use to reduce the linear velocity. The damping parameter can be larger than
249
+ * 1.0f but the damping effect becomes sensitive to the time step when the damping parameter is
250
+ * large.
251
+ * @param linearDamping
252
+ */
253
+ public void setLinearDamping(float linearDamping) {
254
+ this.linearDamping = linearDamping;
255
+ }
256
+
257
+ /**
258
+ * Angular damping is use to reduce the angular velocity. The damping parameter can be larger than
259
+ * 1.0f but the damping effect becomes sensitive to the time step when the damping parameter is
260
+ * large.
261
+ * @return
262
+ */
263
+ public float getAngularDamping() {
264
+ return angularDamping;
265
+ }
266
+
267
+ /**
268
+ * Angular damping is use to reduce the angular velocity. The damping parameter can be larger than
269
+ * 1.0f but the damping effect becomes sensitive to the time step when the damping parameter is
270
+ * large.
271
+ * @param angularDamping
272
+ */
273
+ public void setAngularDamping(float angularDamping) {
274
+ this.angularDamping = angularDamping;
275
+ }
276
+
277
+ /**
278
+ * Set this flag to false if this body should never fall asleep. Note that this increases CPU
279
+ * usage.
280
+ * @return
281
+ */
282
+ public boolean isAllowSleep() {
283
+ return allowSleep;
284
+ }
285
+
286
+ /**
287
+ * Set this flag to false if this body should never fall asleep. Note that this increases CPU
288
+ * usage.
289
+ * @param allowSleep
290
+ */
291
+ public void setAllowSleep(boolean allowSleep) {
292
+ this.allowSleep = allowSleep;
293
+ }
294
+
295
+ /**
296
+ * Is this body initially sleeping?
297
+ * @return
298
+ */
299
+ public boolean isAwake() {
300
+ return awake;
301
+ }
302
+
303
+ /**
304
+ * Is this body initially sleeping?
305
+ * @param awake
306
+ */
307
+ public void setAwake(boolean awake) {
308
+ this.awake = awake;
309
+ }
310
+
311
+ /**
312
+ * Should this body be prevented from rotating? Useful for characters.
313
+ * @return
314
+ */
315
+ public boolean isFixedRotation() {
316
+ return fixedRotation;
317
+ }
318
+
319
+ /**
320
+ * Should this body be prevented from rotating? Useful for characters.
321
+ * @param fixedRotation
322
+ */
323
+ public void setFixedRotation(boolean fixedRotation) {
324
+ this.fixedRotation = fixedRotation;
325
+ }
326
+
327
+ /**
328
+ * Is this a fast moving body that should be prevented from tunneling through other moving bodies?
329
+ * Note that all bodies are prevented from tunneling through kinematic and static bodies. This
330
+ * setting is only considered on dynamic bodies.
331
+ *
332
+ * @return
333
+ * @warning You should use this flag sparingly since it increases processing time.
334
+ */
335
+ public boolean isBullet() {
336
+ return bullet;
337
+ }
338
+
339
+ /**
340
+ * Is this a fast moving body that should be prevented from tunneling through other moving bodies?
341
+ * Note that all bodies are prevented from tunneling through kinematic and static bodies. This
342
+ * setting is only considered on dynamic bodies.
343
+ *
344
+ * @param bullet
345
+ * @warning You should use this flag sparingly since it increases processing time.
346
+ */
347
+ public void setBullet(boolean bullet) {
348
+ this.bullet = bullet;
349
+ }
350
+
351
+ /**
352
+ * Does this body start out active?
353
+ * @return
354
+ */
355
+ public boolean isActive() {
356
+ return active;
357
+ }
358
+
359
+ /**
360
+ * Does this body start out active?
361
+ * @param active
362
+ */
363
+ public void setActive(boolean active) {
364
+ this.active = active;
365
+ }
366
+
367
+ /**
368
+ * Experimental: scales the inertia tensor.
369
+ * @return
370
+ */
371
+ public float getGravityScale() {
372
+ return gravityScale;
373
+ }
374
+
375
+ /**
376
+ * Experimental: scales the inertia tensor.
377
+ * @param gravityScale
378
+ */
379
+ public void setGravityScale(float gravityScale) {
380
+ this.gravityScale = gravityScale;
381
+ }
382
+ }
@@ -0,0 +1,41 @@
1
+ /*******************************************************************************
2
+ * Copyright (c) 2013, Daniel Murphy
3
+ * All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without modification,
6
+ * are permitted provided that the following conditions are met:
7
+ * * Redistributions of source code must retain the above copyright notice,
8
+ * this list of conditions and the following disclaimer.
9
+ * * Redistributions in binary form must reproduce the above copyright notice,
10
+ * this list of conditions and the following disclaimer in the documentation
11
+ * and/or other materials provided with the distribution.
12
+ *
13
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
14
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
17
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
19
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
20
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
21
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
22
+ * POSSIBILITY OF SUCH DAMAGE.
23
+ ******************************************************************************/
24
+ /**
25
+ * Created at 3:59:59 AM Jul 7, 2010
26
+ */
27
+ package org.jbox2d.dynamics;
28
+
29
+ // updated to rev 100
30
+
31
+ /**
32
+ * The body type.
33
+ * static: zero mass, zero velocity, may be manually moved
34
+ * kinematic: zero mass, non-zero velocity set by user, moved by solver
35
+ * dynamic: positive mass, non-zero velocity determined by forces, moved by solver
36
+ *
37
+ * @author daniel
38
+ */
39
+ public enum BodyType {
40
+ STATIC, KINEMATIC, DYNAMIC
41
+ }
@@ -0,0 +1,293 @@
1
+ /*******************************************************************************
2
+ * Copyright (c) 2013, Daniel Murphy
3
+ * All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without modification,
6
+ * are permitted provided that the following conditions are met:
7
+ * * Redistributions of source code must retain the above copyright notice,
8
+ * this list of conditions and the following disclaimer.
9
+ * * Redistributions in binary form must reproduce the above copyright notice,
10
+ * this list of conditions and the following disclaimer in the documentation
11
+ * and/or other materials provided with the distribution.
12
+ *
13
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
14
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
17
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
19
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
20
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
21
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
22
+ * POSSIBILITY OF SUCH DAMAGE.
23
+ ******************************************************************************/
24
+ package org.jbox2d.dynamics;
25
+
26
+ import org.jbox2d.callbacks.ContactFilter;
27
+ import org.jbox2d.callbacks.ContactListener;
28
+ import org.jbox2d.callbacks.PairCallback;
29
+ import org.jbox2d.collision.broadphase.BroadPhase;
30
+ import org.jbox2d.dynamics.contacts.Contact;
31
+ import org.jbox2d.dynamics.contacts.ContactEdge;
32
+
33
+ /**
34
+ * Delegate of World.
35
+ *
36
+ * @author Daniel Murphy
37
+ */
38
+ public class ContactManager implements PairCallback {
39
+
40
+ public BroadPhase m_broadPhase;
41
+ public Contact m_contactList;
42
+ public int m_contactCount;
43
+ public ContactFilter m_contactFilter;
44
+ public ContactListener m_contactListener;
45
+
46
+ private final World pool;
47
+
48
+ public ContactManager(World argPool, BroadPhase broadPhase) {
49
+ m_contactList = null;
50
+ m_contactCount = 0;
51
+ m_contactFilter = new ContactFilter();
52
+ m_contactListener = null;
53
+ m_broadPhase = broadPhase;
54
+ pool = argPool;
55
+ }
56
+
57
+ /**
58
+ * Broad-phase callback.
59
+ *
60
+ * @param proxyUserDataA
61
+ * @param proxyUserDataB
62
+ */
63
+ @Override
64
+ public void addPair(Object proxyUserDataA, Object proxyUserDataB) {
65
+ FixtureProxy proxyA = (FixtureProxy) proxyUserDataA;
66
+ FixtureProxy proxyB = (FixtureProxy) proxyUserDataB;
67
+
68
+ Fixture fixtureA = proxyA.fixture;
69
+ Fixture fixtureB = proxyB.fixture;
70
+
71
+ int indexA = proxyA.childIndex;
72
+ int indexB = proxyB.childIndex;
73
+
74
+ Body bodyA = fixtureA.getBody();
75
+ Body bodyB = fixtureB.getBody();
76
+
77
+ // Are the fixtures on the same body?
78
+ if (bodyA == bodyB) {
79
+ return;
80
+ }
81
+
82
+ // TODO_ERIN use a hash table to remove a potential bottleneck when both
83
+ // bodies have a lot of contacts.
84
+ // Does a contact already exist?
85
+ ContactEdge edge = bodyB.getContactList();
86
+ while (edge != null) {
87
+ if (edge.other == bodyA) {
88
+ Fixture fA = edge.contact.getFixtureA();
89
+ Fixture fB = edge.contact.getFixtureB();
90
+ int iA = edge.contact.getChildIndexA();
91
+ int iB = edge.contact.getChildIndexB();
92
+
93
+ if (fA == fixtureA && iA == indexA && fB == fixtureB && iB == indexB) {
94
+ // A contact already exists.
95
+ return;
96
+ }
97
+
98
+ if (fA == fixtureB && iA == indexB && fB == fixtureA && iB == indexA) {
99
+ // A contact already exists.
100
+ return;
101
+ }
102
+ }
103
+
104
+ edge = edge.next;
105
+ }
106
+
107
+ // Does a joint override collision? is at least one body dynamic?
108
+ if (bodyB.shouldCollide(bodyA) == false) {
109
+ return;
110
+ }
111
+
112
+ // Check user filtering.
113
+ if (m_contactFilter != null && m_contactFilter.shouldCollide(fixtureA, fixtureB) == false) {
114
+ return;
115
+ }
116
+
117
+ // Call the factory.
118
+ Contact c = pool.popContact(fixtureA, indexA, fixtureB, indexB);
119
+ if (c == null) {
120
+ return;
121
+ }
122
+
123
+ // Contact creation may swap fixtures.
124
+ fixtureA = c.getFixtureA();
125
+ fixtureB = c.getFixtureB();
126
+ indexA = c.getChildIndexA();
127
+ indexB = c.getChildIndexB();
128
+ bodyA = fixtureA.getBody();
129
+ bodyB = fixtureB.getBody();
130
+
131
+ // Insert into the world.
132
+ c.m_prev = null;
133
+ c.m_next = m_contactList;
134
+ if (m_contactList != null) {
135
+ m_contactList.m_prev = c;
136
+ }
137
+ m_contactList = c;
138
+
139
+ // Connect to island graph.
140
+
141
+ // Connect to body A
142
+ c.m_nodeA.contact = c;
143
+ c.m_nodeA.other = bodyB;
144
+
145
+ c.m_nodeA.prev = null;
146
+ c.m_nodeA.next = bodyA.m_contactList;
147
+ if (bodyA.m_contactList != null) {
148
+ bodyA.m_contactList.prev = c.m_nodeA;
149
+ }
150
+ bodyA.m_contactList = c.m_nodeA;
151
+
152
+ // Connect to body B
153
+ c.m_nodeB.contact = c;
154
+ c.m_nodeB.other = bodyA;
155
+
156
+ c.m_nodeB.prev = null;
157
+ c.m_nodeB.next = bodyB.m_contactList;
158
+ if (bodyB.m_contactList != null) {
159
+ bodyB.m_contactList.prev = c.m_nodeB;
160
+ }
161
+ bodyB.m_contactList = c.m_nodeB;
162
+
163
+ // wake up the bodies
164
+ if (!fixtureA.isSensor() && !fixtureB.isSensor()) {
165
+ bodyA.setAwake(true);
166
+ bodyB.setAwake(true);
167
+ }
168
+
169
+ ++m_contactCount;
170
+ }
171
+
172
+ public void findNewContacts() {
173
+ m_broadPhase.updatePairs(this);
174
+ }
175
+
176
+ public void destroy(Contact c) {
177
+ Fixture fixtureA = c.getFixtureA();
178
+ Fixture fixtureB = c.getFixtureB();
179
+ Body bodyA = fixtureA.getBody();
180
+ Body bodyB = fixtureB.getBody();
181
+
182
+ if (m_contactListener != null && c.isTouching()) {
183
+ m_contactListener.endContact(c);
184
+ }
185
+
186
+ // Remove from the world.
187
+ if (c.m_prev != null) {
188
+ c.m_prev.m_next = c.m_next;
189
+ }
190
+
191
+ if (c.m_next != null) {
192
+ c.m_next.m_prev = c.m_prev;
193
+ }
194
+
195
+ if (c == m_contactList) {
196
+ m_contactList = c.m_next;
197
+ }
198
+
199
+ // Remove from body 1
200
+ if (c.m_nodeA.prev != null) {
201
+ c.m_nodeA.prev.next = c.m_nodeA.next;
202
+ }
203
+
204
+ if (c.m_nodeA.next != null) {
205
+ c.m_nodeA.next.prev = c.m_nodeA.prev;
206
+ }
207
+
208
+ if (c.m_nodeA == bodyA.m_contactList) {
209
+ bodyA.m_contactList = c.m_nodeA.next;
210
+ }
211
+
212
+ // Remove from body 2
213
+ if (c.m_nodeB.prev != null) {
214
+ c.m_nodeB.prev.next = c.m_nodeB.next;
215
+ }
216
+
217
+ if (c.m_nodeB.next != null) {
218
+ c.m_nodeB.next.prev = c.m_nodeB.prev;
219
+ }
220
+
221
+ if (c.m_nodeB == bodyB.m_contactList) {
222
+ bodyB.m_contactList = c.m_nodeB.next;
223
+ }
224
+
225
+ // Call the factory.
226
+ pool.pushContact(c);
227
+ --m_contactCount;
228
+ }
229
+
230
+ /**
231
+ * This is the top level collision call for the time step. Here all the narrow phase collision is
232
+ * processed for the world contact list.
233
+ */
234
+ public void collide() {
235
+ // Update awake contacts.
236
+ Contact c = m_contactList;
237
+ while (c != null) {
238
+ Fixture fixtureA = c.getFixtureA();
239
+ Fixture fixtureB = c.getFixtureB();
240
+ int indexA = c.getChildIndexA();
241
+ int indexB = c.getChildIndexB();
242
+ Body bodyA = fixtureA.getBody();
243
+ Body bodyB = fixtureB.getBody();
244
+
245
+ // is this contact flagged for filtering?
246
+ if ((c.m_flags & Contact.FILTER_FLAG) == Contact.FILTER_FLAG) {
247
+ // Should these bodies collide?
248
+ if (bodyB.shouldCollide(bodyA) == false) {
249
+ Contact cNuke = c;
250
+ c = cNuke.getNext();
251
+ destroy(cNuke);
252
+ continue;
253
+ }
254
+
255
+ // Check user filtering.
256
+ if (m_contactFilter != null && m_contactFilter.shouldCollide(fixtureA, fixtureB) == false) {
257
+ Contact cNuke = c;
258
+ c = cNuke.getNext();
259
+ destroy(cNuke);
260
+ continue;
261
+ }
262
+
263
+ // Clear the filtering flag.
264
+ c.m_flags &= ~Contact.FILTER_FLAG;
265
+ }
266
+
267
+ boolean activeA = bodyA.isAwake() && bodyA.m_type != BodyType.STATIC;
268
+ boolean activeB = bodyB.isAwake() && bodyB.m_type != BodyType.STATIC;
269
+
270
+ // At least one body must be awake and it must be dynamic or kinematic.
271
+ if (activeA == false && activeB == false) {
272
+ c = c.getNext();
273
+ continue;
274
+ }
275
+
276
+ int proxyIdA = fixtureA.m_proxies[indexA].proxyId;
277
+ int proxyIdB = fixtureB.m_proxies[indexB].proxyId;
278
+ boolean overlap = m_broadPhase.testOverlap(proxyIdA, proxyIdB);
279
+
280
+ // Here we destroy contacts that cease to overlap in the broad-phase.
281
+ if (overlap == false) {
282
+ Contact cNuke = c;
283
+ c = cNuke.getNext();
284
+ destroy(cNuke);
285
+ continue;
286
+ }
287
+
288
+ // The contact persists.
289
+ c.update(m_contactListener);
290
+ c = c.getNext();
291
+ }
292
+ }
293
+ }