box2d-rails 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/.gitignore +17 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +29 -0
  5. data/Rakefile +1 -0
  6. data/box2d-rails.gemspec +20 -0
  7. data/lib/box2d-rails.rb +8 -0
  8. data/lib/box2d-rails/version.rb +5 -0
  9. data/vendor/assets/javascripts/box2d/collision/ClipVertex.js +35 -0
  10. data/vendor/assets/javascripts/box2d/collision/Features.js +61 -0
  11. data/vendor/assets/javascripts/box2d/collision/b2AABB.js +45 -0
  12. data/vendor/assets/javascripts/box2d/collision/b2Bound.js +43 -0
  13. data/vendor/assets/javascripts/box2d/collision/b2BoundValues.js +31 -0
  14. data/vendor/assets/javascripts/box2d/collision/b2BroadPhase.js +898 -0
  15. data/vendor/assets/javascripts/box2d/collision/b2BufferedPair.js +26 -0
  16. data/vendor/assets/javascripts/box2d/collision/b2Collision.js +738 -0
  17. data/vendor/assets/javascripts/box2d/collision/b2ContactID.js +52 -0
  18. data/vendor/assets/javascripts/box2d/collision/b2ContactPoint.js +35 -0
  19. data/vendor/assets/javascripts/box2d/collision/b2Distance.js +333 -0
  20. data/vendor/assets/javascripts/box2d/collision/b2Manifold.js +34 -0
  21. data/vendor/assets/javascripts/box2d/collision/b2OBB.js +34 -0
  22. data/vendor/assets/javascripts/box2d/collision/b2Pair.js +60 -0
  23. data/vendor/assets/javascripts/box2d/collision/b2PairCallback.js +34 -0
  24. data/vendor/assets/javascripts/box2d/collision/b2PairManager.js +386 -0
  25. data/vendor/assets/javascripts/box2d/collision/b2Proxy.js +40 -0
  26. data/vendor/assets/javascripts/box2d/collision/shapes/b2BoxDef.js +49 -0
  27. data/vendor/assets/javascripts/box2d/collision/shapes/b2CircleDef.js +49 -0
  28. data/vendor/assets/javascripts/box2d/collision/shapes/b2CircleShape.js +198 -0
  29. data/vendor/assets/javascripts/box2d/collision/shapes/b2MassData.js +36 -0
  30. data/vendor/assets/javascripts/box2d/collision/shapes/b2PolyDef.js +58 -0
  31. data/vendor/assets/javascripts/box2d/collision/shapes/b2PolyShape.js +492 -0
  32. data/vendor/assets/javascripts/box2d/collision/shapes/b2Shape.js +339 -0
  33. data/vendor/assets/javascripts/box2d/collision/shapes/b2ShapeDef.js +109 -0
  34. data/vendor/assets/javascripts/box2d/common/b2Settings.js +72 -0
  35. data/vendor/assets/javascripts/box2d/common/math/b2Mat22.js +130 -0
  36. data/vendor/assets/javascripts/box2d/common/math/b2Math.js +218 -0
  37. data/vendor/assets/javascripts/box2d/common/math/b2Vec2.js +131 -0
  38. data/vendor/assets/javascripts/box2d/dynamics/b2Body.js +469 -0
  39. data/vendor/assets/javascripts/box2d/dynamics/b2BodyDef.js +69 -0
  40. data/vendor/assets/javascripts/box2d/dynamics/b2CollisionFilter.js +42 -0
  41. data/vendor/assets/javascripts/box2d/dynamics/b2ContactManager.js +337 -0
  42. data/vendor/assets/javascripts/box2d/dynamics/b2Island.js +331 -0
  43. data/vendor/assets/javascripts/box2d/dynamics/b2TimeStep.js +27 -0
  44. data/vendor/assets/javascripts/box2d/dynamics/b2World.js +522 -0
  45. data/vendor/assets/javascripts/box2d/dynamics/b2WorldListener.js +52 -0
  46. data/vendor/assets/javascripts/box2d/dynamics/contacts/b2CircleContact.js +102 -0
  47. data/vendor/assets/javascripts/box2d/dynamics/contacts/b2Conservative.js +228 -0
  48. data/vendor/assets/javascripts/box2d/dynamics/contacts/b2Contact.js +201 -0
  49. data/vendor/assets/javascripts/box2d/dynamics/contacts/b2ContactConstraint.js +45 -0
  50. data/vendor/assets/javascripts/box2d/dynamics/contacts/b2ContactConstraintPoint.js +40 -0
  51. data/vendor/assets/javascripts/box2d/dynamics/contacts/b2ContactNode.js +33 -0
  52. data/vendor/assets/javascripts/box2d/dynamics/contacts/b2ContactRegister.js +30 -0
  53. data/vendor/assets/javascripts/box2d/dynamics/contacts/b2ContactSolver.js +537 -0
  54. data/vendor/assets/javascripts/box2d/dynamics/contacts/b2NullContact.js +65 -0
  55. data/vendor/assets/javascripts/box2d/dynamics/contacts/b2PolyAndCircleContact.js +103 -0
  56. data/vendor/assets/javascripts/box2d/dynamics/contacts/b2PolyContact.js +163 -0
  57. data/vendor/assets/javascripts/box2d/dynamics/joints/b2DistanceJoint.js +264 -0
  58. data/vendor/assets/javascripts/box2d/dynamics/joints/b2DistanceJointDef.js +49 -0
  59. data/vendor/assets/javascripts/box2d/dynamics/joints/b2GearJoint.js +307 -0
  60. data/vendor/assets/javascripts/box2d/dynamics/joints/b2GearJointDef.js +50 -0
  61. data/vendor/assets/javascripts/box2d/dynamics/joints/b2Jacobian.js +49 -0
  62. data/vendor/assets/javascripts/box2d/dynamics/joints/b2Joint.js +200 -0
  63. data/vendor/assets/javascripts/box2d/dynamics/joints/b2JointDef.js +40 -0
  64. data/vendor/assets/javascripts/box2d/dynamics/joints/b2JointNode.js +33 -0
  65. data/vendor/assets/javascripts/box2d/dynamics/joints/b2MouseJoint.js +234 -0
  66. data/vendor/assets/javascripts/box2d/dynamics/joints/b2MouseJointDef.js +53 -0
  67. data/vendor/assets/javascripts/box2d/dynamics/joints/b2PrismaticJoint.js +676 -0
  68. data/vendor/assets/javascripts/box2d/dynamics/joints/b2PrismaticJointDef.js +56 -0
  69. data/vendor/assets/javascripts/box2d/dynamics/joints/b2PulleyJoint.js +618 -0
  70. data/vendor/assets/javascripts/box2d/dynamics/joints/b2PulleyJointDef.js +70 -0
  71. data/vendor/assets/javascripts/box2d/dynamics/joints/b2RevoluteJoint.js +491 -0
  72. data/vendor/assets/javascripts/box2d/dynamics/joints/b2RevoluteJointDef.js +55 -0
  73. metadata +133 -0
@@ -0,0 +1,56 @@
1
+ /*
2
+ * Copyright (c) 2006-2007 Erin Catto http:
3
+ *
4
+ * This software is provided 'as-is', without any express or implied
5
+ * warranty. In no event will the authors be held liable for any damages
6
+ * arising from the use of this software.
7
+ * Permission is granted to anyone to use this software for any purpose,
8
+ * including commercial applications, and to alter it and redistribute it
9
+ * freely, subject to the following restrictions:
10
+ * 1. The origin of this software must not be misrepresented; you must not
11
+ * claim that you wrote the original software. If you use this software
12
+ * in a product, an acknowledgment in the product documentation would be
13
+ * appreciated but is not required.
14
+ * 2. Altered source versions must be plainly marked, and must not be
15
+ * misrepresented the original software.
16
+ * 3. This notice may not be removed or altered from any source distribution.
17
+ */
18
+
19
+
20
+
21
+
22
+
23
+ var b2PrismaticJointDef = Class.create();
24
+ Object.extend(b2PrismaticJointDef.prototype, b2JointDef.prototype);
25
+ Object.extend(b2PrismaticJointDef.prototype,
26
+ {
27
+ initialize: function()
28
+ {
29
+ // The constructor for b2JointDef
30
+ this.type = b2Joint.e_unknownJoint;
31
+ this.userData = null;
32
+ this.body1 = null;
33
+ this.body2 = null;
34
+ this.collideConnected = false;
35
+ //
36
+
37
+ this.type = b2Joint.e_prismaticJoint;
38
+ this.anchorPoint = new b2Vec2(0.0, 0.0);
39
+ this.axis = new b2Vec2(0.0, 0.0);
40
+ this.lowerTranslation = 0.0;
41
+ this.upperTranslation = 0.0;
42
+ this.motorForce = 0.0;
43
+ this.motorSpeed = 0.0;
44
+ this.enableLimit = false;
45
+ this.enableMotor = false;
46
+ },
47
+
48
+ anchorPoint: null,
49
+ axis: null,
50
+ lowerTranslation: null,
51
+ upperTranslation: null,
52
+ motorForce: null,
53
+ motorSpeed: null,
54
+ enableLimit: null,
55
+ enableMotor: null});
56
+
@@ -0,0 +1,618 @@
1
+ /*
2
+ * Copyright (c) 2006-2007 Erin Catto http:
3
+ *
4
+ * This software is provided 'as-is', without any express or implied
5
+ * warranty. In no event will the authors be held liable for any damages
6
+ * arising from the use of this software.
7
+ * Permission is granted to anyone to use this software for any purpose,
8
+ * including commercial applications, and to alter it and redistribute it
9
+ * freely, subject to the following restrictions:
10
+ * 1. The origin of this software must not be misrepresented; you must not
11
+ * claim that you wrote the original software. If you use this software
12
+ * in a product, an acknowledgment in the product documentation would be
13
+ * appreciated but is not required.
14
+ * 2. Altered source versions must be plainly marked, and must not be
15
+ * misrepresented the original software.
16
+ * 3. This notice may not be removed or altered from any source distribution.
17
+ */
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+ var b2PulleyJoint = Class.create();
26
+ Object.extend(b2PulleyJoint.prototype, b2Joint.prototype);
27
+ Object.extend(b2PulleyJoint.prototype,
28
+ {
29
+ GetAnchor1: function(){
30
+ //return this.m_body1->m_position + b2Mul(this.m_body1->m_R, this.m_localAnchor1);
31
+ var tMat = this.m_body1.m_R;
32
+ return new b2Vec2( this.m_body1.m_position.x + (tMat.col1.x * this.m_localAnchor1.x + tMat.col2.x * this.m_localAnchor1.y),
33
+ this.m_body1.m_position.y + (tMat.col1.y * this.m_localAnchor1.x + tMat.col2.y * this.m_localAnchor1.y));
34
+ },
35
+ GetAnchor2: function(){
36
+ //return this.m_body2->m_position + b2Mul(this.m_body2->m_R, this.m_localAnchor2);
37
+ var tMat = this.m_body2.m_R;
38
+ return new b2Vec2( this.m_body2.m_position.x + (tMat.col1.x * this.m_localAnchor2.x + tMat.col2.x * this.m_localAnchor2.y),
39
+ this.m_body2.m_position.y + (tMat.col1.y * this.m_localAnchor2.x + tMat.col2.y * this.m_localAnchor2.y));
40
+ },
41
+
42
+ GetGroundPoint1: function(){
43
+ //return this.m_ground->m_position + this.m_groundAnchor1;
44
+ return new b2Vec2(this.m_ground.m_position.x + this.m_groundAnchor1.x, this.m_ground.m_position.y + this.m_groundAnchor1.y);
45
+ },
46
+ GetGroundPoint2: function(){
47
+ return new b2Vec2(this.m_ground.m_position.x + this.m_groundAnchor2.x, this.m_ground.m_position.y + this.m_groundAnchor2.y);
48
+ },
49
+
50
+ GetReactionForce: function(invTimeStep){
51
+ //b2Vec2 F(0.0f, 0.0f);
52
+ return new b2Vec2();
53
+ },
54
+ GetReactionTorque: function(invTimeStep){
55
+ return 0.0;
56
+ },
57
+
58
+ GetLength1: function(){
59
+ var tMat;
60
+ //b2Vec2 p = this.m_body1->m_position + b2Mul(this.m_body1->m_R, this.m_localAnchor1);
61
+ tMat = this.m_body1.m_R;
62
+ var pX = this.m_body1.m_position.x + (tMat.col1.x * this.m_localAnchor1.x + tMat.col2.x * this.m_localAnchor1.y);
63
+ var pY = this.m_body1.m_position.y + (tMat.col1.y * this.m_localAnchor1.x + tMat.col2.y * this.m_localAnchor1.y);
64
+ //b2Vec2 s = this.m_ground->m_position + this.m_groundAnchor1;
65
+ //b2Vec2 d = p - s;
66
+ var dX = pX - (this.m_ground.m_position.x + this.m_groundAnchor1.x);
67
+ var dY = pY - (this.m_ground.m_position.y + this.m_groundAnchor1.y);
68
+ return Math.sqrt(dX*dX + dY*dY);
69
+ },
70
+ GetLength2: function(){
71
+ var tMat;
72
+ //b2Vec2 p = this.m_body2->m_position + b2Mul(this.m_body2->m_R, this.m_localAnchor2);
73
+ tMat = this.m_body2.m_R;
74
+ var pX = this.m_body2.m_position.x + (tMat.col1.x * this.m_localAnchor2.x + tMat.col2.x * this.m_localAnchor2.y);
75
+ var pY = this.m_body2.m_position.y + (tMat.col1.y * this.m_localAnchor2.x + tMat.col2.y * this.m_localAnchor2.y);
76
+ //b2Vec2 s = this.m_ground->m_position + this.m_groundAnchor2;
77
+ //b2Vec2 d = p - s;
78
+ var dX = pX - (this.m_ground.m_position.x + this.m_groundAnchor2.x);
79
+ var dY = pY - (this.m_ground.m_position.y + this.m_groundAnchor2.y);
80
+ return Math.sqrt(dX*dX + dY*dY);
81
+ },
82
+
83
+ GetRatio: function(){
84
+ return this.m_ratio;
85
+ },
86
+
87
+ //--------------- Internals Below -------------------
88
+
89
+ initialize: function(def){
90
+ // The constructor for b2Joint
91
+ // initialize instance variables for references
92
+ this.m_node1 = new b2JointNode();
93
+ this.m_node2 = new b2JointNode();
94
+ //
95
+ this.m_type = def.type;
96
+ this.m_prev = null;
97
+ this.m_next = null;
98
+ this.m_body1 = def.body1;
99
+ this.m_body2 = def.body2;
100
+ this.m_collideConnected = def.collideConnected;
101
+ this.m_islandFlag = false;
102
+ this.m_userData = def.userData;
103
+ //
104
+
105
+ // initialize instance variables for references
106
+ this.m_groundAnchor1 = new b2Vec2();
107
+ this.m_groundAnchor2 = new b2Vec2();
108
+ this.m_localAnchor1 = new b2Vec2();
109
+ this.m_localAnchor2 = new b2Vec2();
110
+ this.m_u1 = new b2Vec2();
111
+ this.m_u2 = new b2Vec2();
112
+ //
113
+
114
+
115
+ // parent
116
+ //super(def);
117
+
118
+ var tMat;
119
+ var tX;
120
+ var tY;
121
+
122
+ this.m_ground = this.m_body1.m_world.m_groundBody;
123
+ //this.m_groundAnchor1 = def.groundPoint1 - this.m_ground.m_position;
124
+ this.m_groundAnchor1.x = def.groundPoint1.x - this.m_ground.m_position.x;
125
+ this.m_groundAnchor1.y = def.groundPoint1.y - this.m_ground.m_position.y;
126
+ //this.m_groundAnchor2 = def.groundPoint2 - this.m_ground.m_position;
127
+ this.m_groundAnchor2.x = def.groundPoint2.x - this.m_ground.m_position.x;
128
+ this.m_groundAnchor2.y = def.groundPoint2.y - this.m_ground.m_position.y;
129
+ //this.m_localAnchor1 = b2MulT(this.m_body1.m_R, def.anchorPoint1 - this.m_body1.m_position);
130
+ tMat = this.m_body1.m_R;
131
+ tX = def.anchorPoint1.x - this.m_body1.m_position.x;
132
+ tY = def.anchorPoint1.y - this.m_body1.m_position.y;
133
+ this.m_localAnchor1.x = tX*tMat.col1.x + tY*tMat.col1.y;
134
+ this.m_localAnchor1.y = tX*tMat.col2.x + tY*tMat.col2.y;
135
+ //this.m_localAnchor2 = b2MulT(this.m_body2.m_R, def.anchorPoint2 - this.m_body2.m_position);
136
+ tMat = this.m_body2.m_R;
137
+ tX = def.anchorPoint2.x - this.m_body2.m_position.x;
138
+ tY = def.anchorPoint2.y - this.m_body2.m_position.y;
139
+ this.m_localAnchor2.x = tX*tMat.col1.x + tY*tMat.col1.y;
140
+ this.m_localAnchor2.y = tX*tMat.col2.x + tY*tMat.col2.y;
141
+
142
+ this.m_ratio = def.ratio;
143
+
144
+ //var d1 = def.groundPoint1 - def.anchorPoint1;
145
+ tX = def.groundPoint1.x - def.anchorPoint1.x;
146
+ tY = def.groundPoint1.y - def.anchorPoint1.y;
147
+ var d1Len = Math.sqrt(tX*tX + tY*tY);
148
+ //var d2 = def.groundPoint2 - def.anchorPoint2;
149
+ tX = def.groundPoint2.x - def.anchorPoint2.x;
150
+ tY = def.groundPoint2.y - def.anchorPoint2.y;
151
+ var d2Len = Math.sqrt(tX*tX + tY*tY);
152
+
153
+ var length1 = b2Math.b2Max(0.5 * b2PulleyJoint.b2_minPulleyLength, d1Len);
154
+ var length2 = b2Math.b2Max(0.5 * b2PulleyJoint.b2_minPulleyLength, d2Len);
155
+
156
+ this.m_constant = length1 + this.m_ratio * length2;
157
+
158
+ this.m_maxLength1 = b2Math.b2Clamp(def.maxLength1, length1, this.m_constant - this.m_ratio * b2PulleyJoint.b2_minPulleyLength);
159
+ this.m_maxLength2 = b2Math.b2Clamp(def.maxLength2, length2, (this.m_constant - b2PulleyJoint.b2_minPulleyLength) / this.m_ratio);
160
+
161
+ this.m_pulleyImpulse = 0.0;
162
+ this.m_limitImpulse1 = 0.0;
163
+ this.m_limitImpulse2 = 0.0;
164
+
165
+ },
166
+
167
+ PrepareVelocitySolver: function(){
168
+ var b1 = this.m_body1;
169
+ var b2 = this.m_body2;
170
+
171
+ var tMat;
172
+
173
+ //b2Vec2 r1 = b2Mul(b1->m_R, this.m_localAnchor1);
174
+ tMat = b1.m_R;
175
+ var r1X = tMat.col1.x * this.m_localAnchor1.x + tMat.col2.x * this.m_localAnchor1.y;
176
+ var r1Y = tMat.col1.y * this.m_localAnchor1.x + tMat.col2.y * this.m_localAnchor1.y;
177
+ //b2Vec2 r2 = b2Mul(b2->m_R, this.m_localAnchor2);
178
+ tMat = b2.m_R;
179
+ var r2X = tMat.col1.x * this.m_localAnchor2.x + tMat.col2.x * this.m_localAnchor2.y;
180
+ var r2Y = tMat.col1.y * this.m_localAnchor2.x + tMat.col2.y * this.m_localAnchor2.y;
181
+
182
+ //b2Vec2 p1 = b1->m_position + r1;
183
+ var p1X = b1.m_position.x + r1X;
184
+ var p1Y = b1.m_position.y + r1Y;
185
+ //b2Vec2 p2 = b2->m_position + r2;
186
+ var p2X = b2.m_position.x + r2X;
187
+ var p2Y = b2.m_position.y + r2Y;
188
+
189
+ //b2Vec2 s1 = this.m_ground->m_position + this.m_groundAnchor1;
190
+ var s1X = this.m_ground.m_position.x + this.m_groundAnchor1.x;
191
+ var s1Y = this.m_ground.m_position.y + this.m_groundAnchor1.y;
192
+ //b2Vec2 s2 = this.m_ground->m_position + this.m_groundAnchor2;
193
+ var s2X = this.m_ground.m_position.x + this.m_groundAnchor2.x;
194
+ var s2Y = this.m_ground.m_position.y + this.m_groundAnchor2.y;
195
+
196
+ // Get the pulley axes.
197
+ //this.m_u1 = p1 - s1;
198
+ this.m_u1.Set(p1X - s1X, p1Y - s1Y);
199
+ //this.m_u2 = p2 - s2;
200
+ this.m_u2.Set(p2X - s2X, p2Y - s2Y);
201
+
202
+ var length1 = this.m_u1.Length();
203
+ var length2 = this.m_u2.Length();
204
+
205
+ if (length1 > b2Settings.b2_linearSlop)
206
+ {
207
+ //this.m_u1 *= 1.0f / length1;
208
+ this.m_u1.Multiply(1.0 / length1);
209
+ }
210
+ else
211
+ {
212
+ this.m_u1.SetZero();
213
+ }
214
+
215
+ if (length2 > b2Settings.b2_linearSlop)
216
+ {
217
+ //this.m_u2 *= 1.0f / length2;
218
+ this.m_u2.Multiply(1.0 / length2);
219
+ }
220
+ else
221
+ {
222
+ this.m_u2.SetZero();
223
+ }
224
+
225
+ if (length1 < this.m_maxLength1)
226
+ {
227
+ this.m_limitState1 = b2Joint.e_inactiveLimit;
228
+ this.m_limitImpulse1 = 0.0;
229
+ }
230
+ else
231
+ {
232
+ this.m_limitState1 = b2Joint.e_atUpperLimit;
233
+ this.m_limitPositionImpulse1 = 0.0;
234
+ }
235
+
236
+ if (length2 < this.m_maxLength2)
237
+ {
238
+ this.m_limitState2 = b2Joint.e_inactiveLimit;
239
+ this.m_limitImpulse2 = 0.0;
240
+ }
241
+ else
242
+ {
243
+ this.m_limitState2 = b2Joint.e_atUpperLimit;
244
+ this.m_limitPositionImpulse2 = 0.0;
245
+ }
246
+
247
+ // Compute effective mass.
248
+ //var cr1u1 = b2Cross(r1, this.m_u1);
249
+ var cr1u1 = r1X * this.m_u1.y - r1Y * this.m_u1.x;
250
+ //var cr2u2 = b2Cross(r2, this.m_u2);
251
+ var cr2u2 = r2X * this.m_u2.y - r2Y * this.m_u2.x;
252
+
253
+ this.m_limitMass1 = b1.m_invMass + b1.m_invI * cr1u1 * cr1u1;
254
+ this.m_limitMass2 = b2.m_invMass + b2.m_invI * cr2u2 * cr2u2;
255
+ this.m_pulleyMass = this.m_limitMass1 + this.m_ratio * this.m_ratio * this.m_limitMass2;
256
+ //b2Settings.b2Assert(this.m_limitMass1 > Number.MIN_VALUE);
257
+ //b2Settings.b2Assert(this.m_limitMass2 > Number.MIN_VALUE);
258
+ //b2Settings.b2Assert(this.m_pulleyMass > Number.MIN_VALUE);
259
+ this.m_limitMass1 = 1.0 / this.m_limitMass1;
260
+ this.m_limitMass2 = 1.0 / this.m_limitMass2;
261
+ this.m_pulleyMass = 1.0 / this.m_pulleyMass;
262
+
263
+ // Warm starting.
264
+ //b2Vec2 P1 = (-this.m_pulleyImpulse - this.m_limitImpulse1) * this.m_u1;
265
+ var P1X = (-this.m_pulleyImpulse - this.m_limitImpulse1) * this.m_u1.x;
266
+ var P1Y = (-this.m_pulleyImpulse - this.m_limitImpulse1) * this.m_u1.y;
267
+ //b2Vec2 P2 = (-this.m_ratio * this.m_pulleyImpulse - this.m_limitImpulse2) * this.m_u2;
268
+ var P2X = (-this.m_ratio * this.m_pulleyImpulse - this.m_limitImpulse2) * this.m_u2.x;
269
+ var P2Y = (-this.m_ratio * this.m_pulleyImpulse - this.m_limitImpulse2) * this.m_u2.y;
270
+ //b1.m_linearVelocity += b1.m_invMass * P1;
271
+ b1.m_linearVelocity.x += b1.m_invMass * P1X;
272
+ b1.m_linearVelocity.y += b1.m_invMass * P1Y;
273
+ //b1.m_angularVelocity += b1.m_invI * b2Cross(r1, P1);
274
+ b1.m_angularVelocity += b1.m_invI * (r1X * P1Y - r1Y * P1X);
275
+ //b2.m_linearVelocity += b2.m_invMass * P2;
276
+ b2.m_linearVelocity.x += b2.m_invMass * P2X;
277
+ b2.m_linearVelocity.y += b2.m_invMass * P2Y;
278
+ //b2.m_angularVelocity += b2.m_invI * b2Cross(r2, P2);
279
+ b2.m_angularVelocity += b2.m_invI * (r2X * P2Y - r2Y * P2X);
280
+ },
281
+
282
+ SolveVelocityConstraints: function(step){
283
+ var b1 = this.m_body1;
284
+ var b2 = this.m_body2;
285
+
286
+ var tMat;
287
+
288
+ //var r1 = b2Mul(b1.m_R, this.m_localAnchor1);
289
+ tMat = b1.m_R;
290
+ var r1X = tMat.col1.x * this.m_localAnchor1.x + tMat.col2.x * this.m_localAnchor1.y;
291
+ var r1Y = tMat.col1.y * this.m_localAnchor1.x + tMat.col2.y * this.m_localAnchor1.y;
292
+ //var r2 = b2Mul(b2.m_R, this.m_localAnchor2);
293
+ tMat = b2.m_R;
294
+ var r2X = tMat.col1.x * this.m_localAnchor2.x + tMat.col2.x * this.m_localAnchor2.y;
295
+ var r2Y = tMat.col1.y * this.m_localAnchor2.x + tMat.col2.y * this.m_localAnchor2.y;
296
+
297
+ // temp vars
298
+ var v1X;
299
+ var v1Y;
300
+ var v2X;
301
+ var v2Y;
302
+ var P1X;
303
+ var P1Y;
304
+ var P2X;
305
+ var P2Y;
306
+ var Cdot;
307
+ var impulse;
308
+ var oldLimitImpulse;
309
+
310
+ //{
311
+ //b2Vec2 v1 = b1->m_linearVelocity + b2Cross(b1->m_angularVelocity, r1);
312
+ v1X = b1.m_linearVelocity.x + (-b1.m_angularVelocity * r1Y);
313
+ v1Y = b1.m_linearVelocity.y + (b1.m_angularVelocity * r1X);
314
+ //b2Vec2 v2 = b2->m_linearVelocity + b2Cross(b2->m_angularVelocity, r2);
315
+ v2X = b2.m_linearVelocity.x + (-b2.m_angularVelocity * r2Y);
316
+ v2Y = b2.m_linearVelocity.y + (b2.m_angularVelocity * r2X);
317
+
318
+ //Cdot = -b2Dot(this.m_u1, v1) - this.m_ratio * b2Dot(this.m_u2, v2);
319
+ Cdot = -(this.m_u1.x * v1X + this.m_u1.y * v1Y) - this.m_ratio * (this.m_u2.x * v2X + this.m_u2.y * v2Y);
320
+ impulse = -this.m_pulleyMass * Cdot;
321
+ this.m_pulleyImpulse += impulse;
322
+
323
+ //b2Vec2 P1 = -impulse * this.m_u1;
324
+ P1X = -impulse * this.m_u1.x;
325
+ P1Y = -impulse * this.m_u1.y;
326
+ //b2Vec2 P2 = -this.m_ratio * impulse * this.m_u2;
327
+ P2X = -this.m_ratio * impulse * this.m_u2.x;
328
+ P2Y = -this.m_ratio * impulse * this.m_u2.y;
329
+ //b1.m_linearVelocity += b1.m_invMass * P1;
330
+ b1.m_linearVelocity.x += b1.m_invMass * P1X;
331
+ b1.m_linearVelocity.y += b1.m_invMass * P1Y;
332
+ //b1.m_angularVelocity += b1.m_invI * b2Cross(r1, P1);
333
+ b1.m_angularVelocity += b1.m_invI * (r1X * P1Y - r1Y * P1X);
334
+ //b2.m_linearVelocity += b2.m_invMass * P2;
335
+ b2.m_linearVelocity.x += b2.m_invMass * P2X;
336
+ b2.m_linearVelocity.y += b2.m_invMass * P2Y;
337
+ //b2.m_angularVelocity += b2.m_invI * b2Cross(r2, P2);
338
+ b2.m_angularVelocity += b2.m_invI * (r2X * P2Y - r2Y * P2X);
339
+ //}
340
+
341
+ if (this.m_limitState1 == b2Joint.e_atUpperLimit)
342
+ {
343
+ //b2Vec2 v1 = b1->m_linearVelocity + b2Cross(b1->m_angularVelocity, r1);
344
+ v1X = b1.m_linearVelocity.x + (-b1.m_angularVelocity * r1Y);
345
+ v1Y = b1.m_linearVelocity.y + (b1.m_angularVelocity * r1X);
346
+
347
+ //float32 Cdot = -b2Dot(this.m_u1, v1);
348
+ Cdot = -(this.m_u1.x * v1X + this.m_u1.y * v1Y);
349
+ impulse = -this.m_limitMass1 * Cdot;
350
+ oldLimitImpulse = this.m_limitImpulse1;
351
+ this.m_limitImpulse1 = b2Math.b2Max(0.0, this.m_limitImpulse1 + impulse);
352
+ impulse = this.m_limitImpulse1 - oldLimitImpulse;
353
+ //b2Vec2 P1 = -impulse * this.m_u1;
354
+ P1X = -impulse * this.m_u1.x;
355
+ P1Y = -impulse * this.m_u1.y;
356
+ //b1.m_linearVelocity += b1->m_invMass * P1;
357
+ b1.m_linearVelocity.x += b1.m_invMass * P1X;
358
+ b1.m_linearVelocity.y += b1.m_invMass * P1Y;
359
+ //b1.m_angularVelocity += b1->m_invI * b2Cross(r1, P1);
360
+ b1.m_angularVelocity += b1.m_invI * (r1X * P1Y - r1Y * P1X);
361
+ }
362
+
363
+ if (this.m_limitState2 == b2Joint.e_atUpperLimit)
364
+ {
365
+ //b2Vec2 v2 = b2->m_linearVelocity + b2Cross(b2->m_angularVelocity, r2);
366
+ v2X = b2.m_linearVelocity.x + (-b2.m_angularVelocity * r2Y);
367
+ v2Y = b2.m_linearVelocity.y + (b2.m_angularVelocity * r2X);
368
+
369
+ //float32 Cdot = -b2Dot(this.m_u2, v2);
370
+ Cdot = -(this.m_u2.x * v2X + this.m_u2.y * v2Y);
371
+ impulse = -this.m_limitMass2 * Cdot;
372
+ oldLimitImpulse = this.m_limitImpulse2;
373
+ this.m_limitImpulse2 = b2Math.b2Max(0.0, this.m_limitImpulse2 + impulse);
374
+ impulse = this.m_limitImpulse2 - oldLimitImpulse;
375
+ //b2Vec2 P2 = -impulse * this.m_u2;
376
+ P2X = -impulse * this.m_u2.x;
377
+ P2Y = -impulse * this.m_u2.y;
378
+ //b2->m_linearVelocity += b2->m_invMass * P2;
379
+ b2.m_linearVelocity.x += b2.m_invMass * P2X;
380
+ b2.m_linearVelocity.y += b2.m_invMass * P2Y;
381
+ //b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P2);
382
+ b2.m_angularVelocity += b2.m_invI * (r2X * P2Y - r2Y * P2X);
383
+ }
384
+ },
385
+
386
+
387
+
388
+ SolvePositionConstraints: function(){
389
+ var b1 = this.m_body1;
390
+ var b2 = this.m_body2;
391
+
392
+ var tMat;
393
+
394
+ //b2Vec2 s1 = this.m_ground->m_position + this.m_groundAnchor1;
395
+ var s1X = this.m_ground.m_position.x + this.m_groundAnchor1.x;
396
+ var s1Y = this.m_ground.m_position.y + this.m_groundAnchor1.y;
397
+ //b2Vec2 s2 = this.m_ground->m_position + this.m_groundAnchor2;
398
+ var s2X = this.m_ground.m_position.x + this.m_groundAnchor2.x;
399
+ var s2Y = this.m_ground.m_position.y + this.m_groundAnchor2.y;
400
+
401
+ // temp vars
402
+ var r1X;
403
+ var r1Y;
404
+ var r2X;
405
+ var r2Y;
406
+ var p1X;
407
+ var p1Y;
408
+ var p2X;
409
+ var p2Y;
410
+ var length1;
411
+ var length2;
412
+ var C;
413
+ var impulse;
414
+ var oldLimitPositionImpulse;
415
+
416
+ var linearError = 0.0;
417
+
418
+ {
419
+ //var r1 = b2Mul(b1.m_R, this.m_localAnchor1);
420
+ tMat = b1.m_R;
421
+ r1X = tMat.col1.x * this.m_localAnchor1.x + tMat.col2.x * this.m_localAnchor1.y;
422
+ r1Y = tMat.col1.y * this.m_localAnchor1.x + tMat.col2.y * this.m_localAnchor1.y;
423
+ //var r2 = b2Mul(b2.m_R, this.m_localAnchor2);
424
+ tMat = b2.m_R;
425
+ r2X = tMat.col1.x * this.m_localAnchor2.x + tMat.col2.x * this.m_localAnchor2.y;
426
+ r2Y = tMat.col1.y * this.m_localAnchor2.x + tMat.col2.y * this.m_localAnchor2.y;
427
+
428
+ //b2Vec2 p1 = b1->m_position + r1;
429
+ p1X = b1.m_position.x + r1X;
430
+ p1Y = b1.m_position.y + r1Y;
431
+ //b2Vec2 p2 = b2->m_position + r2;
432
+ p2X = b2.m_position.x + r2X;
433
+ p2Y = b2.m_position.y + r2Y;
434
+
435
+ // Get the pulley axes.
436
+ //this.m_u1 = p1 - s1;
437
+ this.m_u1.Set(p1X - s1X, p1Y - s1Y);
438
+ //this.m_u2 = p2 - s2;
439
+ this.m_u2.Set(p2X - s2X, p2Y - s2Y);
440
+
441
+ length1 = this.m_u1.Length();
442
+ length2 = this.m_u2.Length();
443
+
444
+ if (length1 > b2Settings.b2_linearSlop)
445
+ {
446
+ //this.m_u1 *= 1.0f / length1;
447
+ this.m_u1.Multiply( 1.0 / length1 );
448
+ }
449
+ else
450
+ {
451
+ this.m_u1.SetZero();
452
+ }
453
+
454
+ if (length2 > b2Settings.b2_linearSlop)
455
+ {
456
+ //this.m_u2 *= 1.0f / length2;
457
+ this.m_u2.Multiply( 1.0 / length2 );
458
+ }
459
+ else
460
+ {
461
+ this.m_u2.SetZero();
462
+ }
463
+
464
+ C = this.m_constant - length1 - this.m_ratio * length2;
465
+ linearError = b2Math.b2Max(linearError, Math.abs(C));
466
+ C = b2Math.b2Clamp(C, -b2Settings.b2_maxLinearCorrection, b2Settings.b2_maxLinearCorrection);
467
+ impulse = -this.m_pulleyMass * C;
468
+
469
+ p1X = -impulse * this.m_u1.x;
470
+ p1Y = -impulse * this.m_u1.y;
471
+ p2X = -this.m_ratio * impulse * this.m_u2.x;
472
+ p2Y = -this.m_ratio * impulse * this.m_u2.y;
473
+
474
+ b1.m_position.x += b1.m_invMass * p1X;
475
+ b1.m_position.y += b1.m_invMass * p1Y;
476
+ b1.m_rotation += b1.m_invI * (r1X * p1Y - r1Y * p1X);
477
+ b2.m_position.x += b2.m_invMass * p2X;
478
+ b2.m_position.y += b2.m_invMass * p2Y;
479
+ b2.m_rotation += b2.m_invI * (r2X * p2Y - r2Y * p2X);
480
+
481
+ b1.m_R.Set(b1.m_rotation);
482
+ b2.m_R.Set(b2.m_rotation);
483
+ }
484
+
485
+ if (this.m_limitState1 == b2Joint.e_atUpperLimit)
486
+ {
487
+ //b2Vec2 r1 = b2Mul(b1->m_R, this.m_localAnchor1);
488
+ tMat = b1.m_R;
489
+ r1X = tMat.col1.x * this.m_localAnchor1.x + tMat.col2.x * this.m_localAnchor1.y;
490
+ r1Y = tMat.col1.y * this.m_localAnchor1.x + tMat.col2.y * this.m_localAnchor1.y;
491
+ //b2Vec2 p1 = b1->m_position + r1;
492
+ p1X = b1.m_position.x + r1X;
493
+ p1Y = b1.m_position.y + r1Y;
494
+
495
+ //this.m_u1 = p1 - s1;
496
+ this.m_u1.Set(p1X - s1X, p1Y - s1Y);
497
+
498
+ length1 = this.m_u1.Length();
499
+
500
+ if (length1 > b2Settings.b2_linearSlop)
501
+ {
502
+ //this.m_u1 *= 1.0 / length1;
503
+ this.m_u1.x *= 1.0 / length1;
504
+ this.m_u1.y *= 1.0 / length1;
505
+ }
506
+ else
507
+ {
508
+ this.m_u1.SetZero();
509
+ }
510
+
511
+ C = this.m_maxLength1 - length1;
512
+ linearError = b2Math.b2Max(linearError, -C);
513
+ C = b2Math.b2Clamp(C + b2Settings.b2_linearSlop, -b2Settings.b2_maxLinearCorrection, 0.0);
514
+ impulse = -this.m_limitMass1 * C;
515
+ oldLimitPositionImpulse = this.m_limitPositionImpulse1;
516
+ this.m_limitPositionImpulse1 = b2Math.b2Max(0.0, this.m_limitPositionImpulse1 + impulse);
517
+ impulse = this.m_limitPositionImpulse1 - oldLimitPositionImpulse;
518
+
519
+ //P1 = -impulse * this.m_u1;
520
+ p1X = -impulse * this.m_u1.x;
521
+ p1Y = -impulse * this.m_u1.y;
522
+
523
+ b1.m_position.x += b1.m_invMass * p1X;
524
+ b1.m_position.y += b1.m_invMass * p1Y;
525
+ //b1.m_rotation += b1.m_invI * b2Cross(r1, P1);
526
+ b1.m_rotation += b1.m_invI * (r1X * p1Y - r1Y * p1X);
527
+ b1.m_R.Set(b1.m_rotation);
528
+ }
529
+
530
+ if (this.m_limitState2 == b2Joint.e_atUpperLimit)
531
+ {
532
+ //b2Vec2 r2 = b2Mul(b2->m_R, this.m_localAnchor2);
533
+ tMat = b2.m_R;
534
+ r2X = tMat.col1.x * this.m_localAnchor2.x + tMat.col2.x * this.m_localAnchor2.y;
535
+ r2Y = tMat.col1.y * this.m_localAnchor2.x + tMat.col2.y * this.m_localAnchor2.y;
536
+ //b2Vec2 p2 = b2->m_position + r2;
537
+ p2X = b2.m_position.x + r2X;
538
+ p2Y = b2.m_position.y + r2Y;
539
+
540
+ //this.m_u2 = p2 - s2;
541
+ this.m_u2.Set(p2X - s2X, p2Y - s2Y);
542
+
543
+ length2 = this.m_u2.Length();
544
+
545
+ if (length2 > b2Settings.b2_linearSlop)
546
+ {
547
+ //this.m_u2 *= 1.0 / length2;
548
+ this.m_u2.x *= 1.0 / length2;
549
+ this.m_u2.y *= 1.0 / length2;
550
+ }
551
+ else
552
+ {
553
+ this.m_u2.SetZero();
554
+ }
555
+
556
+ C = this.m_maxLength2 - length2;
557
+ linearError = b2Math.b2Max(linearError, -C);
558
+ C = b2Math.b2Clamp(C + b2Settings.b2_linearSlop, -b2Settings.b2_maxLinearCorrection, 0.0);
559
+ impulse = -this.m_limitMass2 * C;
560
+ oldLimitPositionImpulse = this.m_limitPositionImpulse2;
561
+ this.m_limitPositionImpulse2 = b2Math.b2Max(0.0, this.m_limitPositionImpulse2 + impulse);
562
+ impulse = this.m_limitPositionImpulse2 - oldLimitPositionImpulse;
563
+
564
+ //P2 = -impulse * this.m_u2;
565
+ p2X = -impulse * this.m_u2.x;
566
+ p2Y = -impulse * this.m_u2.y;
567
+
568
+ //b2.m_position += b2.m_invMass * P2;
569
+ b2.m_position.x += b2.m_invMass * p2X;
570
+ b2.m_position.y += b2.m_invMass * p2Y;
571
+ //b2.m_rotation += b2.m_invI * b2Cross(r2, P2);
572
+ b2.m_rotation += b2.m_invI * (r2X * p2Y - r2Y * p2X);
573
+ b2.m_R.Set(b2.m_rotation);
574
+ }
575
+
576
+ return linearError < b2Settings.b2_linearSlop;
577
+ },
578
+
579
+
580
+
581
+ m_ground: null,
582
+ m_groundAnchor1: new b2Vec2(),
583
+ m_groundAnchor2: new b2Vec2(),
584
+ m_localAnchor1: new b2Vec2(),
585
+ m_localAnchor2: new b2Vec2(),
586
+
587
+ m_u1: new b2Vec2(),
588
+ m_u2: new b2Vec2(),
589
+
590
+ m_constant: null,
591
+ m_ratio: null,
592
+
593
+ m_maxLength1: null,
594
+ m_maxLength2: null,
595
+
596
+ // Effective masses
597
+ m_pulleyMass: null,
598
+ m_limitMass1: null,
599
+ m_limitMass2: null,
600
+
601
+ // Impulses for accumulation/warm starting.
602
+ m_pulleyImpulse: null,
603
+ m_limitImpulse1: null,
604
+ m_limitImpulse2: null,
605
+
606
+ // Position impulses for accumulation.
607
+ m_limitPositionImpulse1: null,
608
+ m_limitPositionImpulse2: null,
609
+
610
+ m_limitState1: 0,
611
+ m_limitState2: 0
612
+
613
+ // static
614
+ });
615
+
616
+
617
+
618
+ b2PulleyJoint.b2_minPulleyLength = b2Settings.b2_lengthUnitsPerMeter;