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,520 @@
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 11:34:45 AM Jan 23, 2011
26
+ */
27
+ package org.jbox2d.dynamics.joints;
28
+
29
+ import org.jbox2d.common.Rot;
30
+ import org.jbox2d.common.Settings;
31
+ import org.jbox2d.common.Transform;
32
+ import org.jbox2d.common.Vec2;
33
+ import org.jbox2d.dynamics.Body;
34
+ import org.jbox2d.dynamics.SolverData;
35
+ import org.jbox2d.pooling.IWorldPool;
36
+
37
+ //Gear Joint:
38
+ //C0 = (coordinate1 + ratio * coordinate2)_initial
39
+ //C = (coordinate1 + ratio * coordinate2) - C0 = 0
40
+ //J = [J1 ratio * J2]
41
+ //K = J * invM * JT
42
+ //= J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T
43
+ //
44
+ //Revolute:
45
+ //coordinate = rotation
46
+ //Cdot = angularVelocity
47
+ //J = [0 0 1]
48
+ //K = J * invM * JT = invI
49
+ //
50
+ //Prismatic:
51
+ //coordinate = dot(p - pg, ug)
52
+ //Cdot = dot(v + cross(w, r), ug)
53
+ //J = [ug cross(r, ug)]
54
+ //K = J * invM * JT = invMass + invI * cross(r, ug)^2
55
+
56
+ /**
57
+ * A gear joint is used to connect two joints together. Either joint can be a revolute or prismatic
58
+ * joint. You specify a gear ratio to bind the motions together: coordinate1 + ratio * coordinate2 =
59
+ * constant The ratio can be negative or positive. If one joint is a revolute joint and the other
60
+ * joint is a prismatic joint, then the ratio will have units of length or units of 1/length.
61
+ *
62
+ * @warning The revolute and prismatic joints must be attached to fixed bodies (which must be body1
63
+ * on those joints).
64
+ * @warning You have to manually destroy the gear joint if joint1 or joint2 is destroyed.
65
+ * @author Daniel Murphy
66
+ */
67
+ public class GearJoint extends Joint {
68
+
69
+ private final Joint m_joint1;
70
+ private final Joint m_joint2;
71
+
72
+ private final JointType m_typeA;
73
+ private final JointType m_typeB;
74
+
75
+ // Body A is connected to body C
76
+ // Body B is connected to body D
77
+ private final Body m_bodyC;
78
+ private final Body m_bodyD;
79
+
80
+ // Solver shared
81
+ private final Vec2 m_localAnchorA = new Vec2();
82
+ private final Vec2 m_localAnchorB = new Vec2();
83
+ private final Vec2 m_localAnchorC = new Vec2();
84
+ private final Vec2 m_localAnchorD = new Vec2();
85
+
86
+ private final Vec2 m_localAxisC = new Vec2();
87
+ private final Vec2 m_localAxisD = new Vec2();
88
+
89
+ private float m_referenceAngleA;
90
+ private float m_referenceAngleB;
91
+
92
+ private float m_constant;
93
+ private float m_ratio;
94
+
95
+ private float m_impulse;
96
+
97
+ // Solver temp
98
+ private int m_indexA, m_indexB, m_indexC, m_indexD;
99
+ private final Vec2 m_lcA = new Vec2(), m_lcB = new Vec2(), m_lcC = new Vec2(),
100
+ m_lcD = new Vec2();
101
+ private float m_mA, m_mB, m_mC, m_mD;
102
+ private float m_iA, m_iB, m_iC, m_iD;
103
+ private final Vec2 m_JvAC = new Vec2(), m_JvBD = new Vec2();
104
+ private float m_JwA, m_JwB, m_JwC, m_JwD;
105
+ private float m_mass;
106
+
107
+ protected GearJoint(IWorldPool argWorldPool, GearJointDef def) {
108
+ super(argWorldPool, def);
109
+
110
+ m_joint1 = def.joint1;
111
+ m_joint2 = def.joint2;
112
+
113
+ m_typeA = m_joint1.getType();
114
+ m_typeB = m_joint2.getType();
115
+
116
+ assert (m_typeA == JointType.REVOLUTE || m_typeA == JointType.PRISMATIC);
117
+ assert (m_typeB == JointType.REVOLUTE || m_typeB == JointType.PRISMATIC);
118
+
119
+ float coordinateA, coordinateB;
120
+
121
+ // TODO_ERIN there might be some problem with the joint edges in Joint.
122
+
123
+ m_bodyC = m_joint1.getBodyA();
124
+ m_bodyA = m_joint1.getBodyB();
125
+
126
+ // Get geometry of joint1
127
+ Transform xfA = m_bodyA.m_xf;
128
+ float aA = m_bodyA.m_sweep.a;
129
+ Transform xfC = m_bodyC.m_xf;
130
+ float aC = m_bodyC.m_sweep.a;
131
+
132
+ if (m_typeA == JointType.REVOLUTE) {
133
+ RevoluteJoint revolute = (RevoluteJoint) def.joint1;
134
+ m_localAnchorC.set(revolute.m_localAnchorA);
135
+ m_localAnchorA.set(revolute.m_localAnchorB);
136
+ m_referenceAngleA = revolute.m_referenceAngle;
137
+ m_localAxisC.setZero();
138
+
139
+ coordinateA = aA - aC - m_referenceAngleA;
140
+ } else {
141
+ Vec2 pA = pool.popVec2();
142
+ Vec2 temp = pool.popVec2();
143
+ PrismaticJoint prismatic = (PrismaticJoint) def.joint1;
144
+ m_localAnchorC.set(prismatic.m_localAnchorA);
145
+ m_localAnchorA.set(prismatic.m_localAnchorB);
146
+ m_referenceAngleA = prismatic.m_referenceAngle;
147
+ m_localAxisC.set(prismatic.m_localXAxisA);
148
+
149
+ Vec2 pC = m_localAnchorC;
150
+ Rot.mulToOutUnsafe(xfA.q, m_localAnchorA, temp);
151
+ temp.addLocal(xfA.p).subLocal(xfC.p);
152
+ Rot.mulTransUnsafe(xfC.q, temp, pA);
153
+ coordinateA = Vec2.dot(pA.subLocal(pC), m_localAxisC);
154
+ pool.pushVec2(2);
155
+ }
156
+
157
+ m_bodyD = m_joint2.getBodyA();
158
+ m_bodyB = m_joint2.getBodyB();
159
+
160
+ // Get geometry of joint2
161
+ Transform xfB = m_bodyB.m_xf;
162
+ float aB = m_bodyB.m_sweep.a;
163
+ Transform xfD = m_bodyD.m_xf;
164
+ float aD = m_bodyD.m_sweep.a;
165
+
166
+ if (m_typeB == JointType.REVOLUTE) {
167
+ RevoluteJoint revolute = (RevoluteJoint) def.joint2;
168
+ m_localAnchorD.set(revolute.m_localAnchorA);
169
+ m_localAnchorB.set(revolute.m_localAnchorB);
170
+ m_referenceAngleB = revolute.m_referenceAngle;
171
+ m_localAxisD.setZero();
172
+
173
+ coordinateB = aB - aD - m_referenceAngleB;
174
+ } else {
175
+ Vec2 pB = pool.popVec2();
176
+ Vec2 temp = pool.popVec2();
177
+ PrismaticJoint prismatic = (PrismaticJoint) def.joint2;
178
+ m_localAnchorD.set(prismatic.m_localAnchorA);
179
+ m_localAnchorB.set(prismatic.m_localAnchorB);
180
+ m_referenceAngleB = prismatic.m_referenceAngle;
181
+ m_localAxisD.set(prismatic.m_localXAxisA);
182
+
183
+ Vec2 pD = m_localAnchorD;
184
+ Rot.mulToOutUnsafe(xfB.q, m_localAnchorB, temp);
185
+ temp.addLocal(xfB.p).subLocal(xfD.p);
186
+ Rot.mulTransUnsafe(xfD.q, temp, pB);
187
+ coordinateB = Vec2.dot(pB.subLocal(pD), m_localAxisD);
188
+ pool.pushVec2(2);
189
+ }
190
+
191
+ m_ratio = def.ratio;
192
+
193
+ m_constant = coordinateA + m_ratio * coordinateB;
194
+
195
+ m_impulse = 0.0f;
196
+ }
197
+
198
+ @Override
199
+ public void getAnchorA(Vec2 argOut) {
200
+ m_bodyA.getWorldPointToOut(m_localAnchorA, argOut);
201
+ }
202
+
203
+ @Override
204
+ public void getAnchorB(Vec2 argOut) {
205
+ m_bodyB.getWorldPointToOut(m_localAnchorB, argOut);
206
+ }
207
+
208
+ @Override
209
+ public void getReactionForce(float inv_dt, Vec2 argOut) {
210
+ argOut.set(m_JvAC).mulLocal(m_impulse);
211
+ argOut.mulLocal(inv_dt);
212
+ }
213
+
214
+ @Override
215
+ public float getReactionTorque(float inv_dt) {
216
+ float L = m_impulse * m_JwA;
217
+ return inv_dt * L;
218
+ }
219
+
220
+ public void setRatio(float argRatio) {
221
+ m_ratio = argRatio;
222
+ }
223
+
224
+ public float getRatio() {
225
+ return m_ratio;
226
+ }
227
+
228
+ @Override
229
+ public void initVelocityConstraints(SolverData data) {
230
+ m_indexA = m_bodyA.m_islandIndex;
231
+ m_indexB = m_bodyB.m_islandIndex;
232
+ m_indexC = m_bodyC.m_islandIndex;
233
+ m_indexD = m_bodyD.m_islandIndex;
234
+ m_lcA.set(m_bodyA.m_sweep.localCenter);
235
+ m_lcB.set(m_bodyB.m_sweep.localCenter);
236
+ m_lcC.set(m_bodyC.m_sweep.localCenter);
237
+ m_lcD.set(m_bodyD.m_sweep.localCenter);
238
+ m_mA = m_bodyA.m_invMass;
239
+ m_mB = m_bodyB.m_invMass;
240
+ m_mC = m_bodyC.m_invMass;
241
+ m_mD = m_bodyD.m_invMass;
242
+ m_iA = m_bodyA.m_invI;
243
+ m_iB = m_bodyB.m_invI;
244
+ m_iC = m_bodyC.m_invI;
245
+ m_iD = m_bodyD.m_invI;
246
+
247
+ // Vec2 cA = data.positions[m_indexA].c;
248
+ float aA = data.positions[m_indexA].a;
249
+ Vec2 vA = data.velocities[m_indexA].v;
250
+ float wA = data.velocities[m_indexA].w;
251
+
252
+ // Vec2 cB = data.positions[m_indexB].c;
253
+ float aB = data.positions[m_indexB].a;
254
+ Vec2 vB = data.velocities[m_indexB].v;
255
+ float wB = data.velocities[m_indexB].w;
256
+
257
+ // Vec2 cC = data.positions[m_indexC].c;
258
+ float aC = data.positions[m_indexC].a;
259
+ Vec2 vC = data.velocities[m_indexC].v;
260
+ float wC = data.velocities[m_indexC].w;
261
+
262
+ // Vec2 cD = data.positions[m_indexD].c;
263
+ float aD = data.positions[m_indexD].a;
264
+ Vec2 vD = data.velocities[m_indexD].v;
265
+ float wD = data.velocities[m_indexD].w;
266
+
267
+ Rot qA = pool.popRot(), qB = pool.popRot(), qC = pool.popRot(), qD = pool.popRot();
268
+ qA.set(aA);
269
+ qB.set(aB);
270
+ qC.set(aC);
271
+ qD.set(aD);
272
+
273
+ m_mass = 0.0f;
274
+
275
+ Vec2 temp = pool.popVec2();
276
+
277
+ if (m_typeA == JointType.REVOLUTE) {
278
+ m_JvAC.setZero();
279
+ m_JwA = 1.0f;
280
+ m_JwC = 1.0f;
281
+ m_mass += m_iA + m_iC;
282
+ } else {
283
+ Vec2 rC = pool.popVec2();
284
+ Vec2 rA = pool.popVec2();
285
+ Rot.mulToOutUnsafe(qC, m_localAxisC, m_JvAC);
286
+ Rot.mulToOutUnsafe(qC, temp.set(m_localAnchorC).subLocal(m_lcC), rC);
287
+ Rot.mulToOutUnsafe(qA, temp.set(m_localAnchorA).subLocal(m_lcA), rA);
288
+ m_JwC = Vec2.cross(rC, m_JvAC);
289
+ m_JwA = Vec2.cross(rA, m_JvAC);
290
+ m_mass += m_mC + m_mA + m_iC * m_JwC * m_JwC + m_iA * m_JwA * m_JwA;
291
+ pool.pushVec2(2);
292
+ }
293
+
294
+ if (m_typeB == JointType.REVOLUTE) {
295
+ m_JvBD.setZero();
296
+ m_JwB = m_ratio;
297
+ m_JwD = m_ratio;
298
+ m_mass += m_ratio * m_ratio * (m_iB + m_iD);
299
+ } else {
300
+ Vec2 u = pool.popVec2();
301
+ Vec2 rD = pool.popVec2();
302
+ Vec2 rB = pool.popVec2();
303
+ Rot.mulToOutUnsafe(qD, m_localAxisD, u);
304
+ Rot.mulToOutUnsafe(qD, temp.set(m_localAnchorD).subLocal(m_lcD), rD);
305
+ Rot.mulToOutUnsafe(qB, temp.set(m_localAnchorB).subLocal(m_lcB), rB);
306
+ m_JvBD.set(u).mulLocal(m_ratio);
307
+ m_JwD = m_ratio * Vec2.cross(rD, u);
308
+ m_JwB = m_ratio * Vec2.cross(rB, u);
309
+ m_mass += m_ratio * m_ratio * (m_mD + m_mB) + m_iD * m_JwD * m_JwD + m_iB * m_JwB * m_JwB;
310
+ pool.pushVec2(3);
311
+ }
312
+
313
+ // Compute effective mass.
314
+ m_mass = m_mass > 0.0f ? 1.0f / m_mass : 0.0f;
315
+
316
+ if (data.step.warmStarting) {
317
+ vA.x += (m_mA * m_impulse) * m_JvAC.x;
318
+ vA.y += (m_mA * m_impulse) * m_JvAC.y;
319
+ wA += m_iA * m_impulse * m_JwA;
320
+
321
+ vB.x += (m_mB * m_impulse) * m_JvBD.x;
322
+ vB.y += (m_mB * m_impulse) * m_JvBD.y;
323
+ wB += m_iB * m_impulse * m_JwB;
324
+
325
+ vC.x -= (m_mC * m_impulse) * m_JvAC.x;
326
+ vC.y -= (m_mC * m_impulse) * m_JvAC.y;
327
+ wC -= m_iC * m_impulse * m_JwC;
328
+
329
+ vD.x -= (m_mD * m_impulse) * m_JvBD.x;
330
+ vD.y -= (m_mD * m_impulse) * m_JvBD.y;
331
+ wD -= m_iD * m_impulse * m_JwD;
332
+ } else {
333
+ m_impulse = 0.0f;
334
+ }
335
+ pool.pushVec2(1);
336
+ pool.pushRot(4);
337
+
338
+ // data.velocities[m_indexA].v = vA;
339
+ data.velocities[m_indexA].w = wA;
340
+ // data.velocities[m_indexB].v = vB;
341
+ data.velocities[m_indexB].w = wB;
342
+ // data.velocities[m_indexC].v = vC;
343
+ data.velocities[m_indexC].w = wC;
344
+ // data.velocities[m_indexD].v = vD;
345
+ data.velocities[m_indexD].w = wD;
346
+ }
347
+
348
+ @Override
349
+ public void solveVelocityConstraints(SolverData data) {
350
+ Vec2 vA = data.velocities[m_indexA].v;
351
+ float wA = data.velocities[m_indexA].w;
352
+ Vec2 vB = data.velocities[m_indexB].v;
353
+ float wB = data.velocities[m_indexB].w;
354
+ Vec2 vC = data.velocities[m_indexC].v;
355
+ float wC = data.velocities[m_indexC].w;
356
+ Vec2 vD = data.velocities[m_indexD].v;
357
+ float wD = data.velocities[m_indexD].w;
358
+
359
+ Vec2 temp1 = pool.popVec2();
360
+ Vec2 temp2 = pool.popVec2();
361
+ float Cdot =
362
+ Vec2.dot(m_JvAC, temp1.set(vA).subLocal(vC)) + Vec2.dot(m_JvBD, temp2.set(vB).subLocal(vD));
363
+ Cdot += (m_JwA * wA - m_JwC * wC) + (m_JwB * wB - m_JwD * wD);
364
+ pool.pushVec2(2);
365
+
366
+ float impulse = -m_mass * Cdot;
367
+ m_impulse += impulse;
368
+
369
+ vA.x += (m_mA * impulse) * m_JvAC.x;
370
+ vA.y += (m_mA * impulse) * m_JvAC.y;
371
+ wA += m_iA * impulse * m_JwA;
372
+
373
+ vB.x += (m_mB * impulse) * m_JvBD.x;
374
+ vB.y += (m_mB * impulse) * m_JvBD.y;
375
+ wB += m_iB * impulse * m_JwB;
376
+
377
+ vC.x -= (m_mC * impulse) * m_JvAC.x;
378
+ vC.y -= (m_mC * impulse) * m_JvAC.y;
379
+ wC -= m_iC * impulse * m_JwC;
380
+
381
+ vD.x -= (m_mD * impulse) * m_JvBD.x;
382
+ vD.y -= (m_mD * impulse) * m_JvBD.y;
383
+ wD -= m_iD * impulse * m_JwD;
384
+
385
+
386
+ // data.velocities[m_indexA].v = vA;
387
+ data.velocities[m_indexA].w = wA;
388
+ // data.velocities[m_indexB].v = vB;
389
+ data.velocities[m_indexB].w = wB;
390
+ // data.velocities[m_indexC].v = vC;
391
+ data.velocities[m_indexC].w = wC;
392
+ // data.velocities[m_indexD].v = vD;
393
+ data.velocities[m_indexD].w = wD;
394
+ }
395
+
396
+ public Joint getJoint1() {
397
+ return m_joint1;
398
+ }
399
+
400
+ public Joint getJoint2() {
401
+ return m_joint2;
402
+ }
403
+
404
+ @Override
405
+ public boolean solvePositionConstraints(SolverData data) {
406
+ Vec2 cA = data.positions[m_indexA].c;
407
+ float aA = data.positions[m_indexA].a;
408
+ Vec2 cB = data.positions[m_indexB].c;
409
+ float aB = data.positions[m_indexB].a;
410
+ Vec2 cC = data.positions[m_indexC].c;
411
+ float aC = data.positions[m_indexC].a;
412
+ Vec2 cD = data.positions[m_indexD].c;
413
+ float aD = data.positions[m_indexD].a;
414
+
415
+ Rot qA = pool.popRot(), qB = pool.popRot(), qC = pool.popRot(), qD = pool.popRot();
416
+ qA.set(aA);
417
+ qB.set(aB);
418
+ qC.set(aC);
419
+ qD.set(aD);
420
+
421
+ float linearError = 0.0f;
422
+
423
+ float coordinateA, coordinateB;
424
+
425
+ Vec2 temp = pool.popVec2();
426
+ Vec2 JvAC = pool.popVec2();
427
+ Vec2 JvBD = pool.popVec2();
428
+ float JwA, JwB, JwC, JwD;
429
+ float mass = 0.0f;
430
+
431
+ if (m_typeA == JointType.REVOLUTE) {
432
+ JvAC.setZero();
433
+ JwA = 1.0f;
434
+ JwC = 1.0f;
435
+ mass += m_iA + m_iC;
436
+
437
+ coordinateA = aA - aC - m_referenceAngleA;
438
+ } else {
439
+ Vec2 rC = pool.popVec2();
440
+ Vec2 rA = pool.popVec2();
441
+ Vec2 pC = pool.popVec2();
442
+ Vec2 pA = pool.popVec2();
443
+ Rot.mulToOutUnsafe(qC, m_localAxisC, JvAC);
444
+ Rot.mulToOutUnsafe(qC, temp.set(m_localAnchorC).subLocal(m_lcC), rC);
445
+ Rot.mulToOutUnsafe(qA, temp.set(m_localAnchorA).subLocal(m_lcA), rA);
446
+ JwC = Vec2.cross(rC, JvAC);
447
+ JwA = Vec2.cross(rA, JvAC);
448
+ mass += m_mC + m_mA + m_iC * JwC * JwC + m_iA * JwA * JwA;
449
+
450
+ pC.set(m_localAnchorC).subLocal(m_lcC);
451
+ Rot.mulTransUnsafe(qC, temp.set(rA).addLocal(cA).subLocal(cC), pA);
452
+ coordinateA = Vec2.dot(pA.subLocal(pC), m_localAxisC);
453
+ pool.pushVec2(4);
454
+ }
455
+
456
+ if (m_typeB == JointType.REVOLUTE) {
457
+ JvBD.setZero();
458
+ JwB = m_ratio;
459
+ JwD = m_ratio;
460
+ mass += m_ratio * m_ratio * (m_iB + m_iD);
461
+
462
+ coordinateB = aB - aD - m_referenceAngleB;
463
+ } else {
464
+ Vec2 u = pool.popVec2();
465
+ Vec2 rD = pool.popVec2();
466
+ Vec2 rB = pool.popVec2();
467
+ Vec2 pD = pool.popVec2();
468
+ Vec2 pB = pool.popVec2();
469
+ Rot.mulToOutUnsafe(qD, m_localAxisD, u);
470
+ Rot.mulToOutUnsafe(qD, temp.set(m_localAnchorD).subLocal(m_lcD), rD);
471
+ Rot.mulToOutUnsafe(qB, temp.set(m_localAnchorB).subLocal(m_lcB), rB);
472
+ JvBD.set(u).mulLocal(m_ratio);
473
+ JwD = Vec2.cross(rD, u);
474
+ JwB = Vec2.cross(rB, u);
475
+ mass += m_ratio * m_ratio * (m_mD + m_mB) + m_iD * JwD * JwD + m_iB * JwB * JwB;
476
+
477
+ pD.set(m_localAnchorD).subLocal(m_lcD);
478
+ Rot.mulTransUnsafe(qD, temp.set(rB).addLocal(cB).subLocal(cD), pB);
479
+ coordinateB = Vec2.dot(pB.subLocal(pD), m_localAxisD);
480
+ pool.pushVec2(5);
481
+ }
482
+
483
+ float C = (coordinateA + m_ratio * coordinateB) - m_constant;
484
+
485
+ float impulse = 0.0f;
486
+ if (mass > 0.0f) {
487
+ impulse = -C / mass;
488
+ }
489
+ pool.pushVec2(3);
490
+ pool.pushRot(4);
491
+
492
+ cA.x += (m_mA * impulse) * JvAC.x;
493
+ cA.y += (m_mA * impulse) * JvAC.y;
494
+ aA += m_iA * impulse * JwA;
495
+
496
+ cB.x += (m_mB * impulse) * JvBD.x;
497
+ cB.y += (m_mB * impulse) * JvBD.y;
498
+ aB += m_iB * impulse * JwB;
499
+
500
+ cC.x -= (m_mC * impulse) * JvAC.x;
501
+ cC.y -= (m_mC * impulse) * JvAC.y;
502
+ aC -= m_iC * impulse * JwC;
503
+
504
+ cD.x -= (m_mD * impulse) * JvBD.x;
505
+ cD.y -= (m_mD * impulse) * JvBD.y;
506
+ aD -= m_iD * impulse * JwD;
507
+
508
+ // data.positions[m_indexA].c = cA;
509
+ data.positions[m_indexA].a = aA;
510
+ // data.positions[m_indexB].c = cB;
511
+ data.positions[m_indexB].a = aB;
512
+ // data.positions[m_indexC].c = cC;
513
+ data.positions[m_indexC].a = aC;
514
+ // data.positions[m_indexD].c = cD;
515
+ data.positions[m_indexD].a = aD;
516
+
517
+ // TODO_ERIN not implemented
518
+ return linearError < Settings.linearSlop;
519
+ }
520
+ }
@@ -0,0 +1,58 @@
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 5:20:39 AM Jan 22, 2011
26
+ */
27
+ package org.jbox2d.dynamics.joints;
28
+
29
+ /**
30
+ * Gear joint definition. This definition requires two existing revolute or prismatic joints (any
31
+ * combination will work). The provided joints must attach a dynamic body to a static body.
32
+ *
33
+ * @author Daniel Murphy
34
+ */
35
+ public class GearJointDef extends JointDef {
36
+ /**
37
+ * The first revolute/prismatic joint attached to the gear joint.
38
+ */
39
+ public Joint joint1;
40
+
41
+ /**
42
+ * The second revolute/prismatic joint attached to the gear joint.
43
+ */
44
+ public Joint joint2;
45
+
46
+ /**
47
+ * Gear ratio.
48
+ *
49
+ * @see GearJoint
50
+ */
51
+ public float ratio;
52
+
53
+ public GearJointDef() {
54
+ super(JointType.GEAR);
55
+ joint1 = null;
56
+ joint2 = null;
57
+ }
58
+ }
@@ -0,0 +1,32 @@
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.joints;
25
+
26
+ import org.jbox2d.common.Vec2;
27
+
28
+ public class Jacobian {
29
+ public final Vec2 linearA = new Vec2();
30
+ public float angularA;
31
+ public float angularB;
32
+ }