pbox2d 0.6.0-java → 0.8.0-java

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 (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,200 @@
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.collision;
25
+
26
+ import org.jbox2d.common.MathUtils;
27
+ import org.jbox2d.common.Rot;
28
+ import org.jbox2d.common.Settings;
29
+ import org.jbox2d.common.Transform;
30
+ import org.jbox2d.common.Vec2;
31
+
32
+ /**
33
+ * This is used to compute the current state of a contact manifold.
34
+ *
35
+ * @author daniel
36
+ */
37
+ public class WorldManifold {
38
+ /**
39
+ * World vector pointing from A to B
40
+ */
41
+ public final Vec2 normal;
42
+
43
+ /**
44
+ * World contact point (point of intersection)
45
+ */
46
+ public final Vec2[] points;
47
+
48
+ /**
49
+ * A negative value indicates overlap, in meters.
50
+ */
51
+ public final float[] separations;
52
+
53
+ public WorldManifold() {
54
+ normal = new Vec2();
55
+ points = new Vec2[Settings.maxManifoldPoints];
56
+ separations = new float[Settings.maxManifoldPoints];
57
+ for (int i = 0; i < Settings.maxManifoldPoints; i++) {
58
+ points[i] = new Vec2();
59
+ }
60
+ }
61
+
62
+ private final Vec2 pool3 = new Vec2();
63
+ private final Vec2 pool4 = new Vec2();
64
+
65
+ public final void initialize(final Manifold manifold, final Transform xfA, float radiusA,
66
+ final Transform xfB, float radiusB) {
67
+ if (manifold.pointCount == 0) {
68
+ return;
69
+ }
70
+
71
+ switch (manifold.type) {
72
+ case CIRCLES: {
73
+ final Vec2 pointA = pool3;
74
+ final Vec2 pointB = pool4;
75
+
76
+ normal.x = 1;
77
+ normal.y = 0;
78
+ Vec2 v = manifold.localPoint;
79
+ // Transform.mulToOutUnsafe(xfA, manifold.localPoint, pointA);
80
+ // Transform.mulToOutUnsafe(xfB, manifold.points[0].localPoint, pointB);
81
+ pointA.x = (xfA.q.c * v.x - xfA.q.s * v.y) + xfA.p.x;
82
+ pointA.y = (xfA.q.s * v.x + xfA.q.c * v.y) + xfA.p.y;
83
+ Vec2 mp0p = manifold.points[0].localPoint;
84
+ pointB.x = (xfB.q.c * mp0p.x - xfB.q.s * mp0p.y) + xfB.p.x;
85
+ pointB.y = (xfB.q.s * mp0p.x + xfB.q.c * mp0p.y) + xfB.p.y;
86
+
87
+ if (MathUtils.distanceSquared(pointA, pointB) > Settings.EPSILON * Settings.EPSILON) {
88
+ normal.x = pointB.x - pointA.x;
89
+ normal.y = pointB.y - pointA.y;
90
+ normal.normalize();
91
+ }
92
+
93
+ final float cAx = normal.x * radiusA + pointA.x;
94
+ final float cAy = normal.y * radiusA + pointA.y;
95
+
96
+ final float cBx = -normal.x * radiusB + pointB.x;
97
+ final float cBy = -normal.y * radiusB + pointB.y;
98
+
99
+ points[0].x = (cAx + cBx) * .5f;
100
+ points[0].y = (cAy + cBy) * .5f;
101
+ separations[0] = (cBx - cAx) * normal.x + (cBy - cAy) * normal.y;
102
+ }
103
+ break;
104
+ case FACE_A: {
105
+ final Vec2 planePoint = pool3;
106
+
107
+ Rot.mulToOutUnsafe(xfA.q, manifold.localNormal, normal);
108
+ Transform.mulToOut(xfA, manifold.localPoint, planePoint);
109
+
110
+ final Vec2 clipPoint = pool4;
111
+
112
+ for (int i = 0; i < manifold.pointCount; i++) {
113
+ // b2Vec2 clipPoint = b2Mul(xfB, manifold->points[i].localPoint);
114
+ // b2Vec2 cA = clipPoint + (radiusA - b2Dot(clipPoint - planePoint,
115
+ // normal)) * normal;
116
+ // b2Vec2 cB = clipPoint - radiusB * normal;
117
+ // points[i] = 0.5f * (cA + cB);
118
+ Transform.mulToOut(xfB, manifold.points[i].localPoint, clipPoint);
119
+ // use cA as temporary for now
120
+ // cA.set(clipPoint).subLocal(planePoint);
121
+ // float scalar = radiusA - Vec2.dot(cA, normal);
122
+ // cA.set(normal).mulLocal(scalar).addLocal(clipPoint);
123
+ // cB.set(normal).mulLocal(radiusB).subLocal(clipPoint).negateLocal();
124
+ // points[i].set(cA).addLocal(cB).mulLocal(0.5f);
125
+
126
+ final float scalar =
127
+ radiusA
128
+ - ((clipPoint.x - planePoint.x) * normal.x + (clipPoint.y - planePoint.y)
129
+ * normal.y);
130
+
131
+ final float cAx = normal.x * scalar + clipPoint.x;
132
+ final float cAy = normal.y * scalar + clipPoint.y;
133
+
134
+ final float cBx = -normal.x * radiusB + clipPoint.x;
135
+ final float cBy = -normal.y * radiusB + clipPoint.y;
136
+
137
+ points[i].x = (cAx + cBx) * .5f;
138
+ points[i].y = (cAy + cBy) * .5f;
139
+ separations[i] = (cBx - cAx) * normal.x + (cBy - cAy) * normal.y;
140
+ }
141
+ }
142
+ break;
143
+ case FACE_B:
144
+ final Vec2 planePoint = pool3;
145
+ Rot.mulToOutUnsafe(xfB.q, manifold.localNormal, normal);
146
+ Transform.mulToOut(xfB, manifold.localPoint, planePoint);
147
+
148
+ // final Mat22 R = xfB.q;
149
+ // normal.x = R.ex.x * manifold.localNormal.x + R.ey.x * manifold.localNormal.y;
150
+ // normal.y = R.ex.y * manifold.localNormal.x + R.ey.y * manifold.localNormal.y;
151
+ // final Vec2 v = manifold.localPoint;
152
+ // planePoint.x = xfB.p.x + xfB.q.ex.x * v.x + xfB.q.ey.x * v.y;
153
+ // planePoint.y = xfB.p.y + xfB.q.ex.y * v.x + xfB.q.ey.y * v.y;
154
+
155
+ final Vec2 clipPoint = pool4;
156
+
157
+ for (int i = 0; i < manifold.pointCount; i++) {
158
+ // b2Vec2 clipPoint = b2Mul(xfA, manifold->points[i].localPoint);
159
+ // b2Vec2 cB = clipPoint + (radiusB - b2Dot(clipPoint - planePoint,
160
+ // normal)) * normal;
161
+ // b2Vec2 cA = clipPoint - radiusA * normal;
162
+ // points[i] = 0.5f * (cA + cB);
163
+
164
+ Transform.mulToOut(xfA, manifold.points[i].localPoint, clipPoint);
165
+ // cB.set(clipPoint).subLocal(planePoint);
166
+ // float scalar = radiusB - Vec2.dot(cB, normal);
167
+ // cB.set(normal).mulLocal(scalar).addLocal(clipPoint);
168
+ // cA.set(normal).mulLocal(radiusA).subLocal(clipPoint).negateLocal();
169
+ // points[i].set(cA).addLocal(cB).mulLocal(0.5f);
170
+
171
+ // points[i] = 0.5f * (cA + cB);
172
+
173
+ //
174
+ // clipPoint.x = xfA.p.x + xfA.q.ex.x * manifold.points[i].localPoint.x + xfA.q.ey.x *
175
+ // manifold.points[i].localPoint.y;
176
+ // clipPoint.y = xfA.p.y + xfA.q.ex.y * manifold.points[i].localPoint.x + xfA.q.ey.y *
177
+ // manifold.points[i].localPoint.y;
178
+
179
+ final float scalar =
180
+ radiusB
181
+ - ((clipPoint.x - planePoint.x) * normal.x + (clipPoint.y - planePoint.y)
182
+ * normal.y);
183
+
184
+ final float cBx = normal.x * scalar + clipPoint.x;
185
+ final float cBy = normal.y * scalar + clipPoint.y;
186
+
187
+ final float cAx = -normal.x * radiusA + clipPoint.x;
188
+ final float cAy = -normal.y * radiusA + clipPoint.y;
189
+
190
+ points[i].x = (cAx + cBx) * .5f;
191
+ points[i].y = (cAy + cBy) * .5f;
192
+ separations[i] = (cAx - cBx) * normal.x + (cAy - cBy) * normal.y;
193
+ }
194
+ // Ensure normal points from A to B.
195
+ normal.x = -normal.x;
196
+ normal.y = -normal.y;
197
+ break;
198
+ }
199
+ }
200
+ }
@@ -0,0 +1,92 @@
1
+ package org.jbox2d.collision.broadphase;
2
+
3
+ import org.jbox2d.callbacks.DebugDraw;
4
+ import org.jbox2d.callbacks.PairCallback;
5
+ import org.jbox2d.callbacks.TreeCallback;
6
+ import org.jbox2d.callbacks.TreeRayCastCallback;
7
+ import org.jbox2d.collision.AABB;
8
+ import org.jbox2d.collision.RayCastInput;
9
+ import org.jbox2d.common.Vec2;
10
+
11
+
12
+ public interface BroadPhase {
13
+
14
+ public static final int NULL_PROXY = -1;
15
+
16
+ /**
17
+ * Create a proxy with an initial AABB. Pairs are not reported until updatePairs is called.
18
+ *
19
+ * @param aabb
20
+ * @param userData
21
+ * @return
22
+ */
23
+ int createProxy(AABB aabb, Object userData);
24
+
25
+ /**
26
+ * Destroy a proxy. It is up to the client to remove any pairs.
27
+ *
28
+ * @param proxyId
29
+ */
30
+ void destroyProxy(int proxyId);
31
+
32
+ /**
33
+ * Call MoveProxy as many times as you like, then when you are done call UpdatePairs to finalized
34
+ * the proxy pairs (for your time step).
35
+ */
36
+ void moveProxy(int proxyId, AABB aabb, Vec2 displacement);
37
+
38
+ void touchProxy(int proxyId);
39
+
40
+ Object getUserData(int proxyId);
41
+
42
+ AABB getFatAABB(int proxyId);
43
+
44
+ boolean testOverlap(int proxyIdA, int proxyIdB);
45
+
46
+ /**
47
+ * Get the number of proxies.
48
+ *
49
+ * @return
50
+ */
51
+ int getProxyCount();
52
+
53
+ void drawTree(DebugDraw argDraw);
54
+
55
+ /**
56
+ * Update the pairs. This results in pair callbacks. This can only add pairs.
57
+ *
58
+ * @param callback
59
+ */
60
+ void updatePairs(PairCallback callback);
61
+
62
+ /**
63
+ * Query an AABB for overlapping proxies. The callback class is called for each proxy that
64
+ * overlaps the supplied AABB.
65
+ *
66
+ * @param callback
67
+ * @param aabb
68
+ */
69
+ void query(TreeCallback callback, AABB aabb);
70
+
71
+ /**
72
+ * Ray-cast against the proxies in the tree. This relies on the callback to perform a exact
73
+ * ray-cast in the case were the proxy contains a shape. The callback also performs the any
74
+ * collision filtering. This has performance roughly equal to k * log(n), where k is the number of
75
+ * collisions and n is the number of proxies in the tree.
76
+ *
77
+ * @param input the ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1).
78
+ * @param callback a callback class that is called for each proxy that is hit by the ray.
79
+ */
80
+ void raycast(TreeRayCastCallback callback, RayCastInput input);
81
+
82
+ /**
83
+ * Get the height of the embedded tree.
84
+ *
85
+ * @return
86
+ */
87
+ int getTreeHeight();
88
+
89
+ int getTreeBalance();
90
+
91
+ float getTreeQuality();
92
+ }
@@ -0,0 +1,88 @@
1
+ package org.jbox2d.collision.broadphase;
2
+
3
+ import org.jbox2d.callbacks.DebugDraw;
4
+ import org.jbox2d.callbacks.TreeCallback;
5
+ import org.jbox2d.callbacks.TreeRayCastCallback;
6
+ import org.jbox2d.collision.AABB;
7
+ import org.jbox2d.collision.RayCastInput;
8
+ import org.jbox2d.common.Vec2;
9
+
10
+ public interface BroadPhaseStrategy {
11
+
12
+ /**
13
+ * Create a proxy. Provide a tight fitting AABB and a userData pointer.
14
+ *
15
+ * @param aabb
16
+ * @param userData
17
+ * @return
18
+ */
19
+ int createProxy(AABB aabb, Object userData);
20
+
21
+ /**
22
+ * Destroy a proxy
23
+ *
24
+ * @param proxyId
25
+ */
26
+ void destroyProxy(int proxyId);
27
+
28
+ /**
29
+ * Move a proxy with a swepted AABB. If the proxy has moved outside of its fattened AABB, then the
30
+ * proxy is removed from the tree and re-inserted. Otherwise the function returns immediately.
31
+ *
32
+ * @return true if the proxy was re-inserted.
33
+ */
34
+ boolean moveProxy(int proxyId, AABB aabb, Vec2 displacement);
35
+
36
+ Object getUserData(int proxyId);
37
+
38
+ AABB getFatAABB(int proxyId);
39
+
40
+ /**
41
+ * Query an AABB for overlapping proxies. The callback class is called for each proxy that
42
+ * overlaps the supplied AABB.
43
+ *
44
+ * @param callback
45
+ * @param araabbgAABB
46
+ */
47
+ void query(TreeCallback callback, AABB aabb);
48
+
49
+ /**
50
+ * Ray-cast against the proxies in the tree. This relies on the callback to perform a exact
51
+ * ray-cast in the case were the proxy contains a shape. The callback also performs the any
52
+ * collision filtering. This has performance roughly equal to k * log(n), where k is the number of
53
+ * collisions and n is the number of proxies in the tree.
54
+ *
55
+ * @param input the ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1).
56
+ * @param callback a callback class that is called for each proxy that is hit by the ray.
57
+ */
58
+ void raycast(TreeRayCastCallback callback, RayCastInput input);
59
+
60
+ /**
61
+ * Compute the height of the tree.
62
+ */
63
+ int computeHeight();
64
+
65
+ /**
66
+ * Compute the height of the binary tree in O(N) time. Should not be called often.
67
+ *
68
+ * @return
69
+ */
70
+ int getHeight();
71
+
72
+ /**
73
+ * Get the maximum balance of an node in the tree. The balance is the difference in height of the
74
+ * two children of a node.
75
+ *
76
+ * @return
77
+ */
78
+ int getMaxBalance();
79
+
80
+ /**
81
+ * Get the ratio of the sum of the node areas to the root area.
82
+ *
83
+ * @return
84
+ */
85
+ float getAreaRatio();
86
+
87
+ void drawTree(DebugDraw draw);
88
+ }
@@ -0,0 +1,268 @@
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.collision.broadphase;
25
+
26
+ import java.util.Arrays;
27
+
28
+ import org.jbox2d.callbacks.DebugDraw;
29
+ import org.jbox2d.callbacks.PairCallback;
30
+ import org.jbox2d.callbacks.TreeCallback;
31
+ import org.jbox2d.callbacks.TreeRayCastCallback;
32
+ import org.jbox2d.collision.AABB;
33
+ import org.jbox2d.collision.RayCastInput;
34
+ import org.jbox2d.common.Vec2;
35
+
36
+ /**
37
+ * The broad-phase is used for computing pairs and performing volume queries and ray casts. This
38
+ * broad-phase does not persist pairs. Instead, this reports potentially new pairs. It is up to the
39
+ * client to consume the new pairs and to track subsequent overlap.
40
+ *
41
+ * @author Daniel Murphy
42
+ */
43
+ public class DefaultBroadPhaseBuffer implements TreeCallback, BroadPhase {
44
+
45
+ private final BroadPhaseStrategy m_tree;
46
+
47
+ private int m_proxyCount;
48
+
49
+ private int[] m_moveBuffer;
50
+ private int m_moveCapacity;
51
+ private int m_moveCount;
52
+
53
+ private Pair[] m_pairBuffer;
54
+ private int m_pairCapacity;
55
+ private int m_pairCount;
56
+
57
+ private int m_queryProxyId;
58
+
59
+ public DefaultBroadPhaseBuffer(BroadPhaseStrategy strategy) {
60
+ m_proxyCount = 0;
61
+
62
+ m_pairCapacity = 16;
63
+ m_pairCount = 0;
64
+ m_pairBuffer = new Pair[m_pairCapacity];
65
+ for (int i = 0; i < m_pairCapacity; i++) {
66
+ m_pairBuffer[i] = new Pair();
67
+ }
68
+
69
+ m_moveCapacity = 16;
70
+ m_moveCount = 0;
71
+ m_moveBuffer = new int[m_moveCapacity];
72
+
73
+ m_tree = strategy;
74
+ m_queryProxyId = NULL_PROXY;
75
+ }
76
+
77
+ @Override
78
+ public final int createProxy(final AABB aabb, Object userData) {
79
+ int proxyId = m_tree.createProxy(aabb, userData);
80
+ ++m_proxyCount;
81
+ bufferMove(proxyId);
82
+ return proxyId;
83
+ }
84
+
85
+ @Override
86
+ public final void destroyProxy(int proxyId) {
87
+ unbufferMove(proxyId);
88
+ --m_proxyCount;
89
+ m_tree.destroyProxy(proxyId);
90
+ }
91
+
92
+ @Override
93
+ public final void moveProxy(int proxyId, final AABB aabb, final Vec2 displacement) {
94
+ boolean buffer = m_tree.moveProxy(proxyId, aabb, displacement);
95
+ if (buffer) {
96
+ bufferMove(proxyId);
97
+ }
98
+ }
99
+
100
+ @Override
101
+ public void touchProxy(int proxyId) {
102
+ bufferMove(proxyId);
103
+ }
104
+
105
+ @Override
106
+ public Object getUserData(int proxyId) {
107
+ return m_tree.getUserData(proxyId);
108
+ }
109
+
110
+ @Override
111
+ public AABB getFatAABB(int proxyId) {
112
+ return m_tree.getFatAABB(proxyId);
113
+ }
114
+
115
+ @Override
116
+ public boolean testOverlap(int proxyIdA, int proxyIdB) {
117
+ // return AABB.testOverlap(proxyA.aabb, proxyB.aabb);
118
+ // return m_tree.overlap(proxyIdA, proxyIdB);
119
+ final AABB a = m_tree.getFatAABB(proxyIdA);
120
+ final AABB b = m_tree.getFatAABB(proxyIdB);
121
+ if (b.lowerBound.x - a.upperBound.x > 0.0f || b.lowerBound.y - a.upperBound.y > 0.0f) {
122
+ return false;
123
+ }
124
+
125
+ if (a.lowerBound.x - b.upperBound.x > 0.0f || a.lowerBound.y - b.upperBound.y > 0.0f) {
126
+ return false;
127
+ }
128
+
129
+ return true;
130
+ }
131
+
132
+ @Override
133
+ public final int getProxyCount() {
134
+ return m_proxyCount;
135
+ }
136
+
137
+ @Override
138
+ public void drawTree(DebugDraw argDraw) {
139
+ m_tree.drawTree(argDraw);
140
+ }
141
+
142
+ @Override
143
+ public final void updatePairs(PairCallback callback) {
144
+ // Reset pair buffer
145
+ m_pairCount = 0;
146
+
147
+ // Perform tree queries for all moving proxies.
148
+ for (int i = 0; i < m_moveCount; ++i) {
149
+ m_queryProxyId = m_moveBuffer[i];
150
+ if (m_queryProxyId == NULL_PROXY) {
151
+ continue;
152
+ }
153
+
154
+ // We have to query the tree with the fat AABB so that
155
+ // we don't fail to create a pair that may touch later.
156
+ final AABB fatAABB = m_tree.getFatAABB(m_queryProxyId);
157
+
158
+ // Query tree, create pairs and add them pair buffer.
159
+ // log.debug("quering aabb: "+m_queryProxy.aabb);
160
+ m_tree.query(this, fatAABB);
161
+ }
162
+ // log.debug("Number of pairs found: "+m_pairCount);
163
+
164
+ // Reset move buffer
165
+ m_moveCount = 0;
166
+
167
+ // Sort the pair buffer to expose duplicates.
168
+ Arrays.sort(m_pairBuffer, 0, m_pairCount);
169
+
170
+ // Send the pairs back to the client.
171
+ int i = 0;
172
+ while (i < m_pairCount) {
173
+ Pair primaryPair = m_pairBuffer[i];
174
+ Object userDataA = m_tree.getUserData(primaryPair.proxyIdA);
175
+ Object userDataB = m_tree.getUserData(primaryPair.proxyIdB);
176
+
177
+ // log.debug("returning pair: "+userDataA+", "+userDataB);
178
+ callback.addPair(userDataA, userDataB);
179
+ ++i;
180
+
181
+ // Skip any duplicate pairs.
182
+ while (i < m_pairCount) {
183
+ Pair pair = m_pairBuffer[i];
184
+ if (pair.proxyIdA != primaryPair.proxyIdA || pair.proxyIdB != primaryPair.proxyIdB) {
185
+ break;
186
+ }
187
+ ++i;
188
+ }
189
+ }
190
+ }
191
+
192
+ @Override
193
+ public final void query(final TreeCallback callback, final AABB aabb) {
194
+ m_tree.query(callback, aabb);
195
+ }
196
+
197
+ @Override
198
+ public final void raycast(final TreeRayCastCallback callback, final RayCastInput input) {
199
+ m_tree.raycast(callback, input);
200
+ }
201
+
202
+ @Override
203
+ public final int getTreeHeight() {
204
+ return m_tree.getHeight();
205
+ }
206
+
207
+ @Override
208
+ public int getTreeBalance() {
209
+ return m_tree.getMaxBalance();
210
+ }
211
+
212
+ @Override
213
+ public float getTreeQuality() {
214
+ return m_tree.getAreaRatio();
215
+ }
216
+
217
+ protected final void bufferMove(int proxyId) {
218
+ if (m_moveCount == m_moveCapacity) {
219
+ int[] old = m_moveBuffer;
220
+ m_moveCapacity *= 2;
221
+ m_moveBuffer = new int[m_moveCapacity];
222
+ System.arraycopy(old, 0, m_moveBuffer, 0, old.length);
223
+ }
224
+
225
+ m_moveBuffer[m_moveCount] = proxyId;
226
+ ++m_moveCount;
227
+ }
228
+
229
+ protected final void unbufferMove(int proxyId) {
230
+ for (int i = 0; i < m_moveCount; i++) {
231
+ if (m_moveBuffer[i] == proxyId) {
232
+ m_moveBuffer[i] = NULL_PROXY;
233
+ }
234
+ }
235
+ }
236
+
237
+ /**
238
+ * This is called from DynamicTree::query when we are gathering pairs.
239
+ */
240
+ public final boolean treeCallback(int proxyId) {
241
+ // A proxy cannot form a pair with itself.
242
+ if (proxyId == m_queryProxyId) {
243
+ return true;
244
+ }
245
+
246
+ // Grow the pair buffer as needed.
247
+ if (m_pairCount == m_pairCapacity) {
248
+ Pair[] oldBuffer = m_pairBuffer;
249
+ m_pairCapacity *= 2;
250
+ m_pairBuffer = new Pair[m_pairCapacity];
251
+ System.arraycopy(oldBuffer, 0, m_pairBuffer, 0, oldBuffer.length);
252
+ for (int i = oldBuffer.length; i < m_pairCapacity; i++) {
253
+ m_pairBuffer[i] = new Pair();
254
+ }
255
+ }
256
+
257
+ if (proxyId < m_queryProxyId) {
258
+ m_pairBuffer[m_pairCount].proxyIdA = proxyId;
259
+ m_pairBuffer[m_pairCount].proxyIdB = m_queryProxyId;
260
+ } else {
261
+ m_pairBuffer[m_pairCount].proxyIdA = m_queryProxyId;
262
+ m_pairBuffer[m_pairCount].proxyIdB = proxyId;
263
+ }
264
+
265
+ ++m_pairCount;
266
+ return true;
267
+ }
268
+ }