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,526 @@
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.collision.Distance.DistanceProxy;
27
+ import org.jbox2d.collision.Distance.SimplexCache;
28
+ import org.jbox2d.common.MathUtils;
29
+ import org.jbox2d.common.Rot;
30
+ import org.jbox2d.common.Settings;
31
+ import org.jbox2d.common.Sweep;
32
+ import org.jbox2d.common.Transform;
33
+ import org.jbox2d.common.Vec2;
34
+ import org.jbox2d.pooling.IWorldPool;
35
+
36
+ /**
37
+ * Class used for computing the time of impact. This class should not be constructed usually, just
38
+ * retrieve from the {@link IWorldPool#getTimeOfImpact()}.
39
+ *
40
+ * @author daniel
41
+ */
42
+ public class TimeOfImpact {
43
+ public static final int MAX_ITERATIONS = 20;
44
+ public static final int MAX_ROOT_ITERATIONS = 50;
45
+
46
+ public static int toiCalls = 0;
47
+ public static int toiIters = 0;
48
+ public static int toiMaxIters = 0;
49
+ public static int toiRootIters = 0;
50
+ public static int toiMaxRootIters = 0;
51
+
52
+ /**
53
+ * Input parameters for TOI
54
+ *
55
+ * @author Daniel Murphy
56
+ */
57
+ public static class TOIInput {
58
+ public final DistanceProxy proxyA = new DistanceProxy();
59
+ public final DistanceProxy proxyB = new DistanceProxy();
60
+ public final Sweep sweepA = new Sweep();
61
+ public final Sweep sweepB = new Sweep();
62
+ /**
63
+ * defines sweep interval [0, tMax]
64
+ */
65
+ public float tMax;
66
+ }
67
+
68
+ public static enum TOIOutputState {
69
+ UNKNOWN, FAILED, OVERLAPPED, TOUCHING, SEPARATED
70
+ }
71
+
72
+ /**
73
+ * Output parameters for TimeOfImpact
74
+ *
75
+ * @author daniel
76
+ */
77
+ public static class TOIOutput {
78
+ public TOIOutputState state;
79
+ public float t;
80
+ }
81
+
82
+
83
+ // djm pooling
84
+ private final SimplexCache cache = new SimplexCache();
85
+ private final DistanceInput distanceInput = new DistanceInput();
86
+ private final Transform xfA = new Transform();
87
+ private final Transform xfB = new Transform();
88
+ private final DistanceOutput distanceOutput = new DistanceOutput();
89
+ private final SeparationFunction fcn = new SeparationFunction();
90
+ private final int[] indexes = new int[2];
91
+ private final Sweep sweepA = new Sweep();
92
+ private final Sweep sweepB = new Sweep();
93
+
94
+
95
+ private final IWorldPool pool;
96
+
97
+ public TimeOfImpact(IWorldPool argPool) {
98
+ pool = argPool;
99
+ }
100
+
101
+ /**
102
+ * Compute the upper bound on time before two shapes penetrate. Time is represented as a fraction
103
+ * between [0,tMax]. This uses a swept separating axis and may miss some intermediate,
104
+ * non-tunneling collision. If you change the time interval, you should call this function again.
105
+ * Note: use Distance to compute the contact point and normal at the time of impact.
106
+ *
107
+ * @param output
108
+ * @param input
109
+ */
110
+ public final void timeOfImpact(TOIOutput output, TOIInput input) {
111
+ // CCD via the local separating axis method. This seeks progression
112
+ // by computing the largest time at which separation is maintained.
113
+
114
+ ++toiCalls;
115
+
116
+ output.state = TOIOutputState.UNKNOWN;
117
+ output.t = input.tMax;
118
+
119
+ final DistanceProxy proxyA = input.proxyA;
120
+ final DistanceProxy proxyB = input.proxyB;
121
+
122
+ sweepA.set(input.sweepA);
123
+ sweepB.set(input.sweepB);
124
+
125
+ // Large rotations can make the root finder fail, so we normalize the
126
+ // sweep angles.
127
+ sweepA.normalize();
128
+ sweepB.normalize();
129
+
130
+ float tMax = input.tMax;
131
+
132
+ float totalRadius = proxyA.m_radius + proxyB.m_radius;
133
+ // djm: whats with all these constants?
134
+ float target = MathUtils.max(Settings.linearSlop, totalRadius - 3.0f * Settings.linearSlop);
135
+ float tolerance = 0.25f * Settings.linearSlop;
136
+
137
+ assert (target > tolerance);
138
+
139
+ float t1 = 0f;
140
+ int iter = 0;
141
+
142
+ cache.count = 0;
143
+ distanceInput.proxyA = input.proxyA;
144
+ distanceInput.proxyB = input.proxyB;
145
+ distanceInput.useRadii = false;
146
+
147
+ // The outer loop progressively attempts to compute new separating axes.
148
+ // This loop terminates when an axis is repeated (no progress is made).
149
+ for (;;) {
150
+ sweepA.getTransform(xfA, t1);
151
+ sweepB.getTransform(xfB, t1);
152
+ // System.out.printf("sweepA: %f, %f, sweepB: %f, %f\n",
153
+ // sweepA.c.x, sweepA.c.y, sweepB.c.x, sweepB.c.y);
154
+ // Get the distance between shapes. We can also use the results
155
+ // to get a separating axis
156
+ distanceInput.transformA = xfA;
157
+ distanceInput.transformB = xfB;
158
+ pool.getDistance().distance(distanceOutput, cache, distanceInput);
159
+
160
+ // System.out.printf("Dist: %f at points %f, %f and %f, %f. %d iterations\n",
161
+ // distanceOutput.distance, distanceOutput.pointA.x, distanceOutput.pointA.y,
162
+ // distanceOutput.pointB.x, distanceOutput.pointB.y,
163
+ // distanceOutput.iterations);
164
+
165
+ // If the shapes are overlapped, we give up on continuous collision.
166
+ if (distanceOutput.distance <= 0f) {
167
+ // Failure!
168
+ output.state = TOIOutputState.OVERLAPPED;
169
+ output.t = 0f;
170
+ break;
171
+ }
172
+
173
+ if (distanceOutput.distance < target + tolerance) {
174
+ // Victory!
175
+ output.state = TOIOutputState.TOUCHING;
176
+ output.t = t1;
177
+ break;
178
+ }
179
+
180
+ // Initialize the separating axis.
181
+ fcn.initialize(cache, proxyA, sweepA, proxyB, sweepB, t1);
182
+
183
+ // Compute the TOI on the separating axis. We do this by successively
184
+ // resolving the deepest point. This loop is bounded by the number of
185
+ // vertices.
186
+ boolean done = false;
187
+ float t2 = tMax;
188
+ int pushBackIter = 0;
189
+ for (;;) {
190
+
191
+ // Find the deepest point at t2. Store the witness point indices.
192
+ float s2 = fcn.findMinSeparation(indexes, t2);
193
+ // System.out.printf("s2: %f\n", s2);
194
+ // Is the final configuration separated?
195
+ if (s2 > target + tolerance) {
196
+ // Victory!
197
+ output.state = TOIOutputState.SEPARATED;
198
+ output.t = tMax;
199
+ done = true;
200
+ break;
201
+ }
202
+
203
+ // Has the separation reached tolerance?
204
+ if (s2 > target - tolerance) {
205
+ // Advance the sweeps
206
+ t1 = t2;
207
+ break;
208
+ }
209
+
210
+ // Compute the initial separation of the witness points.
211
+ float s1 = fcn.evaluate(indexes[0], indexes[1], t1);
212
+ // Check for initial overlap. This might happen if the root finder
213
+ // runs out of iterations.
214
+ // System.out.printf("s1: %f, target: %f, tolerance: %f\n", s1, target,
215
+ // tolerance);
216
+ if (s1 < target - tolerance) {
217
+ output.state = TOIOutputState.FAILED;
218
+ output.t = t1;
219
+ done = true;
220
+ break;
221
+ }
222
+
223
+ // Check for touching
224
+ if (s1 <= target + tolerance) {
225
+ // Victory! t1 should hold the TOI (could be 0.0).
226
+ output.state = TOIOutputState.TOUCHING;
227
+ output.t = t1;
228
+ done = true;
229
+ break;
230
+ }
231
+
232
+ // Compute 1D root of: f(x) - target = 0
233
+ int rootIterCount = 0;
234
+ float a1 = t1, a2 = t2;
235
+ for (;;) {
236
+ // Use a mix of the secant rule and bisection.
237
+ float t;
238
+ if ((rootIterCount & 1) == 1) {
239
+ // Secant rule to improve convergence.
240
+ t = a1 + (target - s1) * (a2 - a1) / (s2 - s1);
241
+ } else {
242
+ // Bisection to guarantee progress.
243
+ t = 0.5f * (a1 + a2);
244
+ }
245
+
246
+ ++rootIterCount;
247
+ ++toiRootIters;
248
+
249
+ float s = fcn.evaluate(indexes[0], indexes[1], t);
250
+
251
+ if (MathUtils.abs(s - target) < tolerance) {
252
+ // t2 holds a tentative value for t1
253
+ t2 = t;
254
+ break;
255
+ }
256
+
257
+ // Ensure we continue to bracket the root.
258
+ if (s > target) {
259
+ a1 = t;
260
+ s1 = s;
261
+ } else {
262
+ a2 = t;
263
+ s2 = s;
264
+ }
265
+
266
+ if (rootIterCount == MAX_ROOT_ITERATIONS) {
267
+ break;
268
+ }
269
+ }
270
+
271
+ toiMaxRootIters = MathUtils.max(toiMaxRootIters, rootIterCount);
272
+
273
+ ++pushBackIter;
274
+
275
+ if (pushBackIter == Settings.maxPolygonVertices || rootIterCount == MAX_ROOT_ITERATIONS) {
276
+ break;
277
+ }
278
+ }
279
+
280
+ ++iter;
281
+ ++toiIters;
282
+
283
+ if (done) {
284
+ // System.out.println("done");
285
+ break;
286
+ }
287
+
288
+ if (iter == MAX_ITERATIONS) {
289
+ // System.out.println("failed, root finder stuck");
290
+ // Root finder got stuck. Semi-victory.
291
+ output.state = TOIOutputState.FAILED;
292
+ output.t = t1;
293
+ break;
294
+ }
295
+ }
296
+
297
+ // System.out.printf("final sweeps: %f, %f, %f; %f, %f, %f", input.s)
298
+ toiMaxIters = MathUtils.max(toiMaxIters, iter);
299
+ }
300
+ }
301
+
302
+
303
+ enum Type {
304
+ POINTS, FACE_A, FACE_B;
305
+ }
306
+
307
+
308
+ class SeparationFunction {
309
+
310
+ public DistanceProxy m_proxyA;
311
+ public DistanceProxy m_proxyB;
312
+ public Type m_type;
313
+ public final Vec2 m_localPoint = new Vec2();
314
+ public final Vec2 m_axis = new Vec2();
315
+ public Sweep m_sweepA;
316
+ public Sweep m_sweepB;
317
+
318
+ // djm pooling
319
+ private final Vec2 localPointA = new Vec2();
320
+ private final Vec2 localPointB = new Vec2();
321
+ private final Vec2 pointA = new Vec2();
322
+ private final Vec2 pointB = new Vec2();
323
+ private final Vec2 localPointA1 = new Vec2();
324
+ private final Vec2 localPointA2 = new Vec2();
325
+ private final Vec2 normal = new Vec2();
326
+ private final Vec2 localPointB1 = new Vec2();
327
+ private final Vec2 localPointB2 = new Vec2();
328
+ private final Vec2 temp = new Vec2();
329
+ private final Transform xfa = new Transform();
330
+ private final Transform xfb = new Transform();
331
+
332
+ // TODO_ERIN might not need to return the separation
333
+
334
+ public float initialize(final SimplexCache cache, final DistanceProxy proxyA, final Sweep sweepA,
335
+ final DistanceProxy proxyB, final Sweep sweepB, float t1) {
336
+ m_proxyA = proxyA;
337
+ m_proxyB = proxyB;
338
+ int count = cache.count;
339
+ assert (0 < count && count < 3);
340
+
341
+ m_sweepA = sweepA;
342
+ m_sweepB = sweepB;
343
+
344
+ m_sweepA.getTransform(xfa, t1);
345
+ m_sweepB.getTransform(xfb, t1);
346
+
347
+ // log.debug("initializing separation.\n" +
348
+ // "cache: "+cache.count+"-"+cache.metric+"-"+cache.indexA+"-"+cache.indexB+"\n"
349
+ // "distance: "+proxyA.
350
+
351
+ if (count == 1) {
352
+ m_type = Type.POINTS;
353
+ /*
354
+ * Vec2 localPointA = m_proxyA.GetVertex(cache.indexA[0]); Vec2 localPointB =
355
+ * m_proxyB.GetVertex(cache.indexB[0]); Vec2 pointA = Mul(transformA, localPointA); Vec2
356
+ * pointB = Mul(transformB, localPointB); m_axis = pointB - pointA; m_axis.Normalize();
357
+ */
358
+ localPointA.set(m_proxyA.getVertex(cache.indexA[0]));
359
+ localPointB.set(m_proxyB.getVertex(cache.indexB[0]));
360
+ Transform.mulToOutUnsafe(xfa, localPointA, pointA);
361
+ Transform.mulToOutUnsafe(xfb, localPointB, pointB);
362
+ m_axis.set(pointB).subLocal(pointA);
363
+ float s = m_axis.normalize();
364
+ return s;
365
+ } else if (cache.indexA[0] == cache.indexA[1]) {
366
+ // Two points on B and one on A.
367
+ m_type = Type.FACE_B;
368
+
369
+ localPointB1.set(m_proxyB.getVertex(cache.indexB[0]));
370
+ localPointB2.set(m_proxyB.getVertex(cache.indexB[1]));
371
+
372
+ temp.set(localPointB2).subLocal(localPointB1);
373
+ Vec2.crossToOutUnsafe(temp, 1f, m_axis);
374
+ m_axis.normalize();
375
+
376
+ Rot.mulToOutUnsafe(xfb.q, m_axis, normal);
377
+
378
+ m_localPoint.set(localPointB1).addLocal(localPointB2).mulLocal(.5f);
379
+ Transform.mulToOutUnsafe(xfb, m_localPoint, pointB);
380
+
381
+ localPointA.set(proxyA.getVertex(cache.indexA[0]));
382
+ Transform.mulToOutUnsafe(xfa, localPointA, pointA);
383
+
384
+ temp.set(pointA).subLocal(pointB);
385
+ float s = Vec2.dot(temp, normal);
386
+ if (s < 0.0f) {
387
+ m_axis.negateLocal();
388
+ s = -s;
389
+ }
390
+ return s;
391
+ } else {
392
+ // Two points on A and one or two points on B.
393
+ m_type = Type.FACE_A;
394
+
395
+ localPointA1.set(m_proxyA.getVertex(cache.indexA[0]));
396
+ localPointA2.set(m_proxyA.getVertex(cache.indexA[1]));
397
+
398
+ temp.set(localPointA2).subLocal(localPointA1);
399
+ Vec2.crossToOutUnsafe(temp, 1.0f, m_axis);
400
+ m_axis.normalize();
401
+
402
+ Rot.mulToOutUnsafe(xfa.q, m_axis, normal);
403
+
404
+ m_localPoint.set(localPointA1).addLocal(localPointA2).mulLocal(.5f);
405
+ Transform.mulToOutUnsafe(xfa, m_localPoint, pointA);
406
+
407
+ localPointB.set(m_proxyB.getVertex(cache.indexB[0]));
408
+ Transform.mulToOutUnsafe(xfb, localPointB, pointB);
409
+
410
+ temp.set(pointB).subLocal(pointA);
411
+ float s = Vec2.dot(temp, normal);
412
+ if (s < 0.0f) {
413
+ m_axis.negateLocal();
414
+ s = -s;
415
+ }
416
+ return s;
417
+ }
418
+ }
419
+
420
+ private final Vec2 axisA = new Vec2();
421
+ private final Vec2 axisB = new Vec2();
422
+
423
+ // float FindMinSeparation(int* indexA, int* indexB, float t) const
424
+ public float findMinSeparation(int[] indexes, float t) {
425
+
426
+ m_sweepA.getTransform(xfa, t);
427
+ m_sweepB.getTransform(xfb, t);
428
+
429
+ switch (m_type) {
430
+ case POINTS: {
431
+ Rot.mulTransUnsafe(xfa.q, m_axis, axisA);
432
+ Rot.mulTransUnsafe(xfb.q, m_axis.negateLocal(), axisB);
433
+ m_axis.negateLocal();
434
+
435
+ indexes[0] = m_proxyA.getSupport(axisA);
436
+ indexes[1] = m_proxyB.getSupport(axisB);
437
+
438
+ localPointA.set(m_proxyA.getVertex(indexes[0]));
439
+ localPointB.set(m_proxyB.getVertex(indexes[1]));
440
+
441
+ Transform.mulToOutUnsafe(xfa, localPointA, pointA);
442
+ Transform.mulToOutUnsafe(xfb, localPointB, pointB);
443
+
444
+ float separation = Vec2.dot(pointB.subLocal(pointA), m_axis);
445
+ return separation;
446
+ }
447
+ case FACE_A: {
448
+ Rot.mulToOutUnsafe(xfa.q, m_axis, normal);
449
+ Transform.mulToOutUnsafe(xfa, m_localPoint, pointA);
450
+
451
+ Rot.mulTransUnsafe(xfb.q, normal.negateLocal(), axisB);
452
+ normal.negateLocal();
453
+
454
+ indexes[0] = -1;
455
+ indexes[1] = m_proxyB.getSupport(axisB);
456
+
457
+ localPointB.set(m_proxyB.getVertex(indexes[1]));
458
+ Transform.mulToOutUnsafe(xfb, localPointB, pointB);
459
+
460
+ float separation = Vec2.dot(pointB.subLocal(pointA), normal);
461
+ return separation;
462
+ }
463
+ case FACE_B: {
464
+ Rot.mulToOutUnsafe(xfb.q, m_axis, normal);
465
+ Transform.mulToOutUnsafe(xfb, m_localPoint, pointB);
466
+
467
+ Rot.mulTransUnsafe(xfa.q, normal.negateLocal(), axisA);
468
+ normal.negateLocal();
469
+
470
+ indexes[1] = -1;
471
+ indexes[0] = m_proxyA.getSupport(axisA);
472
+
473
+ localPointA.set(m_proxyA.getVertex(indexes[0]));
474
+ Transform.mulToOutUnsafe(xfa, localPointA, pointA);
475
+
476
+ float separation = Vec2.dot(pointA.subLocal(pointB), normal);
477
+ return separation;
478
+ }
479
+ default:
480
+ assert (false);
481
+ indexes[0] = -1;
482
+ indexes[1] = -1;
483
+ return 0f;
484
+ }
485
+ }
486
+
487
+ public float evaluate(int indexA, int indexB, float t) {
488
+ m_sweepA.getTransform(xfa, t);
489
+ m_sweepB.getTransform(xfb, t);
490
+
491
+ switch (m_type) {
492
+ case POINTS: {
493
+ localPointA.set(m_proxyA.getVertex(indexA));
494
+ localPointB.set(m_proxyB.getVertex(indexB));
495
+
496
+ Transform.mulToOutUnsafe(xfa, localPointA, pointA);
497
+ Transform.mulToOutUnsafe(xfb, localPointB, pointB);
498
+
499
+ float separation = Vec2.dot(pointB.subLocal(pointA), m_axis);
500
+ return separation;
501
+ }
502
+ case FACE_A: {
503
+ Rot.mulToOutUnsafe(xfa.q, m_axis, normal);
504
+ Transform.mulToOutUnsafe(xfa, m_localPoint, pointA);
505
+
506
+ localPointB.set(m_proxyB.getVertex(indexB));
507
+ Transform.mulToOutUnsafe(xfb, localPointB, pointB);
508
+ float separation = Vec2.dot(pointB.subLocal(pointA), normal);
509
+ return separation;
510
+ }
511
+ case FACE_B: {
512
+ Rot.mulToOutUnsafe(xfb.q, m_axis, normal);
513
+ Transform.mulToOutUnsafe(xfb, m_localPoint, pointB);
514
+
515
+ localPointA.set(m_proxyA.getVertex(indexA));
516
+ Transform.mulToOutUnsafe(xfa, localPointA, pointA);
517
+
518
+ float separation = Vec2.dot(pointA.subLocal(pointB), normal);
519
+ return separation;
520
+ }
521
+ default:
522
+ assert (false);
523
+ return 0f;
524
+ }
525
+ }
526
+ }