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,52 @@
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 b2WorldListener = Class.create();
26
+ b2WorldListener.prototype =
27
+ {
28
+
29
+ // If a body is destroyed, then any joints attached to it are also destroyed.
30
+ // This prevents memory leaks, but you may unexpectedly be left with an
31
+ // orphaned joint pointer.
32
+ // Box2D will notify you when a joint is implicitly destroyed.
33
+ // It is NOT called if you directly destroy a joint.
34
+ // Implement this abstract class and provide it to b2World via
35
+ // b2World::SetListener().
36
+ // DO NOT modify the Box2D world inside this callback.
37
+ NotifyJointDestroyed: function(joint){},
38
+
39
+ // This is called when a body's shape passes outside of the world boundary. If you
40
+ // override this and pass back e_destroyBody, you must nullify your copies of the
41
+ // body pointer.
42
+ NotifyBoundaryViolated: function(body)
43
+ {
44
+ //NOT_USED(body);
45
+ return b2WorldListener.b2_freezeBody;
46
+ },
47
+
48
+
49
+
50
+ initialize: function() {}};
51
+ b2WorldListener.b2_freezeBody = 0;
52
+ b2WorldListener.b2_destroyBody = 1;
@@ -0,0 +1,102 @@
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
+ var b2CircleContact = Class.create();
23
+ Object.extend(b2CircleContact.prototype, b2Contact.prototype);
24
+ Object.extend(b2CircleContact.prototype,
25
+ {
26
+
27
+ initialize: function(s1, s2) {
28
+ // The constructor for b2Contact
29
+ // initialize instance variables for references
30
+ this.m_node1 = new b2ContactNode();
31
+ this.m_node2 = new b2ContactNode();
32
+ //
33
+ this.m_flags = 0;
34
+
35
+ if (!s1 || !s2){
36
+ this.m_shape1 = null;
37
+ this.m_shape2 = null;
38
+ return;
39
+ }
40
+
41
+ this.m_shape1 = s1;
42
+ this.m_shape2 = s2;
43
+
44
+ this.m_manifoldCount = 0;
45
+
46
+ this.m_friction = Math.sqrt(this.m_shape1.m_friction * this.m_shape2.m_friction);
47
+ this.m_restitution = b2Math.b2Max(this.m_shape1.m_restitution, this.m_shape2.m_restitution);
48
+
49
+ this.m_prev = null;
50
+ this.m_next = null;
51
+
52
+ this.m_node1.contact = null;
53
+ this.m_node1.prev = null;
54
+ this.m_node1.next = null;
55
+ this.m_node1.other = null;
56
+
57
+ this.m_node2.contact = null;
58
+ this.m_node2.prev = null;
59
+ this.m_node2.next = null;
60
+ this.m_node2.other = null;
61
+ //
62
+
63
+ // initialize instance variables for references
64
+ this.m_manifold = [new b2Manifold()];
65
+ //
66
+
67
+ //super(shape1, shape2);
68
+
69
+ //b2Settings.b2Assert(this.m_shape1.m_type == b2Shape.e_circleShape);
70
+ //b2Settings.b2Assert(this.m_shape2.m_type == b2Shape.e_circleShape);
71
+ this.m_manifold[0].pointCount = 0;
72
+ this.m_manifold[0].points[0].normalImpulse = 0.0;
73
+ this.m_manifold[0].points[0].tangentImpulse = 0.0;
74
+ },
75
+ //~b2CircleContact() {}
76
+
77
+ Evaluate: function(){
78
+ b2Collision.b2CollideCircle(this.m_manifold[0], this.m_shape1, this.m_shape2, false);
79
+
80
+ if (this.m_manifold[0].pointCount > 0)
81
+ {
82
+ this.m_manifoldCount = 1;
83
+ }
84
+ else
85
+ {
86
+ this.m_manifoldCount = 0;
87
+ }
88
+ },
89
+
90
+ GetManifolds: function()
91
+ {
92
+ return this.m_manifold;
93
+ },
94
+
95
+ m_manifold: [new b2Manifold()]});
96
+
97
+ b2CircleContact.Create = function(shape1, shape2, allocator){
98
+ return new b2CircleContact(shape1, shape2);
99
+ };
100
+ b2CircleContact.Destroy = function(contact, allocator){
101
+ //
102
+ };
@@ -0,0 +1,228 @@
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 b2Conservative = Class.create();
24
+ b2Conservative.prototype = {
25
+
26
+ // Temp vars
27
+
28
+
29
+
30
+ initialize: function() {}}
31
+ b2Conservative.R1 = new b2Mat22();
32
+ b2Conservative.R2 = new b2Mat22();
33
+ b2Conservative.x1 = new b2Vec2();
34
+ b2Conservative.x2 = new b2Vec2();
35
+ b2Conservative.Conservative = function(shape1, shape2){
36
+ var body1 = shape1.GetBody();
37
+ var body2 = shape2.GetBody();
38
+
39
+ //b2Vec2 v1 = body1->m_position - body1->m_position0;
40
+ var v1X = body1.m_position.x - body1.m_position0.x;
41
+ var v1Y = body1.m_position.y - body1.m_position0.y;
42
+ //float32 omega1 = body1->m_rotation - body1->m_rotation0;
43
+ var omega1 = body1.m_rotation - body1.m_rotation0;
44
+ //b2Vec2 v2 = body2->m_position - body2->m_position0;
45
+ var v2X = body2.m_position.x - body2.m_position0.x;
46
+ var v2Y = body2.m_position.y - body2.m_position0.y;
47
+ //float32 omega2 = body2->m_rotation - body2->m_rotation0;
48
+ var omega2 = body2.m_rotation - body2.m_rotation0;
49
+
50
+ //float32 r1 = shape1->GetMaxRadius();
51
+ var r1 = shape1.GetMaxRadius();
52
+ //float32 r2 = shape2->GetMaxRadius();
53
+ var r2 = shape2.GetMaxRadius();
54
+
55
+ //b2Vec2 p1Start = body1->m_position0;
56
+ var p1StartX = body1.m_position0.x;
57
+ var p1StartY = body1.m_position0.y;
58
+ //float32 a1Start = body1->m_rotation0;
59
+ var a1Start = body1.m_rotation0;
60
+
61
+ //b2Vec2 p2Start = body2->m_position0;
62
+ var p2StartX = body2.m_position0.x;
63
+ var p2StartY = body2.m_position0.y;
64
+ //float32 a2Start = body2->m_rotation0;
65
+ var a2Start = body2.m_rotation0;
66
+
67
+ //b2Vec2 p1 = p1Start;
68
+ var p1X = p1StartX;
69
+ var p1Y = p1StartY;
70
+ //float32 a1 = a1Start;
71
+ var a1 = a1Start;
72
+ //b2Vec2 p2 = p2Start;
73
+ var p2X = p2StartX;
74
+ var p2Y = p2StartY;
75
+ //float32 a2 = a2Start;
76
+ var a2 = a2Start;
77
+
78
+ //b2Mat22 b2Conservative.R1(a1), b2Conservative.R2(a2);
79
+ b2Conservative.R1.Set(a1);
80
+ b2Conservative.R2.Set(a2);
81
+
82
+ //shape1->QuickSync(p1, b2Conservative.R1);
83
+ shape1.QuickSync(p1, b2Conservative.R1);
84
+ //shape2->QuickSync(p2, b2Conservative.R2);
85
+ shape2.QuickSync(p2, b2Conservative.R2);
86
+
87
+ //float32 s1 = 0.0f;
88
+ var s1 = 0.0;
89
+ //const int32 maxIterations = 10;
90
+ var maxIterations = 10;
91
+ //b2Vec2 d;
92
+ var dX;
93
+ var dY;
94
+ //float32 invRelativeVelocity = 0.0f;
95
+ var invRelativeVelocity = 0.0;
96
+ //bool hit = true;
97
+ var hit = true;
98
+ //b2Vec2 b2Conservative.x1, b2Conservative.x2; moved to static var
99
+ for (var iter = 0; iter < maxIterations; ++iter)
100
+ {
101
+ // Get the accurate distance between shapes.
102
+ //float32 distance = b2Distance.Distance(&b2Conservative.x1, &b2Conservative.x2, shape1, shape2);
103
+ var distance = b2Distance.Distance(b2Conservative.x1, b2Conservative.x2, shape1, shape2);
104
+ if (distance < b2Settings.b2_linearSlop)
105
+ {
106
+ if (iter == 0)
107
+ {
108
+ hit = false;
109
+ }
110
+ else
111
+ {
112
+ hit = true;
113
+ }
114
+ break;
115
+ }
116
+
117
+ if (iter == 0)
118
+ {
119
+ //b2Vec2 d = b2Conservative.x2 - b2Conservative.x1;
120
+ dX = b2Conservative.x2.x - b2Conservative.x1.x;
121
+ dY = b2Conservative.x2.y - b2Conservative.x1.y;
122
+ //d.Normalize();
123
+ var dLen = Math.sqrt(dX*dX + dY*dY);
124
+ //float32 relativeVelocity = b2Dot(d, v1 - v2) + b2Abs(omega1) * r1 + b2Abs(omega2) * r2;
125
+ var relativeVelocity = (dX*(v1X-v2X) + dY*(v1Y - v2Y)) + Math.abs(omega1) * r1 + Math.abs(omega2) * r2;
126
+ if (Math.abs(relativeVelocity) < Number.MIN_VALUE)
127
+ {
128
+ hit = false;
129
+ break;
130
+ }
131
+
132
+ invRelativeVelocity = 1.0 / relativeVelocity;
133
+ }
134
+
135
+ // Get the conservative movement.
136
+ //float32 ds = distance * invRelativeVelocity;
137
+ var ds = distance * invRelativeVelocity;
138
+ //float32 s2 = s1 + ds;
139
+ var s2 = s1 + ds;
140
+
141
+ if (s2 < 0.0 || 1.0 < s2)
142
+ {
143
+ hit = false;
144
+ break;
145
+ }
146
+
147
+ if (s2 < (1.0 + 100.0 * Number.MIN_VALUE) * s1)
148
+ {
149
+ hit = true;
150
+ break;
151
+ }
152
+
153
+ s1 = s2;
154
+
155
+ // Move forward conservatively.
156
+ //p1 = p1Start + s1 * v1;
157
+ p1X = p1StartX + s1 * v1.x;
158
+ p1Y = p1StartY + s1 * v1.y;
159
+ //a1 = a1Start + s1 * omega1;
160
+ a1 = a1Start + s1 * omega1;
161
+ //p2 = p2Start + s1 * v2;
162
+ p2X = p2StartX + s1 * v2.x;
163
+ p2Y = p2StartY + s1 * v2.y;
164
+ //a2 = a2Start + s1 * omega2;
165
+ a2 = a2Start + s1 * omega2;
166
+
167
+ b2Conservative.R1.Set(a1);
168
+ b2Conservative.R2.Set(a2);
169
+ shape1.QuickSync(p1, b2Conservative.R1);
170
+ shape2.QuickSync(p2, b2Conservative.R2);
171
+ }
172
+
173
+ if (hit)
174
+ {
175
+ // Hit, move bodies to safe position and re-sync shapes.
176
+ //b2Vec2 d = b2Conservative.x2 - b2Conservative.x1;
177
+ dX = b2Conservative.x2.x - b2Conservative.x1.x;
178
+ dY = b2Conservative.x2.y - b2Conservative.x1.y;
179
+ //float32 length = d.Length();
180
+ var length = Math.sqrt(dX*dX + dY*dY);
181
+ if (length > FLT_EPSILON)
182
+ {
183
+ d *= b2_linearSlop / length;
184
+ }
185
+
186
+ if (body1.IsStatic())
187
+ {
188
+ //body1.m_position = p1;
189
+ body1.m_position.x = p1X;
190
+ body1.m_position.y = p1Y;
191
+ }
192
+ else
193
+ {
194
+ //body1.m_position = p1 - d;
195
+ body1.m_position.x = p1X - dX;
196
+ body1.m_position.y = p1Y - dY;
197
+ }
198
+ body1.m_rotation = a1;
199
+ body1.m_R.Set(a1);
200
+ body1.QuickSyncShapes();
201
+
202
+ if (body2.IsStatic())
203
+ {
204
+ //body2->m_position = p2;
205
+ body2.m_position.x = p2X;
206
+ body2.m_position.y = p2Y;
207
+ }
208
+ else
209
+ {
210
+ //body2->m_position = p2 + d;
211
+ body2.m_position.x = p2X + dX;
212
+ body2.m_position.y = p2Y + dY;
213
+ }
214
+ //body2.m_position = p2 + d;
215
+ body2.m_position.x = p2X + dX;
216
+ body2.m_position.y = p2Y + dY;
217
+ body2.m_rotation = a2;
218
+ body2.m_R.Set(a2);
219
+ body2.QuickSyncShapes();
220
+
221
+ return true;
222
+ }
223
+
224
+ // No hit, restore shapes.
225
+ shape1.QuickSync(body1.m_position, body1.m_R);
226
+ shape2.QuickSync(body2.m_position, body2.m_R);
227
+ return false;
228
+ };
@@ -0,0 +1,201 @@
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
+ //typedef b2Contact* b2ContactCreateFcn(b2Shape* shape1, b2Shape* shape2, b2BlockAllocator* allocator);
24
+ //typedef void b2ContactDestroyFcn(b2Contact* contact, b2BlockAllocator* allocator);
25
+
26
+
27
+
28
+ var b2Contact = Class.create();
29
+ b2Contact.prototype =
30
+ {
31
+ GetManifolds: function(){return null},
32
+ GetManifoldCount: function()
33
+ {
34
+ return this.m_manifoldCount;
35
+ },
36
+
37
+ GetNext: function(){
38
+ return this.m_next;
39
+ },
40
+
41
+ GetShape1: function(){
42
+ return this.m_shape1;
43
+ },
44
+
45
+ GetShape2: function(){
46
+ return this.m_shape2;
47
+ },
48
+
49
+ //--------------- Internals Below -------------------
50
+
51
+ // this.m_flags
52
+ // enum
53
+
54
+
55
+ initialize: function(s1, s2)
56
+ {
57
+ // initialize instance variables for references
58
+ this.m_node1 = new b2ContactNode();
59
+ this.m_node2 = new b2ContactNode();
60
+ //
61
+
62
+ this.m_flags = 0;
63
+
64
+ if (!s1 || !s2){
65
+ this.m_shape1 = null;
66
+ this.m_shape2 = null;
67
+ return;
68
+ }
69
+
70
+ this.m_shape1 = s1;
71
+ this.m_shape2 = s2;
72
+
73
+ this.m_manifoldCount = 0;
74
+
75
+ this.m_friction = Math.sqrt(this.m_shape1.m_friction * this.m_shape2.m_friction);
76
+ this.m_restitution = b2Math.b2Max(this.m_shape1.m_restitution, this.m_shape2.m_restitution);
77
+
78
+ this.m_prev = null;
79
+ this.m_next = null;
80
+
81
+ this.m_node1.contact = null;
82
+ this.m_node1.prev = null;
83
+ this.m_node1.next = null;
84
+ this.m_node1.other = null;
85
+
86
+ this.m_node2.contact = null;
87
+ this.m_node2.prev = null;
88
+ this.m_node2.next = null;
89
+ this.m_node2.other = null;
90
+ },
91
+
92
+ //virtual ~b2Contact() {}
93
+
94
+ Evaluate: function(){},
95
+
96
+ m_flags: 0,
97
+
98
+ // World pool and list pointers.
99
+ m_prev: null,
100
+ m_next: null,
101
+
102
+ // Nodes for connecting bodies.
103
+ m_node1: new b2ContactNode(),
104
+ m_node2: new b2ContactNode(),
105
+
106
+ m_shape1: null,
107
+ m_shape2: null,
108
+
109
+ m_manifoldCount: 0,
110
+
111
+ // Combined friction
112
+ m_friction: null,
113
+ m_restitution: null};
114
+ b2Contact.e_islandFlag = 0x0001;
115
+ b2Contact.e_destroyFlag = 0x0002;
116
+ b2Contact.AddType = function(createFcn, destroyFcn, type1, type2)
117
+ {
118
+ //b2Settings.b2Assert(b2Shape.e_unknownShape < type1 && type1 < b2Shape.e_shapeTypeCount);
119
+ //b2Settings.b2Assert(b2Shape.e_unknownShape < type2 && type2 < b2Shape.e_shapeTypeCount);
120
+
121
+ b2Contact.s_registers[type1][type2].createFcn = createFcn;
122
+ b2Contact.s_registers[type1][type2].destroyFcn = destroyFcn;
123
+ b2Contact.s_registers[type1][type2].primary = true;
124
+
125
+ if (type1 != type2)
126
+ {
127
+ b2Contact.s_registers[type2][type1].createFcn = createFcn;
128
+ b2Contact.s_registers[type2][type1].destroyFcn = destroyFcn;
129
+ b2Contact.s_registers[type2][type1].primary = false;
130
+ }
131
+ };
132
+ b2Contact.InitializeRegisters = function(){
133
+ b2Contact.s_registers = new Array(b2Shape.e_shapeTypeCount);
134
+ for (var i = 0; i < b2Shape.e_shapeTypeCount; i++){
135
+ b2Contact.s_registers[i] = new Array(b2Shape.e_shapeTypeCount);
136
+ for (var j = 0; j < b2Shape.e_shapeTypeCount; j++){
137
+ b2Contact.s_registers[i][j] = new b2ContactRegister();
138
+ }
139
+ }
140
+
141
+ b2Contact.AddType(b2CircleContact.Create, b2CircleContact.Destroy, b2Shape.e_circleShape, b2Shape.e_circleShape);
142
+ b2Contact.AddType(b2PolyAndCircleContact.Create, b2PolyAndCircleContact.Destroy, b2Shape.e_polyShape, b2Shape.e_circleShape);
143
+ b2Contact.AddType(b2PolyContact.Create, b2PolyContact.Destroy, b2Shape.e_polyShape, b2Shape.e_polyShape);
144
+
145
+ };
146
+ b2Contact.Create = function(shape1, shape2, allocator){
147
+ if (b2Contact.s_initialized == false)
148
+ {
149
+ b2Contact.InitializeRegisters();
150
+ b2Contact.s_initialized = true;
151
+ }
152
+
153
+ var type1 = shape1.m_type;
154
+ var type2 = shape2.m_type;
155
+
156
+ //b2Settings.b2Assert(b2Shape.e_unknownShape < type1 && type1 < b2Shape.e_shapeTypeCount);
157
+ //b2Settings.b2Assert(b2Shape.e_unknownShape < type2 && type2 < b2Shape.e_shapeTypeCount);
158
+
159
+ var createFcn = b2Contact.s_registers[type1][type2].createFcn;
160
+ if (createFcn)
161
+ {
162
+ if (b2Contact.s_registers[type1][type2].primary)
163
+ {
164
+ return createFcn(shape1, shape2, allocator);
165
+ }
166
+ else
167
+ {
168
+ var c = createFcn(shape2, shape1, allocator);
169
+ for (var i = 0; i < c.GetManifoldCount(); ++i)
170
+ {
171
+ var m = c.GetManifolds()[ i ];
172
+ m.normal = m.normal.Negative();
173
+ }
174
+ return c;
175
+ }
176
+ }
177
+ else
178
+ {
179
+ return null;
180
+ }
181
+ };
182
+ b2Contact.Destroy = function(contact, allocator){
183
+ //b2Settings.b2Assert(b2Contact.s_initialized == true);
184
+
185
+ if (contact.GetManifoldCount() > 0)
186
+ {
187
+ contact.m_shape1.m_body.WakeUp();
188
+ contact.m_shape2.m_body.WakeUp();
189
+ }
190
+
191
+ var type1 = contact.m_shape1.m_type;
192
+ var type2 = contact.m_shape2.m_type;
193
+
194
+ //b2Settings.b2Assert(b2Shape.e_unknownShape < type1 && type1 < b2Shape.e_shapeTypeCount);
195
+ //b2Settings.b2Assert(b2Shape.e_unknownShape < type2 && type2 < b2Shape.e_shapeTypeCount);
196
+
197
+ var destroyFcn = b2Contact.s_registers[type1][type2].destroyFcn;
198
+ destroyFcn(contact, allocator);
199
+ };
200
+ b2Contact.s_registers = null;
201
+ b2Contact.s_initialized = false;