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,356 @@
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
+ * JBox2D - A Java Port of Erin Catto's Box2D
26
+ *
27
+ * JBox2D homepage: http://jbox2d.sourceforge.net/
28
+ * Box2D homepage: http://www.box2d.org
29
+ *
30
+ * This software is provided 'as-is', without any express or implied
31
+ * warranty. In no event will the authors be held liable for any damages
32
+ * arising from the use of this software.
33
+ *
34
+ * Permission is granted to anyone to use this software for any purpose,
35
+ * including commercial applications, and to alter it and redistribute it
36
+ * freely, subject to the following restrictions:
37
+ *
38
+ * 1. The origin of this software must not be misrepresented; you must not
39
+ * claim that you wrote the original software. If you use this software
40
+ * in a product, an acknowledgment in the product documentation would be
41
+ * appreciated but is not required.
42
+ * 2. Altered source versions must be plainly marked as such, and must not be
43
+ * misrepresented as being the original software.
44
+ * 3. This notice may not be removed or altered from any source distribution.
45
+ */
46
+
47
+ package org.jbox2d.dynamics.joints;
48
+
49
+ import org.jbox2d.common.MathUtils;
50
+ import org.jbox2d.common.Rot;
51
+ import org.jbox2d.common.Settings;
52
+ import org.jbox2d.common.Vec2;
53
+ import org.jbox2d.dynamics.SolverData;
54
+ import org.jbox2d.pooling.IWorldPool;
55
+
56
+ //C = norm(p2 - p1) - L
57
+ //u = (p2 - p1) / norm(p2 - p1)
58
+ //Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1))
59
+ //J = [-u -cross(r1, u) u cross(r2, u)]
60
+ //K = J * invM * JT
61
+ //= invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2
62
+
63
+ /**
64
+ * A distance joint constrains two points on two bodies to remain at a fixed distance from each
65
+ * other. You can view this as a massless, rigid rod.
66
+ */
67
+ public class DistanceJoint extends Joint {
68
+
69
+ private float m_frequencyHz;
70
+ private float m_dampingRatio;
71
+ private float m_bias;
72
+
73
+ // Solver shared
74
+ private final Vec2 m_localAnchorA;
75
+ private final Vec2 m_localAnchorB;
76
+ private float m_gamma;
77
+ private float m_impulse;
78
+ private float m_length;
79
+
80
+ // Solver temp
81
+ private int m_indexA;
82
+ private int m_indexB;
83
+ private final Vec2 m_u = new Vec2();
84
+ private final Vec2 m_rA = new Vec2();
85
+ private final Vec2 m_rB = new Vec2();
86
+ private final Vec2 m_localCenterA = new Vec2();
87
+ private final Vec2 m_localCenterB = new Vec2();
88
+ private float m_invMassA;
89
+ private float m_invMassB;
90
+ private float m_invIA;
91
+ private float m_invIB;
92
+ private float m_mass;
93
+
94
+ protected DistanceJoint(IWorldPool argWorld, final DistanceJointDef def) {
95
+ super(argWorld, def);
96
+ m_localAnchorA = def.localAnchorA.clone();
97
+ m_localAnchorB = def.localAnchorB.clone();
98
+ m_length = def.length;
99
+ m_impulse = 0.0f;
100
+ m_frequencyHz = def.frequencyHz;
101
+ m_dampingRatio = def.dampingRatio;
102
+ m_gamma = 0.0f;
103
+ m_bias = 0.0f;
104
+ }
105
+
106
+ public void setFrequency(float hz) {
107
+ m_frequencyHz = hz;
108
+ }
109
+
110
+ public float getFrequency() {
111
+ return m_frequencyHz;
112
+ }
113
+
114
+ public float getLength() {
115
+ return m_length;
116
+ }
117
+
118
+ public void setLength(float argLength) {
119
+ m_length = argLength;
120
+ }
121
+
122
+ public void setDampingRatio(float damp) {
123
+ m_dampingRatio = damp;
124
+ }
125
+
126
+ public float getDampingRatio() {
127
+ return m_dampingRatio;
128
+ }
129
+
130
+ @Override
131
+ public void getAnchorA(Vec2 argOut) {
132
+ m_bodyA.getWorldPointToOut(m_localAnchorA, argOut);
133
+ }
134
+
135
+ @Override
136
+ public void getAnchorB(Vec2 argOut) {
137
+ m_bodyB.getWorldPointToOut(m_localAnchorB, argOut);
138
+ }
139
+
140
+ public Vec2 getLocalAnchorA() {
141
+ return m_localAnchorA;
142
+ }
143
+
144
+ public Vec2 getLocalAnchorB() {
145
+ return m_localAnchorB;
146
+ }
147
+
148
+ /**
149
+ * Get the reaction force given the inverse time step. Unit is N.
150
+ */
151
+ @Override
152
+ public void getReactionForce(float inv_dt, Vec2 argOut) {
153
+ argOut.x = m_impulse * m_u.x * inv_dt;
154
+ argOut.y = m_impulse * m_u.y * inv_dt;
155
+ }
156
+
157
+ /**
158
+ * Get the reaction torque given the inverse time step. Unit is N*m. This is always zero for a
159
+ * distance joint.
160
+ */
161
+ @Override
162
+ public float getReactionTorque(float inv_dt) {
163
+ return 0.0f;
164
+ }
165
+
166
+ @Override
167
+ public void initVelocityConstraints(final SolverData data) {
168
+
169
+ m_indexA = m_bodyA.m_islandIndex;
170
+ m_indexB = m_bodyB.m_islandIndex;
171
+ m_localCenterA.set(m_bodyA.m_sweep.localCenter);
172
+ m_localCenterB.set(m_bodyB.m_sweep.localCenter);
173
+ m_invMassA = m_bodyA.m_invMass;
174
+ m_invMassB = m_bodyB.m_invMass;
175
+ m_invIA = m_bodyA.m_invI;
176
+ m_invIB = m_bodyB.m_invI;
177
+
178
+ Vec2 cA = data.positions[m_indexA].c;
179
+ float aA = data.positions[m_indexA].a;
180
+ Vec2 vA = data.velocities[m_indexA].v;
181
+ float wA = data.velocities[m_indexA].w;
182
+
183
+ Vec2 cB = data.positions[m_indexB].c;
184
+ float aB = data.positions[m_indexB].a;
185
+ Vec2 vB = data.velocities[m_indexB].v;
186
+ float wB = data.velocities[m_indexB].w;
187
+
188
+ final Rot qA = pool.popRot();
189
+ final Rot qB = pool.popRot();
190
+
191
+ qA.set(aA);
192
+ qB.set(aB);
193
+
194
+ // use m_u as temporary variable
195
+ Rot.mulToOutUnsafe(qA, m_u.set(m_localAnchorA).subLocal(m_localCenterA), m_rA);
196
+ Rot.mulToOutUnsafe(qB, m_u.set(m_localAnchorB).subLocal(m_localCenterB), m_rB);
197
+ m_u.set(cB).addLocal(m_rB).subLocal(cA).subLocal(m_rA);
198
+
199
+ pool.pushRot(2);
200
+
201
+ // Handle singularity.
202
+ float length = m_u.length();
203
+ if (length > Settings.linearSlop) {
204
+ m_u.x *= 1.0f / length;
205
+ m_u.y *= 1.0f / length;
206
+ } else {
207
+ m_u.set(0.0f, 0.0f);
208
+ }
209
+
210
+
211
+ float crAu = Vec2.cross(m_rA, m_u);
212
+ float crBu = Vec2.cross(m_rB, m_u);
213
+ float invMass = m_invMassA + m_invIA * crAu * crAu + m_invMassB + m_invIB * crBu * crBu;
214
+
215
+ // Compute the effective mass matrix.
216
+ m_mass = invMass != 0.0f ? 1.0f / invMass : 0.0f;
217
+
218
+ if (m_frequencyHz > 0.0f) {
219
+ float C = length - m_length;
220
+
221
+ // Frequency
222
+ float omega = 2.0f * MathUtils.PI * m_frequencyHz;
223
+
224
+ // Damping coefficient
225
+ float d = 2.0f * m_mass * m_dampingRatio * omega;
226
+
227
+ // Spring stiffness
228
+ float k = m_mass * omega * omega;
229
+
230
+ // magic formulas
231
+ float h = data.step.dt;
232
+ m_gamma = h * (d + h * k);
233
+ m_gamma = m_gamma != 0.0f ? 1.0f / m_gamma : 0.0f;
234
+ m_bias = C * h * k * m_gamma;
235
+
236
+ invMass += m_gamma;
237
+ m_mass = invMass != 0.0f ? 1.0f / invMass : 0.0f;
238
+ } else {
239
+ m_gamma = 0.0f;
240
+ m_bias = 0.0f;
241
+ }
242
+ if (data.step.warmStarting) {
243
+
244
+ // Scale the impulse to support a variable time step.
245
+ m_impulse *= data.step.dtRatio;
246
+
247
+ Vec2 P = pool.popVec2();
248
+ P.set(m_u).mulLocal(m_impulse);
249
+
250
+ vA.x -= m_invMassA * P.x;
251
+ vA.y -= m_invMassA * P.y;
252
+ wA -= m_invIA * Vec2.cross(m_rA, P);
253
+
254
+ vB.x += m_invMassB * P.x;
255
+ vB.y += m_invMassB * P.y;
256
+ wB += m_invIB * Vec2.cross(m_rB, P);
257
+
258
+ pool.pushVec2(1);
259
+ } else {
260
+ m_impulse = 0.0f;
261
+ }
262
+ // data.velocities[m_indexA].v.set(vA);
263
+ data.velocities[m_indexA].w = wA;
264
+ // data.velocities[m_indexB].v.set(vB);
265
+ data.velocities[m_indexB].w = wB;
266
+ }
267
+
268
+ @Override
269
+ public void solveVelocityConstraints(final SolverData data) {
270
+ Vec2 vA = data.velocities[m_indexA].v;
271
+ float wA = data.velocities[m_indexA].w;
272
+ Vec2 vB = data.velocities[m_indexB].v;
273
+ float wB = data.velocities[m_indexB].w;
274
+
275
+ final Vec2 vpA = pool.popVec2();
276
+ final Vec2 vpB = pool.popVec2();
277
+
278
+ // Cdot = dot(u, v + cross(w, r))
279
+ Vec2.crossToOutUnsafe(wA, m_rA, vpA);
280
+ vpA.addLocal(vA);
281
+ Vec2.crossToOutUnsafe(wB, m_rB, vpB);
282
+ vpB.addLocal(vB);
283
+ float Cdot = Vec2.dot(m_u, vpB.subLocal(vpA));
284
+
285
+ float impulse = -m_mass * (Cdot + m_bias + m_gamma * m_impulse);
286
+ m_impulse += impulse;
287
+
288
+
289
+ float Px = impulse * m_u.x;
290
+ float Py = impulse * m_u.y;
291
+
292
+ vA.x -= m_invMassA * Px;
293
+ vA.y -= m_invMassA * Py;
294
+ wA -= m_invIA * (m_rA.x * Py - m_rA.y * Px);
295
+ vB.x += m_invMassB * Px;
296
+ vB.y += m_invMassB * Py;
297
+ wB += m_invIB * (m_rB.x * Py - m_rB.y * Px);
298
+
299
+ // data.velocities[m_indexA].v.set(vA);
300
+ data.velocities[m_indexA].w = wA;
301
+ // data.velocities[m_indexB].v.set(vB);
302
+ data.velocities[m_indexB].w = wB;
303
+
304
+ pool.pushVec2(2);
305
+ }
306
+
307
+ @Override
308
+ public boolean solvePositionConstraints(final SolverData data) {
309
+ if (m_frequencyHz > 0.0f) {
310
+ return true;
311
+ }
312
+ final Rot qA = pool.popRot();
313
+ final Rot qB = pool.popRot();
314
+ final Vec2 rA = pool.popVec2();
315
+ final Vec2 rB = pool.popVec2();
316
+ final Vec2 u = pool.popVec2();
317
+
318
+ Vec2 cA = data.positions[m_indexA].c;
319
+ float aA = data.positions[m_indexA].a;
320
+ Vec2 cB = data.positions[m_indexB].c;
321
+ float aB = data.positions[m_indexB].a;
322
+
323
+ qA.set(aA);
324
+ qB.set(aB);
325
+
326
+ Rot.mulToOutUnsafe(qA, u.set(m_localAnchorA).subLocal(m_localCenterA), rA);
327
+ Rot.mulToOutUnsafe(qB, u.set(m_localAnchorB).subLocal(m_localCenterB), rB);
328
+ u.set(cB).addLocal(rB).subLocal(cA).subLocal(rA);
329
+
330
+
331
+ float length = u.normalize();
332
+ float C = length - m_length;
333
+ C = MathUtils.clamp(C, -Settings.maxLinearCorrection, Settings.maxLinearCorrection);
334
+
335
+ float impulse = -m_mass * C;
336
+ float Px = impulse * u.x;
337
+ float Py = impulse * u.y;
338
+
339
+ cA.x -= m_invMassA * Px;
340
+ cA.y -= m_invMassA * Py;
341
+ aA -= m_invIA * (rA.x * Py - rA.y * Px);
342
+ cB.x += m_invMassB * Px;
343
+ cB.y += m_invMassB * Py;
344
+ aB += m_invIB * (rB.x * Py - rB.y * Px);
345
+
346
+ // data.positions[m_indexA].c.set(cA);
347
+ data.positions[m_indexA].a = aA;
348
+ // data.positions[m_indexB].c.set(cB);
349
+ data.positions[m_indexB].a = aB;
350
+
351
+ pool.pushVec2(3);
352
+ pool.pushRot(2);
353
+
354
+ return MathUtils.abs(C) < Settings.linearSlop;
355
+ }
356
+ }
@@ -0,0 +1,106 @@
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
+ * JBox2D - A Java Port of Erin Catto's Box2D
26
+ *
27
+ * JBox2D homepage: http://jbox2d.sourceforge.net/
28
+ * Box2D homepage: http://www.box2d.org
29
+ *
30
+ * This software is provided 'as-is', without any express or implied
31
+ * warranty. In no event will the authors be held liable for any damages
32
+ * arising from the use of this software.
33
+ *
34
+ * Permission is granted to anyone to use this software for any purpose,
35
+ * including commercial applications, and to alter it and redistribute it
36
+ * freely, subject to the following restrictions:
37
+ *
38
+ * 1. The origin of this software must not be misrepresented; you must not
39
+ * claim that you wrote the original software. If you use this software
40
+ * in a product, an acknowledgment in the product documentation would be
41
+ * appreciated but is not required.
42
+ * 2. Altered source versions must be plainly marked as such, and must not be
43
+ * misrepresented as being the original software.
44
+ * 3. This notice may not be removed or altered from any source distribution.
45
+ */
46
+
47
+ package org.jbox2d.dynamics.joints;
48
+
49
+ import org.jbox2d.common.Vec2;
50
+ import org.jbox2d.dynamics.Body;
51
+
52
+ //Updated to rev 56->130->142 of b2DistanceJoint.cpp/.h
53
+
54
+ /**
55
+ * Distance joint definition. This requires defining an anchor point on both bodies and the non-zero
56
+ * length of the distance joint. The definition uses local anchor points so that the initial
57
+ * configuration can violate the constraint slightly. This helps when saving and loading a game.
58
+ *
59
+ * @warning Do not use a zero or short length.
60
+ */
61
+ public class DistanceJointDef extends JointDef {
62
+ /** The local anchor point relative to body1's origin. */
63
+ public final Vec2 localAnchorA;
64
+
65
+ /** The local anchor point relative to body2's origin. */
66
+ public final Vec2 localAnchorB;
67
+
68
+ /** The equilibrium length between the anchor points. */
69
+ public float length;
70
+
71
+ /**
72
+ * The mass-spring-damper frequency in Hertz.
73
+ */
74
+ public float frequencyHz;
75
+
76
+ /**
77
+ * The damping ratio. 0 = no damping, 1 = critical damping.
78
+ */
79
+ public float dampingRatio;
80
+
81
+ public DistanceJointDef() {
82
+ super(JointType.DISTANCE);
83
+ localAnchorA = new Vec2(0.0f, 0.0f);
84
+ localAnchorB = new Vec2(0.0f, 0.0f);
85
+ length = 1.0f;
86
+ frequencyHz = 0.0f;
87
+ dampingRatio = 0.0f;
88
+ }
89
+
90
+ /**
91
+ * Initialize the bodies, anchors, and length using the world anchors.
92
+ *
93
+ * @param b1 First body
94
+ * @param b2 Second body
95
+ * @param anchor1 World anchor on first body
96
+ * @param anchor2 World anchor on second body
97
+ */
98
+ public void initialize(final Body b1, final Body b2, final Vec2 anchor1, final Vec2 anchor2) {
99
+ bodyA = b1;
100
+ bodyB = b2;
101
+ localAnchorA.set(bodyA.getLocalPoint(anchor1));
102
+ localAnchorB.set(bodyB.getLocalPoint(anchor2));
103
+ Vec2 d = anchor2.sub(anchor1);
104
+ length = d.length();
105
+ }
106
+ }