box2d-rails 0.0.1

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 (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,45 @@
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 b2ContactConstraint = Class.create();
24
+ b2ContactConstraint.prototype =
25
+ {
26
+ initialize: function(){
27
+ // initialize instance variables for references
28
+ this.normal = new b2Vec2();
29
+ //
30
+
31
+ this.points = new Array(b2Settings.b2_maxManifoldPoints);
32
+ for (var i = 0; i < b2Settings.b2_maxManifoldPoints; i++){
33
+ this.points[i] = new b2ContactConstraintPoint();
34
+ }
35
+
36
+
37
+ },
38
+ points: null,
39
+ normal: new b2Vec2(),
40
+ manifold: null,
41
+ body1: null,
42
+ body2: null,
43
+ friction: null,
44
+ restitution: null,
45
+ pointCount: 0};
@@ -0,0 +1,40 @@
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 b2ContactConstraintPoint = Class.create();
24
+ b2ContactConstraintPoint.prototype =
25
+ {
26
+ localAnchor1: new b2Vec2(),
27
+ localAnchor2: new b2Vec2(),
28
+ normalImpulse: null,
29
+ tangentImpulse: null,
30
+ positionImpulse: null,
31
+ normalMass: null,
32
+ tangentMass: null,
33
+ separation: null,
34
+ velocityBias: null,
35
+ initialize: function() {
36
+ // initialize instance variables for references
37
+ this.localAnchor1 = new b2Vec2();
38
+ this.localAnchor2 = new b2Vec2();
39
+ //
40
+ }};
@@ -0,0 +1,33 @@
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 b2ContactNode = Class.create();
24
+ b2ContactNode.prototype =
25
+ {
26
+ other: null,
27
+ contact: null,
28
+ prev: null,
29
+ next: null,
30
+ initialize: function() {}};
31
+
32
+
33
+
@@ -0,0 +1,30 @@
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
+ var b2ContactRegister = Class.create();
22
+ b2ContactRegister.prototype =
23
+ {
24
+ createFcn: null,
25
+ destroyFcn: null,
26
+ primary: null,
27
+ initialize: function() {}};
28
+
29
+
30
+
@@ -0,0 +1,537 @@
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 b2ContactSolver = Class.create();
24
+ b2ContactSolver.prototype =
25
+ {
26
+ initialize: function(contacts, contactCount, allocator){
27
+ // initialize instance variables for references
28
+ this.m_constraints = new Array();
29
+ //
30
+
31
+ this.m_allocator = allocator;
32
+
33
+ var i = 0;
34
+ var tVec;
35
+ var tMat;
36
+
37
+ this.m_constraintCount = 0;
38
+ for (i = 0; i < contactCount; ++i)
39
+ {
40
+ this.m_constraintCount += contacts[i].GetManifoldCount();
41
+ }
42
+
43
+ // fill array
44
+ for (i = 0; i < this.m_constraintCount; i++){
45
+ this.m_constraints[i] = new b2ContactConstraint();
46
+ }
47
+
48
+ var count = 0;
49
+ for (i = 0; i < contactCount; ++i)
50
+ {
51
+ var contact = contacts[i];
52
+ var b1 = contact.m_shape1.m_body;
53
+ var b2 = contact.m_shape2.m_body;
54
+ var manifoldCount = contact.GetManifoldCount();
55
+ var manifolds = contact.GetManifolds();
56
+ var friction = contact.m_friction;
57
+ var restitution = contact.m_restitution;
58
+
59
+ //var v1 = b1.m_linearVelocity.Copy();
60
+ var v1X = b1.m_linearVelocity.x;
61
+ var v1Y = b1.m_linearVelocity.y;
62
+ //var v2 = b2.m_linearVelocity.Copy();
63
+ var v2X = b2.m_linearVelocity.x;
64
+ var v2Y = b2.m_linearVelocity.y;
65
+ var w1 = b1.m_angularVelocity;
66
+ var w2 = b2.m_angularVelocity;
67
+
68
+ for (var j = 0; j < manifoldCount; ++j)
69
+ {
70
+ var manifold = manifolds[ j ];
71
+
72
+ //b2Settings.b2Assert(manifold.pointCount > 0);
73
+
74
+ //var normal = manifold.normal.Copy();
75
+ var normalX = manifold.normal.x;
76
+ var normalY = manifold.normal.y;
77
+
78
+ //b2Settings.b2Assert(count < this.m_constraintCount);
79
+ var c = this.m_constraints[ count ];
80
+ c.body1 = b1;
81
+ c.body2 = b2;
82
+ c.manifold = manifold;
83
+ //c.normal = normal;
84
+ c.normal.x = normalX;
85
+ c.normal.y = normalY;
86
+ c.pointCount = manifold.pointCount;
87
+ c.friction = friction;
88
+ c.restitution = restitution;
89
+
90
+ for (var k = 0; k < c.pointCount; ++k)
91
+ {
92
+ var cp = manifold.points[ k ];
93
+ var ccp = c.points[ k ];
94
+
95
+ ccp.normalImpulse = cp.normalImpulse;
96
+ ccp.tangentImpulse = cp.tangentImpulse;
97
+ ccp.separation = cp.separation;
98
+
99
+ //var r1 = b2Math.SubtractVV( cp.position, b1.m_position );
100
+ var r1X = cp.position.x - b1.m_position.x;
101
+ var r1Y = cp.position.y - b1.m_position.y;
102
+ //var r2 = b2Math.SubtractVV( cp.position, b2.m_position );
103
+ var r2X = cp.position.x - b2.m_position.x;
104
+ var r2Y = cp.position.y - b2.m_position.y;
105
+
106
+ //ccp.localAnchor1 = b2Math.b2MulTMV(b1.m_R, r1);
107
+ tVec = ccp.localAnchor1;
108
+ tMat = b1.m_R;
109
+ tVec.x = r1X * tMat.col1.x + r1Y * tMat.col1.y;
110
+ tVec.y = r1X * tMat.col2.x + r1Y * tMat.col2.y;
111
+
112
+ //ccp.localAnchor2 = b2Math.b2MulTMV(b2.m_R, r2);
113
+ tVec = ccp.localAnchor2;
114
+ tMat = b2.m_R;
115
+ tVec.x = r2X * tMat.col1.x + r2Y * tMat.col1.y;
116
+ tVec.y = r2X * tMat.col2.x + r2Y * tMat.col2.y;
117
+
118
+ var r1Sqr = r1X * r1X + r1Y * r1Y;
119
+ var r2Sqr = r2X * r2X + r2Y * r2Y;
120
+
121
+ //var rn1 = b2Math.b2Dot(r1, normal);
122
+ var rn1 = r1X*normalX + r1Y*normalY;
123
+ //var rn2 = b2Math.b2Dot(r2, normal);
124
+ var rn2 = r2X*normalX + r2Y*normalY;
125
+ var kNormal = b1.m_invMass + b2.m_invMass;
126
+ kNormal += b1.m_invI * (r1Sqr - rn1 * rn1) + b2.m_invI * (r2Sqr - rn2 * rn2);
127
+ //b2Settings.b2Assert(kNormal > Number.MIN_VALUE);
128
+ ccp.normalMass = 1.0 / kNormal;
129
+
130
+ //var tangent = b2Math.b2CrossVF(normal, 1.0);
131
+ var tangentX = normalY
132
+ var tangentY = -normalX;
133
+
134
+ //var rt1 = b2Math.b2Dot(r1, tangent);
135
+ var rt1 = r1X*tangentX + r1Y*tangentY;
136
+ //var rt2 = b2Math.b2Dot(r2, tangent);
137
+ var rt2 = r2X*tangentX + r2Y*tangentY;
138
+ var kTangent = b1.m_invMass + b2.m_invMass;
139
+ kTangent += b1.m_invI * (r1Sqr - rt1 * rt1) + b2.m_invI * (r2Sqr - rt2 * rt2);
140
+ //b2Settings.b2Assert(kTangent > Number.MIN_VALUE);
141
+ ccp.tangentMass = 1.0 / kTangent;
142
+
143
+ // Setup a velocity bias for restitution.
144
+ ccp.velocityBias = 0.0;
145
+ if (ccp.separation > 0.0)
146
+ {
147
+ ccp.velocityBias = -60.0 * ccp.separation;
148
+ }
149
+ //var vRel = b2Math.b2Dot(c.normal, b2Math.SubtractVV( b2Math.SubtractVV( b2Math.AddVV( v2, b2Math.b2CrossFV(w2, r2)), v1 ), b2Math.b2CrossFV(w1, r1)));
150
+ var tX = v2X + (-w2*r2Y) - v1X - (-w1*r1Y);
151
+ var tY = v2Y + (w2*r2X) - v1Y - (w1*r1X);
152
+ //var vRel = b2Dot(c.normal, tX/Y);
153
+ var vRel = c.normal.x*tX + c.normal.y*tY;
154
+ if (vRel < -b2Settings.b2_velocityThreshold)
155
+ {
156
+ ccp.velocityBias += -c.restitution * vRel;
157
+ }
158
+ }
159
+
160
+ ++count;
161
+ }
162
+ }
163
+
164
+ //b2Settings.b2Assert(count == this.m_constraintCount);
165
+ },
166
+ //~b2ContactSolver();
167
+
168
+ PreSolve: function(){
169
+ var tVec;
170
+ var tVec2;
171
+ var tMat;
172
+
173
+ // Warm start.
174
+ for (var i = 0; i < this.m_constraintCount; ++i)
175
+ {
176
+ var c = this.m_constraints[ i ];
177
+
178
+ var b1 = c.body1;
179
+ var b2 = c.body2;
180
+ var invMass1 = b1.m_invMass;
181
+ var invI1 = b1.m_invI;
182
+ var invMass2 = b2.m_invMass;
183
+ var invI2 = b2.m_invI;
184
+ //var normal = new b2Vec2(c.normal.x, c.normal.y);
185
+ var normalX = c.normal.x;
186
+ var normalY = c.normal.y;
187
+ //var tangent = b2Math.b2CrossVF(normal, 1.0);
188
+ var tangentX = normalY;
189
+ var tangentY = -normalX;
190
+
191
+ var j = 0;
192
+ var tCount = 0;
193
+ if (b2World.s_enableWarmStarting)
194
+ {
195
+ tCount = c.pointCount;
196
+ for (j = 0; j < tCount; ++j)
197
+ {
198
+ var ccp = c.points[ j ];
199
+ //var P = b2Math.AddVV( b2Math.MulFV(ccp.normalImpulse, normal), b2Math.MulFV(ccp.tangentImpulse, tangent));
200
+ var PX = ccp.normalImpulse*normalX + ccp.tangentImpulse*tangentX;
201
+ var PY = ccp.normalImpulse*normalY + ccp.tangentImpulse*tangentY;
202
+
203
+ //var r1 = b2Math.b2MulMV(b1.m_R, ccp.localAnchor1);
204
+ tMat = b1.m_R;
205
+ tVec = ccp.localAnchor1;
206
+ var r1X = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
207
+ var r1Y = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
208
+
209
+ //var r2 = b2Math.b2MulMV(b2.m_R, ccp.localAnchor2);
210
+ tMat = b2.m_R;
211
+ tVec = ccp.localAnchor2;
212
+ var r2X = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
213
+ var r2Y = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
214
+
215
+ //b1.m_angularVelocity -= invI1 * b2Math.b2CrossVV(r1, P);
216
+ b1.m_angularVelocity -= invI1 * (r1X * PY - r1Y * PX);
217
+ //b1.m_linearVelocity.Subtract( b2Math.MulFV(invMass1, P) );
218
+ b1.m_linearVelocity.x -= invMass1 * PX;
219
+ b1.m_linearVelocity.y -= invMass1 * PY;
220
+ //b2.m_angularVelocity += invI2 * b2Math.b2CrossVV(r2, P);
221
+ b2.m_angularVelocity += invI2 * (r2X * PY - r2Y * PX);
222
+ //b2.m_linearVelocity.Add( b2Math.MulFV(invMass2, P) );
223
+ b2.m_linearVelocity.x += invMass2 * PX;
224
+ b2.m_linearVelocity.y += invMass2 * PY;
225
+
226
+ ccp.positionImpulse = 0.0;
227
+ }
228
+ }
229
+ else{
230
+ tCount = c.pointCount;
231
+ for (j = 0; j < tCount; ++j)
232
+ {
233
+ var ccp2 = c.points[ j ];
234
+ ccp2.normalImpulse = 0.0;
235
+ ccp2.tangentImpulse = 0.0;
236
+
237
+ ccp2.positionImpulse = 0.0;
238
+ }
239
+ }
240
+ }
241
+ },
242
+ SolveVelocityConstraints: function(){
243
+ var j = 0;
244
+ var ccp;
245
+ var r1X;
246
+ var r1Y;
247
+ var r2X;
248
+ var r2Y;
249
+ var dvX;
250
+ var dvY;
251
+ var lambda;
252
+ var newImpulse;
253
+ var PX;
254
+ var PY;
255
+
256
+ var tMat;
257
+ var tVec;
258
+
259
+ for (var i = 0; i < this.m_constraintCount; ++i)
260
+ {
261
+ var c = this.m_constraints[ i ];
262
+ var b1 = c.body1;
263
+ var b2 = c.body2;
264
+ var b1_angularVelocity = b1.m_angularVelocity;
265
+ var b1_linearVelocity = b1.m_linearVelocity;
266
+ var b2_angularVelocity = b2.m_angularVelocity;
267
+ var b2_linearVelocity = b2.m_linearVelocity;
268
+
269
+ var invMass1 = b1.m_invMass;
270
+ var invI1 = b1.m_invI;
271
+ var invMass2 = b2.m_invMass;
272
+ var invI2 = b2.m_invI;
273
+ //var normal = new b2Vec2(c.normal.x, c.normal.y);
274
+ var normalX = c.normal.x;
275
+ var normalY = c.normal.y;
276
+ //var tangent = b2Math.b2CrossVF(normal, 1.0);
277
+ var tangentX = normalY;
278
+ var tangentY = -normalX;
279
+
280
+ // Solver normal constraints
281
+ var tCount = c.pointCount;
282
+ for (j = 0; j < tCount; ++j)
283
+ {
284
+ ccp = c.points[ j ];
285
+
286
+ //r1 = b2Math.b2MulMV(b1.m_R, ccp.localAnchor1);
287
+ tMat = b1.m_R;
288
+ tVec = ccp.localAnchor1;
289
+ r1X = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y
290
+ r1Y = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y
291
+ //r2 = b2Math.b2MulMV(b2.m_R, ccp.localAnchor2);
292
+ tMat = b2.m_R;
293
+ tVec = ccp.localAnchor2;
294
+ r2X = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y
295
+ r2Y = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y
296
+
297
+ // Relative velocity at contact
298
+ //var dv = b2Math.SubtractVV( b2Math.AddVV( b2.m_linearVelocity, b2Math.b2CrossFV(b2.m_angularVelocity, r2)), b2Math.SubtractVV(b1.m_linearVelocity, b2Math.b2CrossFV(b1.m_angularVelocity, r1)));
299
+ //dv = b2Math.SubtractVV(b2Math.SubtractVV( b2Math.AddVV( b2.m_linearVelocity, b2Math.b2CrossFV(b2.m_angularVelocity, r2)), b1.m_linearVelocity), b2Math.b2CrossFV(b1.m_angularVelocity, r1));
300
+ dvX = b2_linearVelocity.x + (-b2_angularVelocity * r2Y) - b1_linearVelocity.x - (-b1_angularVelocity * r1Y);
301
+ dvY = b2_linearVelocity.y + (b2_angularVelocity * r2X) - b1_linearVelocity.y - (b1_angularVelocity * r1X);
302
+
303
+ // Compute normal impulse
304
+ //var vn = b2Math.b2Dot(dv, normal);
305
+ var vn = dvX * normalX + dvY * normalY;
306
+ lambda = -ccp.normalMass * (vn - ccp.velocityBias);
307
+
308
+ // b2Clamp the accumulated impulse
309
+ newImpulse = b2Math.b2Max(ccp.normalImpulse + lambda, 0.0);
310
+ lambda = newImpulse - ccp.normalImpulse;
311
+
312
+ // Apply contact impulse
313
+ //P = b2Math.MulFV(lambda, normal);
314
+ PX = lambda * normalX;
315
+ PY = lambda * normalY;
316
+
317
+ //b1.m_linearVelocity.Subtract( b2Math.MulFV( invMass1, P ) );
318
+ b1_linearVelocity.x -= invMass1 * PX;
319
+ b1_linearVelocity.y -= invMass1 * PY;
320
+ b1_angularVelocity -= invI1 * (r1X * PY - r1Y * PX);
321
+
322
+ //b2.m_linearVelocity.Add( b2Math.MulFV( invMass2, P ) );
323
+ b2_linearVelocity.x += invMass2 * PX;
324
+ b2_linearVelocity.y += invMass2 * PY;
325
+ b2_angularVelocity += invI2 * (r2X * PY - r2Y * PX);
326
+
327
+ ccp.normalImpulse = newImpulse;
328
+
329
+
330
+
331
+ // MOVED FROM BELOW
332
+ // Relative velocity at contact
333
+ //var dv = b2.m_linearVelocity + b2Cross(b2.m_angularVelocity, r2) - b1.m_linearVelocity - b2Cross(b1.m_angularVelocity, r1);
334
+ //dv = b2Math.SubtractVV(b2Math.SubtractVV(b2Math.AddVV(b2.m_linearVelocity, b2Math.b2CrossFV(b2.m_angularVelocity, r2)), b1.m_linearVelocity), b2Math.b2CrossFV(b1.m_angularVelocity, r1));
335
+ dvX = b2_linearVelocity.x + (-b2_angularVelocity * r2Y) - b1_linearVelocity.x - (-b1_angularVelocity * r1Y);
336
+ dvY = b2_linearVelocity.y + (b2_angularVelocity * r2X) - b1_linearVelocity.y - (b1_angularVelocity * r1X);
337
+
338
+ // Compute tangent impulse
339
+ var vt = dvX*tangentX + dvY*tangentY;
340
+ lambda = ccp.tangentMass * (-vt);
341
+
342
+ // b2Clamp the accumulated impulse
343
+ var maxFriction = c.friction * ccp.normalImpulse;
344
+ newImpulse = b2Math.b2Clamp(ccp.tangentImpulse + lambda, -maxFriction, maxFriction);
345
+ lambda = newImpulse - ccp.tangentImpulse;
346
+
347
+ // Apply contact impulse
348
+ //P = b2Math.MulFV(lambda, tangent);
349
+ PX = lambda * tangentX;
350
+ PY = lambda * tangentY;
351
+
352
+ //b1.m_linearVelocity.Subtract( b2Math.MulFV( invMass1, P ) );
353
+ b1_linearVelocity.x -= invMass1 * PX;
354
+ b1_linearVelocity.y -= invMass1 * PY;
355
+ b1_angularVelocity -= invI1 * (r1X * PY - r1Y * PX);
356
+
357
+ //b2.m_linearVelocity.Add( b2Math.MulFV( invMass2, P ) );
358
+ b2_linearVelocity.x += invMass2 * PX;
359
+ b2_linearVelocity.y += invMass2 * PY;
360
+ b2_angularVelocity += invI2 * (r2X * PY - r2Y * PX);
361
+
362
+ ccp.tangentImpulse = newImpulse;
363
+ }
364
+
365
+
366
+
367
+ // Solver tangent constraints
368
+ // MOVED ABOVE FOR EFFICIENCY
369
+ /*for (j = 0; j < tCount; ++j)
370
+ {
371
+ ccp = c.points[ j ];
372
+
373
+ //r1 = b2Math.b2MulMV(b1.m_R, ccp.localAnchor1);
374
+ tMat = b1.m_R;
375
+ tVec = ccp.localAnchor1;
376
+ r1X = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y
377
+ r1Y = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y
378
+ //r2 = b2Math.b2MulMV(b2.m_R, ccp.localAnchor2);
379
+ tMat = b2.m_R;
380
+ tVec = ccp.localAnchor2;
381
+ r2X = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y
382
+ r2Y = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y
383
+
384
+ // Relative velocity at contact
385
+ //var dv = b2.m_linearVelocity + b2Cross(b2.m_angularVelocity, r2) - b1.m_linearVelocity - b2Cross(b1.m_angularVelocity, r1);
386
+ //dv = b2Math.SubtractVV(b2Math.SubtractVV(b2Math.AddVV(b2.m_linearVelocity, b2Math.b2CrossFV(b2.m_angularVelocity, r2)), b1.m_linearVelocity), b2Math.b2CrossFV(b1.m_angularVelocity, r1));
387
+ dvX = b2_linearVelocity.x + (-b2_angularVelocity * r2Y) - b1_linearVelocity.x - (-b1_angularVelocity * r1Y);
388
+ dvY = b2_linearVelocity.y + (b2_angularVelocity * r2X) - b1_linearVelocity.y - (b1_angularVelocity * r1X);
389
+
390
+ // Compute tangent impulse
391
+ var vt = dvX*tangentX + dvY*tangentY;
392
+ lambda = ccp.tangentMass * (-vt);
393
+
394
+ // b2Clamp the accumulated impulse
395
+ var maxFriction = c.friction * ccp.normalImpulse;
396
+ newImpulse = b2Math.b2Clamp(ccp.tangentImpulse + lambda, -maxFriction, maxFriction);
397
+ lambda = newImpulse - ccp.tangentImpulse;
398
+
399
+ // Apply contact impulse
400
+ //P = b2Math.MulFV(lambda, tangent);
401
+ PX = lambda * tangentX;
402
+ PY = lambda * tangentY;
403
+
404
+ //b1.m_linearVelocity.Subtract( b2Math.MulFV( invMass1, P ) );
405
+ b1_linearVelocity.x -= invMass1 * PX;
406
+ b1_linearVelocity.y -= invMass1 * PY;
407
+ b1_angularVelocity -= invI1 * (r1X * PY - r1Y * PX);
408
+
409
+ //b2.m_linearVelocity.Add( b2Math.MulFV( invMass2, P ) );
410
+ b2_linearVelocity.x += invMass2 * PX;
411
+ b2_linearVelocity.y += invMass2 * PY;
412
+ b2_angularVelocity += invI2 * (r2X * PY - r2Y * PX);
413
+
414
+ ccp.tangentImpulse = newImpulse;
415
+ }*/
416
+
417
+ // Update angular velocity
418
+ b1.m_angularVelocity = b1_angularVelocity;
419
+ b2.m_angularVelocity = b2_angularVelocity;
420
+ }
421
+ },
422
+ SolvePositionConstraints: function(beta){
423
+ var minSeparation = 0.0;
424
+
425
+ var tMat;
426
+ var tVec;
427
+
428
+ for (var i = 0; i < this.m_constraintCount; ++i)
429
+ {
430
+ var c = this.m_constraints[ i ];
431
+ var b1 = c.body1;
432
+ var b2 = c.body2;
433
+ var b1_position = b1.m_position;
434
+ var b1_rotation = b1.m_rotation;
435
+ var b2_position = b2.m_position;
436
+ var b2_rotation = b2.m_rotation;
437
+
438
+ var invMass1 = b1.m_invMass;
439
+ var invI1 = b1.m_invI;
440
+ var invMass2 = b2.m_invMass;
441
+ var invI2 = b2.m_invI;
442
+ //var normal = new b2Vec2(c.normal.x, c.normal.y);
443
+ var normalX = c.normal.x;
444
+ var normalY = c.normal.y;
445
+ //var tangent = b2Math.b2CrossVF(normal, 1.0);
446
+ var tangentX = normalY;
447
+ var tangentY = -normalX;
448
+
449
+ // Solver normal constraints
450
+ var tCount = c.pointCount;
451
+ for (var j = 0; j < tCount; ++j)
452
+ {
453
+ var ccp = c.points[ j ];
454
+
455
+ //r1 = b2Math.b2MulMV(b1.m_R, ccp.localAnchor1);
456
+ tMat = b1.m_R;
457
+ tVec = ccp.localAnchor1;
458
+ var r1X = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y
459
+ var r1Y = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y
460
+ //r2 = b2Math.b2MulMV(b2.m_R, ccp.localAnchor2);
461
+ tMat = b2.m_R;
462
+ tVec = ccp.localAnchor2;
463
+ var r2X = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y
464
+ var r2Y = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y
465
+
466
+ //var p1 = b2Math.AddVV(b1.m_position, r1);
467
+ var p1X = b1_position.x + r1X;
468
+ var p1Y = b1_position.y + r1Y;
469
+
470
+ //var p2 = b2Math.AddVV(b2.m_position, r2);
471
+ var p2X = b2_position.x + r2X;
472
+ var p2Y = b2_position.y + r2Y;
473
+
474
+ //var dp = b2Math.SubtractVV(p2, p1);
475
+ var dpX = p2X - p1X;
476
+ var dpY = p2Y - p1Y;
477
+
478
+ // Approximate the current separation.
479
+ //var separation = b2Math.b2Dot(dp, normal) + ccp.separation;
480
+ var separation = (dpX*normalX + dpY*normalY) + ccp.separation;
481
+
482
+ // Track max constraint error.
483
+ minSeparation = b2Math.b2Min(minSeparation, separation);
484
+
485
+ // Prevent large corrections and allow slop.
486
+ var C = beta * b2Math.b2Clamp(separation + b2Settings.b2_linearSlop, -b2Settings.b2_maxLinearCorrection, 0.0);
487
+
488
+ // Compute normal impulse
489
+ var dImpulse = -ccp.normalMass * C;
490
+
491
+ // b2Clamp the accumulated impulse
492
+ var impulse0 = ccp.positionImpulse;
493
+ ccp.positionImpulse = b2Math.b2Max(impulse0 + dImpulse, 0.0);
494
+ dImpulse = ccp.positionImpulse - impulse0;
495
+
496
+ //var impulse = b2Math.MulFV( dImpulse, normal );
497
+ var impulseX = dImpulse * normalX;
498
+ var impulseY = dImpulse * normalY;
499
+
500
+ //b1.m_position.Subtract( b2Math.MulFV( invMass1, impulse ) );
501
+ b1_position.x -= invMass1 * impulseX;
502
+ b1_position.y -= invMass1 * impulseY;
503
+ b1_rotation -= invI1 * (r1X * impulseY - r1Y * impulseX);
504
+ b1.m_R.Set(b1_rotation);
505
+
506
+ //b2.m_position.Add( b2Math.MulFV( invMass2, impulse ) );
507
+ b2_position.x += invMass2 * impulseX;
508
+ b2_position.y += invMass2 * impulseY;
509
+ b2_rotation += invI2 * (r2X * impulseY - r2Y * impulseX);
510
+ b2.m_R.Set(b2_rotation);
511
+ }
512
+ // Update body rotations
513
+ b1.m_rotation = b1_rotation;
514
+ b2.m_rotation = b2_rotation;
515
+ }
516
+
517
+ return minSeparation >= -b2Settings.b2_linearSlop;
518
+ },
519
+ PostSolve: function(){
520
+ for (var i = 0; i < this.m_constraintCount; ++i)
521
+ {
522
+ var c = this.m_constraints[ i ];
523
+ var m = c.manifold;
524
+
525
+ for (var j = 0; j < c.pointCount; ++j)
526
+ {
527
+ var mPoint = m.points[j];
528
+ var cPoint = c.points[j];
529
+ mPoint.normalImpulse = cPoint.normalImpulse;
530
+ mPoint.tangentImpulse = cPoint.tangentImpulse;
531
+ }
532
+ }
533
+ },
534
+
535
+ m_allocator: null,
536
+ m_constraints: new Array(),
537
+ m_constraintCount: 0};