box2d-rails 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/box2d-rails.gemspec +20 -0
- data/lib/box2d-rails.rb +8 -0
- data/lib/box2d-rails/version.rb +5 -0
- data/vendor/assets/javascripts/box2d/collision/ClipVertex.js +35 -0
- data/vendor/assets/javascripts/box2d/collision/Features.js +61 -0
- data/vendor/assets/javascripts/box2d/collision/b2AABB.js +45 -0
- data/vendor/assets/javascripts/box2d/collision/b2Bound.js +43 -0
- data/vendor/assets/javascripts/box2d/collision/b2BoundValues.js +31 -0
- data/vendor/assets/javascripts/box2d/collision/b2BroadPhase.js +898 -0
- data/vendor/assets/javascripts/box2d/collision/b2BufferedPair.js +26 -0
- data/vendor/assets/javascripts/box2d/collision/b2Collision.js +738 -0
- data/vendor/assets/javascripts/box2d/collision/b2ContactID.js +52 -0
- data/vendor/assets/javascripts/box2d/collision/b2ContactPoint.js +35 -0
- data/vendor/assets/javascripts/box2d/collision/b2Distance.js +333 -0
- data/vendor/assets/javascripts/box2d/collision/b2Manifold.js +34 -0
- data/vendor/assets/javascripts/box2d/collision/b2OBB.js +34 -0
- data/vendor/assets/javascripts/box2d/collision/b2Pair.js +60 -0
- data/vendor/assets/javascripts/box2d/collision/b2PairCallback.js +34 -0
- data/vendor/assets/javascripts/box2d/collision/b2PairManager.js +386 -0
- data/vendor/assets/javascripts/box2d/collision/b2Proxy.js +40 -0
- data/vendor/assets/javascripts/box2d/collision/shapes/b2BoxDef.js +49 -0
- data/vendor/assets/javascripts/box2d/collision/shapes/b2CircleDef.js +49 -0
- data/vendor/assets/javascripts/box2d/collision/shapes/b2CircleShape.js +198 -0
- data/vendor/assets/javascripts/box2d/collision/shapes/b2MassData.js +36 -0
- data/vendor/assets/javascripts/box2d/collision/shapes/b2PolyDef.js +58 -0
- data/vendor/assets/javascripts/box2d/collision/shapes/b2PolyShape.js +492 -0
- data/vendor/assets/javascripts/box2d/collision/shapes/b2Shape.js +339 -0
- data/vendor/assets/javascripts/box2d/collision/shapes/b2ShapeDef.js +109 -0
- data/vendor/assets/javascripts/box2d/common/b2Settings.js +72 -0
- data/vendor/assets/javascripts/box2d/common/math/b2Mat22.js +130 -0
- data/vendor/assets/javascripts/box2d/common/math/b2Math.js +218 -0
- data/vendor/assets/javascripts/box2d/common/math/b2Vec2.js +131 -0
- data/vendor/assets/javascripts/box2d/dynamics/b2Body.js +469 -0
- data/vendor/assets/javascripts/box2d/dynamics/b2BodyDef.js +69 -0
- data/vendor/assets/javascripts/box2d/dynamics/b2CollisionFilter.js +42 -0
- data/vendor/assets/javascripts/box2d/dynamics/b2ContactManager.js +337 -0
- data/vendor/assets/javascripts/box2d/dynamics/b2Island.js +331 -0
- data/vendor/assets/javascripts/box2d/dynamics/b2TimeStep.js +27 -0
- data/vendor/assets/javascripts/box2d/dynamics/b2World.js +522 -0
- data/vendor/assets/javascripts/box2d/dynamics/b2WorldListener.js +52 -0
- data/vendor/assets/javascripts/box2d/dynamics/contacts/b2CircleContact.js +102 -0
- data/vendor/assets/javascripts/box2d/dynamics/contacts/b2Conservative.js +228 -0
- data/vendor/assets/javascripts/box2d/dynamics/contacts/b2Contact.js +201 -0
- data/vendor/assets/javascripts/box2d/dynamics/contacts/b2ContactConstraint.js +45 -0
- data/vendor/assets/javascripts/box2d/dynamics/contacts/b2ContactConstraintPoint.js +40 -0
- data/vendor/assets/javascripts/box2d/dynamics/contacts/b2ContactNode.js +33 -0
- data/vendor/assets/javascripts/box2d/dynamics/contacts/b2ContactRegister.js +30 -0
- data/vendor/assets/javascripts/box2d/dynamics/contacts/b2ContactSolver.js +537 -0
- data/vendor/assets/javascripts/box2d/dynamics/contacts/b2NullContact.js +65 -0
- data/vendor/assets/javascripts/box2d/dynamics/contacts/b2PolyAndCircleContact.js +103 -0
- data/vendor/assets/javascripts/box2d/dynamics/contacts/b2PolyContact.js +163 -0
- data/vendor/assets/javascripts/box2d/dynamics/joints/b2DistanceJoint.js +264 -0
- data/vendor/assets/javascripts/box2d/dynamics/joints/b2DistanceJointDef.js +49 -0
- data/vendor/assets/javascripts/box2d/dynamics/joints/b2GearJoint.js +307 -0
- data/vendor/assets/javascripts/box2d/dynamics/joints/b2GearJointDef.js +50 -0
- data/vendor/assets/javascripts/box2d/dynamics/joints/b2Jacobian.js +49 -0
- data/vendor/assets/javascripts/box2d/dynamics/joints/b2Joint.js +200 -0
- data/vendor/assets/javascripts/box2d/dynamics/joints/b2JointDef.js +40 -0
- data/vendor/assets/javascripts/box2d/dynamics/joints/b2JointNode.js +33 -0
- data/vendor/assets/javascripts/box2d/dynamics/joints/b2MouseJoint.js +234 -0
- data/vendor/assets/javascripts/box2d/dynamics/joints/b2MouseJointDef.js +53 -0
- data/vendor/assets/javascripts/box2d/dynamics/joints/b2PrismaticJoint.js +676 -0
- data/vendor/assets/javascripts/box2d/dynamics/joints/b2PrismaticJointDef.js +56 -0
- data/vendor/assets/javascripts/box2d/dynamics/joints/b2PulleyJoint.js +618 -0
- data/vendor/assets/javascripts/box2d/dynamics/joints/b2PulleyJointDef.js +70 -0
- data/vendor/assets/javascripts/box2d/dynamics/joints/b2RevoluteJoint.js +491 -0
- data/vendor/assets/javascripts/box2d/dynamics/joints/b2RevoluteJointDef.js +55 -0
- metadata +133 -0
@@ -0,0 +1,65 @@
|
|
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 b2NullContact = Class.create();
|
24
|
+
Object.extend(b2NullContact.prototype, b2Contact.prototype);
|
25
|
+
Object.extend(b2NullContact.prototype,
|
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
|
+
Evaluate: function() {},
|
64
|
+
GetManifolds: function(){ return null; }});
|
65
|
+
|
@@ -0,0 +1,103 @@
|
|
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 b2PolyAndCircleContact = Class.create();
|
24
|
+
Object.extend(b2PolyAndCircleContact.prototype, b2Contact.prototype);
|
25
|
+
Object.extend(b2PolyAndCircleContact.prototype, {
|
26
|
+
|
27
|
+
|
28
|
+
initialize: function(s1, s2) {
|
29
|
+
// The constructor for b2Contact
|
30
|
+
// initialize instance variables for references
|
31
|
+
this.m_node1 = new b2ContactNode();
|
32
|
+
this.m_node2 = new b2ContactNode();
|
33
|
+
//
|
34
|
+
this.m_flags = 0;
|
35
|
+
|
36
|
+
if (!s1 || !s2){
|
37
|
+
this.m_shape1 = null;
|
38
|
+
this.m_shape2 = null;
|
39
|
+
return;
|
40
|
+
}
|
41
|
+
|
42
|
+
this.m_shape1 = s1;
|
43
|
+
this.m_shape2 = s2;
|
44
|
+
|
45
|
+
this.m_manifoldCount = 0;
|
46
|
+
|
47
|
+
this.m_friction = Math.sqrt(this.m_shape1.m_friction * this.m_shape2.m_friction);
|
48
|
+
this.m_restitution = b2Math.b2Max(this.m_shape1.m_restitution, this.m_shape2.m_restitution);
|
49
|
+
|
50
|
+
this.m_prev = null;
|
51
|
+
this.m_next = null;
|
52
|
+
|
53
|
+
this.m_node1.contact = null;
|
54
|
+
this.m_node1.prev = null;
|
55
|
+
this.m_node1.next = null;
|
56
|
+
this.m_node1.other = null;
|
57
|
+
|
58
|
+
this.m_node2.contact = null;
|
59
|
+
this.m_node2.prev = null;
|
60
|
+
this.m_node2.next = null;
|
61
|
+
this.m_node2.other = null;
|
62
|
+
//
|
63
|
+
|
64
|
+
// initialize instance variables for references
|
65
|
+
this.m_manifold = [new b2Manifold()];
|
66
|
+
//
|
67
|
+
|
68
|
+
//super(shape1, shape2);
|
69
|
+
|
70
|
+
b2Settings.b2Assert(this.m_shape1.m_type == b2Shape.e_polyShape);
|
71
|
+
b2Settings.b2Assert(this.m_shape2.m_type == b2Shape.e_circleShape);
|
72
|
+
this.m_manifold[0].pointCount = 0;
|
73
|
+
this.m_manifold[0].points[0].normalImpulse = 0.0;
|
74
|
+
this.m_manifold[0].points[0].tangentImpulse = 0.0;
|
75
|
+
},
|
76
|
+
//~b2PolyAndCircleContact() {}
|
77
|
+
|
78
|
+
Evaluate: function(){
|
79
|
+
b2Collision.b2CollidePolyAndCircle(this.m_manifold[0], this.m_shape1, this.m_shape2, false);
|
80
|
+
|
81
|
+
if (this.m_manifold[0].pointCount > 0)
|
82
|
+
{
|
83
|
+
this.m_manifoldCount = 1;
|
84
|
+
}
|
85
|
+
else
|
86
|
+
{
|
87
|
+
this.m_manifoldCount = 0;
|
88
|
+
}
|
89
|
+
},
|
90
|
+
|
91
|
+
GetManifolds: function()
|
92
|
+
{
|
93
|
+
return this.m_manifold;
|
94
|
+
},
|
95
|
+
|
96
|
+
m_manifold: [new b2Manifold()]})
|
97
|
+
|
98
|
+
b2PolyAndCircleContact.Create = function(shape1, shape2, allocator){
|
99
|
+
return new b2PolyAndCircleContact(shape1, shape2);
|
100
|
+
};
|
101
|
+
b2PolyAndCircleContact.Destroy = function(contact, allocator){
|
102
|
+
//
|
103
|
+
};
|
@@ -0,0 +1,163 @@
|
|
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 b2PolyContact = Class.create();
|
24
|
+
Object.extend(b2PolyContact.prototype, b2Contact.prototype);
|
25
|
+
Object.extend(b2PolyContact.prototype,
|
26
|
+
{
|
27
|
+
|
28
|
+
initialize: function(s1, s2) {
|
29
|
+
// The constructor for b2Contact
|
30
|
+
// initialize instance variables for references
|
31
|
+
this.m_node1 = new b2ContactNode();
|
32
|
+
this.m_node2 = new b2ContactNode();
|
33
|
+
//
|
34
|
+
this.m_flags = 0;
|
35
|
+
|
36
|
+
if (!s1 || !s2){
|
37
|
+
this.m_shape1 = null;
|
38
|
+
this.m_shape2 = null;
|
39
|
+
return;
|
40
|
+
}
|
41
|
+
|
42
|
+
this.m_shape1 = s1;
|
43
|
+
this.m_shape2 = s2;
|
44
|
+
|
45
|
+
this.m_manifoldCount = 0;
|
46
|
+
|
47
|
+
this.m_friction = Math.sqrt(this.m_shape1.m_friction * this.m_shape2.m_friction);
|
48
|
+
this.m_restitution = b2Math.b2Max(this.m_shape1.m_restitution, this.m_shape2.m_restitution);
|
49
|
+
|
50
|
+
this.m_prev = null;
|
51
|
+
this.m_next = null;
|
52
|
+
|
53
|
+
this.m_node1.contact = null;
|
54
|
+
this.m_node1.prev = null;
|
55
|
+
this.m_node1.next = null;
|
56
|
+
this.m_node1.other = null;
|
57
|
+
|
58
|
+
this.m_node2.contact = null;
|
59
|
+
this.m_node2.prev = null;
|
60
|
+
this.m_node2.next = null;
|
61
|
+
this.m_node2.other = null;
|
62
|
+
//
|
63
|
+
|
64
|
+
// initialize instance variables for references
|
65
|
+
this.m0 = new b2Manifold();
|
66
|
+
this.m_manifold = [new b2Manifold()];
|
67
|
+
//
|
68
|
+
|
69
|
+
//super(shape1, shape2);
|
70
|
+
//b2Settings.b2Assert(this.m_shape1.m_type == b2Shape.e_polyShape);
|
71
|
+
//b2Settings.b2Assert(this.m_shape2.m_type == b2Shape.e_polyShape);
|
72
|
+
this.m_manifold[0].pointCount = 0;
|
73
|
+
},
|
74
|
+
//~b2PolyContact() {}
|
75
|
+
|
76
|
+
// store temp manifold to reduce calls to new
|
77
|
+
m0: new b2Manifold(),
|
78
|
+
|
79
|
+
Evaluate: function(){
|
80
|
+
var tMani = this.m_manifold[0];
|
81
|
+
// replace memcpy
|
82
|
+
// memcpy(&this.m0, &this.m_manifold, sizeof(b2Manifold));
|
83
|
+
//this.m0.points = new Array(tMani.pointCount);
|
84
|
+
var tPoints = this.m0.points;
|
85
|
+
|
86
|
+
for (var k = 0; k < tMani.pointCount; k++){
|
87
|
+
var tPoint = tPoints[k];
|
88
|
+
var tPoint0 = tMani.points[k];
|
89
|
+
//tPoint.separation = tPoint0.separation;
|
90
|
+
tPoint.normalImpulse = tPoint0.normalImpulse;
|
91
|
+
tPoint.tangentImpulse = tPoint0.tangentImpulse;
|
92
|
+
//tPoint.position.SetV( tPoint0.position );
|
93
|
+
|
94
|
+
tPoint.id = tPoint0.id.Copy();
|
95
|
+
|
96
|
+
/*this.m0.points[k].id.features = new Features();
|
97
|
+
this.m0.points[k].id.features.referenceFace = this.m_manifold[0].points[k].id.features.referenceFace;
|
98
|
+
this.m0.points[k].id.features.incidentEdge = this.m_manifold[0].points[k].id.features.incidentEdge;
|
99
|
+
this.m0.points[k].id.features.incidentVertex = this.m_manifold[0].points[k].id.features.incidentVertex;
|
100
|
+
this.m0.points[k].id.features.flip = this.m_manifold[0].points[k].id.features.flip;*/
|
101
|
+
}
|
102
|
+
//this.m0.normal.SetV( tMani.normal );
|
103
|
+
this.m0.pointCount = tMani.pointCount;
|
104
|
+
|
105
|
+
b2Collision.b2CollidePoly(tMani, this.m_shape1, this.m_shape2, false);
|
106
|
+
|
107
|
+
// Match contact ids to facilitate warm starting.
|
108
|
+
if (tMani.pointCount > 0)
|
109
|
+
{
|
110
|
+
var match = [false, false];
|
111
|
+
|
112
|
+
// Match old contact ids to new contact ids and copy the
|
113
|
+
// stored impulses to warm start the solver.
|
114
|
+
for (var i = 0; i < tMani.pointCount; ++i)
|
115
|
+
{
|
116
|
+
var cp = tMani.points[ i ];
|
117
|
+
|
118
|
+
cp.normalImpulse = 0.0;
|
119
|
+
cp.tangentImpulse = 0.0;
|
120
|
+
var idKey = cp.id.key;
|
121
|
+
|
122
|
+
for (var j = 0; j < this.m0.pointCount; ++j)
|
123
|
+
{
|
124
|
+
|
125
|
+
if (match[j] == true)
|
126
|
+
continue;
|
127
|
+
|
128
|
+
var cp0 = this.m0.points[j];
|
129
|
+
var id0 = cp0.id;
|
130
|
+
|
131
|
+
if (id0.key == idKey)
|
132
|
+
{
|
133
|
+
match[j] = true;
|
134
|
+
cp.normalImpulse = cp0.normalImpulse;
|
135
|
+
cp.tangentImpulse = cp0.tangentImpulse;
|
136
|
+
break;
|
137
|
+
}
|
138
|
+
}
|
139
|
+
}
|
140
|
+
|
141
|
+
this.m_manifoldCount = 1;
|
142
|
+
}
|
143
|
+
else
|
144
|
+
{
|
145
|
+
this.m_manifoldCount = 0;
|
146
|
+
}
|
147
|
+
},
|
148
|
+
|
149
|
+
GetManifolds: function()
|
150
|
+
{
|
151
|
+
return this.m_manifold;
|
152
|
+
},
|
153
|
+
|
154
|
+
m_manifold: [new b2Manifold()]});
|
155
|
+
|
156
|
+
b2PolyContact.Create = function(shape1, shape2, allocator){
|
157
|
+
//void* mem = allocator->Allocate(sizeof(b2PolyContact));
|
158
|
+
return new b2PolyContact(shape1, shape2);
|
159
|
+
};
|
160
|
+
b2PolyContact.Destroy = function(contact, allocator){
|
161
|
+
//((b2PolyContact*)contact)->~b2PolyContact();
|
162
|
+
//allocator->Free(contact, sizeof(b2PolyContact));
|
163
|
+
};
|
@@ -0,0 +1,264 @@
|
|
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
|
+
// C = norm(p2 - p1) - L
|
22
|
+
// u = (p2 - p1) / norm(p2 - p1)
|
23
|
+
// Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1))
|
24
|
+
// J = [-u -cross(r1, u) u cross(r2, u)]
|
25
|
+
// K = J * invM * JT
|
26
|
+
// = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2
|
27
|
+
|
28
|
+
var b2DistanceJoint = Class.create();
|
29
|
+
Object.extend(b2DistanceJoint.prototype, b2Joint.prototype);
|
30
|
+
Object.extend(b2DistanceJoint.prototype,
|
31
|
+
{
|
32
|
+
//--------------- Internals Below -------------------
|
33
|
+
|
34
|
+
initialize: function(def){
|
35
|
+
// The constructor for b2Joint
|
36
|
+
// initialize instance variables for references
|
37
|
+
this.m_node1 = new b2JointNode();
|
38
|
+
this.m_node2 = new b2JointNode();
|
39
|
+
//
|
40
|
+
this.m_type = def.type;
|
41
|
+
this.m_prev = null;
|
42
|
+
this.m_next = null;
|
43
|
+
this.m_body1 = def.body1;
|
44
|
+
this.m_body2 = def.body2;
|
45
|
+
this.m_collideConnected = def.collideConnected;
|
46
|
+
this.m_islandFlag = false;
|
47
|
+
this.m_userData = def.userData;
|
48
|
+
//
|
49
|
+
|
50
|
+
// initialize instance variables for references
|
51
|
+
this.m_localAnchor1 = new b2Vec2();
|
52
|
+
this.m_localAnchor2 = new b2Vec2();
|
53
|
+
this.m_u = new b2Vec2();
|
54
|
+
//
|
55
|
+
|
56
|
+
//super(def);
|
57
|
+
|
58
|
+
var tMat;
|
59
|
+
var tX;
|
60
|
+
var tY;
|
61
|
+
//this.m_localAnchor1 = b2MulT(this.m_body1->m_R, def->anchorPoint1 - this.m_body1->m_position);
|
62
|
+
tMat = this.m_body1.m_R;
|
63
|
+
tX = def.anchorPoint1.x - this.m_body1.m_position.x;
|
64
|
+
tY = def.anchorPoint1.y - this.m_body1.m_position.y;
|
65
|
+
this.m_localAnchor1.x = tX*tMat.col1.x + tY*tMat.col1.y;
|
66
|
+
this.m_localAnchor1.y = tX*tMat.col2.x + tY*tMat.col2.y;
|
67
|
+
//this.m_localAnchor2 = b2MulT(this.m_body2->m_R, def->anchorPoint2 - this.m_body2->m_position);
|
68
|
+
tMat = this.m_body2.m_R;
|
69
|
+
tX = def.anchorPoint2.x - this.m_body2.m_position.x;
|
70
|
+
tY = def.anchorPoint2.y - this.m_body2.m_position.y;
|
71
|
+
this.m_localAnchor2.x = tX*tMat.col1.x + tY*tMat.col1.y;
|
72
|
+
this.m_localAnchor2.y = tX*tMat.col2.x + tY*tMat.col2.y;
|
73
|
+
|
74
|
+
//b2Vec2 d = def->anchorPoint2 - def->anchorPoint1;
|
75
|
+
tX = def.anchorPoint2.x - def.anchorPoint1.x;
|
76
|
+
tY = def.anchorPoint2.y - def.anchorPoint1.y;
|
77
|
+
//this.m_length = d.Length();
|
78
|
+
this.m_length = Math.sqrt(tX*tX + tY*tY);
|
79
|
+
this.m_impulse = 0.0;
|
80
|
+
},
|
81
|
+
|
82
|
+
PrepareVelocitySolver: function(){
|
83
|
+
|
84
|
+
var tMat;
|
85
|
+
|
86
|
+
// Compute the effective mass matrix.
|
87
|
+
//b2Vec2 r1 = b2Mul(this.m_body1->m_R, this.m_localAnchor1);
|
88
|
+
tMat = this.m_body1.m_R;
|
89
|
+
var r1X = tMat.col1.x * this.m_localAnchor1.x + tMat.col2.x * this.m_localAnchor1.y;
|
90
|
+
var r1Y = tMat.col1.y * this.m_localAnchor1.x + tMat.col2.y * this.m_localAnchor1.y;
|
91
|
+
//b2Vec2 r2 = b2Mul(this.m_body2->m_R, this.m_localAnchor2);
|
92
|
+
tMat = this.m_body2.m_R;
|
93
|
+
var r2X = tMat.col1.x * this.m_localAnchor2.x + tMat.col2.x * this.m_localAnchor2.y;
|
94
|
+
var r2Y = tMat.col1.y * this.m_localAnchor2.x + tMat.col2.y * this.m_localAnchor2.y;
|
95
|
+
//this.m_u = this.m_body2->m_position + r2 - this.m_body1->m_position - r1;
|
96
|
+
this.m_u.x = this.m_body2.m_position.x + r2X - this.m_body1.m_position.x - r1X;
|
97
|
+
this.m_u.y = this.m_body2.m_position.y + r2Y - this.m_body1.m_position.y - r1Y;
|
98
|
+
|
99
|
+
// Handle singularity.
|
100
|
+
//float32 length = this.m_u.Length();
|
101
|
+
var length = Math.sqrt(this.m_u.x*this.m_u.x + this.m_u.y*this.m_u.y);
|
102
|
+
if (length > b2Settings.b2_linearSlop)
|
103
|
+
{
|
104
|
+
//this.m_u *= 1.0 / length;
|
105
|
+
this.m_u.Multiply( 1.0 / length );
|
106
|
+
}
|
107
|
+
else
|
108
|
+
{
|
109
|
+
this.m_u.SetZero();
|
110
|
+
}
|
111
|
+
|
112
|
+
//float32 cr1u = b2Cross(r1, this.m_u);
|
113
|
+
var cr1u = (r1X * this.m_u.y - r1Y * this.m_u.x);
|
114
|
+
//float32 cr2u = b2Cross(r2, this.m_u);
|
115
|
+
var cr2u = (r2X * this.m_u.y - r2Y * this.m_u.x);
|
116
|
+
//this.m_mass = this.m_body1->m_invMass + this.m_body1->m_invI * cr1u * cr1u + this.m_body2->m_invMass + this.m_body2->m_invI * cr2u * cr2u;
|
117
|
+
this.m_mass = this.m_body1.m_invMass + this.m_body1.m_invI * cr1u * cr1u + this.m_body2.m_invMass + this.m_body2.m_invI * cr2u * cr2u;
|
118
|
+
//b2Settings.b2Assert(this.m_mass > Number.MIN_VALUE);
|
119
|
+
this.m_mass = 1.0 / this.m_mass;
|
120
|
+
|
121
|
+
if (b2World.s_enableWarmStarting)
|
122
|
+
{
|
123
|
+
//b2Vec2 P = this.m_impulse * this.m_u;
|
124
|
+
var PX = this.m_impulse * this.m_u.x;
|
125
|
+
var PY = this.m_impulse * this.m_u.y;
|
126
|
+
//this.m_body1.m_linearVelocity -= this.m_body1.m_invMass * P;
|
127
|
+
this.m_body1.m_linearVelocity.x -= this.m_body1.m_invMass * PX;
|
128
|
+
this.m_body1.m_linearVelocity.y -= this.m_body1.m_invMass * PY;
|
129
|
+
//this.m_body1.m_angularVelocity -= this.m_body1.m_invI * b2Cross(r1, P);
|
130
|
+
this.m_body1.m_angularVelocity -= this.m_body1.m_invI * (r1X * PY - r1Y * PX);
|
131
|
+
//this.m_body2.m_linearVelocity += this.m_body2.m_invMass * P;
|
132
|
+
this.m_body2.m_linearVelocity.x += this.m_body2.m_invMass * PX;
|
133
|
+
this.m_body2.m_linearVelocity.y += this.m_body2.m_invMass * PY;
|
134
|
+
//this.m_body2.m_angularVelocity += this.m_body2.m_invI * b2Cross(r2, P);
|
135
|
+
this.m_body2.m_angularVelocity += this.m_body2.m_invI * (r2X * PY - r2Y * PX);
|
136
|
+
}
|
137
|
+
else
|
138
|
+
{
|
139
|
+
this.m_impulse = 0.0;
|
140
|
+
}
|
141
|
+
|
142
|
+
},
|
143
|
+
|
144
|
+
|
145
|
+
|
146
|
+
SolveVelocityConstraints: function(step){
|
147
|
+
|
148
|
+
var tMat;
|
149
|
+
|
150
|
+
//b2Vec2 r1 = b2Mul(this.m_body1->m_R, this.m_localAnchor1);
|
151
|
+
tMat = this.m_body1.m_R;
|
152
|
+
var r1X = tMat.col1.x * this.m_localAnchor1.x + tMat.col2.x * this.m_localAnchor1.y;
|
153
|
+
var r1Y = tMat.col1.y * this.m_localAnchor1.x + tMat.col2.y * this.m_localAnchor1.y;
|
154
|
+
//b2Vec2 r2 = b2Mul(this.m_body2->m_R, this.m_localAnchor2);
|
155
|
+
tMat = this.m_body2.m_R;
|
156
|
+
var r2X = tMat.col1.x * this.m_localAnchor2.x + tMat.col2.x * this.m_localAnchor2.y;
|
157
|
+
var r2Y = tMat.col1.y * this.m_localAnchor2.x + tMat.col2.y * this.m_localAnchor2.y;
|
158
|
+
|
159
|
+
// Cdot = dot(u, v + cross(w, r))
|
160
|
+
//b2Vec2 v1 = this.m_body1->m_linearVelocity + b2Cross(this.m_body1->m_angularVelocity, r1);
|
161
|
+
var v1X = this.m_body1.m_linearVelocity.x + (-this.m_body1.m_angularVelocity * r1Y);
|
162
|
+
var v1Y = this.m_body1.m_linearVelocity.y + (this.m_body1.m_angularVelocity * r1X);
|
163
|
+
//b2Vec2 v2 = this.m_body2->m_linearVelocity + b2Cross(this.m_body2->m_angularVelocity, r2);
|
164
|
+
var v2X = this.m_body2.m_linearVelocity.x + (-this.m_body2.m_angularVelocity * r2Y);
|
165
|
+
var v2Y = this.m_body2.m_linearVelocity.y + (this.m_body2.m_angularVelocity * r2X);
|
166
|
+
//float32 Cdot = b2Dot(this.m_u, v2 - v1);
|
167
|
+
var Cdot = (this.m_u.x * (v2X - v1X) + this.m_u.y * (v2Y - v1Y));
|
168
|
+
//float32 impulse = -this.m_mass * Cdot;
|
169
|
+
var impulse = -this.m_mass * Cdot;
|
170
|
+
this.m_impulse += impulse;
|
171
|
+
|
172
|
+
//b2Vec2 P = impulse * this.m_u;
|
173
|
+
var PX = impulse * this.m_u.x;
|
174
|
+
var PY = impulse * this.m_u.y;
|
175
|
+
//this.m_body1->m_linearVelocity -= this.m_body1->m_invMass * P;
|
176
|
+
this.m_body1.m_linearVelocity.x -= this.m_body1.m_invMass * PX;
|
177
|
+
this.m_body1.m_linearVelocity.y -= this.m_body1.m_invMass * PY;
|
178
|
+
//this.m_body1->m_angularVelocity -= this.m_body1->m_invI * b2Cross(r1, P);
|
179
|
+
this.m_body1.m_angularVelocity -= this.m_body1.m_invI * (r1X * PY - r1Y * PX);
|
180
|
+
//this.m_body2->m_linearVelocity += this.m_body2->m_invMass * P;
|
181
|
+
this.m_body2.m_linearVelocity.x += this.m_body2.m_invMass * PX;
|
182
|
+
this.m_body2.m_linearVelocity.y += this.m_body2.m_invMass * PY;
|
183
|
+
//this.m_body2->m_angularVelocity += this.m_body2->m_invI * b2Cross(r2, P);
|
184
|
+
this.m_body2.m_angularVelocity += this.m_body2.m_invI * (r2X * PY - r2Y * PX);
|
185
|
+
},
|
186
|
+
|
187
|
+
SolvePositionConstraints: function(){
|
188
|
+
|
189
|
+
var tMat;
|
190
|
+
|
191
|
+
//b2Vec2 r1 = b2Mul(this.m_body1->m_R, this.m_localAnchor1);
|
192
|
+
tMat = this.m_body1.m_R;
|
193
|
+
var r1X = tMat.col1.x * this.m_localAnchor1.x + tMat.col2.x * this.m_localAnchor1.y;
|
194
|
+
var r1Y = tMat.col1.y * this.m_localAnchor1.x + tMat.col2.y * this.m_localAnchor1.y;
|
195
|
+
//b2Vec2 r2 = b2Mul(this.m_body2->m_R, this.m_localAnchor2);
|
196
|
+
tMat = this.m_body2.m_R;
|
197
|
+
var r2X = tMat.col1.x * this.m_localAnchor2.x + tMat.col2.x * this.m_localAnchor2.y;
|
198
|
+
var r2Y = tMat.col1.y * this.m_localAnchor2.x + tMat.col2.y * this.m_localAnchor2.y;
|
199
|
+
//b2Vec2 d = this.m_body2->m_position + r2 - this.m_body1->m_position - r1;
|
200
|
+
var dX = this.m_body2.m_position.x + r2X - this.m_body1.m_position.x - r1X;
|
201
|
+
var dY = this.m_body2.m_position.y + r2Y - this.m_body1.m_position.y - r1Y;
|
202
|
+
|
203
|
+
//float32 length = d.Normalize();
|
204
|
+
var length = Math.sqrt(dX*dX + dY*dY);
|
205
|
+
dX /= length;
|
206
|
+
dY /= length;
|
207
|
+
//float32 C = length - this.m_length;
|
208
|
+
var C = length - this.m_length;
|
209
|
+
C = b2Math.b2Clamp(C, -b2Settings.b2_maxLinearCorrection, b2Settings.b2_maxLinearCorrection);
|
210
|
+
|
211
|
+
var impulse = -this.m_mass * C;
|
212
|
+
//this.m_u = d;
|
213
|
+
this.m_u.Set(dX, dY);
|
214
|
+
//b2Vec2 P = impulse * this.m_u;
|
215
|
+
var PX = impulse * this.m_u.x;
|
216
|
+
var PY = impulse * this.m_u.y;
|
217
|
+
|
218
|
+
//this.m_body1->m_position -= this.m_body1->m_invMass * P;
|
219
|
+
this.m_body1.m_position.x -= this.m_body1.m_invMass * PX;
|
220
|
+
this.m_body1.m_position.y -= this.m_body1.m_invMass * PY;
|
221
|
+
//this.m_body1->m_rotation -= this.m_body1->m_invI * b2Cross(r1, P);
|
222
|
+
this.m_body1.m_rotation -= this.m_body1.m_invI * (r1X * PY - r1Y * PX);
|
223
|
+
//this.m_body2->m_position += this.m_body2->m_invMass * P;
|
224
|
+
this.m_body2.m_position.x += this.m_body2.m_invMass * PX;
|
225
|
+
this.m_body2.m_position.y += this.m_body2.m_invMass * PY;
|
226
|
+
//this.m_body2->m_rotation -= this.m_body2->m_invI * b2Cross(r2, P);
|
227
|
+
this.m_body2.m_rotation += this.m_body2.m_invI * (r2X * PY - r2Y * PX);
|
228
|
+
|
229
|
+
this.m_body1.m_R.Set(this.m_body1.m_rotation);
|
230
|
+
this.m_body2.m_R.Set(this.m_body2.m_rotation);
|
231
|
+
|
232
|
+
return b2Math.b2Abs(C) < b2Settings.b2_linearSlop;
|
233
|
+
|
234
|
+
},
|
235
|
+
|
236
|
+
GetAnchor1: function(){
|
237
|
+
return b2Math.AddVV(this.m_body1.m_position , b2Math.b2MulMV(this.m_body1.m_R, this.m_localAnchor1));
|
238
|
+
},
|
239
|
+
GetAnchor2: function(){
|
240
|
+
return b2Math.AddVV(this.m_body2.m_position , b2Math.b2MulMV(this.m_body2.m_R, this.m_localAnchor2));
|
241
|
+
},
|
242
|
+
|
243
|
+
GetReactionForce: function(invTimeStep)
|
244
|
+
{
|
245
|
+
//var F = (this.m_impulse * invTimeStep) * this.m_u;
|
246
|
+
var F = new b2Vec2();
|
247
|
+
F.SetV(this.m_u);
|
248
|
+
F.Multiply(this.m_impulse * invTimeStep);
|
249
|
+
return F;
|
250
|
+
},
|
251
|
+
|
252
|
+
GetReactionTorque: function(invTimeStep)
|
253
|
+
{
|
254
|
+
//NOT_USED(invTimeStep);
|
255
|
+
return 0.0;
|
256
|
+
},
|
257
|
+
|
258
|
+
m_localAnchor1: new b2Vec2(),
|
259
|
+
m_localAnchor2: new b2Vec2(),
|
260
|
+
m_u: new b2Vec2(),
|
261
|
+
m_impulse: null,
|
262
|
+
m_mass: null,
|
263
|
+
m_length: null});
|
264
|
+
|