Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
FogNetwork
GitHub Repository: FogNetwork/Tsunami
Path: blob/main/public/games/files/garbage-collector/js/Box2dWeb/Box2dWeb-2.1.a.3.js
1515 views
1
/*
2
* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com
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 as such, and must not be
15
* misrepresented as being the original software.
16
* 3. This notice may not be removed or altered from any source distribution.
17
*/
18
var Box2D = {};
19
20
(function (a2j, undefined) {
21
22
if(!(Object.prototype.defineProperty instanceof Function)
23
&& Object.prototype.__defineGetter__ instanceof Function
24
&& Object.prototype.__defineSetter__ instanceof Function)
25
{
26
Object.defineProperty = function(obj, p, cfg) {
27
if(cfg.get instanceof Function)
28
obj.__defineGetter__(p, cfg.get);
29
if(cfg.set instanceof Function)
30
obj.__defineSetter__(p, cfg.set);
31
}
32
}
33
34
function emptyFn() {};
35
a2j.inherit = function(cls, base) {
36
var tmpCtr = cls;
37
emptyFn.prototype = base.prototype;
38
cls.prototype = new emptyFn;
39
cls.prototype.constructor = tmpCtr;
40
};
41
42
a2j.generateCallback = function generateCallback(context, cb) {
43
return function () {
44
cb.apply(context, arguments);
45
};
46
};
47
48
a2j.NVector = function NVector(length) {
49
if (length === undefined) length = 0;
50
var tmp = new Array(length || 0);
51
for (var i = 0; i < length; ++i)
52
tmp[i] = 0;
53
return tmp;
54
};
55
56
a2j.is = function is(o1, o2) {
57
if (o1 === null) return false;
58
if ((o2 instanceof Function) && (o1 instanceof o2)) return true;
59
if ((o1.constructor.__implements != undefined) && (o1.constructor.__implements[o2])) return true;
60
return false;
61
};
62
63
a2j.parseUInt = function(v) {
64
return Math.abs(parseInt(v));
65
}
66
67
})(Box2D);
68
69
//#TODO remove assignments from global namespace
70
var Vector = Array;
71
var Vector_a2j_Number = Box2D.NVector;
72
//package structure
73
if (typeof(Box2D) === "undefined") Box2D = {};
74
if (typeof(Box2D.Collision) === "undefined") Box2D.Collision = {};
75
if (typeof(Box2D.Collision.Shapes) === "undefined") Box2D.Collision.Shapes = {};
76
if (typeof(Box2D.Common) === "undefined") Box2D.Common = {};
77
if (typeof(Box2D.Common.Math) === "undefined") Box2D.Common.Math = {};
78
if (typeof(Box2D.Dynamics) === "undefined") Box2D.Dynamics = {};
79
if (typeof(Box2D.Dynamics.Contacts) === "undefined") Box2D.Dynamics.Contacts = {};
80
if (typeof(Box2D.Dynamics.Controllers) === "undefined") Box2D.Dynamics.Controllers = {};
81
if (typeof(Box2D.Dynamics.Joints) === "undefined") Box2D.Dynamics.Joints = {};
82
//pre-definitions
83
(function () {
84
Box2D.Collision.IBroadPhase = 'Box2D.Collision.IBroadPhase';
85
86
function b2AABB() {
87
b2AABB.b2AABB.apply(this, arguments);
88
};
89
Box2D.Collision.b2AABB = b2AABB;
90
91
function b2Bound() {
92
b2Bound.b2Bound.apply(this, arguments);
93
};
94
Box2D.Collision.b2Bound = b2Bound;
95
96
function b2BoundValues() {
97
b2BoundValues.b2BoundValues.apply(this, arguments);
98
if (this.constructor === b2BoundValues) this.b2BoundValues.apply(this, arguments);
99
};
100
Box2D.Collision.b2BoundValues = b2BoundValues;
101
102
function b2Collision() {
103
b2Collision.b2Collision.apply(this, arguments);
104
};
105
Box2D.Collision.b2Collision = b2Collision;
106
107
function b2ContactID() {
108
b2ContactID.b2ContactID.apply(this, arguments);
109
if (this.constructor === b2ContactID) this.b2ContactID.apply(this, arguments);
110
};
111
Box2D.Collision.b2ContactID = b2ContactID;
112
113
function b2ContactPoint() {
114
b2ContactPoint.b2ContactPoint.apply(this, arguments);
115
};
116
Box2D.Collision.b2ContactPoint = b2ContactPoint;
117
118
function b2Distance() {
119
b2Distance.b2Distance.apply(this, arguments);
120
};
121
Box2D.Collision.b2Distance = b2Distance;
122
123
function b2DistanceInput() {
124
b2DistanceInput.b2DistanceInput.apply(this, arguments);
125
};
126
Box2D.Collision.b2DistanceInput = b2DistanceInput;
127
128
function b2DistanceOutput() {
129
b2DistanceOutput.b2DistanceOutput.apply(this, arguments);
130
};
131
Box2D.Collision.b2DistanceOutput = b2DistanceOutput;
132
133
function b2DistanceProxy() {
134
b2DistanceProxy.b2DistanceProxy.apply(this, arguments);
135
};
136
Box2D.Collision.b2DistanceProxy = b2DistanceProxy;
137
138
function b2DynamicTree() {
139
b2DynamicTree.b2DynamicTree.apply(this, arguments);
140
if (this.constructor === b2DynamicTree) this.b2DynamicTree.apply(this, arguments);
141
};
142
Box2D.Collision.b2DynamicTree = b2DynamicTree;
143
144
function b2DynamicTreeBroadPhase() {
145
b2DynamicTreeBroadPhase.b2DynamicTreeBroadPhase.apply(this, arguments);
146
};
147
Box2D.Collision.b2DynamicTreeBroadPhase = b2DynamicTreeBroadPhase;
148
149
function b2DynamicTreeNode() {
150
b2DynamicTreeNode.b2DynamicTreeNode.apply(this, arguments);
151
};
152
Box2D.Collision.b2DynamicTreeNode = b2DynamicTreeNode;
153
154
function b2DynamicTreePair() {
155
b2DynamicTreePair.b2DynamicTreePair.apply(this, arguments);
156
};
157
Box2D.Collision.b2DynamicTreePair = b2DynamicTreePair;
158
159
function b2Manifold() {
160
b2Manifold.b2Manifold.apply(this, arguments);
161
if (this.constructor === b2Manifold) this.b2Manifold.apply(this, arguments);
162
};
163
Box2D.Collision.b2Manifold = b2Manifold;
164
165
function b2ManifoldPoint() {
166
b2ManifoldPoint.b2ManifoldPoint.apply(this, arguments);
167
if (this.constructor === b2ManifoldPoint) this.b2ManifoldPoint.apply(this, arguments);
168
};
169
Box2D.Collision.b2ManifoldPoint = b2ManifoldPoint;
170
171
function b2Point() {
172
b2Point.b2Point.apply(this, arguments);
173
};
174
Box2D.Collision.b2Point = b2Point;
175
176
function b2RayCastInput() {
177
b2RayCastInput.b2RayCastInput.apply(this, arguments);
178
if (this.constructor === b2RayCastInput) this.b2RayCastInput.apply(this, arguments);
179
};
180
Box2D.Collision.b2RayCastInput = b2RayCastInput;
181
182
function b2RayCastOutput() {
183
b2RayCastOutput.b2RayCastOutput.apply(this, arguments);
184
};
185
Box2D.Collision.b2RayCastOutput = b2RayCastOutput;
186
187
function b2Segment() {
188
b2Segment.b2Segment.apply(this, arguments);
189
};
190
Box2D.Collision.b2Segment = b2Segment;
191
192
function b2SeparationFunction() {
193
b2SeparationFunction.b2SeparationFunction.apply(this, arguments);
194
};
195
Box2D.Collision.b2SeparationFunction = b2SeparationFunction;
196
197
function b2Simplex() {
198
b2Simplex.b2Simplex.apply(this, arguments);
199
if (this.constructor === b2Simplex) this.b2Simplex.apply(this, arguments);
200
};
201
Box2D.Collision.b2Simplex = b2Simplex;
202
203
function b2SimplexCache() {
204
b2SimplexCache.b2SimplexCache.apply(this, arguments);
205
};
206
Box2D.Collision.b2SimplexCache = b2SimplexCache;
207
208
function b2SimplexVertex() {
209
b2SimplexVertex.b2SimplexVertex.apply(this, arguments);
210
};
211
Box2D.Collision.b2SimplexVertex = b2SimplexVertex;
212
213
function b2TimeOfImpact() {
214
b2TimeOfImpact.b2TimeOfImpact.apply(this, arguments);
215
};
216
Box2D.Collision.b2TimeOfImpact = b2TimeOfImpact;
217
218
function b2TOIInput() {
219
b2TOIInput.b2TOIInput.apply(this, arguments);
220
};
221
Box2D.Collision.b2TOIInput = b2TOIInput;
222
223
function b2WorldManifold() {
224
b2WorldManifold.b2WorldManifold.apply(this, arguments);
225
if (this.constructor === b2WorldManifold) this.b2WorldManifold.apply(this, arguments);
226
};
227
Box2D.Collision.b2WorldManifold = b2WorldManifold;
228
229
function ClipVertex() {
230
ClipVertex.ClipVertex.apply(this, arguments);
231
};
232
Box2D.Collision.ClipVertex = ClipVertex;
233
234
function Features() {
235
Features.Features.apply(this, arguments);
236
};
237
Box2D.Collision.Features = Features;
238
239
function b2CircleShape() {
240
b2CircleShape.b2CircleShape.apply(this, arguments);
241
if (this.constructor === b2CircleShape) this.b2CircleShape.apply(this, arguments);
242
};
243
Box2D.Collision.Shapes.b2CircleShape = b2CircleShape;
244
245
function b2EdgeChainDef() {
246
b2EdgeChainDef.b2EdgeChainDef.apply(this, arguments);
247
if (this.constructor === b2EdgeChainDef) this.b2EdgeChainDef.apply(this, arguments);
248
};
249
Box2D.Collision.Shapes.b2EdgeChainDef = b2EdgeChainDef;
250
251
function b2EdgeShape() {
252
b2EdgeShape.b2EdgeShape.apply(this, arguments);
253
if (this.constructor === b2EdgeShape) this.b2EdgeShape.apply(this, arguments);
254
};
255
Box2D.Collision.Shapes.b2EdgeShape = b2EdgeShape;
256
257
function b2MassData() {
258
b2MassData.b2MassData.apply(this, arguments);
259
};
260
Box2D.Collision.Shapes.b2MassData = b2MassData;
261
262
function b2PolygonShape() {
263
b2PolygonShape.b2PolygonShape.apply(this, arguments);
264
if (this.constructor === b2PolygonShape) this.b2PolygonShape.apply(this, arguments);
265
};
266
Box2D.Collision.Shapes.b2PolygonShape = b2PolygonShape;
267
268
function b2Shape() {
269
b2Shape.b2Shape.apply(this, arguments);
270
if (this.constructor === b2Shape) this.b2Shape.apply(this, arguments);
271
};
272
Box2D.Collision.Shapes.b2Shape = b2Shape;
273
Box2D.Common.b2internal = 'Box2D.Common.b2internal';
274
275
function b2Color() {
276
b2Color.b2Color.apply(this, arguments);
277
if (this.constructor === b2Color) this.b2Color.apply(this, arguments);
278
};
279
Box2D.Common.b2Color = b2Color;
280
281
function b2Settings() {
282
b2Settings.b2Settings.apply(this, arguments);
283
};
284
Box2D.Common.b2Settings = b2Settings;
285
286
function b2Mat22() {
287
b2Mat22.b2Mat22.apply(this, arguments);
288
if (this.constructor === b2Mat22) this.b2Mat22.apply(this, arguments);
289
};
290
Box2D.Common.Math.b2Mat22 = b2Mat22;
291
292
function b2Mat33() {
293
b2Mat33.b2Mat33.apply(this, arguments);
294
if (this.constructor === b2Mat33) this.b2Mat33.apply(this, arguments);
295
};
296
Box2D.Common.Math.b2Mat33 = b2Mat33;
297
298
function b2Math() {
299
b2Math.b2Math.apply(this, arguments);
300
};
301
Box2D.Common.Math.b2Math = b2Math;
302
303
function b2Sweep() {
304
b2Sweep.b2Sweep.apply(this, arguments);
305
};
306
Box2D.Common.Math.b2Sweep = b2Sweep;
307
308
function b2Transform() {
309
b2Transform.b2Transform.apply(this, arguments);
310
if (this.constructor === b2Transform) this.b2Transform.apply(this, arguments);
311
};
312
Box2D.Common.Math.b2Transform = b2Transform;
313
314
function b2Vec2() {
315
b2Vec2.b2Vec2.apply(this, arguments);
316
if (this.constructor === b2Vec2) this.b2Vec2.apply(this, arguments);
317
};
318
Box2D.Common.Math.b2Vec2 = b2Vec2;
319
320
function b2Vec3() {
321
b2Vec3.b2Vec3.apply(this, arguments);
322
if (this.constructor === b2Vec3) this.b2Vec3.apply(this, arguments);
323
};
324
Box2D.Common.Math.b2Vec3 = b2Vec3;
325
326
function b2Body() {
327
b2Body.b2Body.apply(this, arguments);
328
if (this.constructor === b2Body) this.b2Body.apply(this, arguments);
329
};
330
Box2D.Dynamics.b2Body = b2Body;
331
332
function b2BodyDef() {
333
b2BodyDef.b2BodyDef.apply(this, arguments);
334
if (this.constructor === b2BodyDef) this.b2BodyDef.apply(this, arguments);
335
};
336
Box2D.Dynamics.b2BodyDef = b2BodyDef;
337
338
function b2ContactFilter() {
339
b2ContactFilter.b2ContactFilter.apply(this, arguments);
340
};
341
Box2D.Dynamics.b2ContactFilter = b2ContactFilter;
342
343
function b2ContactImpulse() {
344
b2ContactImpulse.b2ContactImpulse.apply(this, arguments);
345
};
346
Box2D.Dynamics.b2ContactImpulse = b2ContactImpulse;
347
348
function b2ContactListener() {
349
b2ContactListener.b2ContactListener.apply(this, arguments);
350
};
351
Box2D.Dynamics.b2ContactListener = b2ContactListener;
352
353
function b2ContactManager() {
354
b2ContactManager.b2ContactManager.apply(this, arguments);
355
if (this.constructor === b2ContactManager) this.b2ContactManager.apply(this, arguments);
356
};
357
Box2D.Dynamics.b2ContactManager = b2ContactManager;
358
359
function b2DebugDraw() {
360
b2DebugDraw.b2DebugDraw.apply(this, arguments);
361
if (this.constructor === b2DebugDraw) this.b2DebugDraw.apply(this, arguments);
362
};
363
Box2D.Dynamics.b2DebugDraw = b2DebugDraw;
364
365
function b2DestructionListener() {
366
b2DestructionListener.b2DestructionListener.apply(this, arguments);
367
};
368
Box2D.Dynamics.b2DestructionListener = b2DestructionListener;
369
370
function b2FilterData() {
371
b2FilterData.b2FilterData.apply(this, arguments);
372
};
373
Box2D.Dynamics.b2FilterData = b2FilterData;
374
375
function b2Fixture() {
376
b2Fixture.b2Fixture.apply(this, arguments);
377
if (this.constructor === b2Fixture) this.b2Fixture.apply(this, arguments);
378
};
379
Box2D.Dynamics.b2Fixture = b2Fixture;
380
381
function b2FixtureDef() {
382
b2FixtureDef.b2FixtureDef.apply(this, arguments);
383
if (this.constructor === b2FixtureDef) this.b2FixtureDef.apply(this, arguments);
384
};
385
Box2D.Dynamics.b2FixtureDef = b2FixtureDef;
386
387
function b2Island() {
388
b2Island.b2Island.apply(this, arguments);
389
if (this.constructor === b2Island) this.b2Island.apply(this, arguments);
390
};
391
Box2D.Dynamics.b2Island = b2Island;
392
393
function b2TimeStep() {
394
b2TimeStep.b2TimeStep.apply(this, arguments);
395
};
396
Box2D.Dynamics.b2TimeStep = b2TimeStep;
397
398
function b2World() {
399
b2World.b2World.apply(this, arguments);
400
if (this.constructor === b2World) this.b2World.apply(this, arguments);
401
};
402
Box2D.Dynamics.b2World = b2World;
403
404
function b2CircleContact() {
405
b2CircleContact.b2CircleContact.apply(this, arguments);
406
};
407
Box2D.Dynamics.Contacts.b2CircleContact = b2CircleContact;
408
409
function b2Contact() {
410
b2Contact.b2Contact.apply(this, arguments);
411
if (this.constructor === b2Contact) this.b2Contact.apply(this, arguments);
412
};
413
Box2D.Dynamics.Contacts.b2Contact = b2Contact;
414
415
function b2ContactConstraint() {
416
b2ContactConstraint.b2ContactConstraint.apply(this, arguments);
417
if (this.constructor === b2ContactConstraint) this.b2ContactConstraint.apply(this, arguments);
418
};
419
Box2D.Dynamics.Contacts.b2ContactConstraint = b2ContactConstraint;
420
421
function b2ContactConstraintPoint() {
422
b2ContactConstraintPoint.b2ContactConstraintPoint.apply(this, arguments);
423
};
424
Box2D.Dynamics.Contacts.b2ContactConstraintPoint = b2ContactConstraintPoint;
425
426
function b2ContactEdge() {
427
b2ContactEdge.b2ContactEdge.apply(this, arguments);
428
};
429
Box2D.Dynamics.Contacts.b2ContactEdge = b2ContactEdge;
430
431
function b2ContactFactory() {
432
b2ContactFactory.b2ContactFactory.apply(this, arguments);
433
if (this.constructor === b2ContactFactory) this.b2ContactFactory.apply(this, arguments);
434
};
435
Box2D.Dynamics.Contacts.b2ContactFactory = b2ContactFactory;
436
437
function b2ContactRegister() {
438
b2ContactRegister.b2ContactRegister.apply(this, arguments);
439
};
440
Box2D.Dynamics.Contacts.b2ContactRegister = b2ContactRegister;
441
442
function b2ContactResult() {
443
b2ContactResult.b2ContactResult.apply(this, arguments);
444
};
445
Box2D.Dynamics.Contacts.b2ContactResult = b2ContactResult;
446
447
function b2ContactSolver() {
448
b2ContactSolver.b2ContactSolver.apply(this, arguments);
449
if (this.constructor === b2ContactSolver) this.b2ContactSolver.apply(this, arguments);
450
};
451
Box2D.Dynamics.Contacts.b2ContactSolver = b2ContactSolver;
452
453
function b2EdgeAndCircleContact() {
454
b2EdgeAndCircleContact.b2EdgeAndCircleContact.apply(this, arguments);
455
};
456
Box2D.Dynamics.Contacts.b2EdgeAndCircleContact = b2EdgeAndCircleContact;
457
458
function b2NullContact() {
459
b2NullContact.b2NullContact.apply(this, arguments);
460
if (this.constructor === b2NullContact) this.b2NullContact.apply(this, arguments);
461
};
462
Box2D.Dynamics.Contacts.b2NullContact = b2NullContact;
463
464
function b2PolyAndCircleContact() {
465
b2PolyAndCircleContact.b2PolyAndCircleContact.apply(this, arguments);
466
};
467
Box2D.Dynamics.Contacts.b2PolyAndCircleContact = b2PolyAndCircleContact;
468
469
function b2PolyAndEdgeContact() {
470
b2PolyAndEdgeContact.b2PolyAndEdgeContact.apply(this, arguments);
471
};
472
Box2D.Dynamics.Contacts.b2PolyAndEdgeContact = b2PolyAndEdgeContact;
473
474
function b2PolygonContact() {
475
b2PolygonContact.b2PolygonContact.apply(this, arguments);
476
};
477
Box2D.Dynamics.Contacts.b2PolygonContact = b2PolygonContact;
478
479
function b2PositionSolverManifold() {
480
b2PositionSolverManifold.b2PositionSolverManifold.apply(this, arguments);
481
if (this.constructor === b2PositionSolverManifold) this.b2PositionSolverManifold.apply(this, arguments);
482
};
483
Box2D.Dynamics.Contacts.b2PositionSolverManifold = b2PositionSolverManifold;
484
485
function b2BuoyancyController() {
486
b2BuoyancyController.b2BuoyancyController.apply(this, arguments);
487
};
488
Box2D.Dynamics.Controllers.b2BuoyancyController = b2BuoyancyController;
489
490
function b2ConstantAccelController() {
491
b2ConstantAccelController.b2ConstantAccelController.apply(this, arguments);
492
};
493
Box2D.Dynamics.Controllers.b2ConstantAccelController = b2ConstantAccelController;
494
495
function b2ConstantForceController() {
496
b2ConstantForceController.b2ConstantForceController.apply(this, arguments);
497
};
498
Box2D.Dynamics.Controllers.b2ConstantForceController = b2ConstantForceController;
499
500
function b2Controller() {
501
b2Controller.b2Controller.apply(this, arguments);
502
};
503
Box2D.Dynamics.Controllers.b2Controller = b2Controller;
504
505
function b2ControllerEdge() {
506
b2ControllerEdge.b2ControllerEdge.apply(this, arguments);
507
};
508
Box2D.Dynamics.Controllers.b2ControllerEdge = b2ControllerEdge;
509
510
function b2GravityController() {
511
b2GravityController.b2GravityController.apply(this, arguments);
512
};
513
Box2D.Dynamics.Controllers.b2GravityController = b2GravityController;
514
515
function b2TensorDampingController() {
516
b2TensorDampingController.b2TensorDampingController.apply(this, arguments);
517
};
518
Box2D.Dynamics.Controllers.b2TensorDampingController = b2TensorDampingController;
519
520
function b2DistanceJoint() {
521
b2DistanceJoint.b2DistanceJoint.apply(this, arguments);
522
if (this.constructor === b2DistanceJoint) this.b2DistanceJoint.apply(this, arguments);
523
};
524
Box2D.Dynamics.Joints.b2DistanceJoint = b2DistanceJoint;
525
526
function b2DistanceJointDef() {
527
b2DistanceJointDef.b2DistanceJointDef.apply(this, arguments);
528
if (this.constructor === b2DistanceJointDef) this.b2DistanceJointDef.apply(this, arguments);
529
};
530
Box2D.Dynamics.Joints.b2DistanceJointDef = b2DistanceJointDef;
531
532
function b2FrictionJoint() {
533
b2FrictionJoint.b2FrictionJoint.apply(this, arguments);
534
if (this.constructor === b2FrictionJoint) this.b2FrictionJoint.apply(this, arguments);
535
};
536
Box2D.Dynamics.Joints.b2FrictionJoint = b2FrictionJoint;
537
538
function b2FrictionJointDef() {
539
b2FrictionJointDef.b2FrictionJointDef.apply(this, arguments);
540
if (this.constructor === b2FrictionJointDef) this.b2FrictionJointDef.apply(this, arguments);
541
};
542
Box2D.Dynamics.Joints.b2FrictionJointDef = b2FrictionJointDef;
543
544
function b2GearJoint() {
545
b2GearJoint.b2GearJoint.apply(this, arguments);
546
if (this.constructor === b2GearJoint) this.b2GearJoint.apply(this, arguments);
547
};
548
Box2D.Dynamics.Joints.b2GearJoint = b2GearJoint;
549
550
function b2GearJointDef() {
551
b2GearJointDef.b2GearJointDef.apply(this, arguments);
552
if (this.constructor === b2GearJointDef) this.b2GearJointDef.apply(this, arguments);
553
};
554
Box2D.Dynamics.Joints.b2GearJointDef = b2GearJointDef;
555
556
function b2Jacobian() {
557
b2Jacobian.b2Jacobian.apply(this, arguments);
558
};
559
Box2D.Dynamics.Joints.b2Jacobian = b2Jacobian;
560
561
function b2Joint() {
562
b2Joint.b2Joint.apply(this, arguments);
563
if (this.constructor === b2Joint) this.b2Joint.apply(this, arguments);
564
};
565
Box2D.Dynamics.Joints.b2Joint = b2Joint;
566
567
function b2JointDef() {
568
b2JointDef.b2JointDef.apply(this, arguments);
569
if (this.constructor === b2JointDef) this.b2JointDef.apply(this, arguments);
570
};
571
Box2D.Dynamics.Joints.b2JointDef = b2JointDef;
572
573
function b2JointEdge() {
574
b2JointEdge.b2JointEdge.apply(this, arguments);
575
};
576
Box2D.Dynamics.Joints.b2JointEdge = b2JointEdge;
577
578
function b2LineJoint() {
579
b2LineJoint.b2LineJoint.apply(this, arguments);
580
if (this.constructor === b2LineJoint) this.b2LineJoint.apply(this, arguments);
581
};
582
Box2D.Dynamics.Joints.b2LineJoint = b2LineJoint;
583
584
function b2LineJointDef() {
585
b2LineJointDef.b2LineJointDef.apply(this, arguments);
586
if (this.constructor === b2LineJointDef) this.b2LineJointDef.apply(this, arguments);
587
};
588
Box2D.Dynamics.Joints.b2LineJointDef = b2LineJointDef;
589
590
function b2MouseJoint() {
591
b2MouseJoint.b2MouseJoint.apply(this, arguments);
592
if (this.constructor === b2MouseJoint) this.b2MouseJoint.apply(this, arguments);
593
};
594
Box2D.Dynamics.Joints.b2MouseJoint = b2MouseJoint;
595
596
function b2MouseJointDef() {
597
b2MouseJointDef.b2MouseJointDef.apply(this, arguments);
598
if (this.constructor === b2MouseJointDef) this.b2MouseJointDef.apply(this, arguments);
599
};
600
Box2D.Dynamics.Joints.b2MouseJointDef = b2MouseJointDef;
601
602
function b2PrismaticJoint() {
603
b2PrismaticJoint.b2PrismaticJoint.apply(this, arguments);
604
if (this.constructor === b2PrismaticJoint) this.b2PrismaticJoint.apply(this, arguments);
605
};
606
Box2D.Dynamics.Joints.b2PrismaticJoint = b2PrismaticJoint;
607
608
function b2PrismaticJointDef() {
609
b2PrismaticJointDef.b2PrismaticJointDef.apply(this, arguments);
610
if (this.constructor === b2PrismaticJointDef) this.b2PrismaticJointDef.apply(this, arguments);
611
};
612
Box2D.Dynamics.Joints.b2PrismaticJointDef = b2PrismaticJointDef;
613
614
function b2PulleyJoint() {
615
b2PulleyJoint.b2PulleyJoint.apply(this, arguments);
616
if (this.constructor === b2PulleyJoint) this.b2PulleyJoint.apply(this, arguments);
617
};
618
Box2D.Dynamics.Joints.b2PulleyJoint = b2PulleyJoint;
619
620
function b2PulleyJointDef() {
621
b2PulleyJointDef.b2PulleyJointDef.apply(this, arguments);
622
if (this.constructor === b2PulleyJointDef) this.b2PulleyJointDef.apply(this, arguments);
623
};
624
Box2D.Dynamics.Joints.b2PulleyJointDef = b2PulleyJointDef;
625
626
function b2RevoluteJoint() {
627
b2RevoluteJoint.b2RevoluteJoint.apply(this, arguments);
628
if (this.constructor === b2RevoluteJoint) this.b2RevoluteJoint.apply(this, arguments);
629
};
630
Box2D.Dynamics.Joints.b2RevoluteJoint = b2RevoluteJoint;
631
632
function b2RevoluteJointDef() {
633
b2RevoluteJointDef.b2RevoluteJointDef.apply(this, arguments);
634
if (this.constructor === b2RevoluteJointDef) this.b2RevoluteJointDef.apply(this, arguments);
635
};
636
Box2D.Dynamics.Joints.b2RevoluteJointDef = b2RevoluteJointDef;
637
638
function b2WeldJoint() {
639
b2WeldJoint.b2WeldJoint.apply(this, arguments);
640
if (this.constructor === b2WeldJoint) this.b2WeldJoint.apply(this, arguments);
641
};
642
Box2D.Dynamics.Joints.b2WeldJoint = b2WeldJoint;
643
644
function b2WeldJointDef() {
645
b2WeldJointDef.b2WeldJointDef.apply(this, arguments);
646
if (this.constructor === b2WeldJointDef) this.b2WeldJointDef.apply(this, arguments);
647
};
648
Box2D.Dynamics.Joints.b2WeldJointDef = b2WeldJointDef;
649
})(); //definitions
650
Box2D.postDefs = [];
651
(function () {
652
var b2CircleShape = Box2D.Collision.Shapes.b2CircleShape,
653
b2EdgeChainDef = Box2D.Collision.Shapes.b2EdgeChainDef,
654
b2EdgeShape = Box2D.Collision.Shapes.b2EdgeShape,
655
b2MassData = Box2D.Collision.Shapes.b2MassData,
656
b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape,
657
b2Shape = Box2D.Collision.Shapes.b2Shape,
658
b2Color = Box2D.Common.b2Color,
659
b2internal = Box2D.Common.b2internal,
660
b2Settings = Box2D.Common.b2Settings,
661
b2Mat22 = Box2D.Common.Math.b2Mat22,
662
b2Mat33 = Box2D.Common.Math.b2Mat33,
663
b2Math = Box2D.Common.Math.b2Math,
664
b2Sweep = Box2D.Common.Math.b2Sweep,
665
b2Transform = Box2D.Common.Math.b2Transform,
666
b2Vec2 = Box2D.Common.Math.b2Vec2,
667
b2Vec3 = Box2D.Common.Math.b2Vec3,
668
b2AABB = Box2D.Collision.b2AABB,
669
b2Bound = Box2D.Collision.b2Bound,
670
b2BoundValues = Box2D.Collision.b2BoundValues,
671
b2Collision = Box2D.Collision.b2Collision,
672
b2ContactID = Box2D.Collision.b2ContactID,
673
b2ContactPoint = Box2D.Collision.b2ContactPoint,
674
b2Distance = Box2D.Collision.b2Distance,
675
b2DistanceInput = Box2D.Collision.b2DistanceInput,
676
b2DistanceOutput = Box2D.Collision.b2DistanceOutput,
677
b2DistanceProxy = Box2D.Collision.b2DistanceProxy,
678
b2DynamicTree = Box2D.Collision.b2DynamicTree,
679
b2DynamicTreeBroadPhase = Box2D.Collision.b2DynamicTreeBroadPhase,
680
b2DynamicTreeNode = Box2D.Collision.b2DynamicTreeNode,
681
b2DynamicTreePair = Box2D.Collision.b2DynamicTreePair,
682
b2Manifold = Box2D.Collision.b2Manifold,
683
b2ManifoldPoint = Box2D.Collision.b2ManifoldPoint,
684
b2Point = Box2D.Collision.b2Point,
685
b2RayCastInput = Box2D.Collision.b2RayCastInput,
686
b2RayCastOutput = Box2D.Collision.b2RayCastOutput,
687
b2Segment = Box2D.Collision.b2Segment,
688
b2SeparationFunction = Box2D.Collision.b2SeparationFunction,
689
b2Simplex = Box2D.Collision.b2Simplex,
690
b2SimplexCache = Box2D.Collision.b2SimplexCache,
691
b2SimplexVertex = Box2D.Collision.b2SimplexVertex,
692
b2TimeOfImpact = Box2D.Collision.b2TimeOfImpact,
693
b2TOIInput = Box2D.Collision.b2TOIInput,
694
b2WorldManifold = Box2D.Collision.b2WorldManifold,
695
ClipVertex = Box2D.Collision.ClipVertex,
696
Features = Box2D.Collision.Features,
697
IBroadPhase = Box2D.Collision.IBroadPhase;
698
699
b2AABB.b2AABB = function () {
700
this.lowerBound = new b2Vec2();
701
this.upperBound = new b2Vec2();
702
};
703
b2AABB.prototype.IsValid = function () {
704
var dX = this.upperBound.x - this.lowerBound.x;
705
var dY = this.upperBound.y - this.lowerBound.y;
706
var valid = dX >= 0.0 && dY >= 0.0;
707
valid = valid && this.lowerBound.IsValid() && this.upperBound.IsValid();
708
return valid;
709
}
710
b2AABB.prototype.GetCenter = function () {
711
return new b2Vec2((this.lowerBound.x + this.upperBound.x) / 2, (this.lowerBound.y + this.upperBound.y) / 2);
712
}
713
b2AABB.prototype.GetExtents = function () {
714
return new b2Vec2((this.upperBound.x - this.lowerBound.x) / 2, (this.upperBound.y - this.lowerBound.y) / 2);
715
}
716
b2AABB.prototype.Contains = function (aabb) {
717
var result = true;
718
result = result && this.lowerBound.x <= aabb.lowerBound.x;
719
result = result && this.lowerBound.y <= aabb.lowerBound.y;
720
result = result && aabb.upperBound.x <= this.upperBound.x;
721
result = result && aabb.upperBound.y <= this.upperBound.y;
722
return result;
723
}
724
b2AABB.prototype.RayCast = function (output, input) {
725
var tmin = (-Number.MAX_VALUE);
726
var tmax = Number.MAX_VALUE;
727
var pX = input.p1.x;
728
var pY = input.p1.y;
729
var dX = input.p2.x - input.p1.x;
730
var dY = input.p2.y - input.p1.y;
731
var absDX = Math.abs(dX);
732
var absDY = Math.abs(dY);
733
var normal = output.normal;
734
var inv_d = 0;
735
var t1 = 0;
736
var t2 = 0;
737
var t3 = 0;
738
var s = 0; {
739
if (absDX < Number.MIN_VALUE) {
740
if (pX < this.lowerBound.x || this.upperBound.x < pX) return false;
741
}
742
else {
743
inv_d = 1.0 / dX;
744
t1 = (this.lowerBound.x - pX) * inv_d;
745
t2 = (this.upperBound.x - pX) * inv_d;
746
s = (-1.0);
747
if (t1 > t2) {
748
t3 = t1;
749
t1 = t2;
750
t2 = t3;
751
s = 1.0;
752
}
753
if (t1 > tmin) {
754
normal.x = s;
755
normal.y = 0;
756
tmin = t1;
757
}
758
tmax = Math.min(tmax, t2);
759
if (tmin > tmax) return false;
760
}
761
} {
762
if (absDY < Number.MIN_VALUE) {
763
if (pY < this.lowerBound.y || this.upperBound.y < pY) return false;
764
}
765
else {
766
inv_d = 1.0 / dY;
767
t1 = (this.lowerBound.y - pY) * inv_d;
768
t2 = (this.upperBound.y - pY) * inv_d;
769
s = (-1.0);
770
if (t1 > t2) {
771
t3 = t1;
772
t1 = t2;
773
t2 = t3;
774
s = 1.0;
775
}
776
if (t1 > tmin) {
777
normal.y = s;
778
normal.x = 0;
779
tmin = t1;
780
}
781
tmax = Math.min(tmax, t2);
782
if (tmin > tmax) return false;
783
}
784
}
785
output.fraction = tmin;
786
return true;
787
}
788
b2AABB.prototype.TestOverlap = function (other) {
789
var d1X = other.lowerBound.x - this.upperBound.x;
790
var d1Y = other.lowerBound.y - this.upperBound.y;
791
var d2X = this.lowerBound.x - other.upperBound.x;
792
var d2Y = this.lowerBound.y - other.upperBound.y;
793
if (d1X > 0.0 || d1Y > 0.0) return false;
794
if (d2X > 0.0 || d2Y > 0.0) return false;
795
return true;
796
}
797
b2AABB.Combine = function (aabb1, aabb2) {
798
var aabb = new b2AABB();
799
aabb.Combine(aabb1, aabb2);
800
return aabb;
801
}
802
b2AABB.prototype.Combine = function (aabb1, aabb2) {
803
this.lowerBound.x = Math.min(aabb1.lowerBound.x, aabb2.lowerBound.x);
804
this.lowerBound.y = Math.min(aabb1.lowerBound.y, aabb2.lowerBound.y);
805
this.upperBound.x = Math.max(aabb1.upperBound.x, aabb2.upperBound.x);
806
this.upperBound.y = Math.max(aabb1.upperBound.y, aabb2.upperBound.y);
807
}
808
b2Bound.b2Bound = function () {};
809
b2Bound.prototype.IsLower = function () {
810
return (this.value & 1) == 0;
811
}
812
b2Bound.prototype.IsUpper = function () {
813
return (this.value & 1) == 1;
814
}
815
b2Bound.prototype.Swap = function (b) {
816
var tempValue = this.value;
817
var tempProxy = this.proxy;
818
var tempStabbingCount = this.stabbingCount;
819
this.value = b.value;
820
this.proxy = b.proxy;
821
this.stabbingCount = b.stabbingCount;
822
b.value = tempValue;
823
b.proxy = tempProxy;
824
b.stabbingCount = tempStabbingCount;
825
}
826
b2BoundValues.b2BoundValues = function () {};
827
b2BoundValues.prototype.b2BoundValues = function () {
828
this.lowerValues = new Vector_a2j_Number();
829
this.lowerValues[0] = 0.0;
830
this.lowerValues[1] = 0.0;
831
this.upperValues = new Vector_a2j_Number();
832
this.upperValues[0] = 0.0;
833
this.upperValues[1] = 0.0;
834
}
835
b2Collision.b2Collision = function () {};
836
b2Collision.ClipSegmentToLine = function (vOut, vIn, normal, offset) {
837
if (offset === undefined) offset = 0;
838
var cv;
839
var numOut = 0;
840
cv = vIn[0];
841
var vIn0 = cv.v;
842
cv = vIn[1];
843
var vIn1 = cv.v;
844
var distance0 = normal.x * vIn0.x + normal.y * vIn0.y - offset;
845
var distance1 = normal.x * vIn1.x + normal.y * vIn1.y - offset;
846
if (distance0 <= 0.0) vOut[numOut++].Set(vIn[0]);
847
if (distance1 <= 0.0) vOut[numOut++].Set(vIn[1]);
848
if (distance0 * distance1 < 0.0) {
849
var interp = distance0 / (distance0 - distance1);
850
cv = vOut[numOut];
851
var tVec = cv.v;
852
tVec.x = vIn0.x + interp * (vIn1.x - vIn0.x);
853
tVec.y = vIn0.y + interp * (vIn1.y - vIn0.y);
854
cv = vOut[numOut];
855
var cv2;
856
if (distance0 > 0.0) {
857
cv2 = vIn[0];
858
cv.id = cv2.id;
859
}
860
else {
861
cv2 = vIn[1];
862
cv.id = cv2.id;
863
}++numOut;
864
}
865
return numOut;
866
}
867
b2Collision.EdgeSeparation = function (poly1, xf1, edge1, poly2, xf2) {
868
if (edge1 === undefined) edge1 = 0;
869
var count1 = parseInt(poly1.m_vertexCount);
870
var vertices1 = poly1.m_vertices;
871
var normals1 = poly1.m_normals;
872
var count2 = parseInt(poly2.m_vertexCount);
873
var vertices2 = poly2.m_vertices;
874
var tMat;
875
var tVec;
876
tMat = xf1.R;
877
tVec = normals1[edge1];
878
var normal1WorldX = (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
879
var normal1WorldY = (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
880
tMat = xf2.R;
881
var normal1X = (tMat.col1.x * normal1WorldX + tMat.col1.y * normal1WorldY);
882
var normal1Y = (tMat.col2.x * normal1WorldX + tMat.col2.y * normal1WorldY);
883
var index = 0;
884
var minDot = Number.MAX_VALUE;
885
for (var i = 0; i < count2; ++i) {
886
tVec = vertices2[i];
887
var dot = tVec.x * normal1X + tVec.y * normal1Y;
888
if (dot < minDot) {
889
minDot = dot;
890
index = i;
891
}
892
}
893
tVec = vertices1[edge1];
894
tMat = xf1.R;
895
var v1X = xf1.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
896
var v1Y = xf1.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
897
tVec = vertices2[index];
898
tMat = xf2.R;
899
var v2X = xf2.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
900
var v2Y = xf2.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
901
v2X -= v1X;
902
v2Y -= v1Y;
903
var separation = v2X * normal1WorldX + v2Y * normal1WorldY;
904
return separation;
905
}
906
b2Collision.FindMaxSeparation = function (edgeIndex, poly1, xf1, poly2, xf2) {
907
var count1 = parseInt(poly1.m_vertexCount);
908
var normals1 = poly1.m_normals;
909
var tVec;
910
var tMat;
911
tMat = xf2.R;
912
tVec = poly2.m_centroid;
913
var dX = xf2.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
914
var dY = xf2.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
915
tMat = xf1.R;
916
tVec = poly1.m_centroid;
917
dX -= xf1.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
918
dY -= xf1.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
919
var dLocal1X = (dX * xf1.R.col1.x + dY * xf1.R.col1.y);
920
var dLocal1Y = (dX * xf1.R.col2.x + dY * xf1.R.col2.y);
921
var edge = 0;
922
var maxDot = (-Number.MAX_VALUE);
923
for (var i = 0; i < count1; ++i) {
924
tVec = normals1[i];
925
var dot = (tVec.x * dLocal1X + tVec.y * dLocal1Y);
926
if (dot > maxDot) {
927
maxDot = dot;
928
edge = i;
929
}
930
}
931
var s = b2Collision.EdgeSeparation(poly1, xf1, edge, poly2, xf2);
932
var prevEdge = parseInt(edge - 1 >= 0 ? edge - 1 : count1 - 1);
933
var sPrev = b2Collision.EdgeSeparation(poly1, xf1, prevEdge, poly2, xf2);
934
var nextEdge = parseInt(edge + 1 < count1 ? edge + 1 : 0);
935
var sNext = b2Collision.EdgeSeparation(poly1, xf1, nextEdge, poly2, xf2);
936
var bestEdge = 0;
937
var bestSeparation = 0;
938
var increment = 0;
939
if (sPrev > s && sPrev > sNext) {
940
increment = (-1);
941
bestEdge = prevEdge;
942
bestSeparation = sPrev;
943
}
944
else if (sNext > s) {
945
increment = 1;
946
bestEdge = nextEdge;
947
bestSeparation = sNext;
948
}
949
else {
950
edgeIndex[0] = edge;
951
return s;
952
}
953
while (true) {
954
if (increment == (-1)) edge = bestEdge - 1 >= 0 ? bestEdge - 1 : count1 - 1;
955
else edge = bestEdge + 1 < count1 ? bestEdge + 1 : 0;s = b2Collision.EdgeSeparation(poly1, xf1, edge, poly2, xf2);
956
if (s > bestSeparation) {
957
bestEdge = edge;
958
bestSeparation = s;
959
}
960
else {
961
break;
962
}
963
}
964
edgeIndex[0] = bestEdge;
965
return bestSeparation;
966
}
967
b2Collision.FindIncidentEdge = function (c, poly1, xf1, edge1, poly2, xf2) {
968
if (edge1 === undefined) edge1 = 0;
969
var count1 = parseInt(poly1.m_vertexCount);
970
var normals1 = poly1.m_normals;
971
var count2 = parseInt(poly2.m_vertexCount);
972
var vertices2 = poly2.m_vertices;
973
var normals2 = poly2.m_normals;
974
var tMat;
975
var tVec;
976
tMat = xf1.R;
977
tVec = normals1[edge1];
978
var normal1X = (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
979
var normal1Y = (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
980
tMat = xf2.R;
981
var tX = (tMat.col1.x * normal1X + tMat.col1.y * normal1Y);
982
normal1Y = (tMat.col2.x * normal1X + tMat.col2.y * normal1Y);
983
normal1X = tX;
984
var index = 0;
985
var minDot = Number.MAX_VALUE;
986
for (var i = 0; i < count2; ++i) {
987
tVec = normals2[i];
988
var dot = (normal1X * tVec.x + normal1Y * tVec.y);
989
if (dot < minDot) {
990
minDot = dot;
991
index = i;
992
}
993
}
994
var tClip;
995
var i1 = parseInt(index);
996
var i2 = parseInt(i1 + 1 < count2 ? i1 + 1 : 0);
997
tClip = c[0];
998
tVec = vertices2[i1];
999
tMat = xf2.R;
1000
tClip.v.x = xf2.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
1001
tClip.v.y = xf2.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
1002
tClip.id.features.referenceEdge = edge1;
1003
tClip.id.features.incidentEdge = i1;
1004
tClip.id.features.incidentVertex = 0;
1005
tClip = c[1];
1006
tVec = vertices2[i2];
1007
tMat = xf2.R;
1008
tClip.v.x = xf2.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
1009
tClip.v.y = xf2.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
1010
tClip.id.features.referenceEdge = edge1;
1011
tClip.id.features.incidentEdge = i2;
1012
tClip.id.features.incidentVertex = 1;
1013
}
1014
b2Collision.MakeClipPointVector = function () {
1015
var r = new Vector(2);
1016
r[0] = new ClipVertex();
1017
r[1] = new ClipVertex();
1018
return r;
1019
}
1020
b2Collision.CollidePolygons = function (manifold, polyA, xfA, polyB, xfB) {
1021
var cv;
1022
manifold.m_pointCount = 0;
1023
var totalRadius = polyA.m_radius + polyB.m_radius;
1024
var edgeA = 0;
1025
b2Collision.s_edgeAO[0] = edgeA;
1026
var separationA = b2Collision.FindMaxSeparation(b2Collision.s_edgeAO, polyA, xfA, polyB, xfB);
1027
edgeA = b2Collision.s_edgeAO[0];
1028
if (separationA > totalRadius) return;
1029
var edgeB = 0;
1030
b2Collision.s_edgeBO[0] = edgeB;
1031
var separationB = b2Collision.FindMaxSeparation(b2Collision.s_edgeBO, polyB, xfB, polyA, xfA);
1032
edgeB = b2Collision.s_edgeBO[0];
1033
if (separationB > totalRadius) return;
1034
var poly1;
1035
var poly2;
1036
var xf1;
1037
var xf2;
1038
var edge1 = 0;
1039
var flip = 0;
1040
var k_relativeTol = 0.98;
1041
var k_absoluteTol = 0.001;
1042
var tMat;
1043
if (separationB > k_relativeTol * separationA + k_absoluteTol) {
1044
poly1 = polyB;
1045
poly2 = polyA;
1046
xf1 = xfB;
1047
xf2 = xfA;
1048
edge1 = edgeB;
1049
manifold.m_type = b2Manifold.e_faceB;
1050
flip = 1;
1051
}
1052
else {
1053
poly1 = polyA;
1054
poly2 = polyB;
1055
xf1 = xfA;
1056
xf2 = xfB;
1057
edge1 = edgeA;
1058
manifold.m_type = b2Manifold.e_faceA;
1059
flip = 0;
1060
}
1061
var incidentEdge = b2Collision.s_incidentEdge;
1062
b2Collision.FindIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2);
1063
var count1 = parseInt(poly1.m_vertexCount);
1064
var vertices1 = poly1.m_vertices;
1065
var local_v11 = vertices1[edge1];
1066
var local_v12;
1067
if (edge1 + 1 < count1) {
1068
local_v12 = vertices1[parseInt(edge1 + 1)];
1069
}
1070
else {
1071
local_v12 = vertices1[0];
1072
}
1073
var localTangent = b2Collision.s_localTangent;
1074
localTangent.Set(local_v12.x - local_v11.x, local_v12.y - local_v11.y);
1075
localTangent.Normalize();
1076
var localNormal = b2Collision.s_localNormal;
1077
localNormal.x = localTangent.y;
1078
localNormal.y = (-localTangent.x);
1079
var planePoint = b2Collision.s_planePoint;
1080
planePoint.Set(0.5 * (local_v11.x + local_v12.x), 0.5 * (local_v11.y + local_v12.y));
1081
var tangent = b2Collision.s_tangent;
1082
tMat = xf1.R;
1083
tangent.x = (tMat.col1.x * localTangent.x + tMat.col2.x * localTangent.y);
1084
tangent.y = (tMat.col1.y * localTangent.x + tMat.col2.y * localTangent.y);
1085
var tangent2 = b2Collision.s_tangent2;
1086
tangent2.x = (-tangent.x);
1087
tangent2.y = (-tangent.y);
1088
var normal = b2Collision.s_normal;
1089
normal.x = tangent.y;
1090
normal.y = (-tangent.x);
1091
var v11 = b2Collision.s_v11;
1092
var v12 = b2Collision.s_v12;
1093
v11.x = xf1.position.x + (tMat.col1.x * local_v11.x + tMat.col2.x * local_v11.y);
1094
v11.y = xf1.position.y + (tMat.col1.y * local_v11.x + tMat.col2.y * local_v11.y);
1095
v12.x = xf1.position.x + (tMat.col1.x * local_v12.x + tMat.col2.x * local_v12.y);
1096
v12.y = xf1.position.y + (tMat.col1.y * local_v12.x + tMat.col2.y * local_v12.y);
1097
var frontOffset = normal.x * v11.x + normal.y * v11.y;
1098
var sideOffset1 = (-tangent.x * v11.x) - tangent.y * v11.y + totalRadius;
1099
var sideOffset2 = tangent.x * v12.x + tangent.y * v12.y + totalRadius;
1100
var clipPoints1 = b2Collision.s_clipPoints1;
1101
var clipPoints2 = b2Collision.s_clipPoints2;
1102
var np = 0;
1103
np = b2Collision.ClipSegmentToLine(clipPoints1, incidentEdge, tangent2, sideOffset1);
1104
if (np < 2) return;
1105
np = b2Collision.ClipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2);
1106
if (np < 2) return;
1107
manifold.m_localPlaneNormal.SetV(localNormal);
1108
manifold.m_localPoint.SetV(planePoint);
1109
var pointCount = 0;
1110
for (var i = 0; i < b2Settings.b2_maxManifoldPoints; ++i) {
1111
cv = clipPoints2[i];
1112
var separation = normal.x * cv.v.x + normal.y * cv.v.y - frontOffset;
1113
if (separation <= totalRadius) {
1114
var cp = manifold.m_points[pointCount];
1115
tMat = xf2.R;
1116
var tX = cv.v.x - xf2.position.x;
1117
var tY = cv.v.y - xf2.position.y;
1118
cp.m_localPoint.x = (tX * tMat.col1.x + tY * tMat.col1.y);
1119
cp.m_localPoint.y = (tX * tMat.col2.x + tY * tMat.col2.y);
1120
cp.m_id.Set(cv.id);
1121
cp.m_id.features.flip = flip;
1122
++pointCount;
1123
}
1124
}
1125
manifold.m_pointCount = pointCount;
1126
}
1127
b2Collision.CollideCircles = function (manifold, circle1, xf1, circle2, xf2) {
1128
manifold.m_pointCount = 0;
1129
var tMat;
1130
var tVec;
1131
tMat = xf1.R;
1132
tVec = circle1.m_p;
1133
var p1X = xf1.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
1134
var p1Y = xf1.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
1135
tMat = xf2.R;
1136
tVec = circle2.m_p;
1137
var p2X = xf2.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
1138
var p2Y = xf2.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
1139
var dX = p2X - p1X;
1140
var dY = p2Y - p1Y;
1141
var distSqr = dX * dX + dY * dY;
1142
var radius = circle1.m_radius + circle2.m_radius;
1143
if (distSqr > radius * radius) {
1144
return;
1145
}
1146
manifold.m_type = b2Manifold.e_circles;
1147
manifold.m_localPoint.SetV(circle1.m_p);
1148
manifold.m_localPlaneNormal.SetZero();
1149
manifold.m_pointCount = 1;
1150
manifold.m_points[0].m_localPoint.SetV(circle2.m_p);
1151
manifold.m_points[0].m_id.key = 0;
1152
}
1153
b2Collision.CollidePolygonAndCircle = function (manifold, polygon, xf1, circle, xf2) {
1154
manifold.m_pointCount = 0;
1155
var tPoint;
1156
var dX = 0;
1157
var dY = 0;
1158
var positionX = 0;
1159
var positionY = 0;
1160
var tVec;
1161
var tMat;
1162
tMat = xf2.R;
1163
tVec = circle.m_p;
1164
var cX = xf2.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
1165
var cY = xf2.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
1166
dX = cX - xf1.position.x;
1167
dY = cY - xf1.position.y;
1168
tMat = xf1.R;
1169
var cLocalX = (dX * tMat.col1.x + dY * tMat.col1.y);
1170
var cLocalY = (dX * tMat.col2.x + dY * tMat.col2.y);
1171
var dist = 0;
1172
var normalIndex = 0;
1173
var separation = (-Number.MAX_VALUE);
1174
var radius = polygon.m_radius + circle.m_radius;
1175
var vertexCount = parseInt(polygon.m_vertexCount);
1176
var vertices = polygon.m_vertices;
1177
var normals = polygon.m_normals;
1178
for (var i = 0; i < vertexCount; ++i) {
1179
tVec = vertices[i];
1180
dX = cLocalX - tVec.x;
1181
dY = cLocalY - tVec.y;
1182
tVec = normals[i];
1183
var s = tVec.x * dX + tVec.y * dY;
1184
if (s > radius) {
1185
return;
1186
}
1187
if (s > separation) {
1188
separation = s;
1189
normalIndex = i;
1190
}
1191
}
1192
var vertIndex1 = parseInt(normalIndex);
1193
var vertIndex2 = parseInt(vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0);
1194
var v1 = vertices[vertIndex1];
1195
var v2 = vertices[vertIndex2];
1196
if (separation < Number.MIN_VALUE) {
1197
manifold.m_pointCount = 1;
1198
manifold.m_type = b2Manifold.e_faceA;
1199
manifold.m_localPlaneNormal.SetV(normals[normalIndex]);
1200
manifold.m_localPoint.x = 0.5 * (v1.x + v2.x);
1201
manifold.m_localPoint.y = 0.5 * (v1.y + v2.y);
1202
manifold.m_points[0].m_localPoint.SetV(circle.m_p);
1203
manifold.m_points[0].m_id.key = 0;
1204
return;
1205
}
1206
var u1 = (cLocalX - v1.x) * (v2.x - v1.x) + (cLocalY - v1.y) * (v2.y - v1.y);
1207
var u2 = (cLocalX - v2.x) * (v1.x - v2.x) + (cLocalY - v2.y) * (v1.y - v2.y);
1208
if (u1 <= 0.0) {
1209
if ((cLocalX - v1.x) * (cLocalX - v1.x) + (cLocalY - v1.y) * (cLocalY - v1.y) > radius * radius) return;
1210
manifold.m_pointCount = 1;
1211
manifold.m_type = b2Manifold.e_faceA;
1212
manifold.m_localPlaneNormal.x = cLocalX - v1.x;
1213
manifold.m_localPlaneNormal.y = cLocalY - v1.y;
1214
manifold.m_localPlaneNormal.Normalize();
1215
manifold.m_localPoint.SetV(v1);
1216
manifold.m_points[0].m_localPoint.SetV(circle.m_p);
1217
manifold.m_points[0].m_id.key = 0;
1218
}
1219
else if (u2 <= 0) {
1220
if ((cLocalX - v2.x) * (cLocalX - v2.x) + (cLocalY - v2.y) * (cLocalY - v2.y) > radius * radius) return;
1221
manifold.m_pointCount = 1;
1222
manifold.m_type = b2Manifold.e_faceA;
1223
manifold.m_localPlaneNormal.x = cLocalX - v2.x;
1224
manifold.m_localPlaneNormal.y = cLocalY - v2.y;
1225
manifold.m_localPlaneNormal.Normalize();
1226
manifold.m_localPoint.SetV(v2);
1227
manifold.m_points[0].m_localPoint.SetV(circle.m_p);
1228
manifold.m_points[0].m_id.key = 0;
1229
}
1230
else {
1231
var faceCenterX = 0.5 * (v1.x + v2.x);
1232
var faceCenterY = 0.5 * (v1.y + v2.y);
1233
separation = (cLocalX - faceCenterX) * normals[vertIndex1].x + (cLocalY - faceCenterY) * normals[vertIndex1].y;
1234
if (separation > radius) return;
1235
manifold.m_pointCount = 1;
1236
manifold.m_type = b2Manifold.e_faceA;
1237
manifold.m_localPlaneNormal.x = normals[vertIndex1].x;
1238
manifold.m_localPlaneNormal.y = normals[vertIndex1].y;
1239
manifold.m_localPlaneNormal.Normalize();
1240
manifold.m_localPoint.Set(faceCenterX, faceCenterY);
1241
manifold.m_points[0].m_localPoint.SetV(circle.m_p);
1242
manifold.m_points[0].m_id.key = 0;
1243
}
1244
}
1245
b2Collision.TestOverlap = function (a, b) {
1246
var t1 = b.lowerBound;
1247
var t2 = a.upperBound;
1248
var d1X = t1.x - t2.x;
1249
var d1Y = t1.y - t2.y;
1250
t1 = a.lowerBound;
1251
t2 = b.upperBound;
1252
var d2X = t1.x - t2.x;
1253
var d2Y = t1.y - t2.y;
1254
if (d1X > 0.0 || d1Y > 0.0) return false;
1255
if (d2X > 0.0 || d2Y > 0.0) return false;
1256
return true;
1257
}
1258
Box2D.postDefs.push(function () {
1259
Box2D.Collision.b2Collision.s_incidentEdge = b2Collision.MakeClipPointVector();
1260
Box2D.Collision.b2Collision.s_clipPoints1 = b2Collision.MakeClipPointVector();
1261
Box2D.Collision.b2Collision.s_clipPoints2 = b2Collision.MakeClipPointVector();
1262
Box2D.Collision.b2Collision.s_edgeAO = new Vector_a2j_Number(1);
1263
Box2D.Collision.b2Collision.s_edgeBO = new Vector_a2j_Number(1);
1264
Box2D.Collision.b2Collision.s_localTangent = new b2Vec2();
1265
Box2D.Collision.b2Collision.s_localNormal = new b2Vec2();
1266
Box2D.Collision.b2Collision.s_planePoint = new b2Vec2();
1267
Box2D.Collision.b2Collision.s_normal = new b2Vec2();
1268
Box2D.Collision.b2Collision.s_tangent = new b2Vec2();
1269
Box2D.Collision.b2Collision.s_tangent2 = new b2Vec2();
1270
Box2D.Collision.b2Collision.s_v11 = new b2Vec2();
1271
Box2D.Collision.b2Collision.s_v12 = new b2Vec2();
1272
Box2D.Collision.b2Collision.b2CollidePolyTempVec = new b2Vec2();
1273
Box2D.Collision.b2Collision.b2_nullFeature = 0x000000ff;
1274
});
1275
b2ContactID.b2ContactID = function () {
1276
this.features = new Features();
1277
};
1278
b2ContactID.prototype.b2ContactID = function () {
1279
this.features._m_id = this;
1280
}
1281
b2ContactID.prototype.Set = function (id) {
1282
this.key = id._key;
1283
}
1284
b2ContactID.prototype.Copy = function () {
1285
var id = new b2ContactID();
1286
id.key = this.key;
1287
return id;
1288
}
1289
Object.defineProperty(b2ContactID.prototype, 'key', {
1290
enumerable: false,
1291
configurable: true,
1292
get: function () {
1293
return this._key;
1294
}
1295
});
1296
Object.defineProperty(b2ContactID.prototype, 'key', {
1297
enumerable: false,
1298
configurable: true,
1299
set: function (value) {
1300
if (value === undefined) value = 0;
1301
this._key = value;
1302
this.features._referenceEdge = this._key & 0x000000ff;
1303
this.features._incidentEdge = ((this._key & 0x0000ff00) >> 8) & 0x000000ff;
1304
this.features._incidentVertex = ((this._key & 0x00ff0000) >> 16) & 0x000000ff;
1305
this.features._flip = ((this._key & 0xff000000) >> 24) & 0x000000ff;
1306
}
1307
});
1308
b2ContactPoint.b2ContactPoint = function () {
1309
this.position = new b2Vec2();
1310
this.velocity = new b2Vec2();
1311
this.normal = new b2Vec2();
1312
this.id = new b2ContactID();
1313
};
1314
b2Distance.b2Distance = function () {};
1315
b2Distance.Distance = function (output, cache, input) {
1316
++b2Distance.b2_gjkCalls;
1317
var proxyA = input.proxyA;
1318
var proxyB = input.proxyB;
1319
var transformA = input.transformA;
1320
var transformB = input.transformB;
1321
var simplex = b2Distance.s_simplex;
1322
simplex.ReadCache(cache, proxyA, transformA, proxyB, transformB);
1323
var vertices = simplex.m_vertices;
1324
var k_maxIters = 20;
1325
var saveA = b2Distance.s_saveA;
1326
var saveB = b2Distance.s_saveB;
1327
var saveCount = 0;
1328
var closestPoint = simplex.GetClosestPoint();
1329
var distanceSqr1 = closestPoint.LengthSquared();
1330
var distanceSqr2 = distanceSqr1;
1331
var i = 0;
1332
var p;
1333
var iter = 0;
1334
while (iter < k_maxIters) {
1335
saveCount = simplex.m_count;
1336
for (i = 0;
1337
i < saveCount; i++) {
1338
saveA[i] = vertices[i].indexA;
1339
saveB[i] = vertices[i].indexB;
1340
}
1341
switch (simplex.m_count) {
1342
case 1:
1343
break;
1344
case 2:
1345
simplex.Solve2();
1346
break;
1347
case 3:
1348
simplex.Solve3();
1349
break;
1350
default:
1351
b2Settings.b2Assert(false);
1352
}
1353
if (simplex.m_count == 3) {
1354
break;
1355
}
1356
p = simplex.GetClosestPoint();
1357
distanceSqr2 = p.LengthSquared();
1358
if (distanceSqr2 > distanceSqr1) {}
1359
distanceSqr1 = distanceSqr2;
1360
var d = simplex.GetSearchDirection();
1361
if (d.LengthSquared() < Number.MIN_VALUE * Number.MIN_VALUE) {
1362
break;
1363
}
1364
var vertex = vertices[simplex.m_count];
1365
vertex.indexA = proxyA.GetSupport(b2Math.MulTMV(transformA.R, d.GetNegative()));
1366
vertex.wA = b2Math.MulX(transformA, proxyA.GetVertex(vertex.indexA));
1367
vertex.indexB = proxyB.GetSupport(b2Math.MulTMV(transformB.R, d));
1368
vertex.wB = b2Math.MulX(transformB, proxyB.GetVertex(vertex.indexB));
1369
vertex.w = b2Math.SubtractVV(vertex.wB, vertex.wA);
1370
++iter;
1371
++b2Distance.b2_gjkIters;
1372
var duplicate = false;
1373
for (i = 0;
1374
i < saveCount; i++) {
1375
if (vertex.indexA == saveA[i] && vertex.indexB == saveB[i]) {
1376
duplicate = true;
1377
break;
1378
}
1379
}
1380
if (duplicate) {
1381
break;
1382
}++simplex.m_count;
1383
}
1384
b2Distance.b2_gjkMaxIters = b2Math.Max(b2Distance.b2_gjkMaxIters, iter);
1385
simplex.GetWitnessPoints(output.pointA, output.pointB);
1386
output.distance = b2Math.SubtractVV(output.pointA, output.pointB).Length();
1387
output.iterations = iter;
1388
simplex.WriteCache(cache);
1389
if (input.useRadii) {
1390
var rA = proxyA.m_radius;
1391
var rB = proxyB.m_radius;
1392
if (output.distance > rA + rB && output.distance > Number.MIN_VALUE) {
1393
output.distance -= rA + rB;
1394
var normal = b2Math.SubtractVV(output.pointB, output.pointA);
1395
normal.Normalize();
1396
output.pointA.x += rA * normal.x;
1397
output.pointA.y += rA * normal.y;
1398
output.pointB.x -= rB * normal.x;
1399
output.pointB.y -= rB * normal.y;
1400
}
1401
else {
1402
p = new b2Vec2();
1403
p.x = .5 * (output.pointA.x + output.pointB.x);
1404
p.y = .5 * (output.pointA.y + output.pointB.y);
1405
output.pointA.x = output.pointB.x = p.x;
1406
output.pointA.y = output.pointB.y = p.y;
1407
output.distance = 0.0;
1408
}
1409
}
1410
}
1411
Box2D.postDefs.push(function () {
1412
Box2D.Collision.b2Distance.s_simplex = new b2Simplex();
1413
Box2D.Collision.b2Distance.s_saveA = new Vector_a2j_Number(3);
1414
Box2D.Collision.b2Distance.s_saveB = new Vector_a2j_Number(3);
1415
});
1416
b2DistanceInput.b2DistanceInput = function () {};
1417
b2DistanceOutput.b2DistanceOutput = function () {
1418
this.pointA = new b2Vec2();
1419
this.pointB = new b2Vec2();
1420
};
1421
b2DistanceProxy.b2DistanceProxy = function () {};
1422
b2DistanceProxy.prototype.Set = function (shape) {
1423
switch (shape.GetType()) {
1424
case b2Shape.e_circleShape:
1425
{
1426
var circle = (shape instanceof b2CircleShape ? shape : null);
1427
this.m_vertices = new Vector(1, true);
1428
this.m_vertices[0] = circle.m_p;
1429
this.m_count = 1;
1430
this.m_radius = circle.m_radius;
1431
}
1432
break;
1433
case b2Shape.e_polygonShape:
1434
{
1435
var polygon = (shape instanceof b2PolygonShape ? shape : null);
1436
this.m_vertices = polygon.m_vertices;
1437
this.m_count = polygon.m_vertexCount;
1438
this.m_radius = polygon.m_radius;
1439
}
1440
break;
1441
default:
1442
b2Settings.b2Assert(false);
1443
}
1444
}
1445
b2DistanceProxy.prototype.GetSupport = function (d) {
1446
var bestIndex = 0;
1447
var bestValue = this.m_vertices[0].x * d.x + this.m_vertices[0].y * d.y;
1448
for (var i = 1; i < this.m_count; ++i) {
1449
var value = this.m_vertices[i].x * d.x + this.m_vertices[i].y * d.y;
1450
if (value > bestValue) {
1451
bestIndex = i;
1452
bestValue = value;
1453
}
1454
}
1455
return bestIndex;
1456
}
1457
b2DistanceProxy.prototype.GetSupportVertex = function (d) {
1458
var bestIndex = 0;
1459
var bestValue = this.m_vertices[0].x * d.x + this.m_vertices[0].y * d.y;
1460
for (var i = 1; i < this.m_count; ++i) {
1461
var value = this.m_vertices[i].x * d.x + this.m_vertices[i].y * d.y;
1462
if (value > bestValue) {
1463
bestIndex = i;
1464
bestValue = value;
1465
}
1466
}
1467
return this.m_vertices[bestIndex];
1468
}
1469
b2DistanceProxy.prototype.GetVertexCount = function () {
1470
return this.m_count;
1471
}
1472
b2DistanceProxy.prototype.GetVertex = function (index) {
1473
if (index === undefined) index = 0;
1474
b2Settings.b2Assert(0 <= index && index < this.m_count);
1475
return this.m_vertices[index];
1476
}
1477
b2DynamicTree.b2DynamicTree = function () {};
1478
b2DynamicTree.prototype.b2DynamicTree = function () {
1479
this.m_root = null;
1480
this.m_freeList = null;
1481
this.m_path = 0;
1482
this.m_insertionCount = 0;
1483
}
1484
b2DynamicTree.prototype.CreateProxy = function (aabb, userData) {
1485
var node = this.AllocateNode();
1486
var extendX = b2Settings.b2_aabbExtension;
1487
var extendY = b2Settings.b2_aabbExtension;
1488
node.aabb.lowerBound.x = aabb.lowerBound.x - extendX;
1489
node.aabb.lowerBound.y = aabb.lowerBound.y - extendY;
1490
node.aabb.upperBound.x = aabb.upperBound.x + extendX;
1491
node.aabb.upperBound.y = aabb.upperBound.y + extendY;
1492
node.userData = userData;
1493
this.InsertLeaf(node);
1494
return node;
1495
}
1496
b2DynamicTree.prototype.DestroyProxy = function (proxy) {
1497
this.RemoveLeaf(proxy);
1498
this.FreeNode(proxy);
1499
}
1500
b2DynamicTree.prototype.MoveProxy = function (proxy, aabb, displacement) {
1501
b2Settings.b2Assert(proxy.IsLeaf());
1502
if (proxy.aabb.Contains(aabb)) {
1503
return false;
1504
}
1505
this.RemoveLeaf(proxy);
1506
var extendX = b2Settings.b2_aabbExtension + b2Settings.b2_aabbMultiplier * (displacement.x > 0 ? displacement.x : (-displacement.x));
1507
var extendY = b2Settings.b2_aabbExtension + b2Settings.b2_aabbMultiplier * (displacement.y > 0 ? displacement.y : (-displacement.y));
1508
proxy.aabb.lowerBound.x = aabb.lowerBound.x - extendX;
1509
proxy.aabb.lowerBound.y = aabb.lowerBound.y - extendY;
1510
proxy.aabb.upperBound.x = aabb.upperBound.x + extendX;
1511
proxy.aabb.upperBound.y = aabb.upperBound.y + extendY;
1512
this.InsertLeaf(proxy);
1513
return true;
1514
}
1515
b2DynamicTree.prototype.Rebalance = function (iterations) {
1516
if (iterations === undefined) iterations = 0;
1517
if (this.m_root == null) return;
1518
for (var i = 0; i < iterations; i++) {
1519
var node = this.m_root;
1520
var bit = 0;
1521
while (node.IsLeaf() == false) {
1522
node = (this.m_path >> bit) & 1 ? node.child2 : node.child1;
1523
bit = (bit + 1) & 31;
1524
}++this.m_path;
1525
this.RemoveLeaf(node);
1526
this.InsertLeaf(node);
1527
}
1528
}
1529
b2DynamicTree.prototype.GetFatAABB = function (proxy) {
1530
return proxy.aabb;
1531
}
1532
b2DynamicTree.prototype.GetUserData = function (proxy) {
1533
return proxy.userData;
1534
}
1535
b2DynamicTree.prototype.Query = function (callback, aabb) {
1536
if (this.m_root == null) return;
1537
var stack = new Vector();
1538
var count = 0;
1539
stack[count++] = this.m_root;
1540
while (count > 0) {
1541
var node = stack[--count];
1542
if (node.aabb.TestOverlap(aabb)) {
1543
if (node.IsLeaf()) {
1544
var proceed = callback(node);
1545
if (!proceed) return;
1546
}
1547
else {
1548
stack[count++] = node.child1;
1549
stack[count++] = node.child2;
1550
}
1551
}
1552
}
1553
}
1554
b2DynamicTree.prototype.RayCast = function (callback, input) {
1555
if (this.m_root == null) return;
1556
var p1 = input.p1;
1557
var p2 = input.p2;
1558
var r = b2Math.SubtractVV(p1, p2);
1559
r.Normalize();
1560
var v = b2Math.CrossFV(1.0, r);
1561
var abs_v = b2Math.AbsV(v);
1562
var maxFraction = input.maxFraction;
1563
var segmentAABB = new b2AABB();
1564
var tX = 0;
1565
var tY = 0; {
1566
tX = p1.x + maxFraction * (p2.x - p1.x);
1567
tY = p1.y + maxFraction * (p2.y - p1.y);
1568
segmentAABB.lowerBound.x = Math.min(p1.x, tX);
1569
segmentAABB.lowerBound.y = Math.min(p1.y, tY);
1570
segmentAABB.upperBound.x = Math.max(p1.x, tX);
1571
segmentAABB.upperBound.y = Math.max(p1.y, tY);
1572
}
1573
var stack = new Vector();
1574
var count = 0;
1575
stack[count++] = this.m_root;
1576
while (count > 0) {
1577
var node = stack[--count];
1578
if (node.aabb.TestOverlap(segmentAABB) == false) {
1579
continue;
1580
}
1581
var c = node.aabb.GetCenter();
1582
var h = node.aabb.GetExtents();
1583
var separation = Math.abs(v.x * (p1.x - c.x) + v.y * (p1.y - c.y)) - abs_v.x * h.x - abs_v.y * h.y;
1584
if (separation > 0.0) continue;
1585
if (node.IsLeaf()) {
1586
var subInput = new b2RayCastInput();
1587
subInput.p1 = input.p1;
1588
subInput.p2 = input.p2;
1589
subInput.maxFraction = input.maxFraction;
1590
maxFraction = callback(subInput, node);
1591
if (maxFraction == 0.0) return;
1592
if (maxFraction > 0.0) {
1593
tX = p1.x + maxFraction * (p2.x - p1.x);
1594
tY = p1.y + maxFraction * (p2.y - p1.y);
1595
segmentAABB.lowerBound.x = Math.min(p1.x, tX);
1596
segmentAABB.lowerBound.y = Math.min(p1.y, tY);
1597
segmentAABB.upperBound.x = Math.max(p1.x, tX);
1598
segmentAABB.upperBound.y = Math.max(p1.y, tY);
1599
}
1600
}
1601
else {
1602
stack[count++] = node.child1;
1603
stack[count++] = node.child2;
1604
}
1605
}
1606
}
1607
b2DynamicTree.prototype.AllocateNode = function () {
1608
if (this.m_freeList) {
1609
var node = this.m_freeList;
1610
this.m_freeList = node.parent;
1611
node.parent = null;
1612
node.child1 = null;
1613
node.child2 = null;
1614
return node;
1615
}
1616
return new b2DynamicTreeNode();
1617
}
1618
b2DynamicTree.prototype.FreeNode = function (node) {
1619
node.parent = this.m_freeList;
1620
this.m_freeList = node;
1621
}
1622
b2DynamicTree.prototype.InsertLeaf = function (leaf) {
1623
++this.m_insertionCount;
1624
if (this.m_root == null) {
1625
this.m_root = leaf;
1626
this.m_root.parent = null;
1627
return;
1628
}
1629
var center = leaf.aabb.GetCenter();
1630
var sibling = this.m_root;
1631
if (sibling.IsLeaf() == false) {
1632
do {
1633
var child1 = sibling.child1;
1634
var child2 = sibling.child2;
1635
var norm1 = Math.abs((child1.aabb.lowerBound.x + child1.aabb.upperBound.x) / 2 - center.x) + Math.abs((child1.aabb.lowerBound.y + child1.aabb.upperBound.y) / 2 - center.y);
1636
var norm2 = Math.abs((child2.aabb.lowerBound.x + child2.aabb.upperBound.x) / 2 - center.x) + Math.abs((child2.aabb.lowerBound.y + child2.aabb.upperBound.y) / 2 - center.y);
1637
if (norm1 < norm2) {
1638
sibling = child1;
1639
}
1640
else {
1641
sibling = child2;
1642
}
1643
}
1644
while (sibling.IsLeaf() == false)
1645
}
1646
var node1 = sibling.parent;
1647
var node2 = this.AllocateNode();
1648
node2.parent = node1;
1649
node2.userData = null;
1650
node2.aabb.Combine(leaf.aabb, sibling.aabb);
1651
if (node1) {
1652
if (sibling.parent.child1 == sibling) {
1653
node1.child1 = node2;
1654
}
1655
else {
1656
node1.child2 = node2;
1657
}
1658
node2.child1 = sibling;
1659
node2.child2 = leaf;
1660
sibling.parent = node2;
1661
leaf.parent = node2;
1662
do {
1663
if (node1.aabb.Contains(node2.aabb)) break;
1664
node1.aabb.Combine(node1.child1.aabb, node1.child2.aabb);
1665
node2 = node1;
1666
node1 = node1.parent;
1667
}
1668
while (node1)
1669
}
1670
else {
1671
node2.child1 = sibling;
1672
node2.child2 = leaf;
1673
sibling.parent = node2;
1674
leaf.parent = node2;
1675
this.m_root = node2;
1676
}
1677
}
1678
b2DynamicTree.prototype.RemoveLeaf = function (leaf) {
1679
if (leaf == this.m_root) {
1680
this.m_root = null;
1681
return;
1682
}
1683
var node2 = leaf.parent;
1684
var node1 = node2.parent;
1685
var sibling;
1686
if (node2.child1 == leaf) {
1687
sibling = node2.child2;
1688
}
1689
else {
1690
sibling = node2.child1;
1691
}
1692
if (node1) {
1693
if (node1.child1 == node2) {
1694
node1.child1 = sibling;
1695
}
1696
else {
1697
node1.child2 = sibling;
1698
}
1699
sibling.parent = node1;
1700
this.FreeNode(node2);
1701
while (node1) {
1702
var oldAABB = node1.aabb;
1703
node1.aabb = b2AABB.Combine(node1.child1.aabb, node1.child2.aabb);
1704
if (oldAABB.Contains(node1.aabb)) break;
1705
node1 = node1.parent;
1706
}
1707
}
1708
else {
1709
this.m_root = sibling;
1710
sibling.parent = null;
1711
this.FreeNode(node2);
1712
}
1713
}
1714
b2DynamicTreeBroadPhase.b2DynamicTreeBroadPhase = function () {
1715
this.m_tree = new b2DynamicTree();
1716
this.m_moveBuffer = new Vector();
1717
this.m_pairBuffer = new Vector();
1718
this.m_pairCount = 0;
1719
};
1720
b2DynamicTreeBroadPhase.prototype.CreateProxy = function (aabb, userData) {
1721
var proxy = this.m_tree.CreateProxy(aabb, userData);
1722
++this.m_proxyCount;
1723
this.BufferMove(proxy);
1724
return proxy;
1725
}
1726
b2DynamicTreeBroadPhase.prototype.DestroyProxy = function (proxy) {
1727
this.UnBufferMove(proxy);
1728
--this.m_proxyCount;
1729
this.m_tree.DestroyProxy(proxy);
1730
}
1731
b2DynamicTreeBroadPhase.prototype.MoveProxy = function (proxy, aabb, displacement) {
1732
var buffer = this.m_tree.MoveProxy(proxy, aabb, displacement);
1733
if (buffer) {
1734
this.BufferMove(proxy);
1735
}
1736
}
1737
b2DynamicTreeBroadPhase.prototype.TestOverlap = function (proxyA, proxyB) {
1738
var aabbA = this.m_tree.GetFatAABB(proxyA);
1739
var aabbB = this.m_tree.GetFatAABB(proxyB);
1740
return aabbA.TestOverlap(aabbB);
1741
}
1742
b2DynamicTreeBroadPhase.prototype.GetUserData = function (proxy) {
1743
return this.m_tree.GetUserData(proxy);
1744
}
1745
b2DynamicTreeBroadPhase.prototype.GetFatAABB = function (proxy) {
1746
return this.m_tree.GetFatAABB(proxy);
1747
}
1748
b2DynamicTreeBroadPhase.prototype.GetProxyCount = function () {
1749
return this.m_proxyCount;
1750
}
1751
b2DynamicTreeBroadPhase.prototype.UpdatePairs = function (callback) {
1752
var __this = this;
1753
__this.m_pairCount = 0;
1754
var i = 0,
1755
queryProxy;
1756
for (i = 0;
1757
i < __this.m_moveBuffer.length; ++i) {
1758
queryProxy = __this.m_moveBuffer[i];
1759
1760
function QueryCallback(proxy) {
1761
if (proxy == queryProxy) return true;
1762
if (__this.m_pairCount == __this.m_pairBuffer.length) {
1763
__this.m_pairBuffer[__this.m_pairCount] = new b2DynamicTreePair();
1764
}
1765
var pair = __this.m_pairBuffer[__this.m_pairCount];
1766
pair.proxyA = proxy < queryProxy ? proxy : queryProxy;
1767
pair.proxyB = proxy >= queryProxy ? proxy : queryProxy;++__this.m_pairCount;
1768
return true;
1769
};
1770
var fatAABB = __this.m_tree.GetFatAABB(queryProxy);
1771
__this.m_tree.Query(QueryCallback, fatAABB);
1772
}
1773
__this.m_moveBuffer.length = 0;
1774
for (var i = 0; i < __this.m_pairCount;) {
1775
var primaryPair = __this.m_pairBuffer[i];
1776
var userDataA = __this.m_tree.GetUserData(primaryPair.proxyA);
1777
var userDataB = __this.m_tree.GetUserData(primaryPair.proxyB);
1778
callback(userDataA, userDataB);
1779
++i;
1780
while (i < __this.m_pairCount) {
1781
var pair = __this.m_pairBuffer[i];
1782
if (pair.proxyA != primaryPair.proxyA || pair.proxyB != primaryPair.proxyB) {
1783
break;
1784
}++i;
1785
}
1786
}
1787
}
1788
b2DynamicTreeBroadPhase.prototype.Query = function (callback, aabb) {
1789
this.m_tree.Query(callback, aabb);
1790
}
1791
b2DynamicTreeBroadPhase.prototype.RayCast = function (callback, input) {
1792
this.m_tree.RayCast(callback, input);
1793
}
1794
b2DynamicTreeBroadPhase.prototype.Validate = function () {}
1795
b2DynamicTreeBroadPhase.prototype.Rebalance = function (iterations) {
1796
if (iterations === undefined) iterations = 0;
1797
this.m_tree.Rebalance(iterations);
1798
}
1799
b2DynamicTreeBroadPhase.prototype.BufferMove = function (proxy) {
1800
this.m_moveBuffer[this.m_moveBuffer.length] = proxy;
1801
}
1802
b2DynamicTreeBroadPhase.prototype.UnBufferMove = function (proxy) {
1803
var i = parseInt(this.m_moveBuffer.indexOf(proxy));
1804
this.m_moveBuffer.splice(i, 1);
1805
}
1806
b2DynamicTreeBroadPhase.prototype.ComparePairs = function (pair1, pair2) {
1807
return 0;
1808
}
1809
b2DynamicTreeBroadPhase.__implements = {};
1810
b2DynamicTreeBroadPhase.__implements[IBroadPhase] = true;
1811
b2DynamicTreeNode.b2DynamicTreeNode = function () {
1812
this.aabb = new b2AABB();
1813
};
1814
b2DynamicTreeNode.prototype.IsLeaf = function () {
1815
return this.child1 == null;
1816
}
1817
b2DynamicTreePair.b2DynamicTreePair = function () {};
1818
b2Manifold.b2Manifold = function () {
1819
this.m_pointCount = 0;
1820
};
1821
b2Manifold.prototype.b2Manifold = function () {
1822
this.m_points = new Vector(b2Settings.b2_maxManifoldPoints);
1823
for (var i = 0; i < b2Settings.b2_maxManifoldPoints; i++) {
1824
this.m_points[i] = new b2ManifoldPoint();
1825
}
1826
this.m_localPlaneNormal = new b2Vec2();
1827
this.m_localPoint = new b2Vec2();
1828
}
1829
b2Manifold.prototype.Reset = function () {
1830
for (var i = 0; i < b2Settings.b2_maxManifoldPoints; i++) {
1831
((this.m_points[i] instanceof b2ManifoldPoint ? this.m_points[i] : null)).Reset();
1832
}
1833
this.m_localPlaneNormal.SetZero();
1834
this.m_localPoint.SetZero();
1835
this.m_type = 0;
1836
this.m_pointCount = 0;
1837
}
1838
b2Manifold.prototype.Set = function (m) {
1839
this.m_pointCount = m.m_pointCount;
1840
for (var i = 0; i < b2Settings.b2_maxManifoldPoints; i++) {
1841
((this.m_points[i] instanceof b2ManifoldPoint ? this.m_points[i] : null)).Set(m.m_points[i]);
1842
}
1843
this.m_localPlaneNormal.SetV(m.m_localPlaneNormal);
1844
this.m_localPoint.SetV(m.m_localPoint);
1845
this.m_type = m.m_type;
1846
}
1847
b2Manifold.prototype.Copy = function () {
1848
var copy = new b2Manifold();
1849
copy.Set(this);
1850
return copy;
1851
}
1852
Box2D.postDefs.push(function () {
1853
Box2D.Collision.b2Manifold.e_circles = 0x0001;
1854
Box2D.Collision.b2Manifold.e_faceA = 0x0002;
1855
Box2D.Collision.b2Manifold.e_faceB = 0x0004;
1856
});
1857
b2ManifoldPoint.b2ManifoldPoint = function () {
1858
this.m_localPoint = new b2Vec2();
1859
this.m_id = new b2ContactID();
1860
};
1861
b2ManifoldPoint.prototype.b2ManifoldPoint = function () {
1862
this.Reset();
1863
}
1864
b2ManifoldPoint.prototype.Reset = function () {
1865
this.m_localPoint.SetZero();
1866
this.m_normalImpulse = 0.0;
1867
this.m_tangentImpulse = 0.0;
1868
this.m_id.key = 0;
1869
}
1870
b2ManifoldPoint.prototype.Set = function (m) {
1871
this.m_localPoint.SetV(m.m_localPoint);
1872
this.m_normalImpulse = m.m_normalImpulse;
1873
this.m_tangentImpulse = m.m_tangentImpulse;
1874
this.m_id.Set(m.m_id);
1875
}
1876
b2Point.b2Point = function () {
1877
this.p = new b2Vec2();
1878
};
1879
b2Point.prototype.Support = function (xf, vX, vY) {
1880
if (vX === undefined) vX = 0;
1881
if (vY === undefined) vY = 0;
1882
return this.p;
1883
}
1884
b2Point.prototype.GetFirstVertex = function (xf) {
1885
return this.p;
1886
}
1887
b2RayCastInput.b2RayCastInput = function () {
1888
this.p1 = new b2Vec2();
1889
this.p2 = new b2Vec2();
1890
};
1891
b2RayCastInput.prototype.b2RayCastInput = function (p1, p2, maxFraction) {
1892
if (p1 === undefined) p1 = null;
1893
if (p2 === undefined) p2 = null;
1894
if (maxFraction === undefined) maxFraction = 1;
1895
if (p1) this.p1.SetV(p1);
1896
if (p2) this.p2.SetV(p2);
1897
this.maxFraction = maxFraction;
1898
}
1899
b2RayCastOutput.b2RayCastOutput = function () {
1900
this.normal = new b2Vec2();
1901
};
1902
b2Segment.b2Segment = function () {
1903
this.p1 = new b2Vec2();
1904
this.p2 = new b2Vec2();
1905
};
1906
b2Segment.prototype.TestSegment = function (lambda, normal, segment, maxLambda) {
1907
if (maxLambda === undefined) maxLambda = 0;
1908
var s = segment.p1;
1909
var rX = segment.p2.x - s.x;
1910
var rY = segment.p2.y - s.y;
1911
var dX = this.p2.x - this.p1.x;
1912
var dY = this.p2.y - this.p1.y;
1913
var nX = dY;
1914
var nY = (-dX);
1915
var k_slop = 100.0 * Number.MIN_VALUE;
1916
var denom = (-(rX * nX + rY * nY));
1917
if (denom > k_slop) {
1918
var bX = s.x - this.p1.x;
1919
var bY = s.y - this.p1.y;
1920
var a = (bX * nX + bY * nY);
1921
if (0.0 <= a && a <= maxLambda * denom) {
1922
var mu2 = (-rX * bY) + rY * bX;
1923
if ((-k_slop * denom) <= mu2 && mu2 <= denom * (1.0 + k_slop)) {
1924
a /= denom;
1925
var nLen = Math.sqrt(nX * nX + nY * nY);
1926
nX /= nLen;
1927
nY /= nLen;
1928
lambda[0] = a;
1929
normal.Set(nX, nY);
1930
return true;
1931
}
1932
}
1933
}
1934
return false;
1935
}
1936
b2Segment.prototype.Extend = function (aabb) {
1937
this.ExtendForward(aabb);
1938
this.ExtendBackward(aabb);
1939
}
1940
b2Segment.prototype.ExtendForward = function (aabb) {
1941
var dX = this.p2.x - this.p1.x;
1942
var dY = this.p2.y - this.p1.y;
1943
var lambda = Math.min(dX > 0 ? (aabb.upperBound.x - this.p1.x) / dX : dX < 0 ? (aabb.lowerBound.x - this.p1.x) / dX : Number.POSITIVE_INFINITY,
1944
dY > 0 ? (aabb.upperBound.y - this.p1.y) / dY : dY < 0 ? (aabb.lowerBound.y - this.p1.y) / dY : Number.POSITIVE_INFINITY);
1945
this.p2.x = this.p1.x + dX * lambda;
1946
this.p2.y = this.p1.y + dY * lambda;
1947
}
1948
b2Segment.prototype.ExtendBackward = function (aabb) {
1949
var dX = (-this.p2.x) + this.p1.x;
1950
var dY = (-this.p2.y) + this.p1.y;
1951
var lambda = Math.min(dX > 0 ? (aabb.upperBound.x - this.p2.x) / dX : dX < 0 ? (aabb.lowerBound.x - this.p2.x) / dX : Number.POSITIVE_INFINITY,
1952
dY > 0 ? (aabb.upperBound.y - this.p2.y) / dY : dY < 0 ? (aabb.lowerBound.y - this.p2.y) / dY : Number.POSITIVE_INFINITY);
1953
this.p1.x = this.p2.x + dX * lambda;
1954
this.p1.y = this.p2.y + dY * lambda;
1955
}
1956
b2SeparationFunction.b2SeparationFunction = function () {
1957
this.m_localPoint = new b2Vec2();
1958
this.m_axis = new b2Vec2();
1959
};
1960
b2SeparationFunction.prototype.Initialize = function (cache, proxyA, transformA, proxyB, transformB) {
1961
this.m_proxyA = proxyA;
1962
this.m_proxyB = proxyB;
1963
var count = parseInt(cache.count);
1964
b2Settings.b2Assert(0 < count && count < 3);
1965
var localPointA;
1966
var localPointA1;
1967
var localPointA2;
1968
var localPointB;
1969
var localPointB1;
1970
var localPointB2;
1971
var pointAX = 0;
1972
var pointAY = 0;
1973
var pointBX = 0;
1974
var pointBY = 0;
1975
var normalX = 0;
1976
var normalY = 0;
1977
var tMat;
1978
var tVec;
1979
var s = 0;
1980
var sgn = 0;
1981
if (count == 1) {
1982
this.m_type = b2SeparationFunction.e_points;
1983
localPointA = this.m_proxyA.GetVertex(cache.indexA[0]);
1984
localPointB = this.m_proxyB.GetVertex(cache.indexB[0]);
1985
tVec = localPointA;
1986
tMat = transformA.R;
1987
pointAX = transformA.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
1988
pointAY = transformA.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
1989
tVec = localPointB;
1990
tMat = transformB.R;
1991
pointBX = transformB.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
1992
pointBY = transformB.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
1993
this.m_axis.x = pointBX - pointAX;
1994
this.m_axis.y = pointBY - pointAY;
1995
this.m_axis.Normalize();
1996
}
1997
else if (cache.indexB[0] == cache.indexB[1]) {
1998
this.m_type = b2SeparationFunction.e_faceA;
1999
localPointA1 = this.m_proxyA.GetVertex(cache.indexA[0]);
2000
localPointA2 = this.m_proxyA.GetVertex(cache.indexA[1]);
2001
localPointB = this.m_proxyB.GetVertex(cache.indexB[0]);
2002
this.m_localPoint.x = 0.5 * (localPointA1.x + localPointA2.x);
2003
this.m_localPoint.y = 0.5 * (localPointA1.y + localPointA2.y);
2004
this.m_axis = b2Math.CrossVF(b2Math.SubtractVV(localPointA2, localPointA1), 1.0);
2005
this.m_axis.Normalize();
2006
tVec = this.m_axis;
2007
tMat = transformA.R;
2008
normalX = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
2009
normalY = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
2010
tVec = this.m_localPoint;
2011
tMat = transformA.R;
2012
pointAX = transformA.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
2013
pointAY = transformA.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
2014
tVec = localPointB;
2015
tMat = transformB.R;
2016
pointBX = transformB.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
2017
pointBY = transformB.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
2018
s = (pointBX - pointAX) * normalX + (pointBY - pointAY) * normalY;
2019
if (s < 0.0) {
2020
this.m_axis.NegativeSelf();
2021
}
2022
}
2023
else if (cache.indexA[0] == cache.indexA[0]) {
2024
this.m_type = b2SeparationFunction.e_faceB;
2025
localPointB1 = this.m_proxyB.GetVertex(cache.indexB[0]);
2026
localPointB2 = this.m_proxyB.GetVertex(cache.indexB[1]);
2027
localPointA = this.m_proxyA.GetVertex(cache.indexA[0]);
2028
this.m_localPoint.x = 0.5 * (localPointB1.x + localPointB2.x);
2029
this.m_localPoint.y = 0.5 * (localPointB1.y + localPointB2.y);
2030
this.m_axis = b2Math.CrossVF(b2Math.SubtractVV(localPointB2, localPointB1), 1.0);
2031
this.m_axis.Normalize();
2032
tVec = this.m_axis;
2033
tMat = transformB.R;
2034
normalX = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
2035
normalY = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
2036
tVec = this.m_localPoint;
2037
tMat = transformB.R;
2038
pointBX = transformB.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
2039
pointBY = transformB.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
2040
tVec = localPointA;
2041
tMat = transformA.R;
2042
pointAX = transformA.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
2043
pointAY = transformA.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
2044
s = (pointAX - pointBX) * normalX + (pointAY - pointBY) * normalY;
2045
if (s < 0.0) {
2046
this.m_axis.NegativeSelf();
2047
}
2048
}
2049
else {
2050
localPointA1 = this.m_proxyA.GetVertex(cache.indexA[0]);
2051
localPointA2 = this.m_proxyA.GetVertex(cache.indexA[1]);
2052
localPointB1 = this.m_proxyB.GetVertex(cache.indexB[0]);
2053
localPointB2 = this.m_proxyB.GetVertex(cache.indexB[1]);
2054
var pA = b2Math.MulX(transformA, localPointA);
2055
var dA = b2Math.MulMV(transformA.R, b2Math.SubtractVV(localPointA2, localPointA1));
2056
var pB = b2Math.MulX(transformB, localPointB);
2057
var dB = b2Math.MulMV(transformB.R, b2Math.SubtractVV(localPointB2, localPointB1));
2058
var a = dA.x * dA.x + dA.y * dA.y;
2059
var e = dB.x * dB.x + dB.y * dB.y;
2060
var r = b2Math.SubtractVV(dB, dA);
2061
var c = dA.x * r.x + dA.y * r.y;
2062
var f = dB.x * r.x + dB.y * r.y;
2063
var b = dA.x * dB.x + dA.y * dB.y;
2064
var denom = a * e - b * b;
2065
s = 0.0;
2066
if (denom != 0.0) {
2067
s = b2Math.Clamp((b * f - c * e) / denom, 0.0, 1.0);
2068
}
2069
var t = (b * s + f) / e;
2070
if (t < 0.0) {
2071
t = 0.0;
2072
s = b2Math.Clamp((b - c) / a, 0.0, 1.0);
2073
}
2074
localPointA = new b2Vec2();
2075
localPointA.x = localPointA1.x + s * (localPointA2.x - localPointA1.x);
2076
localPointA.y = localPointA1.y + s * (localPointA2.y - localPointA1.y);
2077
localPointB = new b2Vec2();
2078
localPointB.x = localPointB1.x + s * (localPointB2.x - localPointB1.x);
2079
localPointB.y = localPointB1.y + s * (localPointB2.y - localPointB1.y);
2080
if (s == 0.0 || s == 1.0) {
2081
this.m_type = b2SeparationFunction.e_faceB;
2082
this.m_axis = b2Math.CrossVF(b2Math.SubtractVV(localPointB2, localPointB1), 1.0);
2083
this.m_axis.Normalize();
2084
this.m_localPoint = localPointB;
2085
tVec = this.m_axis;
2086
tMat = transformB.R;
2087
normalX = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
2088
normalY = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
2089
tVec = this.m_localPoint;
2090
tMat = transformB.R;
2091
pointBX = transformB.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
2092
pointBY = transformB.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
2093
tVec = localPointA;
2094
tMat = transformA.R;
2095
pointAX = transformA.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
2096
pointAY = transformA.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
2097
sgn = (pointAX - pointBX) * normalX + (pointAY - pointBY) * normalY;
2098
if (s < 0.0) {
2099
this.m_axis.NegativeSelf();
2100
}
2101
}
2102
else {
2103
this.m_type = b2SeparationFunction.e_faceA;
2104
this.m_axis = b2Math.CrossVF(b2Math.SubtractVV(localPointA2, localPointA1), 1.0);
2105
this.m_localPoint = localPointA;
2106
tVec = this.m_axis;
2107
tMat = transformA.R;
2108
normalX = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
2109
normalY = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
2110
tVec = this.m_localPoint;
2111
tMat = transformA.R;
2112
pointAX = transformA.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
2113
pointAY = transformA.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
2114
tVec = localPointB;
2115
tMat = transformB.R;
2116
pointBX = transformB.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
2117
pointBY = transformB.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
2118
sgn = (pointBX - pointAX) * normalX + (pointBY - pointAY) * normalY;
2119
if (s < 0.0) {
2120
this.m_axis.NegativeSelf();
2121
}
2122
}
2123
}
2124
}
2125
b2SeparationFunction.prototype.Evaluate = function (transformA, transformB) {
2126
var axisA;
2127
var axisB;
2128
var localPointA;
2129
var localPointB;
2130
var pointA;
2131
var pointB;
2132
var seperation = 0;
2133
var normal;
2134
switch (this.m_type) {
2135
case b2SeparationFunction.e_points:
2136
{
2137
axisA = b2Math.MulTMV(transformA.R, this.m_axis);
2138
axisB = b2Math.MulTMV(transformB.R, this.m_axis.GetNegative());
2139
localPointA = this.m_proxyA.GetSupportVertex(axisA);
2140
localPointB = this.m_proxyB.GetSupportVertex(axisB);
2141
pointA = b2Math.MulX(transformA, localPointA);
2142
pointB = b2Math.MulX(transformB, localPointB);
2143
seperation = (pointB.x - pointA.x) * this.m_axis.x + (pointB.y - pointA.y) * this.m_axis.y;
2144
return seperation;
2145
}
2146
case b2SeparationFunction.e_faceA:
2147
{
2148
normal = b2Math.MulMV(transformA.R, this.m_axis);
2149
pointA = b2Math.MulX(transformA, this.m_localPoint);
2150
axisB = b2Math.MulTMV(transformB.R, normal.GetNegative());
2151
localPointB = this.m_proxyB.GetSupportVertex(axisB);
2152
pointB = b2Math.MulX(transformB, localPointB);
2153
seperation = (pointB.x - pointA.x) * normal.x + (pointB.y - pointA.y) * normal.y;
2154
return seperation;
2155
}
2156
case b2SeparationFunction.e_faceB:
2157
{
2158
normal = b2Math.MulMV(transformB.R, this.m_axis);
2159
pointB = b2Math.MulX(transformB, this.m_localPoint);
2160
axisA = b2Math.MulTMV(transformA.R, normal.GetNegative());
2161
localPointA = this.m_proxyA.GetSupportVertex(axisA);
2162
pointA = b2Math.MulX(transformA, localPointA);
2163
seperation = (pointA.x - pointB.x) * normal.x + (pointA.y - pointB.y) * normal.y;
2164
return seperation;
2165
}
2166
default:
2167
b2Settings.b2Assert(false);
2168
return 0.0;
2169
}
2170
}
2171
Box2D.postDefs.push(function () {
2172
Box2D.Collision.b2SeparationFunction.e_points = 0x01;
2173
Box2D.Collision.b2SeparationFunction.e_faceA = 0x02;
2174
Box2D.Collision.b2SeparationFunction.e_faceB = 0x04;
2175
});
2176
b2Simplex.b2Simplex = function () {
2177
this.m_v1 = new b2SimplexVertex();
2178
this.m_v2 = new b2SimplexVertex();
2179
this.m_v3 = new b2SimplexVertex();
2180
this.m_vertices = new Vector(3);
2181
};
2182
b2Simplex.prototype.b2Simplex = function () {
2183
this.m_vertices[0] = this.m_v1;
2184
this.m_vertices[1] = this.m_v2;
2185
this.m_vertices[2] = this.m_v3;
2186
}
2187
b2Simplex.prototype.ReadCache = function (cache, proxyA, transformA, proxyB, transformB) {
2188
b2Settings.b2Assert(0 <= cache.count && cache.count <= 3);
2189
var wALocal;
2190
var wBLocal;
2191
this.m_count = cache.count;
2192
var vertices = this.m_vertices;
2193
for (var i = 0; i < this.m_count; i++) {
2194
var v = vertices[i];
2195
v.indexA = cache.indexA[i];
2196
v.indexB = cache.indexB[i];
2197
wALocal = proxyA.GetVertex(v.indexA);
2198
wBLocal = proxyB.GetVertex(v.indexB);
2199
v.wA = b2Math.MulX(transformA, wALocal);
2200
v.wB = b2Math.MulX(transformB, wBLocal);
2201
v.w = b2Math.SubtractVV(v.wB, v.wA);
2202
v.a = 0;
2203
}
2204
if (this.m_count > 1) {
2205
var metric1 = cache.metric;
2206
var metric2 = this.GetMetric();
2207
if (metric2 < .5 * metric1 || 2.0 * metric1 < metric2 || metric2 < Number.MIN_VALUE) {
2208
this.m_count = 0;
2209
}
2210
}
2211
if (this.m_count == 0) {
2212
v = vertices[0];
2213
v.indexA = 0;
2214
v.indexB = 0;
2215
wALocal = proxyA.GetVertex(0);
2216
wBLocal = proxyB.GetVertex(0);
2217
v.wA = b2Math.MulX(transformA, wALocal);
2218
v.wB = b2Math.MulX(transformB, wBLocal);
2219
v.w = b2Math.SubtractVV(v.wB, v.wA);
2220
this.m_count = 1;
2221
}
2222
}
2223
b2Simplex.prototype.WriteCache = function (cache) {
2224
cache.metric = this.GetMetric();
2225
cache.count = Box2D.parseUInt(this.m_count);
2226
var vertices = this.m_vertices;
2227
for (var i = 0; i < this.m_count; i++) {
2228
cache.indexA[i] = Box2D.parseUInt(vertices[i].indexA);
2229
cache.indexB[i] = Box2D.parseUInt(vertices[i].indexB);
2230
}
2231
}
2232
b2Simplex.prototype.GetSearchDirection = function () {
2233
switch (this.m_count) {
2234
case 1:
2235
return this.m_v1.w.GetNegative();
2236
case 2:
2237
{
2238
var e12 = b2Math.SubtractVV(this.m_v2.w, this.m_v1.w);
2239
var sgn = b2Math.CrossVV(e12, this.m_v1.w.GetNegative());
2240
if (sgn > 0.0) {
2241
return b2Math.CrossFV(1.0, e12);
2242
}
2243
else {
2244
return b2Math.CrossVF(e12, 1.0);
2245
}
2246
}
2247
default:
2248
b2Settings.b2Assert(false);
2249
return new b2Vec2();
2250
}
2251
}
2252
b2Simplex.prototype.GetClosestPoint = function () {
2253
switch (this.m_count) {
2254
case 0:
2255
b2Settings.b2Assert(false);
2256
return new b2Vec2();
2257
case 1:
2258
return this.m_v1.w;
2259
case 2:
2260
return new b2Vec2(this.m_v1.a * this.m_v1.w.x + this.m_v2.a * this.m_v2.w.x, this.m_v1.a * this.m_v1.w.y + this.m_v2.a * this.m_v2.w.y);
2261
default:
2262
b2Settings.b2Assert(false);
2263
return new b2Vec2();
2264
}
2265
}
2266
b2Simplex.prototype.GetWitnessPoints = function (pA, pB) {
2267
switch (this.m_count) {
2268
case 0:
2269
b2Settings.b2Assert(false);
2270
break;
2271
case 1:
2272
pA.SetV(this.m_v1.wA);
2273
pB.SetV(this.m_v1.wB);
2274
break;
2275
case 2:
2276
pA.x = this.m_v1.a * this.m_v1.wA.x + this.m_v2.a * this.m_v2.wA.x;
2277
pA.y = this.m_v1.a * this.m_v1.wA.y + this.m_v2.a * this.m_v2.wA.y;
2278
pB.x = this.m_v1.a * this.m_v1.wB.x + this.m_v2.a * this.m_v2.wB.x;
2279
pB.y = this.m_v1.a * this.m_v1.wB.y + this.m_v2.a * this.m_v2.wB.y;
2280
break;
2281
case 3:
2282
pB.x = pA.x = this.m_v1.a * this.m_v1.wA.x + this.m_v2.a * this.m_v2.wA.x + this.m_v3.a * this.m_v3.wA.x;
2283
pB.y = pA.y = this.m_v1.a * this.m_v1.wA.y + this.m_v2.a * this.m_v2.wA.y + this.m_v3.a * this.m_v3.wA.y;
2284
break;
2285
default:
2286
b2Settings.b2Assert(false);
2287
break;
2288
}
2289
}
2290
b2Simplex.prototype.GetMetric = function () {
2291
switch (this.m_count) {
2292
case 0:
2293
b2Settings.b2Assert(false);
2294
return 0.0;
2295
case 1:
2296
return 0.0;
2297
case 2:
2298
return b2Math.SubtractVV(this.m_v1.w, this.m_v2.w).Length();
2299
case 3:
2300
return b2Math.CrossVV(b2Math.SubtractVV(this.m_v2.w, this.m_v1.w), b2Math.SubtractVV(this.m_v3.w, this.m_v1.w));
2301
default:
2302
b2Settings.b2Assert(false);
2303
return 0.0;
2304
}
2305
}
2306
b2Simplex.prototype.Solve2 = function () {
2307
var w1 = this.m_v1.w;
2308
var w2 = this.m_v2.w;
2309
var e12 = b2Math.SubtractVV(w2, w1);
2310
var d12_2 = (-(w1.x * e12.x + w1.y * e12.y));
2311
if (d12_2 <= 0.0) {
2312
this.m_v1.a = 1.0;
2313
this.m_count = 1;
2314
return;
2315
}
2316
var d12_1 = (w2.x * e12.x + w2.y * e12.y);
2317
if (d12_1 <= 0.0) {
2318
this.m_v2.a = 1.0;
2319
this.m_count = 1;
2320
this.m_v1.Set(this.m_v2);
2321
return;
2322
}
2323
var inv_d12 = 1.0 / (d12_1 + d12_2);
2324
this.m_v1.a = d12_1 * inv_d12;
2325
this.m_v2.a = d12_2 * inv_d12;
2326
this.m_count = 2;
2327
}
2328
b2Simplex.prototype.Solve3 = function () {
2329
var w1 = this.m_v1.w;
2330
var w2 = this.m_v2.w;
2331
var w3 = this.m_v3.w;
2332
var e12 = b2Math.SubtractVV(w2, w1);
2333
var w1e12 = b2Math.Dot(w1, e12);
2334
var w2e12 = b2Math.Dot(w2, e12);
2335
var d12_1 = w2e12;
2336
var d12_2 = (-w1e12);
2337
var e13 = b2Math.SubtractVV(w3, w1);
2338
var w1e13 = b2Math.Dot(w1, e13);
2339
var w3e13 = b2Math.Dot(w3, e13);
2340
var d13_1 = w3e13;
2341
var d13_2 = (-w1e13);
2342
var e23 = b2Math.SubtractVV(w3, w2);
2343
var w2e23 = b2Math.Dot(w2, e23);
2344
var w3e23 = b2Math.Dot(w3, e23);
2345
var d23_1 = w3e23;
2346
var d23_2 = (-w2e23);
2347
var n123 = b2Math.CrossVV(e12, e13);
2348
var d123_1 = n123 * b2Math.CrossVV(w2, w3);
2349
var d123_2 = n123 * b2Math.CrossVV(w3, w1);
2350
var d123_3 = n123 * b2Math.CrossVV(w1, w2);
2351
if (d12_2 <= 0.0 && d13_2 <= 0.0) {
2352
this.m_v1.a = 1.0;
2353
this.m_count = 1;
2354
return;
2355
}
2356
if (d12_1 > 0.0 && d12_2 > 0.0 && d123_3 <= 0.0) {
2357
var inv_d12 = 1.0 / (d12_1 + d12_2);
2358
this.m_v1.a = d12_1 * inv_d12;
2359
this.m_v2.a = d12_2 * inv_d12;
2360
this.m_count = 2;
2361
return;
2362
}
2363
if (d13_1 > 0.0 && d13_2 > 0.0 && d123_2 <= 0.0) {
2364
var inv_d13 = 1.0 / (d13_1 + d13_2);
2365
this.m_v1.a = d13_1 * inv_d13;
2366
this.m_v3.a = d13_2 * inv_d13;
2367
this.m_count = 2;
2368
this.m_v2.Set(this.m_v3);
2369
return;
2370
}
2371
if (d12_1 <= 0.0 && d23_2 <= 0.0) {
2372
this.m_v2.a = 1.0;
2373
this.m_count = 1;
2374
this.m_v1.Set(this.m_v2);
2375
return;
2376
}
2377
if (d13_1 <= 0.0 && d23_1 <= 0.0) {
2378
this.m_v3.a = 1.0;
2379
this.m_count = 1;
2380
this.m_v1.Set(this.m_v3);
2381
return;
2382
}
2383
if (d23_1 > 0.0 && d23_2 > 0.0 && d123_1 <= 0.0) {
2384
var inv_d23 = 1.0 / (d23_1 + d23_2);
2385
this.m_v2.a = d23_1 * inv_d23;
2386
this.m_v3.a = d23_2 * inv_d23;
2387
this.m_count = 2;
2388
this.m_v1.Set(this.m_v3);
2389
return;
2390
}
2391
var inv_d123 = 1.0 / (d123_1 + d123_2 + d123_3);
2392
this.m_v1.a = d123_1 * inv_d123;
2393
this.m_v2.a = d123_2 * inv_d123;
2394
this.m_v3.a = d123_3 * inv_d123;
2395
this.m_count = 3;
2396
}
2397
b2SimplexCache.b2SimplexCache = function () {
2398
this.indexA = new Vector_a2j_Number(3);
2399
this.indexB = new Vector_a2j_Number(3);
2400
};
2401
b2SimplexVertex.b2SimplexVertex = function () {};
2402
b2SimplexVertex.prototype.Set = function (other) {
2403
this.wA.SetV(other.wA);
2404
this.wB.SetV(other.wB);
2405
this.w.SetV(other.w);
2406
this.a = other.a;
2407
this.indexA = other.indexA;
2408
this.indexB = other.indexB;
2409
}
2410
b2TimeOfImpact.b2TimeOfImpact = function () {};
2411
b2TimeOfImpact.TimeOfImpact = function (input) {
2412
++b2TimeOfImpact.b2_toiCalls;
2413
var proxyA = input.proxyA;
2414
var proxyB = input.proxyB;
2415
var sweepA = input.sweepA;
2416
var sweepB = input.sweepB;
2417
b2Settings.b2Assert(sweepA.t0 == sweepB.t0);
2418
b2Settings.b2Assert(1.0 - sweepA.t0 > Number.MIN_VALUE);
2419
var radius = proxyA.m_radius + proxyB.m_radius;
2420
var tolerance = input.tolerance;
2421
var alpha = 0.0;
2422
var k_maxIterations = 1000;
2423
var iter = 0;
2424
var target = 0.0;
2425
b2TimeOfImpact.s_cache.count = 0;
2426
b2TimeOfImpact.s_distanceInput.useRadii = false;
2427
for (;;) {
2428
sweepA.GetTransform(b2TimeOfImpact.s_xfA, alpha);
2429
sweepB.GetTransform(b2TimeOfImpact.s_xfB, alpha);
2430
b2TimeOfImpact.s_distanceInput.proxyA = proxyA;
2431
b2TimeOfImpact.s_distanceInput.proxyB = proxyB;
2432
b2TimeOfImpact.s_distanceInput.transformA = b2TimeOfImpact.s_xfA;
2433
b2TimeOfImpact.s_distanceInput.transformB = b2TimeOfImpact.s_xfB;
2434
b2Distance.Distance(b2TimeOfImpact.s_distanceOutput, b2TimeOfImpact.s_cache, b2TimeOfImpact.s_distanceInput);
2435
if (b2TimeOfImpact.s_distanceOutput.distance <= 0.0) {
2436
alpha = 1.0;
2437
break;
2438
}
2439
b2TimeOfImpact.s_fcn.Initialize(b2TimeOfImpact.s_cache, proxyA, b2TimeOfImpact.s_xfA, proxyB, b2TimeOfImpact.s_xfB);
2440
var separation = b2TimeOfImpact.s_fcn.Evaluate(b2TimeOfImpact.s_xfA, b2TimeOfImpact.s_xfB);
2441
if (separation <= 0.0) {
2442
alpha = 1.0;
2443
break;
2444
}
2445
if (iter == 0) {
2446
if (separation > radius) {
2447
target = b2Math.Max(radius - tolerance, 0.75 * radius);
2448
}
2449
else {
2450
target = b2Math.Max(separation - tolerance, 0.02 * radius);
2451
}
2452
}
2453
if (separation - target < 0.5 * tolerance) {
2454
if (iter == 0) {
2455
alpha = 1.0;
2456
break;
2457
}
2458
break;
2459
}
2460
var newAlpha = alpha; {
2461
var x1 = alpha;
2462
var x2 = 1.0;
2463
var f1 = separation;
2464
sweepA.GetTransform(b2TimeOfImpact.s_xfA, x2);
2465
sweepB.GetTransform(b2TimeOfImpact.s_xfB, x2);
2466
var f2 = b2TimeOfImpact.s_fcn.Evaluate(b2TimeOfImpact.s_xfA, b2TimeOfImpact.s_xfB);
2467
if (f2 >= target) {
2468
alpha = 1.0;
2469
break;
2470
}
2471
var rootIterCount = 0;
2472
for (;;) {
2473
var x = 0;
2474
if (rootIterCount & 1) {
2475
x = x1 + (target - f1) * (x2 - x1) / (f2 - f1);
2476
}
2477
else {
2478
x = 0.5 * (x1 + x2);
2479
}
2480
sweepA.GetTransform(b2TimeOfImpact.s_xfA, x);
2481
sweepB.GetTransform(b2TimeOfImpact.s_xfB, x);
2482
var f = b2TimeOfImpact.s_fcn.Evaluate(b2TimeOfImpact.s_xfA, b2TimeOfImpact.s_xfB);
2483
if (b2Math.Abs(f - target) < 0.025 * tolerance) {
2484
newAlpha = x;
2485
break;
2486
}
2487
if (f > target) {
2488
x1 = x;
2489
f1 = f;
2490
}
2491
else {
2492
x2 = x;
2493
f2 = f;
2494
}++rootIterCount;
2495
++b2TimeOfImpact.b2_toiRootIters;
2496
if (rootIterCount == 50) {
2497
break;
2498
}
2499
}
2500
b2TimeOfImpact.b2_toiMaxRootIters = b2Math.Max(b2TimeOfImpact.b2_toiMaxRootIters, rootIterCount);
2501
}
2502
if (newAlpha < (1.0 + 100.0 * Number.MIN_VALUE) * alpha) {
2503
break;
2504
}
2505
alpha = newAlpha;
2506
iter++;
2507
++b2TimeOfImpact.b2_toiIters;
2508
if (iter == k_maxIterations) {
2509
break;
2510
}
2511
}
2512
b2TimeOfImpact.b2_toiMaxIters = b2Math.Max(b2TimeOfImpact.b2_toiMaxIters, iter);
2513
return alpha;
2514
}
2515
Box2D.postDefs.push(function () {
2516
Box2D.Collision.b2TimeOfImpact.b2_toiCalls = 0;
2517
Box2D.Collision.b2TimeOfImpact.b2_toiIters = 0;
2518
Box2D.Collision.b2TimeOfImpact.b2_toiMaxIters = 0;
2519
Box2D.Collision.b2TimeOfImpact.b2_toiRootIters = 0;
2520
Box2D.Collision.b2TimeOfImpact.b2_toiMaxRootIters = 0;
2521
Box2D.Collision.b2TimeOfImpact.s_cache = new b2SimplexCache();
2522
Box2D.Collision.b2TimeOfImpact.s_distanceInput = new b2DistanceInput();
2523
Box2D.Collision.b2TimeOfImpact.s_xfA = new b2Transform();
2524
Box2D.Collision.b2TimeOfImpact.s_xfB = new b2Transform();
2525
Box2D.Collision.b2TimeOfImpact.s_fcn = new b2SeparationFunction();
2526
Box2D.Collision.b2TimeOfImpact.s_distanceOutput = new b2DistanceOutput();
2527
});
2528
b2TOIInput.b2TOIInput = function () {
2529
this.proxyA = new b2DistanceProxy();
2530
this.proxyB = new b2DistanceProxy();
2531
this.sweepA = new b2Sweep();
2532
this.sweepB = new b2Sweep();
2533
};
2534
b2WorldManifold.b2WorldManifold = function () {
2535
this.m_normal = new b2Vec2();
2536
};
2537
b2WorldManifold.prototype.b2WorldManifold = function () {
2538
this.m_points = new Vector(b2Settings.b2_maxManifoldPoints);
2539
for (var i = 0; i < b2Settings.b2_maxManifoldPoints; i++) {
2540
this.m_points[i] = new b2Vec2();
2541
}
2542
}
2543
b2WorldManifold.prototype.Initialize = function (manifold, xfA, radiusA, xfB, radiusB) {
2544
if (radiusA === undefined) radiusA = 0;
2545
if (radiusB === undefined) radiusB = 0;
2546
if (manifold.m_pointCount == 0) {
2547
return;
2548
}
2549
var i = 0;
2550
var tVec;
2551
var tMat;
2552
var normalX = 0;
2553
var normalY = 0;
2554
var planePointX = 0;
2555
var planePointY = 0;
2556
var clipPointX = 0;
2557
var clipPointY = 0;
2558
switch (manifold.m_type) {
2559
case b2Manifold.e_circles:
2560
{
2561
tMat = xfA.R;
2562
tVec = manifold.m_localPoint;
2563
var pointAX = xfA.position.x + tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
2564
var pointAY = xfA.position.y + tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
2565
tMat = xfB.R;
2566
tVec = manifold.m_points[0].m_localPoint;
2567
var pointBX = xfB.position.x + tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
2568
var pointBY = xfB.position.y + tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
2569
var dX = pointBX - pointAX;
2570
var dY = pointBY - pointAY;
2571
var d2 = dX * dX + dY * dY;
2572
if (d2 > Number.MIN_VALUE * Number.MIN_VALUE) {
2573
var d = Math.sqrt(d2);
2574
this.m_normal.x = dX / d;
2575
this.m_normal.y = dY / d;
2576
}
2577
else {
2578
this.m_normal.x = 1;
2579
this.m_normal.y = 0;
2580
}
2581
var cAX = pointAX + radiusA * this.m_normal.x;
2582
var cAY = pointAY + radiusA * this.m_normal.y;
2583
var cBX = pointBX - radiusB * this.m_normal.x;
2584
var cBY = pointBY - radiusB * this.m_normal.y;
2585
this.m_points[0].x = 0.5 * (cAX + cBX);
2586
this.m_points[0].y = 0.5 * (cAY + cBY);
2587
}
2588
break;
2589
case b2Manifold.e_faceA:
2590
{
2591
tMat = xfA.R;
2592
tVec = manifold.m_localPlaneNormal;
2593
normalX = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
2594
normalY = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
2595
tMat = xfA.R;
2596
tVec = manifold.m_localPoint;
2597
planePointX = xfA.position.x + tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
2598
planePointY = xfA.position.y + tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
2599
this.m_normal.x = normalX;
2600
this.m_normal.y = normalY;
2601
for (i = 0;
2602
i < manifold.m_pointCount; i++) {
2603
tMat = xfB.R;
2604
tVec = manifold.m_points[i].m_localPoint;
2605
clipPointX = xfB.position.x + tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
2606
clipPointY = xfB.position.y + tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
2607
this.m_points[i].x = clipPointX + 0.5 * (radiusA - (clipPointX - planePointX) * normalX - (clipPointY - planePointY) * normalY - radiusB) * normalX;
2608
this.m_points[i].y = clipPointY + 0.5 * (radiusA - (clipPointX - planePointX) * normalX - (clipPointY - planePointY) * normalY - radiusB) * normalY;
2609
}
2610
}
2611
break;
2612
case b2Manifold.e_faceB:
2613
{
2614
tMat = xfB.R;
2615
tVec = manifold.m_localPlaneNormal;
2616
normalX = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
2617
normalY = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
2618
tMat = xfB.R;
2619
tVec = manifold.m_localPoint;
2620
planePointX = xfB.position.x + tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
2621
planePointY = xfB.position.y + tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
2622
this.m_normal.x = (-normalX);
2623
this.m_normal.y = (-normalY);
2624
for (i = 0;
2625
i < manifold.m_pointCount; i++) {
2626
tMat = xfA.R;
2627
tVec = manifold.m_points[i].m_localPoint;
2628
clipPointX = xfA.position.x + tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
2629
clipPointY = xfA.position.y + tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
2630
this.m_points[i].x = clipPointX + 0.5 * (radiusB - (clipPointX - planePointX) * normalX - (clipPointY - planePointY) * normalY - radiusA) * normalX;
2631
this.m_points[i].y = clipPointY + 0.5 * (radiusB - (clipPointX - planePointX) * normalX - (clipPointY - planePointY) * normalY - radiusA) * normalY;
2632
}
2633
}
2634
break;
2635
}
2636
}
2637
ClipVertex.ClipVertex = function () {
2638
this.v = new b2Vec2();
2639
this.id = new b2ContactID();
2640
};
2641
ClipVertex.prototype.Set = function (other) {
2642
this.v.SetV(other.v);
2643
this.id.Set(other.id);
2644
}
2645
Features.Features = function () {};
2646
Object.defineProperty(Features.prototype, 'referenceEdge', {
2647
enumerable: false,
2648
configurable: true,
2649
get: function () {
2650
return this._referenceEdge;
2651
}
2652
});
2653
Object.defineProperty(Features.prototype, 'referenceEdge', {
2654
enumerable: false,
2655
configurable: true,
2656
set: function (value) {
2657
if (value === undefined) value = 0;
2658
this._referenceEdge = value;
2659
this._m_id._key = (this._m_id._key & 0xffffff00) | (this._referenceEdge & 0x000000ff);
2660
}
2661
});
2662
Object.defineProperty(Features.prototype, 'incidentEdge', {
2663
enumerable: false,
2664
configurable: true,
2665
get: function () {
2666
return this._incidentEdge;
2667
}
2668
});
2669
Object.defineProperty(Features.prototype, 'incidentEdge', {
2670
enumerable: false,
2671
configurable: true,
2672
set: function (value) {
2673
if (value === undefined) value = 0;
2674
this._incidentEdge = value;
2675
this._m_id._key = (this._m_id._key & 0xffff00ff) | ((this._incidentEdge << 8) & 0x0000ff00);
2676
}
2677
});
2678
Object.defineProperty(Features.prototype, 'incidentVertex', {
2679
enumerable: false,
2680
configurable: true,
2681
get: function () {
2682
return this._incidentVertex;
2683
}
2684
});
2685
Object.defineProperty(Features.prototype, 'incidentVertex', {
2686
enumerable: false,
2687
configurable: true,
2688
set: function (value) {
2689
if (value === undefined) value = 0;
2690
this._incidentVertex = value;
2691
this._m_id._key = (this._m_id._key & 0xff00ffff) | ((this._incidentVertex << 16) & 0x00ff0000);
2692
}
2693
});
2694
Object.defineProperty(Features.prototype, 'flip', {
2695
enumerable: false,
2696
configurable: true,
2697
get: function () {
2698
return this._flip;
2699
}
2700
});
2701
Object.defineProperty(Features.prototype, 'flip', {
2702
enumerable: false,
2703
configurable: true,
2704
set: function (value) {
2705
if (value === undefined) value = 0;
2706
this._flip = value;
2707
this._m_id._key = (this._m_id._key & 0x00ffffff) | ((this._flip << 24) & 0xff000000);
2708
}
2709
});
2710
})();
2711
(function () {
2712
var b2Color = Box2D.Common.b2Color,
2713
b2internal = Box2D.Common.b2internal,
2714
b2Settings = Box2D.Common.b2Settings,
2715
b2CircleShape = Box2D.Collision.Shapes.b2CircleShape,
2716
b2EdgeChainDef = Box2D.Collision.Shapes.b2EdgeChainDef,
2717
b2EdgeShape = Box2D.Collision.Shapes.b2EdgeShape,
2718
b2MassData = Box2D.Collision.Shapes.b2MassData,
2719
b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape,
2720
b2Shape = Box2D.Collision.Shapes.b2Shape,
2721
b2Mat22 = Box2D.Common.Math.b2Mat22,
2722
b2Mat33 = Box2D.Common.Math.b2Mat33,
2723
b2Math = Box2D.Common.Math.b2Math,
2724
b2Sweep = Box2D.Common.Math.b2Sweep,
2725
b2Transform = Box2D.Common.Math.b2Transform,
2726
b2Vec2 = Box2D.Common.Math.b2Vec2,
2727
b2Vec3 = Box2D.Common.Math.b2Vec3,
2728
b2Body = Box2D.Dynamics.b2Body,
2729
b2BodyDef = Box2D.Dynamics.b2BodyDef,
2730
b2ContactFilter = Box2D.Dynamics.b2ContactFilter,
2731
b2ContactImpulse = Box2D.Dynamics.b2ContactImpulse,
2732
b2ContactListener = Box2D.Dynamics.b2ContactListener,
2733
b2ContactManager = Box2D.Dynamics.b2ContactManager,
2734
b2DebugDraw = Box2D.Dynamics.b2DebugDraw,
2735
b2DestructionListener = Box2D.Dynamics.b2DestructionListener,
2736
b2FilterData = Box2D.Dynamics.b2FilterData,
2737
b2Fixture = Box2D.Dynamics.b2Fixture,
2738
b2FixtureDef = Box2D.Dynamics.b2FixtureDef,
2739
b2Island = Box2D.Dynamics.b2Island,
2740
b2TimeStep = Box2D.Dynamics.b2TimeStep,
2741
b2World = Box2D.Dynamics.b2World,
2742
b2AABB = Box2D.Collision.b2AABB,
2743
b2Bound = Box2D.Collision.b2Bound,
2744
b2BoundValues = Box2D.Collision.b2BoundValues,
2745
b2Collision = Box2D.Collision.b2Collision,
2746
b2ContactID = Box2D.Collision.b2ContactID,
2747
b2ContactPoint = Box2D.Collision.b2ContactPoint,
2748
b2Distance = Box2D.Collision.b2Distance,
2749
b2DistanceInput = Box2D.Collision.b2DistanceInput,
2750
b2DistanceOutput = Box2D.Collision.b2DistanceOutput,
2751
b2DistanceProxy = Box2D.Collision.b2DistanceProxy,
2752
b2DynamicTree = Box2D.Collision.b2DynamicTree,
2753
b2DynamicTreeBroadPhase = Box2D.Collision.b2DynamicTreeBroadPhase,
2754
b2DynamicTreeNode = Box2D.Collision.b2DynamicTreeNode,
2755
b2DynamicTreePair = Box2D.Collision.b2DynamicTreePair,
2756
b2Manifold = Box2D.Collision.b2Manifold,
2757
b2ManifoldPoint = Box2D.Collision.b2ManifoldPoint,
2758
b2Point = Box2D.Collision.b2Point,
2759
b2RayCastInput = Box2D.Collision.b2RayCastInput,
2760
b2RayCastOutput = Box2D.Collision.b2RayCastOutput,
2761
b2Segment = Box2D.Collision.b2Segment,
2762
b2SeparationFunction = Box2D.Collision.b2SeparationFunction,
2763
b2Simplex = Box2D.Collision.b2Simplex,
2764
b2SimplexCache = Box2D.Collision.b2SimplexCache,
2765
b2SimplexVertex = Box2D.Collision.b2SimplexVertex,
2766
b2TimeOfImpact = Box2D.Collision.b2TimeOfImpact,
2767
b2TOIInput = Box2D.Collision.b2TOIInput,
2768
b2WorldManifold = Box2D.Collision.b2WorldManifold,
2769
ClipVertex = Box2D.Collision.ClipVertex,
2770
Features = Box2D.Collision.Features,
2771
IBroadPhase = Box2D.Collision.IBroadPhase;
2772
2773
Box2D.inherit(b2CircleShape, Box2D.Collision.Shapes.b2Shape);
2774
b2CircleShape.prototype.__super = Box2D.Collision.Shapes.b2Shape.prototype;
2775
b2CircleShape.b2CircleShape = function () {
2776
Box2D.Collision.Shapes.b2Shape.b2Shape.apply(this, arguments);
2777
this.m_p = new b2Vec2();
2778
};
2779
b2CircleShape.prototype.Copy = function () {
2780
var s = new b2CircleShape();
2781
s.Set(this);
2782
return s;
2783
}
2784
b2CircleShape.prototype.Set = function (other) {
2785
this.__super.Set.call(this, other);
2786
if (Box2D.is(other, b2CircleShape)) {
2787
var other2 = (other instanceof b2CircleShape ? other : null);
2788
this.m_p.SetV(other2.m_p);
2789
}
2790
}
2791
b2CircleShape.prototype.TestPoint = function (transform, p) {
2792
var tMat = transform.R;
2793
var dX = transform.position.x + (tMat.col1.x * this.m_p.x + tMat.col2.x * this.m_p.y);
2794
var dY = transform.position.y + (tMat.col1.y * this.m_p.x + tMat.col2.y * this.m_p.y);
2795
dX = p.x - dX;
2796
dY = p.y - dY;
2797
return (dX * dX + dY * dY) <= this.m_radius * this.m_radius;
2798
}
2799
b2CircleShape.prototype.RayCast = function (output, input, transform) {
2800
var tMat = transform.R;
2801
var positionX = transform.position.x + (tMat.col1.x * this.m_p.x + tMat.col2.x * this.m_p.y);
2802
var positionY = transform.position.y + (tMat.col1.y * this.m_p.x + tMat.col2.y * this.m_p.y);
2803
var sX = input.p1.x - positionX;
2804
var sY = input.p1.y - positionY;
2805
var b = (sX * sX + sY * sY) - this.m_radius * this.m_radius;
2806
var rX = input.p2.x - input.p1.x;
2807
var rY = input.p2.y - input.p1.y;
2808
var c = (sX * rX + sY * rY);
2809
var rr = (rX * rX + rY * rY);
2810
var sigma = c * c - rr * b;
2811
if (sigma < 0.0 || rr < Number.MIN_VALUE) {
2812
return false;
2813
}
2814
var a = (-(c + Math.sqrt(sigma)));
2815
if (0.0 <= a && a <= input.maxFraction * rr) {
2816
a /= rr;
2817
output.fraction = a;
2818
output.normal.x = sX + a * rX;
2819
output.normal.y = sY + a * rY;
2820
output.normal.Normalize();
2821
return true;
2822
}
2823
return false;
2824
}
2825
b2CircleShape.prototype.ComputeAABB = function (aabb, transform) {
2826
var tMat = transform.R;
2827
var pX = transform.position.x + (tMat.col1.x * this.m_p.x + tMat.col2.x * this.m_p.y);
2828
var pY = transform.position.y + (tMat.col1.y * this.m_p.x + tMat.col2.y * this.m_p.y);
2829
aabb.lowerBound.Set(pX - this.m_radius, pY - this.m_radius);
2830
aabb.upperBound.Set(pX + this.m_radius, pY + this.m_radius);
2831
}
2832
b2CircleShape.prototype.ComputeMass = function (massData, density) {
2833
if (density === undefined) density = 0;
2834
massData.mass = density * b2Settings.b2_pi * this.m_radius * this.m_radius;
2835
massData.center.SetV(this.m_p);
2836
massData.I = massData.mass * (0.5 * this.m_radius * this.m_radius + (this.m_p.x * this.m_p.x + this.m_p.y * this.m_p.y));
2837
}
2838
b2CircleShape.prototype.ComputeSubmergedArea = function (normal, offset, xf, c) {
2839
if (offset === undefined) offset = 0;
2840
var p = b2Math.MulX(xf, this.m_p);
2841
var l = (-(b2Math.Dot(normal, p) - offset));
2842
if (l < (-this.m_radius) + Number.MIN_VALUE) {
2843
return 0;
2844
}
2845
if (l > this.m_radius) {
2846
c.SetV(p);
2847
return Math.PI * this.m_radius * this.m_radius;
2848
}
2849
var r2 = this.m_radius * this.m_radius;
2850
var l2 = l * l;
2851
var area = r2 * (Math.asin(l / this.m_radius) + Math.PI / 2) + l * Math.sqrt(r2 - l2);
2852
var com = (-2 / 3 * Math.pow(r2 - l2, 1.5) / area);
2853
c.x = p.x + normal.x * com;
2854
c.y = p.y + normal.y * com;
2855
return area;
2856
}
2857
b2CircleShape.prototype.GetLocalPosition = function () {
2858
return this.m_p;
2859
}
2860
b2CircleShape.prototype.SetLocalPosition = function (position) {
2861
this.m_p.SetV(position);
2862
}
2863
b2CircleShape.prototype.GetRadius = function () {
2864
return this.m_radius;
2865
}
2866
b2CircleShape.prototype.SetRadius = function (radius) {
2867
if (radius === undefined) radius = 0;
2868
this.m_radius = radius;
2869
}
2870
b2CircleShape.prototype.b2CircleShape = function (radius) {
2871
if (radius === undefined) radius = 0;
2872
this.__super.b2Shape.call(this);
2873
this.m_type = b2Shape.e_circleShape;
2874
this.m_radius = radius;
2875
}
2876
b2EdgeChainDef.b2EdgeChainDef = function () {};
2877
b2EdgeChainDef.prototype.b2EdgeChainDef = function () {
2878
this.vertexCount = 0;
2879
this.isALoop = true;
2880
this.vertices = [];
2881
}
2882
Box2D.inherit(b2EdgeShape, Box2D.Collision.Shapes.b2Shape);
2883
b2EdgeShape.prototype.__super = Box2D.Collision.Shapes.b2Shape.prototype;
2884
b2EdgeShape.b2EdgeShape = function () {
2885
Box2D.Collision.Shapes.b2Shape.b2Shape.apply(this, arguments);
2886
this.s_supportVec = new b2Vec2();
2887
this.m_v1 = new b2Vec2();
2888
this.m_v2 = new b2Vec2();
2889
this.m_coreV1 = new b2Vec2();
2890
this.m_coreV2 = new b2Vec2();
2891
this.m_normal = new b2Vec2();
2892
this.m_direction = new b2Vec2();
2893
this.m_cornerDir1 = new b2Vec2();
2894
this.m_cornerDir2 = new b2Vec2();
2895
};
2896
b2EdgeShape.prototype.TestPoint = function (transform, p) {
2897
return false;
2898
}
2899
b2EdgeShape.prototype.RayCast = function (output, input, transform) {
2900
var tMat;
2901
var rX = input.p2.x - input.p1.x;
2902
var rY = input.p2.y - input.p1.y;
2903
tMat = transform.R;
2904
var v1X = transform.position.x + (tMat.col1.x * this.m_v1.x + tMat.col2.x * this.m_v1.y);
2905
var v1Y = transform.position.y + (tMat.col1.y * this.m_v1.x + tMat.col2.y * this.m_v1.y);
2906
var nX = transform.position.y + (tMat.col1.y * this.m_v2.x + tMat.col2.y * this.m_v2.y) - v1Y;
2907
var nY = (-(transform.position.x + (tMat.col1.x * this.m_v2.x + tMat.col2.x * this.m_v2.y) - v1X));
2908
var k_slop = 100.0 * Number.MIN_VALUE;
2909
var denom = (-(rX * nX + rY * nY));
2910
if (denom > k_slop) {
2911
var bX = input.p1.x - v1X;
2912
var bY = input.p1.y - v1Y;
2913
var a = (bX * nX + bY * nY);
2914
if (0.0 <= a && a <= input.maxFraction * denom) {
2915
var mu2 = (-rX * bY) + rY * bX;
2916
if ((-k_slop * denom) <= mu2 && mu2 <= denom * (1.0 + k_slop)) {
2917
a /= denom;
2918
output.fraction = a;
2919
var nLen = Math.sqrt(nX * nX + nY * nY);
2920
output.normal.x = nX / nLen;
2921
output.normal.y = nY / nLen;
2922
return true;
2923
}
2924
}
2925
}
2926
return false;
2927
}
2928
b2EdgeShape.prototype.ComputeAABB = function (aabb, transform) {
2929
var tMat = transform.R;
2930
var v1X = transform.position.x + (tMat.col1.x * this.m_v1.x + tMat.col2.x * this.m_v1.y);
2931
var v1Y = transform.position.y + (tMat.col1.y * this.m_v1.x + tMat.col2.y * this.m_v1.y);
2932
var v2X = transform.position.x + (tMat.col1.x * this.m_v2.x + tMat.col2.x * this.m_v2.y);
2933
var v2Y = transform.position.y + (tMat.col1.y * this.m_v2.x + tMat.col2.y * this.m_v2.y);
2934
if (v1X < v2X) {
2935
aabb.lowerBound.x = v1X;
2936
aabb.upperBound.x = v2X;
2937
}
2938
else {
2939
aabb.lowerBound.x = v2X;
2940
aabb.upperBound.x = v1X;
2941
}
2942
if (v1Y < v2Y) {
2943
aabb.lowerBound.y = v1Y;
2944
aabb.upperBound.y = v2Y;
2945
}
2946
else {
2947
aabb.lowerBound.y = v2Y;
2948
aabb.upperBound.y = v1Y;
2949
}
2950
}
2951
b2EdgeShape.prototype.ComputeMass = function (massData, density) {
2952
if (density === undefined) density = 0;
2953
massData.mass = 0;
2954
massData.center.SetV(this.m_v1);
2955
massData.I = 0;
2956
}
2957
b2EdgeShape.prototype.ComputeSubmergedArea = function (normal, offset, xf, c) {
2958
if (offset === undefined) offset = 0;
2959
var v0 = new b2Vec2(normal.x * offset, normal.y * offset);
2960
var v1 = b2Math.MulX(xf, this.m_v1);
2961
var v2 = b2Math.MulX(xf, this.m_v2);
2962
var d1 = b2Math.Dot(normal, v1) - offset;
2963
var d2 = b2Math.Dot(normal, v2) - offset;
2964
if (d1 > 0) {
2965
if (d2 > 0) {
2966
return 0;
2967
}
2968
else {
2969
v1.x = (-d2 / (d1 - d2) * v1.x) + d1 / (d1 - d2) * v2.x;
2970
v1.y = (-d2 / (d1 - d2) * v1.y) + d1 / (d1 - d2) * v2.y;
2971
}
2972
}
2973
else {
2974
if (d2 > 0) {
2975
v2.x = (-d2 / (d1 - d2) * v1.x) + d1 / (d1 - d2) * v2.x;
2976
v2.y = (-d2 / (d1 - d2) * v1.y) + d1 / (d1 - d2) * v2.y;
2977
}
2978
else {}
2979
}
2980
c.x = (v0.x + v1.x + v2.x) / 3;
2981
c.y = (v0.y + v1.y + v2.y) / 3;
2982
return 0.5 * ((v1.x - v0.x) * (v2.y - v0.y) - (v1.y - v0.y) * (v2.x - v0.x));
2983
}
2984
b2EdgeShape.prototype.GetLength = function () {
2985
return this.m_length;
2986
}
2987
b2EdgeShape.prototype.GetVertex1 = function () {
2988
return this.m_v1;
2989
}
2990
b2EdgeShape.prototype.GetVertex2 = function () {
2991
return this.m_v2;
2992
}
2993
b2EdgeShape.prototype.GetCoreVertex1 = function () {
2994
return this.m_coreV1;
2995
}
2996
b2EdgeShape.prototype.GetCoreVertex2 = function () {
2997
return this.m_coreV2;
2998
}
2999
b2EdgeShape.prototype.GetNormalVector = function () {
3000
return this.m_normal;
3001
}
3002
b2EdgeShape.prototype.GetDirectionVector = function () {
3003
return this.m_direction;
3004
}
3005
b2EdgeShape.prototype.GetCorner1Vector = function () {
3006
return this.m_cornerDir1;
3007
}
3008
b2EdgeShape.prototype.GetCorner2Vector = function () {
3009
return this.m_cornerDir2;
3010
}
3011
b2EdgeShape.prototype.Corner1IsConvex = function () {
3012
return this.m_cornerConvex1;
3013
}
3014
b2EdgeShape.prototype.Corner2IsConvex = function () {
3015
return this.m_cornerConvex2;
3016
}
3017
b2EdgeShape.prototype.GetFirstVertex = function (xf) {
3018
var tMat = xf.R;
3019
return new b2Vec2(xf.position.x + (tMat.col1.x * this.m_coreV1.x + tMat.col2.x * this.m_coreV1.y), xf.position.y + (tMat.col1.y * this.m_coreV1.x + tMat.col2.y * this.m_coreV1.y));
3020
}
3021
b2EdgeShape.prototype.GetNextEdge = function () {
3022
return this.m_nextEdge;
3023
}
3024
b2EdgeShape.prototype.GetPrevEdge = function () {
3025
return this.m_prevEdge;
3026
}
3027
b2EdgeShape.prototype.Support = function (xf, dX, dY) {
3028
if (dX === undefined) dX = 0;
3029
if (dY === undefined) dY = 0;
3030
var tMat = xf.R;
3031
var v1X = xf.position.x + (tMat.col1.x * this.m_coreV1.x + tMat.col2.x * this.m_coreV1.y);
3032
var v1Y = xf.position.y + (tMat.col1.y * this.m_coreV1.x + tMat.col2.y * this.m_coreV1.y);
3033
var v2X = xf.position.x + (tMat.col1.x * this.m_coreV2.x + tMat.col2.x * this.m_coreV2.y);
3034
var v2Y = xf.position.y + (tMat.col1.y * this.m_coreV2.x + tMat.col2.y * this.m_coreV2.y);
3035
if ((v1X * dX + v1Y * dY) > (v2X * dX + v2Y * dY)) {
3036
this.s_supportVec.x = v1X;
3037
this.s_supportVec.y = v1Y;
3038
}
3039
else {
3040
this.s_supportVec.x = v2X;
3041
this.s_supportVec.y = v2Y;
3042
}
3043
return this.s_supportVec;
3044
}
3045
b2EdgeShape.prototype.b2EdgeShape = function (v1, v2) {
3046
this.__super.b2Shape.call(this);
3047
this.m_type = b2Shape.e_edgeShape;
3048
this.m_prevEdge = null;
3049
this.m_nextEdge = null;
3050
this.m_v1 = v1;
3051
this.m_v2 = v2;
3052
this.m_direction.Set(this.m_v2.x - this.m_v1.x, this.m_v2.y - this.m_v1.y);
3053
this.m_length = this.m_direction.Normalize();
3054
this.m_normal.Set(this.m_direction.y, (-this.m_direction.x));
3055
this.m_coreV1.Set((-b2Settings.b2_toiSlop * (this.m_normal.x - this.m_direction.x)) + this.m_v1.x, (-b2Settings.b2_toiSlop * (this.m_normal.y - this.m_direction.y)) + this.m_v1.y);
3056
this.m_coreV2.Set((-b2Settings.b2_toiSlop * (this.m_normal.x + this.m_direction.x)) + this.m_v2.x, (-b2Settings.b2_toiSlop * (this.m_normal.y + this.m_direction.y)) + this.m_v2.y);
3057
this.m_cornerDir1 = this.m_normal;
3058
this.m_cornerDir2.Set((-this.m_normal.x), (-this.m_normal.y));
3059
}
3060
b2EdgeShape.prototype.SetPrevEdge = function (edge, core, cornerDir, convex) {
3061
this.m_prevEdge = edge;
3062
this.m_coreV1 = core;
3063
this.m_cornerDir1 = cornerDir;
3064
this.m_cornerConvex1 = convex;
3065
}
3066
b2EdgeShape.prototype.SetNextEdge = function (edge, core, cornerDir, convex) {
3067
this.m_nextEdge = edge;
3068
this.m_coreV2 = core;
3069
this.m_cornerDir2 = cornerDir;
3070
this.m_cornerConvex2 = convex;
3071
}
3072
b2MassData.b2MassData = function () {
3073
this.mass = 0.0;
3074
this.center = new b2Vec2(0, 0);
3075
this.I = 0.0;
3076
};
3077
Box2D.inherit(b2PolygonShape, Box2D.Collision.Shapes.b2Shape);
3078
b2PolygonShape.prototype.__super = Box2D.Collision.Shapes.b2Shape.prototype;
3079
b2PolygonShape.b2PolygonShape = function () {
3080
Box2D.Collision.Shapes.b2Shape.b2Shape.apply(this, arguments);
3081
};
3082
b2PolygonShape.prototype.Copy = function () {
3083
var s = new b2PolygonShape();
3084
s.Set(this);
3085
return s;
3086
}
3087
b2PolygonShape.prototype.Set = function (other) {
3088
this.__super.Set.call(this, other);
3089
if (Box2D.is(other, b2PolygonShape)) {
3090
var other2 = (other instanceof b2PolygonShape ? other : null);
3091
this.m_centroid.SetV(other2.m_centroid);
3092
this.m_vertexCount = other2.m_vertexCount;
3093
this.Reserve(this.m_vertexCount);
3094
for (var i = 0; i < this.m_vertexCount; i++) {
3095
this.m_vertices[i].SetV(other2.m_vertices[i]);
3096
this.m_normals[i].SetV(other2.m_normals[i]);
3097
}
3098
}
3099
}
3100
b2PolygonShape.prototype.SetAsArray = function (vertices, vertexCount) {
3101
if (vertexCount === undefined) vertexCount = 0;
3102
var v = new Vector();
3103
var i = 0,
3104
tVec;
3105
for (i = 0;
3106
i < vertices.length; ++i) {
3107
tVec = vertices[i];
3108
v.push(tVec);
3109
}
3110
this.SetAsVector(v, vertexCount);
3111
}
3112
b2PolygonShape.AsArray = function (vertices, vertexCount) {
3113
if (vertexCount === undefined) vertexCount = 0;
3114
var polygonShape = new b2PolygonShape();
3115
polygonShape.SetAsArray(vertices, vertexCount);
3116
return polygonShape;
3117
}
3118
b2PolygonShape.prototype.SetAsVector = function (vertices, vertexCount) {
3119
if (vertexCount === undefined) vertexCount = 0;
3120
if (vertexCount == 0) vertexCount = vertices.length;
3121
b2Settings.b2Assert(2 <= vertexCount);
3122
this.m_vertexCount = vertexCount;
3123
this.Reserve(vertexCount);
3124
var i = 0;
3125
for (i = 0;
3126
i < this.m_vertexCount; i++) {
3127
this.m_vertices[i].SetV(vertices[i]);
3128
}
3129
for (i = 0;
3130
i < this.m_vertexCount; ++i) {
3131
var i1 = parseInt(i);
3132
var i2 = parseInt(i + 1 < this.m_vertexCount ? i + 1 : 0);
3133
var edge = b2Math.SubtractVV(this.m_vertices[i2], this.m_vertices[i1]);
3134
b2Settings.b2Assert(edge.LengthSquared() > Number.MIN_VALUE);
3135
this.m_normals[i].SetV(b2Math.CrossVF(edge, 1.0));
3136
this.m_normals[i].Normalize();
3137
}
3138
this.m_centroid = b2PolygonShape.ComputeCentroid(this.m_vertices, this.m_vertexCount);
3139
}
3140
b2PolygonShape.AsVector = function (vertices, vertexCount) {
3141
if (vertexCount === undefined) vertexCount = 0;
3142
var polygonShape = new b2PolygonShape();
3143
polygonShape.SetAsVector(vertices, vertexCount);
3144
return polygonShape;
3145
}
3146
b2PolygonShape.prototype.SetAsBox = function (hx, hy) {
3147
if (hx === undefined) hx = 0;
3148
if (hy === undefined) hy = 0;
3149
this.m_vertexCount = 4;
3150
this.Reserve(4);
3151
this.m_vertices[0].Set((-hx), (-hy));
3152
this.m_vertices[1].Set(hx, (-hy));
3153
this.m_vertices[2].Set(hx, hy);
3154
this.m_vertices[3].Set((-hx), hy);
3155
this.m_normals[0].Set(0.0, (-1.0));
3156
this.m_normals[1].Set(1.0, 0.0);
3157
this.m_normals[2].Set(0.0, 1.0);
3158
this.m_normals[3].Set((-1.0), 0.0);
3159
this.m_centroid.SetZero();
3160
}
3161
b2PolygonShape.AsBox = function (hx, hy) {
3162
if (hx === undefined) hx = 0;
3163
if (hy === undefined) hy = 0;
3164
var polygonShape = new b2PolygonShape();
3165
polygonShape.SetAsBox(hx, hy);
3166
return polygonShape;
3167
}
3168
b2PolygonShape.prototype.SetAsOrientedBox = function (hx, hy, center, angle) {
3169
if (hx === undefined) hx = 0;
3170
if (hy === undefined) hy = 0;
3171
if (center === undefined) center = null;
3172
if (angle === undefined) angle = 0.0;
3173
this.m_vertexCount = 4;
3174
this.Reserve(4);
3175
this.m_vertices[0].Set((-hx), (-hy));
3176
this.m_vertices[1].Set(hx, (-hy));
3177
this.m_vertices[2].Set(hx, hy);
3178
this.m_vertices[3].Set((-hx), hy);
3179
this.m_normals[0].Set(0.0, (-1.0));
3180
this.m_normals[1].Set(1.0, 0.0);
3181
this.m_normals[2].Set(0.0, 1.0);
3182
this.m_normals[3].Set((-1.0), 0.0);
3183
this.m_centroid = center;
3184
var xf = new b2Transform();
3185
xf.position = center;
3186
xf.R.Set(angle);
3187
for (var i = 0; i < this.m_vertexCount; ++i) {
3188
this.m_vertices[i] = b2Math.MulX(xf, this.m_vertices[i]);
3189
this.m_normals[i] = b2Math.MulMV(xf.R, this.m_normals[i]);
3190
}
3191
}
3192
b2PolygonShape.AsOrientedBox = function (hx, hy, center, angle) {
3193
if (hx === undefined) hx = 0;
3194
if (hy === undefined) hy = 0;
3195
if (center === undefined) center = null;
3196
if (angle === undefined) angle = 0.0;
3197
var polygonShape = new b2PolygonShape();
3198
polygonShape.SetAsOrientedBox(hx, hy, center, angle);
3199
return polygonShape;
3200
}
3201
b2PolygonShape.prototype.SetAsEdge = function (v1, v2) {
3202
this.m_vertexCount = 2;
3203
this.Reserve(2);
3204
this.m_vertices[0].SetV(v1);
3205
this.m_vertices[1].SetV(v2);
3206
this.m_centroid.x = 0.5 * (v1.x + v2.x);
3207
this.m_centroid.y = 0.5 * (v1.y + v2.y);
3208
this.m_normals[0] = b2Math.CrossVF(b2Math.SubtractVV(v2, v1), 1.0);
3209
this.m_normals[0].Normalize();
3210
this.m_normals[1].x = (-this.m_normals[0].x);
3211
this.m_normals[1].y = (-this.m_normals[0].y);
3212
}
3213
b2PolygonShape.AsEdge = function (v1, v2) {
3214
var polygonShape = new b2PolygonShape();
3215
polygonShape.SetAsEdge(v1, v2);
3216
return polygonShape;
3217
}
3218
b2PolygonShape.prototype.TestPoint = function (xf, p) {
3219
var tVec;
3220
var tMat = xf.R;
3221
var tX = p.x - xf.position.x;
3222
var tY = p.y - xf.position.y;
3223
var pLocalX = (tX * tMat.col1.x + tY * tMat.col1.y);
3224
var pLocalY = (tX * tMat.col2.x + tY * tMat.col2.y);
3225
for (var i = 0; i < this.m_vertexCount; ++i) {
3226
tVec = this.m_vertices[i];
3227
tX = pLocalX - tVec.x;
3228
tY = pLocalY - tVec.y;
3229
tVec = this.m_normals[i];
3230
var dot = (tVec.x * tX + tVec.y * tY);
3231
if (dot > 0.0) {
3232
return false;
3233
}
3234
}
3235
return true;
3236
}
3237
b2PolygonShape.prototype.RayCast = function (output, input, transform) {
3238
var lower = 0.0;
3239
var upper = input.maxFraction;
3240
var tX = 0;
3241
var tY = 0;
3242
var tMat;
3243
var tVec;
3244
tX = input.p1.x - transform.position.x;
3245
tY = input.p1.y - transform.position.y;
3246
tMat = transform.R;
3247
var p1X = (tX * tMat.col1.x + tY * tMat.col1.y);
3248
var p1Y = (tX * tMat.col2.x + tY * tMat.col2.y);
3249
tX = input.p2.x - transform.position.x;
3250
tY = input.p2.y - transform.position.y;
3251
tMat = transform.R;
3252
var p2X = (tX * tMat.col1.x + tY * tMat.col1.y);
3253
var p2Y = (tX * tMat.col2.x + tY * tMat.col2.y);
3254
var dX = p2X - p1X;
3255
var dY = p2Y - p1Y;
3256
var index = parseInt((-1));
3257
for (var i = 0; i < this.m_vertexCount; ++i) {
3258
tVec = this.m_vertices[i];
3259
tX = tVec.x - p1X;
3260
tY = tVec.y - p1Y;
3261
tVec = this.m_normals[i];
3262
var numerator = (tVec.x * tX + tVec.y * tY);
3263
var denominator = (tVec.x * dX + tVec.y * dY);
3264
if (denominator == 0.0) {
3265
if (numerator < 0.0) {
3266
return false;
3267
}
3268
}
3269
else {
3270
if (denominator < 0.0 && numerator < lower * denominator) {
3271
lower = numerator / denominator;
3272
index = i;
3273
}
3274
else if (denominator > 0.0 && numerator < upper * denominator) {
3275
upper = numerator / denominator;
3276
}
3277
}
3278
if (upper < lower - Number.MIN_VALUE) {
3279
return false;
3280
}
3281
}
3282
if (index >= 0) {
3283
output.fraction = lower;
3284
tMat = transform.R;
3285
tVec = this.m_normals[index];
3286
output.normal.x = (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
3287
output.normal.y = (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
3288
return true;
3289
}
3290
return false;
3291
}
3292
b2PolygonShape.prototype.ComputeAABB = function (aabb, xf) {
3293
var tMat = xf.R;
3294
var tVec = this.m_vertices[0];
3295
var lowerX = xf.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
3296
var lowerY = xf.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
3297
var upperX = lowerX;
3298
var upperY = lowerY;
3299
for (var i = 1; i < this.m_vertexCount; ++i) {
3300
tVec = this.m_vertices[i];
3301
var vX = xf.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
3302
var vY = xf.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
3303
lowerX = lowerX < vX ? lowerX : vX;
3304
lowerY = lowerY < vY ? lowerY : vY;
3305
upperX = upperX > vX ? upperX : vX;
3306
upperY = upperY > vY ? upperY : vY;
3307
}
3308
aabb.lowerBound.x = lowerX - this.m_radius;
3309
aabb.lowerBound.y = lowerY - this.m_radius;
3310
aabb.upperBound.x = upperX + this.m_radius;
3311
aabb.upperBound.y = upperY + this.m_radius;
3312
}
3313
b2PolygonShape.prototype.ComputeMass = function (massData, density) {
3314
if (density === undefined) density = 0;
3315
if (this.m_vertexCount == 2) {
3316
massData.center.x = 0.5 * (this.m_vertices[0].x + this.m_vertices[1].x);
3317
massData.center.y = 0.5 * (this.m_vertices[0].y + this.m_vertices[1].y);
3318
massData.mass = 0.0;
3319
massData.I = 0.0;
3320
return;
3321
}
3322
var centerX = 0.0;
3323
var centerY = 0.0;
3324
var area = 0.0;
3325
var I = 0.0;
3326
var p1X = 0.0;
3327
var p1Y = 0.0;
3328
var k_inv3 = 1.0 / 3.0;
3329
for (var i = 0; i < this.m_vertexCount; ++i) {
3330
var p2 = this.m_vertices[i];
3331
var p3 = i + 1 < this.m_vertexCount ? this.m_vertices[parseInt(i + 1)] : this.m_vertices[0];
3332
var e1X = p2.x - p1X;
3333
var e1Y = p2.y - p1Y;
3334
var e2X = p3.x - p1X;
3335
var e2Y = p3.y - p1Y;
3336
var D = e1X * e2Y - e1Y * e2X;
3337
var triangleArea = 0.5 * D;area += triangleArea;
3338
centerX += triangleArea * k_inv3 * (p1X + p2.x + p3.x);
3339
centerY += triangleArea * k_inv3 * (p1Y + p2.y + p3.y);
3340
var px = p1X;
3341
var py = p1Y;
3342
var ex1 = e1X;
3343
var ey1 = e1Y;
3344
var ex2 = e2X;
3345
var ey2 = e2Y;
3346
var intx2 = k_inv3 * (0.25 * (ex1 * ex1 + ex2 * ex1 + ex2 * ex2) + (px * ex1 + px * ex2)) + 0.5 * px * px;
3347
var inty2 = k_inv3 * (0.25 * (ey1 * ey1 + ey2 * ey1 + ey2 * ey2) + (py * ey1 + py * ey2)) + 0.5 * py * py;I += D * (intx2 + inty2);
3348
}
3349
massData.mass = density * area;
3350
centerX *= 1.0 / area;
3351
centerY *= 1.0 / area;
3352
massData.center.Set(centerX, centerY);
3353
massData.I = density * I;
3354
}
3355
b2PolygonShape.prototype.ComputeSubmergedArea = function (normal, offset, xf, c) {
3356
if (offset === undefined) offset = 0;
3357
var normalL = b2Math.MulTMV(xf.R, normal);
3358
var offsetL = offset - b2Math.Dot(normal, xf.position);
3359
var depths = new Vector_a2j_Number();
3360
var diveCount = 0;
3361
var intoIndex = parseInt((-1));
3362
var outoIndex = parseInt((-1));
3363
var lastSubmerged = false;
3364
var i = 0;
3365
for (i = 0;
3366
i < this.m_vertexCount; ++i) {
3367
depths[i] = b2Math.Dot(normalL, this.m_vertices[i]) - offsetL;
3368
var isSubmerged = depths[i] < (-Number.MIN_VALUE);
3369
if (i > 0) {
3370
if (isSubmerged) {
3371
if (!lastSubmerged) {
3372
intoIndex = i - 1;
3373
diveCount++;
3374
}
3375
}
3376
else {
3377
if (lastSubmerged) {
3378
outoIndex = i - 1;
3379
diveCount++;
3380
}
3381
}
3382
}
3383
lastSubmerged = isSubmerged;
3384
}
3385
switch (diveCount) {
3386
case 0:
3387
if (lastSubmerged) {
3388
var md = new b2MassData();
3389
this.ComputeMass(md, 1);
3390
c.SetV(b2Math.MulX(xf, md.center));
3391
return md.mass;
3392
}
3393
else {
3394
return 0;
3395
}
3396
break;
3397
case 1:
3398
if (intoIndex == (-1)) {
3399
intoIndex = this.m_vertexCount - 1;
3400
}
3401
else {
3402
outoIndex = this.m_vertexCount - 1;
3403
}
3404
break;
3405
}
3406
var intoIndex2 = parseInt((intoIndex + 1) % this.m_vertexCount);
3407
var outoIndex2 = parseInt((outoIndex + 1) % this.m_vertexCount);
3408
var intoLamdda = (0 - depths[intoIndex]) / (depths[intoIndex2] - depths[intoIndex]);
3409
var outoLamdda = (0 - depths[outoIndex]) / (depths[outoIndex2] - depths[outoIndex]);
3410
var intoVec = new b2Vec2(this.m_vertices[intoIndex].x * (1 - intoLamdda) + this.m_vertices[intoIndex2].x * intoLamdda, this.m_vertices[intoIndex].y * (1 - intoLamdda) + this.m_vertices[intoIndex2].y * intoLamdda);
3411
var outoVec = new b2Vec2(this.m_vertices[outoIndex].x * (1 - outoLamdda) + this.m_vertices[outoIndex2].x * outoLamdda, this.m_vertices[outoIndex].y * (1 - outoLamdda) + this.m_vertices[outoIndex2].y * outoLamdda);
3412
var area = 0;
3413
var center = new b2Vec2();
3414
var p2 = this.m_vertices[intoIndex2];
3415
var p3;
3416
i = intoIndex2;
3417
while (i != outoIndex2) {
3418
i = (i + 1) % this.m_vertexCount;
3419
if (i == outoIndex2) p3 = outoVec;
3420
else p3 = this.m_vertices[i];
3421
var triangleArea = 0.5 * ((p2.x - intoVec.x) * (p3.y - intoVec.y) - (p2.y - intoVec.y) * (p3.x - intoVec.x));
3422
area += triangleArea;
3423
center.x += triangleArea * (intoVec.x + p2.x + p3.x) / 3;
3424
center.y += triangleArea * (intoVec.y + p2.y + p3.y) / 3;
3425
p2 = p3;
3426
}
3427
center.Multiply(1 / area);
3428
c.SetV(b2Math.MulX(xf, center));
3429
return area;
3430
}
3431
b2PolygonShape.prototype.GetVertexCount = function () {
3432
return this.m_vertexCount;
3433
}
3434
b2PolygonShape.prototype.GetVertices = function () {
3435
return this.m_vertices;
3436
}
3437
b2PolygonShape.prototype.GetNormals = function () {
3438
return this.m_normals;
3439
}
3440
b2PolygonShape.prototype.GetSupport = function (d) {
3441
var bestIndex = 0;
3442
var bestValue = this.m_vertices[0].x * d.x + this.m_vertices[0].y * d.y;
3443
for (var i = 1; i < this.m_vertexCount; ++i) {
3444
var value = this.m_vertices[i].x * d.x + this.m_vertices[i].y * d.y;
3445
if (value > bestValue) {
3446
bestIndex = i;
3447
bestValue = value;
3448
}
3449
}
3450
return bestIndex;
3451
}
3452
b2PolygonShape.prototype.GetSupportVertex = function (d) {
3453
var bestIndex = 0;
3454
var bestValue = this.m_vertices[0].x * d.x + this.m_vertices[0].y * d.y;
3455
for (var i = 1; i < this.m_vertexCount; ++i) {
3456
var value = this.m_vertices[i].x * d.x + this.m_vertices[i].y * d.y;
3457
if (value > bestValue) {
3458
bestIndex = i;
3459
bestValue = value;
3460
}
3461
}
3462
return this.m_vertices[bestIndex];
3463
}
3464
b2PolygonShape.prototype.Validate = function () {
3465
return false;
3466
}
3467
b2PolygonShape.prototype.b2PolygonShape = function () {
3468
this.__super.b2Shape.call(this);
3469
this.m_type = b2Shape.e_polygonShape;
3470
this.m_centroid = new b2Vec2();
3471
this.m_vertices = new Vector();
3472
this.m_normals = new Vector();
3473
}
3474
b2PolygonShape.prototype.Reserve = function (count) {
3475
if (count === undefined) count = 0;
3476
for (var i = parseInt(this.m_vertices.length); i < count; i++) {
3477
this.m_vertices[i] = new b2Vec2();
3478
this.m_normals[i] = new b2Vec2();
3479
}
3480
}
3481
b2PolygonShape.ComputeCentroid = function (vs, count) {
3482
if (count === undefined) count = 0;
3483
var c = new b2Vec2();
3484
var area = 0.0;
3485
var p1X = 0.0;
3486
var p1Y = 0.0;
3487
var inv3 = 1.0 / 3.0;
3488
for (var i = 0; i < count; ++i) {
3489
var p2 = vs[i];
3490
var p3 = i + 1 < count ? vs[parseInt(i + 1)] : vs[0];
3491
var e1X = p2.x - p1X;
3492
var e1Y = p2.y - p1Y;
3493
var e2X = p3.x - p1X;
3494
var e2Y = p3.y - p1Y;
3495
var D = (e1X * e2Y - e1Y * e2X);
3496
var triangleArea = 0.5 * D;area += triangleArea;
3497
c.x += triangleArea * inv3 * (p1X + p2.x + p3.x);
3498
c.y += triangleArea * inv3 * (p1Y + p2.y + p3.y);
3499
}
3500
c.x *= 1.0 / area;
3501
c.y *= 1.0 / area;
3502
return c;
3503
}
3504
b2PolygonShape.ComputeOBB = function (obb, vs, count) {
3505
if (count === undefined) count = 0;
3506
var i = 0;
3507
var p = new Vector(count + 1);
3508
for (i = 0;
3509
i < count; ++i) {
3510
p[i] = vs[i];
3511
}
3512
p[count] = p[0];
3513
var minArea = Number.MAX_VALUE;
3514
for (i = 1;
3515
i <= count; ++i) {
3516
var root = p[parseInt(i - 1)];
3517
var uxX = p[i].x - root.x;
3518
var uxY = p[i].y - root.y;
3519
var length = Math.sqrt(uxX * uxX + uxY * uxY);
3520
uxX /= length;
3521
uxY /= length;
3522
var uyX = (-uxY);
3523
var uyY = uxX;
3524
var lowerX = Number.MAX_VALUE;
3525
var lowerY = Number.MAX_VALUE;
3526
var upperX = (-Number.MAX_VALUE);
3527
var upperY = (-Number.MAX_VALUE);
3528
for (var j = 0; j < count; ++j) {
3529
var dX = p[j].x - root.x;
3530
var dY = p[j].y - root.y;
3531
var rX = (uxX * dX + uxY * dY);
3532
var rY = (uyX * dX + uyY * dY);
3533
if (rX < lowerX) lowerX = rX;
3534
if (rY < lowerY) lowerY = rY;
3535
if (rX > upperX) upperX = rX;
3536
if (rY > upperY) upperY = rY;
3537
}
3538
var area = (upperX - lowerX) * (upperY - lowerY);
3539
if (area < 0.95 * minArea) {
3540
minArea = area;
3541
obb.R.col1.x = uxX;
3542
obb.R.col1.y = uxY;
3543
obb.R.col2.x = uyX;
3544
obb.R.col2.y = uyY;
3545
var centerX = 0.5 * (lowerX + upperX);
3546
var centerY = 0.5 * (lowerY + upperY);
3547
var tMat = obb.R;
3548
obb.center.x = root.x + (tMat.col1.x * centerX + tMat.col2.x * centerY);
3549
obb.center.y = root.y + (tMat.col1.y * centerX + tMat.col2.y * centerY);
3550
obb.extents.x = 0.5 * (upperX - lowerX);
3551
obb.extents.y = 0.5 * (upperY - lowerY);
3552
}
3553
}
3554
}
3555
Box2D.postDefs.push(function () {
3556
Box2D.Collision.Shapes.b2PolygonShape.s_mat = new b2Mat22();
3557
});
3558
b2Shape.b2Shape = function () {};
3559
b2Shape.prototype.Copy = function () {
3560
return null;
3561
}
3562
b2Shape.prototype.Set = function (other) {
3563
this.m_radius = other.m_radius;
3564
}
3565
b2Shape.prototype.GetType = function () {
3566
return this.m_type;
3567
}
3568
b2Shape.prototype.TestPoint = function (xf, p) {
3569
return false;
3570
}
3571
b2Shape.prototype.RayCast = function (output, input, transform) {
3572
return false;
3573
}
3574
b2Shape.prototype.ComputeAABB = function (aabb, xf) {}
3575
b2Shape.prototype.ComputeMass = function (massData, density) {
3576
if (density === undefined) density = 0;
3577
}
3578
b2Shape.prototype.ComputeSubmergedArea = function (normal, offset, xf, c) {
3579
if (offset === undefined) offset = 0;
3580
return 0;
3581
}
3582
b2Shape.TestOverlap = function (shape1, transform1, shape2, transform2) {
3583
var input = new b2DistanceInput();
3584
input.proxyA = new b2DistanceProxy();
3585
input.proxyA.Set(shape1);
3586
input.proxyB = new b2DistanceProxy();
3587
input.proxyB.Set(shape2);
3588
input.transformA = transform1;
3589
input.transformB = transform2;
3590
input.useRadii = true;
3591
var simplexCache = new b2SimplexCache();
3592
simplexCache.count = 0;
3593
var output = new b2DistanceOutput();
3594
b2Distance.Distance(output, simplexCache, input);
3595
return output.distance < 10.0 * Number.MIN_VALUE;
3596
}
3597
b2Shape.prototype.b2Shape = function () {
3598
this.m_type = b2Shape.e_unknownShape;
3599
this.m_radius = b2Settings.b2_linearSlop;
3600
}
3601
Box2D.postDefs.push(function () {
3602
Box2D.Collision.Shapes.b2Shape.e_unknownShape = parseInt((-1));
3603
Box2D.Collision.Shapes.b2Shape.e_circleShape = 0;
3604
Box2D.Collision.Shapes.b2Shape.e_polygonShape = 1;
3605
Box2D.Collision.Shapes.b2Shape.e_edgeShape = 2;
3606
Box2D.Collision.Shapes.b2Shape.e_shapeTypeCount = 3;
3607
Box2D.Collision.Shapes.b2Shape.e_hitCollide = 1;
3608
Box2D.Collision.Shapes.b2Shape.e_missCollide = 0;
3609
Box2D.Collision.Shapes.b2Shape.e_startsInsideCollide = parseInt((-1));
3610
});
3611
})();
3612
(function () {
3613
var b2Color = Box2D.Common.b2Color,
3614
b2internal = Box2D.Common.b2internal,
3615
b2Settings = Box2D.Common.b2Settings,
3616
b2Mat22 = Box2D.Common.Math.b2Mat22,
3617
b2Mat33 = Box2D.Common.Math.b2Mat33,
3618
b2Math = Box2D.Common.Math.b2Math,
3619
b2Sweep = Box2D.Common.Math.b2Sweep,
3620
b2Transform = Box2D.Common.Math.b2Transform,
3621
b2Vec2 = Box2D.Common.Math.b2Vec2,
3622
b2Vec3 = Box2D.Common.Math.b2Vec3;
3623
3624
b2Color.b2Color = function () {
3625
this._r = 0;
3626
this._g = 0;
3627
this._b = 0;
3628
};
3629
b2Color.prototype.b2Color = function (rr, gg, bb) {
3630
if (rr === undefined) rr = 0;
3631
if (gg === undefined) gg = 0;
3632
if (bb === undefined) bb = 0;
3633
this._r = Box2D.parseUInt(255 * b2Math.Clamp(rr, 0.0, 1.0));
3634
this._g = Box2D.parseUInt(255 * b2Math.Clamp(gg, 0.0, 1.0));
3635
this._b = Box2D.parseUInt(255 * b2Math.Clamp(bb, 0.0, 1.0));
3636
}
3637
b2Color.prototype.Set = function (rr, gg, bb) {
3638
if (rr === undefined) rr = 0;
3639
if (gg === undefined) gg = 0;
3640
if (bb === undefined) bb = 0;
3641
this._r = Box2D.parseUInt(255 * b2Math.Clamp(rr, 0.0, 1.0));
3642
this._g = Box2D.parseUInt(255 * b2Math.Clamp(gg, 0.0, 1.0));
3643
this._b = Box2D.parseUInt(255 * b2Math.Clamp(bb, 0.0, 1.0));
3644
}
3645
Object.defineProperty(b2Color.prototype, 'r', {
3646
enumerable: false,
3647
configurable: true,
3648
set: function (rr) {
3649
if (rr === undefined) rr = 0;
3650
this._r = Box2D.parseUInt(255 * b2Math.Clamp(rr, 0.0, 1.0));
3651
}
3652
});
3653
Object.defineProperty(b2Color.prototype, 'g', {
3654
enumerable: false,
3655
configurable: true,
3656
set: function (gg) {
3657
if (gg === undefined) gg = 0;
3658
this._g = Box2D.parseUInt(255 * b2Math.Clamp(gg, 0.0, 1.0));
3659
}
3660
});
3661
Object.defineProperty(b2Color.prototype, 'b', {
3662
enumerable: false,
3663
configurable: true,
3664
set: function (bb) {
3665
if (bb === undefined) bb = 0;
3666
this._b = Box2D.parseUInt(255 * b2Math.Clamp(bb, 0.0, 1.0));
3667
}
3668
});
3669
Object.defineProperty(b2Color.prototype, 'color', {
3670
enumerable: false,
3671
configurable: true,
3672
get: function () {
3673
return (this._r << 16) | (this._g << 8) | (this._b);
3674
}
3675
});
3676
b2Settings.b2Settings = function () {};
3677
b2Settings.b2MixFriction = function (friction1, friction2) {
3678
if (friction1 === undefined) friction1 = 0;
3679
if (friction2 === undefined) friction2 = 0;
3680
return Math.sqrt(friction1 * friction2);
3681
}
3682
b2Settings.b2MixRestitution = function (restitution1, restitution2) {
3683
if (restitution1 === undefined) restitution1 = 0;
3684
if (restitution2 === undefined) restitution2 = 0;
3685
return restitution1 > restitution2 ? restitution1 : restitution2;
3686
}
3687
b2Settings.b2Assert = function (a) {
3688
if (!a) {
3689
throw "Assertion Failed";
3690
}
3691
}
3692
Box2D.postDefs.push(function () {
3693
Box2D.Common.b2Settings.VERSION = "2.1alpha";
3694
Box2D.Common.b2Settings.USHRT_MAX = 0x0000ffff;
3695
Box2D.Common.b2Settings.b2_pi = Math.PI;
3696
Box2D.Common.b2Settings.b2_maxManifoldPoints = 2;
3697
Box2D.Common.b2Settings.b2_aabbExtension = 0.1;
3698
Box2D.Common.b2Settings.b2_aabbMultiplier = 2.0;
3699
Box2D.Common.b2Settings.b2_polygonRadius = 2.0 * b2Settings.b2_linearSlop;
3700
Box2D.Common.b2Settings.b2_linearSlop = 0.005;
3701
Box2D.Common.b2Settings.b2_angularSlop = 2.0 / 180.0 * b2Settings.b2_pi;
3702
Box2D.Common.b2Settings.b2_toiSlop = 8.0 * b2Settings.b2_linearSlop;
3703
Box2D.Common.b2Settings.b2_maxTOIContactsPerIsland = 32;
3704
Box2D.Common.b2Settings.b2_maxTOIJointsPerIsland = 32;
3705
Box2D.Common.b2Settings.b2_velocityThreshold = 1.0;
3706
Box2D.Common.b2Settings.b2_maxLinearCorrection = 0.2;
3707
Box2D.Common.b2Settings.b2_maxAngularCorrection = 8.0 / 180.0 * b2Settings.b2_pi;
3708
Box2D.Common.b2Settings.b2_maxTranslation = 2.0;
3709
Box2D.Common.b2Settings.b2_maxTranslationSquared = b2Settings.b2_maxTranslation * b2Settings.b2_maxTranslation;
3710
Box2D.Common.b2Settings.b2_maxRotation = 0.5 * b2Settings.b2_pi;
3711
Box2D.Common.b2Settings.b2_maxRotationSquared = b2Settings.b2_maxRotation * b2Settings.b2_maxRotation;
3712
Box2D.Common.b2Settings.b2_contactBaumgarte = 0.2;
3713
Box2D.Common.b2Settings.b2_timeToSleep = 0.5;
3714
Box2D.Common.b2Settings.b2_linearSleepTolerance = 0.01;
3715
Box2D.Common.b2Settings.b2_angularSleepTolerance = 2.0 / 180.0 * b2Settings.b2_pi;
3716
});
3717
})();
3718
(function () {
3719
var b2AABB = Box2D.Collision.b2AABB,
3720
b2Color = Box2D.Common.b2Color,
3721
b2internal = Box2D.Common.b2internal,
3722
b2Settings = Box2D.Common.b2Settings,
3723
b2Mat22 = Box2D.Common.Math.b2Mat22,
3724
b2Mat33 = Box2D.Common.Math.b2Mat33,
3725
b2Math = Box2D.Common.Math.b2Math,
3726
b2Sweep = Box2D.Common.Math.b2Sweep,
3727
b2Transform = Box2D.Common.Math.b2Transform,
3728
b2Vec2 = Box2D.Common.Math.b2Vec2,
3729
b2Vec3 = Box2D.Common.Math.b2Vec3;
3730
3731
b2Mat22.b2Mat22 = function () {
3732
this.col1 = new b2Vec2();
3733
this.col2 = new b2Vec2();
3734
};
3735
b2Mat22.prototype.b2Mat22 = function () {
3736
this.SetIdentity();
3737
}
3738
b2Mat22.FromAngle = function (angle) {
3739
if (angle === undefined) angle = 0;
3740
var mat = new b2Mat22();
3741
mat.Set(angle);
3742
return mat;
3743
}
3744
b2Mat22.FromVV = function (c1, c2) {
3745
var mat = new b2Mat22();
3746
mat.SetVV(c1, c2);
3747
return mat;
3748
}
3749
b2Mat22.prototype.Set = function (angle) {
3750
if (angle === undefined) angle = 0;
3751
var c = Math.cos(angle);
3752
var s = Math.sin(angle);
3753
this.col1.x = c;
3754
this.col2.x = (-s);
3755
this.col1.y = s;
3756
this.col2.y = c;
3757
}
3758
b2Mat22.prototype.SetVV = function (c1, c2) {
3759
this.col1.SetV(c1);
3760
this.col2.SetV(c2);
3761
}
3762
b2Mat22.prototype.Copy = function () {
3763
var mat = new b2Mat22();
3764
mat.SetM(this);
3765
return mat;
3766
}
3767
b2Mat22.prototype.SetM = function (m) {
3768
this.col1.SetV(m.col1);
3769
this.col2.SetV(m.col2);
3770
}
3771
b2Mat22.prototype.AddM = function (m) {
3772
this.col1.x += m.col1.x;
3773
this.col1.y += m.col1.y;
3774
this.col2.x += m.col2.x;
3775
this.col2.y += m.col2.y;
3776
}
3777
b2Mat22.prototype.SetIdentity = function () {
3778
this.col1.x = 1.0;
3779
this.col2.x = 0.0;
3780
this.col1.y = 0.0;
3781
this.col2.y = 1.0;
3782
}
3783
b2Mat22.prototype.SetZero = function () {
3784
this.col1.x = 0.0;
3785
this.col2.x = 0.0;
3786
this.col1.y = 0.0;
3787
this.col2.y = 0.0;
3788
}
3789
b2Mat22.prototype.GetAngle = function () {
3790
return Math.atan2(this.col1.y, this.col1.x);
3791
}
3792
b2Mat22.prototype.GetInverse = function (out) {
3793
var a = this.col1.x;
3794
var b = this.col2.x;
3795
var c = this.col1.y;
3796
var d = this.col2.y;
3797
var det = a * d - b * c;
3798
if (det != 0.0) {
3799
det = 1.0 / det;
3800
}
3801
out.col1.x = det * d;
3802
out.col2.x = (-det * b);
3803
out.col1.y = (-det * c);
3804
out.col2.y = det * a;
3805
return out;
3806
}
3807
b2Mat22.prototype.Solve = function (out, bX, bY) {
3808
if (bX === undefined) bX = 0;
3809
if (bY === undefined) bY = 0;
3810
var a11 = this.col1.x;
3811
var a12 = this.col2.x;
3812
var a21 = this.col1.y;
3813
var a22 = this.col2.y;
3814
var det = a11 * a22 - a12 * a21;
3815
if (det != 0.0) {
3816
det = 1.0 / det;
3817
}
3818
out.x = det * (a22 * bX - a12 * bY);
3819
out.y = det * (a11 * bY - a21 * bX);
3820
return out;
3821
}
3822
b2Mat22.prototype.Abs = function () {
3823
this.col1.Abs();
3824
this.col2.Abs();
3825
}
3826
b2Mat33.b2Mat33 = function () {
3827
this.col1 = new b2Vec3();
3828
this.col2 = new b2Vec3();
3829
this.col3 = new b2Vec3();
3830
};
3831
b2Mat33.prototype.b2Mat33 = function (c1, c2, c3) {
3832
if (c1 === undefined) c1 = null;
3833
if (c2 === undefined) c2 = null;
3834
if (c3 === undefined) c3 = null;
3835
if (!c1 && !c2 && !c3) {
3836
this.col1.SetZero();
3837
this.col2.SetZero();
3838
this.col3.SetZero();
3839
}
3840
else {
3841
this.col1.SetV(c1);
3842
this.col2.SetV(c2);
3843
this.col3.SetV(c3);
3844
}
3845
}
3846
b2Mat33.prototype.SetVVV = function (c1, c2, c3) {
3847
this.col1.SetV(c1);
3848
this.col2.SetV(c2);
3849
this.col3.SetV(c3);
3850
}
3851
b2Mat33.prototype.Copy = function () {
3852
return new b2Mat33(this.col1, this.col2, this.col3);
3853
}
3854
b2Mat33.prototype.SetM = function (m) {
3855
this.col1.SetV(m.col1);
3856
this.col2.SetV(m.col2);
3857
this.col3.SetV(m.col3);
3858
}
3859
b2Mat33.prototype.AddM = function (m) {
3860
this.col1.x += m.col1.x;
3861
this.col1.y += m.col1.y;
3862
this.col1.z += m.col1.z;
3863
this.col2.x += m.col2.x;
3864
this.col2.y += m.col2.y;
3865
this.col2.z += m.col2.z;
3866
this.col3.x += m.col3.x;
3867
this.col3.y += m.col3.y;
3868
this.col3.z += m.col3.z;
3869
}
3870
b2Mat33.prototype.SetIdentity = function () {
3871
this.col1.x = 1.0;
3872
this.col2.x = 0.0;
3873
this.col3.x = 0.0;
3874
this.col1.y = 0.0;
3875
this.col2.y = 1.0;
3876
this.col3.y = 0.0;
3877
this.col1.z = 0.0;
3878
this.col2.z = 0.0;
3879
this.col3.z = 1.0;
3880
}
3881
b2Mat33.prototype.SetZero = function () {
3882
this.col1.x = 0.0;
3883
this.col2.x = 0.0;
3884
this.col3.x = 0.0;
3885
this.col1.y = 0.0;
3886
this.col2.y = 0.0;
3887
this.col3.y = 0.0;
3888
this.col1.z = 0.0;
3889
this.col2.z = 0.0;
3890
this.col3.z = 0.0;
3891
}
3892
b2Mat33.prototype.Solve22 = function (out, bX, bY) {
3893
if (bX === undefined) bX = 0;
3894
if (bY === undefined) bY = 0;
3895
var a11 = this.col1.x;
3896
var a12 = this.col2.x;
3897
var a21 = this.col1.y;
3898
var a22 = this.col2.y;
3899
var det = a11 * a22 - a12 * a21;
3900
if (det != 0.0) {
3901
det = 1.0 / det;
3902
}
3903
out.x = det * (a22 * bX - a12 * bY);
3904
out.y = det * (a11 * bY - a21 * bX);
3905
return out;
3906
}
3907
b2Mat33.prototype.Solve33 = function (out, bX, bY, bZ) {
3908
if (bX === undefined) bX = 0;
3909
if (bY === undefined) bY = 0;
3910
if (bZ === undefined) bZ = 0;
3911
var a11 = this.col1.x;
3912
var a21 = this.col1.y;
3913
var a31 = this.col1.z;
3914
var a12 = this.col2.x;
3915
var a22 = this.col2.y;
3916
var a32 = this.col2.z;
3917
var a13 = this.col3.x;
3918
var a23 = this.col3.y;
3919
var a33 = this.col3.z;
3920
var det = a11 * (a22 * a33 - a32 * a23) + a21 * (a32 * a13 - a12 * a33) + a31 * (a12 * a23 - a22 * a13);
3921
if (det != 0.0) {
3922
det = 1.0 / det;
3923
}
3924
out.x = det * (bX * (a22 * a33 - a32 * a23) + bY * (a32 * a13 - a12 * a33) + bZ * (a12 * a23 - a22 * a13));
3925
out.y = det * (a11 * (bY * a33 - bZ * a23) + a21 * (bZ * a13 - bX * a33) + a31 * (bX * a23 - bY * a13));
3926
out.z = det * (a11 * (a22 * bZ - a32 * bY) + a21 * (a32 * bX - a12 * bZ) + a31 * (a12 * bY - a22 * bX));
3927
return out;
3928
}
3929
b2Math.b2Math = function () {};
3930
b2Math.IsValid = function (x) {
3931
if (x === undefined) x = 0;
3932
return isFinite(x);
3933
}
3934
b2Math.Dot = function (a, b) {
3935
return a.x * b.x + a.y * b.y;
3936
}
3937
b2Math.CrossVV = function (a, b) {
3938
return a.x * b.y - a.y * b.x;
3939
}
3940
b2Math.CrossVF = function (a, s) {
3941
if (s === undefined) s = 0;
3942
var v = new b2Vec2(s * a.y, (-s * a.x));
3943
return v;
3944
}
3945
b2Math.CrossFV = function (s, a) {
3946
if (s === undefined) s = 0;
3947
var v = new b2Vec2((-s * a.y), s * a.x);
3948
return v;
3949
}
3950
b2Math.MulMV = function (A, v) {
3951
var u = new b2Vec2(A.col1.x * v.x + A.col2.x * v.y, A.col1.y * v.x + A.col2.y * v.y);
3952
return u;
3953
}
3954
b2Math.MulTMV = function (A, v) {
3955
var u = new b2Vec2(b2Math.Dot(v, A.col1), b2Math.Dot(v, A.col2));
3956
return u;
3957
}
3958
b2Math.MulX = function (T, v) {
3959
var a = b2Math.MulMV(T.R, v);
3960
a.x += T.position.x;
3961
a.y += T.position.y;
3962
return a;
3963
}
3964
b2Math.MulXT = function (T, v) {
3965
var a = b2Math.SubtractVV(v, T.position);
3966
var tX = (a.x * T.R.col1.x + a.y * T.R.col1.y);
3967
a.y = (a.x * T.R.col2.x + a.y * T.R.col2.y);
3968
a.x = tX;
3969
return a;
3970
}
3971
b2Math.AddVV = function (a, b) {
3972
var v = new b2Vec2(a.x + b.x, a.y + b.y);
3973
return v;
3974
}
3975
b2Math.SubtractVV = function (a, b) {
3976
var v = new b2Vec2(a.x - b.x, a.y - b.y);
3977
return v;
3978
}
3979
b2Math.Distance = function (a, b) {
3980
var cX = a.x - b.x;
3981
var cY = a.y - b.y;
3982
return Math.sqrt(cX * cX + cY * cY);
3983
}
3984
b2Math.DistanceSquared = function (a, b) {
3985
var cX = a.x - b.x;
3986
var cY = a.y - b.y;
3987
return (cX * cX + cY * cY);
3988
}
3989
b2Math.MulFV = function (s, a) {
3990
if (s === undefined) s = 0;
3991
var v = new b2Vec2(s * a.x, s * a.y);
3992
return v;
3993
}
3994
b2Math.AddMM = function (A, B) {
3995
var C = b2Mat22.FromVV(b2Math.AddVV(A.col1, B.col1), b2Math.AddVV(A.col2, B.col2));
3996
return C;
3997
}
3998
b2Math.MulMM = function (A, B) {
3999
var C = b2Mat22.FromVV(b2Math.MulMV(A, B.col1), b2Math.MulMV(A, B.col2));
4000
return C;
4001
}
4002
b2Math.MulTMM = function (A, B) {
4003
var c1 = new b2Vec2(b2Math.Dot(A.col1, B.col1), b2Math.Dot(A.col2, B.col1));
4004
var c2 = new b2Vec2(b2Math.Dot(A.col1, B.col2), b2Math.Dot(A.col2, B.col2));
4005
var C = b2Mat22.FromVV(c1, c2);
4006
return C;
4007
}
4008
b2Math.Abs = function (a) {
4009
if (a === undefined) a = 0;
4010
return a > 0.0 ? a : (-a);
4011
}
4012
b2Math.AbsV = function (a) {
4013
var b = new b2Vec2(b2Math.Abs(a.x), b2Math.Abs(a.y));
4014
return b;
4015
}
4016
b2Math.AbsM = function (A) {
4017
var B = b2Mat22.FromVV(b2Math.AbsV(A.col1), b2Math.AbsV(A.col2));
4018
return B;
4019
}
4020
b2Math.Min = function (a, b) {
4021
if (a === undefined) a = 0;
4022
if (b === undefined) b = 0;
4023
return a < b ? a : b;
4024
}
4025
b2Math.MinV = function (a, b) {
4026
var c = new b2Vec2(b2Math.Min(a.x, b.x), b2Math.Min(a.y, b.y));
4027
return c;
4028
}
4029
b2Math.Max = function (a, b) {
4030
if (a === undefined) a = 0;
4031
if (b === undefined) b = 0;
4032
return a > b ? a : b;
4033
}
4034
b2Math.MaxV = function (a, b) {
4035
var c = new b2Vec2(b2Math.Max(a.x, b.x), b2Math.Max(a.y, b.y));
4036
return c;
4037
}
4038
b2Math.Clamp = function (a, low, high) {
4039
if (a === undefined) a = 0;
4040
if (low === undefined) low = 0;
4041
if (high === undefined) high = 0;
4042
return a < low ? low : a > high ? high : a;
4043
}
4044
b2Math.ClampV = function (a, low, high) {
4045
return b2Math.MaxV(low, b2Math.MinV(a, high));
4046
}
4047
b2Math.Swap = function (a, b) {
4048
var tmp = a[0];
4049
a[0] = b[0];
4050
b[0] = tmp;
4051
}
4052
b2Math.Random = function () {
4053
return Math.random() * 2 - 1;
4054
}
4055
b2Math.RandomRange = function (lo, hi) {
4056
if (lo === undefined) lo = 0;
4057
if (hi === undefined) hi = 0;
4058
var r = Math.random();
4059
r = (hi - lo) * r + lo;
4060
return r;
4061
}
4062
b2Math.NextPowerOfTwo = function (x) {
4063
if (x === undefined) x = 0;
4064
x |= (x >> 1) & 0x7FFFFFFF;
4065
x |= (x >> 2) & 0x3FFFFFFF;
4066
x |= (x >> 4) & 0x0FFFFFFF;
4067
x |= (x >> 8) & 0x00FFFFFF;
4068
x |= (x >> 16) & 0x0000FFFF;
4069
return x + 1;
4070
}
4071
b2Math.IsPowerOfTwo = function (x) {
4072
if (x === undefined) x = 0;
4073
var result = x > 0 && (x & (x - 1)) == 0;
4074
return result;
4075
}
4076
Box2D.postDefs.push(function () {
4077
Box2D.Common.Math.b2Math.b2Vec2_zero = new b2Vec2(0.0, 0.0);
4078
Box2D.Common.Math.b2Math.b2Mat22_identity = b2Mat22.FromVV(new b2Vec2(1.0, 0.0), new b2Vec2(0.0, 1.0));
4079
Box2D.Common.Math.b2Math.b2Transform_identity = new b2Transform(b2Math.b2Vec2_zero, b2Math.b2Mat22_identity);
4080
});
4081
b2Sweep.b2Sweep = function () {
4082
this.localCenter = new b2Vec2();
4083
this.c0 = new b2Vec2;
4084
this.c = new b2Vec2();
4085
};
4086
b2Sweep.prototype.Set = function (other) {
4087
this.localCenter.SetV(other.localCenter);
4088
this.c0.SetV(other.c0);
4089
this.c.SetV(other.c);
4090
this.a0 = other.a0;
4091
this.a = other.a;
4092
this.t0 = other.t0;
4093
}
4094
b2Sweep.prototype.Copy = function () {
4095
var copy = new b2Sweep();
4096
copy.localCenter.SetV(this.localCenter);
4097
copy.c0.SetV(this.c0);
4098
copy.c.SetV(this.c);
4099
copy.a0 = this.a0;
4100
copy.a = this.a;
4101
copy.t0 = this.t0;
4102
return copy;
4103
}
4104
b2Sweep.prototype.GetTransform = function (xf, alpha) {
4105
if (alpha === undefined) alpha = 0;
4106
xf.position.x = (1.0 - alpha) * this.c0.x + alpha * this.c.x;
4107
xf.position.y = (1.0 - alpha) * this.c0.y + alpha * this.c.y;
4108
var angle = (1.0 - alpha) * this.a0 + alpha * this.a;
4109
xf.R.Set(angle);
4110
var tMat = xf.R;
4111
xf.position.x -= (tMat.col1.x * this.localCenter.x + tMat.col2.x * this.localCenter.y);
4112
xf.position.y -= (tMat.col1.y * this.localCenter.x + tMat.col2.y * this.localCenter.y);
4113
}
4114
b2Sweep.prototype.Advance = function (t) {
4115
if (t === undefined) t = 0;
4116
if (this.t0 < t && 1.0 - this.t0 > Number.MIN_VALUE) {
4117
var alpha = (t - this.t0) / (1.0 - this.t0);
4118
this.c0.x = (1.0 - alpha) * this.c0.x + alpha * this.c.x;
4119
this.c0.y = (1.0 - alpha) * this.c0.y + alpha * this.c.y;
4120
this.a0 = (1.0 - alpha) * this.a0 + alpha * this.a;
4121
this.t0 = t;
4122
}
4123
}
4124
b2Transform.b2Transform = function () {
4125
this.position = new b2Vec2;
4126
this.R = new b2Mat22();
4127
};
4128
b2Transform.prototype.b2Transform = function (pos, r) {
4129
if (pos === undefined) pos = null;
4130
if (r === undefined) r = null;
4131
if (pos) {
4132
this.position.SetV(pos);
4133
this.R.SetM(r);
4134
}
4135
}
4136
b2Transform.prototype.Initialize = function (pos, r) {
4137
this.position.SetV(pos);
4138
this.R.SetM(r);
4139
}
4140
b2Transform.prototype.SetIdentity = function () {
4141
this.position.SetZero();
4142
this.R.SetIdentity();
4143
}
4144
b2Transform.prototype.Set = function (x) {
4145
this.position.SetV(x.position);
4146
this.R.SetM(x.R);
4147
}
4148
b2Transform.prototype.GetAngle = function () {
4149
return Math.atan2(this.R.col1.y, this.R.col1.x);
4150
}
4151
b2Vec2.b2Vec2 = function () {};
4152
b2Vec2.prototype.b2Vec2 = function (x_, y_) {
4153
if (x_ === undefined) x_ = 0;
4154
if (y_ === undefined) y_ = 0;
4155
this.x = x_;
4156
this.y = y_;
4157
}
4158
b2Vec2.prototype.SetZero = function () {
4159
this.x = 0.0;
4160
this.y = 0.0;
4161
}
4162
b2Vec2.prototype.Set = function (x_, y_) {
4163
if (x_ === undefined) x_ = 0;
4164
if (y_ === undefined) y_ = 0;
4165
this.x = x_;
4166
this.y = y_;
4167
}
4168
b2Vec2.prototype.SetV = function (v) {
4169
this.x = v.x;
4170
this.y = v.y;
4171
}
4172
b2Vec2.prototype.GetNegative = function () {
4173
return new b2Vec2((-this.x), (-this.y));
4174
}
4175
b2Vec2.prototype.NegativeSelf = function () {
4176
this.x = (-this.x);
4177
this.y = (-this.y);
4178
}
4179
b2Vec2.Make = function (x_, y_) {
4180
if (x_ === undefined) x_ = 0;
4181
if (y_ === undefined) y_ = 0;
4182
return new b2Vec2(x_, y_);
4183
}
4184
b2Vec2.prototype.Copy = function () {
4185
return new b2Vec2(this.x, this.y);
4186
}
4187
b2Vec2.prototype.Add = function (v) {
4188
this.x += v.x;
4189
this.y += v.y;
4190
}
4191
b2Vec2.prototype.Subtract = function (v) {
4192
this.x -= v.x;
4193
this.y -= v.y;
4194
}
4195
b2Vec2.prototype.Multiply = function (a) {
4196
if (a === undefined) a = 0;
4197
this.x *= a;
4198
this.y *= a;
4199
}
4200
b2Vec2.prototype.MulM = function (A) {
4201
var tX = this.x;
4202
this.x = A.col1.x * tX + A.col2.x * this.y;
4203
this.y = A.col1.y * tX + A.col2.y * this.y;
4204
}
4205
b2Vec2.prototype.MulTM = function (A) {
4206
var tX = b2Math.Dot(this, A.col1);
4207
this.y = b2Math.Dot(this, A.col2);
4208
this.x = tX;
4209
}
4210
b2Vec2.prototype.CrossVF = function (s) {
4211
if (s === undefined) s = 0;
4212
var tX = this.x;
4213
this.x = s * this.y;
4214
this.y = (-s * tX);
4215
}
4216
b2Vec2.prototype.CrossFV = function (s) {
4217
if (s === undefined) s = 0;
4218
var tX = this.x;
4219
this.x = (-s * this.y);
4220
this.y = s * tX;
4221
}
4222
b2Vec2.prototype.MinV = function (b) {
4223
this.x = this.x < b.x ? this.x : b.x;
4224
this.y = this.y < b.y ? this.y : b.y;
4225
}
4226
b2Vec2.prototype.MaxV = function (b) {
4227
this.x = this.x > b.x ? this.x : b.x;
4228
this.y = this.y > b.y ? this.y : b.y;
4229
}
4230
b2Vec2.prototype.Abs = function () {
4231
if (this.x < 0) this.x = (-this.x);
4232
if (this.y < 0) this.y = (-this.y);
4233
}
4234
b2Vec2.prototype.Length = function () {
4235
return Math.sqrt(this.x * this.x + this.y * this.y);
4236
}
4237
b2Vec2.prototype.LengthSquared = function () {
4238
return (this.x * this.x + this.y * this.y);
4239
}
4240
b2Vec2.prototype.Normalize = function () {
4241
var length = Math.sqrt(this.x * this.x + this.y * this.y);
4242
if (length < Number.MIN_VALUE) {
4243
return 0.0;
4244
}
4245
var invLength = 1.0 / length;
4246
this.x *= invLength;
4247
this.y *= invLength;
4248
return length;
4249
}
4250
b2Vec2.prototype.IsValid = function () {
4251
return b2Math.IsValid(this.x) && b2Math.IsValid(this.y);
4252
}
4253
b2Vec3.b2Vec3 = function () {};
4254
b2Vec3.prototype.b2Vec3 = function (x, y, z) {
4255
if (x === undefined) x = 0;
4256
if (y === undefined) y = 0;
4257
if (z === undefined) z = 0;
4258
this.x = x;
4259
this.y = y;
4260
this.z = z;
4261
}
4262
b2Vec3.prototype.SetZero = function () {
4263
this.x = this.y = this.z = 0.0;
4264
}
4265
b2Vec3.prototype.Set = function (x, y, z) {
4266
if (x === undefined) x = 0;
4267
if (y === undefined) y = 0;
4268
if (z === undefined) z = 0;
4269
this.x = x;
4270
this.y = y;
4271
this.z = z;
4272
}
4273
b2Vec3.prototype.SetV = function (v) {
4274
this.x = v.x;
4275
this.y = v.y;
4276
this.z = v.z;
4277
}
4278
b2Vec3.prototype.GetNegative = function () {
4279
return new b2Vec3((-this.x), (-this.y), (-this.z));
4280
}
4281
b2Vec3.prototype.NegativeSelf = function () {
4282
this.x = (-this.x);
4283
this.y = (-this.y);
4284
this.z = (-this.z);
4285
}
4286
b2Vec3.prototype.Copy = function () {
4287
return new b2Vec3(this.x, this.y, this.z);
4288
}
4289
b2Vec3.prototype.Add = function (v) {
4290
this.x += v.x;
4291
this.y += v.y;
4292
this.z += v.z;
4293
}
4294
b2Vec3.prototype.Subtract = function (v) {
4295
this.x -= v.x;
4296
this.y -= v.y;
4297
this.z -= v.z;
4298
}
4299
b2Vec3.prototype.Multiply = function (a) {
4300
if (a === undefined) a = 0;
4301
this.x *= a;
4302
this.y *= a;
4303
this.z *= a;
4304
}
4305
})();
4306
(function () {
4307
var b2ControllerEdge = Box2D.Dynamics.Controllers.b2ControllerEdge,
4308
b2Mat22 = Box2D.Common.Math.b2Mat22,
4309
b2Mat33 = Box2D.Common.Math.b2Mat33,
4310
b2Math = Box2D.Common.Math.b2Math,
4311
b2Sweep = Box2D.Common.Math.b2Sweep,
4312
b2Transform = Box2D.Common.Math.b2Transform,
4313
b2Vec2 = Box2D.Common.Math.b2Vec2,
4314
b2Vec3 = Box2D.Common.Math.b2Vec3,
4315
b2Color = Box2D.Common.b2Color,
4316
b2internal = Box2D.Common.b2internal,
4317
b2Settings = Box2D.Common.b2Settings,
4318
b2AABB = Box2D.Collision.b2AABB,
4319
b2Bound = Box2D.Collision.b2Bound,
4320
b2BoundValues = Box2D.Collision.b2BoundValues,
4321
b2Collision = Box2D.Collision.b2Collision,
4322
b2ContactID = Box2D.Collision.b2ContactID,
4323
b2ContactPoint = Box2D.Collision.b2ContactPoint,
4324
b2Distance = Box2D.Collision.b2Distance,
4325
b2DistanceInput = Box2D.Collision.b2DistanceInput,
4326
b2DistanceOutput = Box2D.Collision.b2DistanceOutput,
4327
b2DistanceProxy = Box2D.Collision.b2DistanceProxy,
4328
b2DynamicTree = Box2D.Collision.b2DynamicTree,
4329
b2DynamicTreeBroadPhase = Box2D.Collision.b2DynamicTreeBroadPhase,
4330
b2DynamicTreeNode = Box2D.Collision.b2DynamicTreeNode,
4331
b2DynamicTreePair = Box2D.Collision.b2DynamicTreePair,
4332
b2Manifold = Box2D.Collision.b2Manifold,
4333
b2ManifoldPoint = Box2D.Collision.b2ManifoldPoint,
4334
b2Point = Box2D.Collision.b2Point,
4335
b2RayCastInput = Box2D.Collision.b2RayCastInput,
4336
b2RayCastOutput = Box2D.Collision.b2RayCastOutput,
4337
b2Segment = Box2D.Collision.b2Segment,
4338
b2SeparationFunction = Box2D.Collision.b2SeparationFunction,
4339
b2Simplex = Box2D.Collision.b2Simplex,
4340
b2SimplexCache = Box2D.Collision.b2SimplexCache,
4341
b2SimplexVertex = Box2D.Collision.b2SimplexVertex,
4342
b2TimeOfImpact = Box2D.Collision.b2TimeOfImpact,
4343
b2TOIInput = Box2D.Collision.b2TOIInput,
4344
b2WorldManifold = Box2D.Collision.b2WorldManifold,
4345
ClipVertex = Box2D.Collision.ClipVertex,
4346
Features = Box2D.Collision.Features,
4347
IBroadPhase = Box2D.Collision.IBroadPhase,
4348
b2CircleShape = Box2D.Collision.Shapes.b2CircleShape,
4349
b2EdgeChainDef = Box2D.Collision.Shapes.b2EdgeChainDef,
4350
b2EdgeShape = Box2D.Collision.Shapes.b2EdgeShape,
4351
b2MassData = Box2D.Collision.Shapes.b2MassData,
4352
b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape,
4353
b2Shape = Box2D.Collision.Shapes.b2Shape,
4354
b2Body = Box2D.Dynamics.b2Body,
4355
b2BodyDef = Box2D.Dynamics.b2BodyDef,
4356
b2ContactFilter = Box2D.Dynamics.b2ContactFilter,
4357
b2ContactImpulse = Box2D.Dynamics.b2ContactImpulse,
4358
b2ContactListener = Box2D.Dynamics.b2ContactListener,
4359
b2ContactManager = Box2D.Dynamics.b2ContactManager,
4360
b2DebugDraw = Box2D.Dynamics.b2DebugDraw,
4361
b2DestructionListener = Box2D.Dynamics.b2DestructionListener,
4362
b2FilterData = Box2D.Dynamics.b2FilterData,
4363
b2Fixture = Box2D.Dynamics.b2Fixture,
4364
b2FixtureDef = Box2D.Dynamics.b2FixtureDef,
4365
b2Island = Box2D.Dynamics.b2Island,
4366
b2TimeStep = Box2D.Dynamics.b2TimeStep,
4367
b2World = Box2D.Dynamics.b2World,
4368
b2CircleContact = Box2D.Dynamics.Contacts.b2CircleContact,
4369
b2Contact = Box2D.Dynamics.Contacts.b2Contact,
4370
b2ContactConstraint = Box2D.Dynamics.Contacts.b2ContactConstraint,
4371
b2ContactConstraintPoint = Box2D.Dynamics.Contacts.b2ContactConstraintPoint,
4372
b2ContactEdge = Box2D.Dynamics.Contacts.b2ContactEdge,
4373
b2ContactFactory = Box2D.Dynamics.Contacts.b2ContactFactory,
4374
b2ContactRegister = Box2D.Dynamics.Contacts.b2ContactRegister,
4375
b2ContactResult = Box2D.Dynamics.Contacts.b2ContactResult,
4376
b2ContactSolver = Box2D.Dynamics.Contacts.b2ContactSolver,
4377
b2EdgeAndCircleContact = Box2D.Dynamics.Contacts.b2EdgeAndCircleContact,
4378
b2NullContact = Box2D.Dynamics.Contacts.b2NullContact,
4379
b2PolyAndCircleContact = Box2D.Dynamics.Contacts.b2PolyAndCircleContact,
4380
b2PolyAndEdgeContact = Box2D.Dynamics.Contacts.b2PolyAndEdgeContact,
4381
b2PolygonContact = Box2D.Dynamics.Contacts.b2PolygonContact,
4382
b2PositionSolverManifold = Box2D.Dynamics.Contacts.b2PositionSolverManifold,
4383
b2Controller = Box2D.Dynamics.Controllers.b2Controller,
4384
b2DistanceJoint = Box2D.Dynamics.Joints.b2DistanceJoint,
4385
b2DistanceJointDef = Box2D.Dynamics.Joints.b2DistanceJointDef,
4386
b2FrictionJoint = Box2D.Dynamics.Joints.b2FrictionJoint,
4387
b2FrictionJointDef = Box2D.Dynamics.Joints.b2FrictionJointDef,
4388
b2GearJoint = Box2D.Dynamics.Joints.b2GearJoint,
4389
b2GearJointDef = Box2D.Dynamics.Joints.b2GearJointDef,
4390
b2Jacobian = Box2D.Dynamics.Joints.b2Jacobian,
4391
b2Joint = Box2D.Dynamics.Joints.b2Joint,
4392
b2JointDef = Box2D.Dynamics.Joints.b2JointDef,
4393
b2JointEdge = Box2D.Dynamics.Joints.b2JointEdge,
4394
b2LineJoint = Box2D.Dynamics.Joints.b2LineJoint,
4395
b2LineJointDef = Box2D.Dynamics.Joints.b2LineJointDef,
4396
b2MouseJoint = Box2D.Dynamics.Joints.b2MouseJoint,
4397
b2MouseJointDef = Box2D.Dynamics.Joints.b2MouseJointDef,
4398
b2PrismaticJoint = Box2D.Dynamics.Joints.b2PrismaticJoint,
4399
b2PrismaticJointDef = Box2D.Dynamics.Joints.b2PrismaticJointDef,
4400
b2PulleyJoint = Box2D.Dynamics.Joints.b2PulleyJoint,
4401
b2PulleyJointDef = Box2D.Dynamics.Joints.b2PulleyJointDef,
4402
b2RevoluteJoint = Box2D.Dynamics.Joints.b2RevoluteJoint,
4403
b2RevoluteJointDef = Box2D.Dynamics.Joints.b2RevoluteJointDef,
4404
b2WeldJoint = Box2D.Dynamics.Joints.b2WeldJoint,
4405
b2WeldJointDef = Box2D.Dynamics.Joints.b2WeldJointDef;
4406
4407
b2Body.b2Body = function () {
4408
this.m_xf = new b2Transform();
4409
this.m_sweep = new b2Sweep();
4410
this.m_linearVelocity = new b2Vec2();
4411
this.m_force = new b2Vec2();
4412
};
4413
b2Body.prototype.connectEdges = function (s1, s2, angle1) {
4414
if (angle1 === undefined) angle1 = 0;
4415
var angle2 = Math.atan2(s2.GetDirectionVector().y, s2.GetDirectionVector().x);
4416
var coreOffset = Math.tan((angle2 - angle1) * 0.5);
4417
var core = b2Math.MulFV(coreOffset, s2.GetDirectionVector());
4418
core = b2Math.SubtractVV(core, s2.GetNormalVector());
4419
core = b2Math.MulFV(b2Settings.b2_toiSlop, core);
4420
core = b2Math.AddVV(core, s2.GetVertex1());
4421
var cornerDir = b2Math.AddVV(s1.GetDirectionVector(), s2.GetDirectionVector());
4422
cornerDir.Normalize();
4423
var convex = b2Math.Dot(s1.GetDirectionVector(), s2.GetNormalVector()) > 0.0;
4424
s1.SetNextEdge(s2, core, cornerDir, convex);
4425
s2.SetPrevEdge(s1, core, cornerDir, convex);
4426
return angle2;
4427
}
4428
b2Body.prototype.CreateFixture = function (def) {
4429
if (this.m_world.IsLocked() == true) {
4430
return null;
4431
}
4432
var fixture = new b2Fixture();
4433
fixture.Create(this, this.m_xf, def);
4434
if (this.m_flags & b2Body.e_activeFlag) {
4435
var broadPhase = this.m_world.m_contactManager.m_broadPhase;
4436
fixture.CreateProxy(broadPhase, this.m_xf);
4437
}
4438
fixture.m_next = this.m_fixtureList;
4439
this.m_fixtureList = fixture;
4440
++this.m_fixtureCount;
4441
fixture.m_body = this;
4442
if (fixture.m_density > 0.0) {
4443
this.ResetMassData();
4444
}
4445
this.m_world.m_flags |= b2World.e_newFixture;
4446
return fixture;
4447
}
4448
b2Body.prototype.CreateFixture2 = function (shape, density) {
4449
if (density === undefined) density = 0.0;
4450
var def = new b2FixtureDef();
4451
def.shape = shape;
4452
def.density = density;
4453
return this.CreateFixture(def);
4454
}
4455
b2Body.prototype.DestroyFixture = function (fixture) {
4456
if (this.m_world.IsLocked() == true) {
4457
return;
4458
}
4459
var node = this.m_fixtureList;
4460
var ppF = null;
4461
var found = false;
4462
while (node != null) {
4463
if (node == fixture) {
4464
if (ppF) ppF.m_next = fixture.m_next;
4465
else this.m_fixtureList = fixture.m_next;
4466
found = true;
4467
break;
4468
}
4469
ppF = node;
4470
node = node.m_next;
4471
}
4472
var edge = this.m_contactList;
4473
while (edge) {
4474
var c = edge.contact;
4475
edge = edge.next;
4476
var fixtureA = c.GetFixtureA();
4477
var fixtureB = c.GetFixtureB();
4478
if (fixture == fixtureA || fixture == fixtureB) {
4479
this.m_world.m_contactManager.Destroy(c);
4480
}
4481
}
4482
if (this.m_flags & b2Body.e_activeFlag) {
4483
var broadPhase = this.m_world.m_contactManager.m_broadPhase;
4484
fixture.DestroyProxy(broadPhase);
4485
}
4486
else {}
4487
fixture.Destroy();
4488
fixture.m_body = null;
4489
fixture.m_next = null;
4490
--this.m_fixtureCount;
4491
this.ResetMassData();
4492
}
4493
b2Body.prototype.SetPositionAndAngle = function (position, angle) {
4494
if (angle === undefined) angle = 0;
4495
var f;
4496
if (this.m_world.IsLocked() == true) {
4497
return;
4498
}
4499
this.m_xf.R.Set(angle);
4500
this.m_xf.position.SetV(position);
4501
var tMat = this.m_xf.R;
4502
var tVec = this.m_sweep.localCenter;
4503
this.m_sweep.c.x = (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
4504
this.m_sweep.c.y = (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
4505
this.m_sweep.c.x += this.m_xf.position.x;
4506
this.m_sweep.c.y += this.m_xf.position.y;
4507
this.m_sweep.c0.SetV(this.m_sweep.c);
4508
this.m_sweep.a0 = this.m_sweep.a = angle;
4509
var broadPhase = this.m_world.m_contactManager.m_broadPhase;
4510
for (f = this.m_fixtureList;
4511
f; f = f.m_next) {
4512
f.Synchronize(broadPhase, this.m_xf, this.m_xf);
4513
}
4514
this.m_world.m_contactManager.FindNewContacts();
4515
}
4516
b2Body.prototype.SetTransform = function (xf) {
4517
this.SetPositionAndAngle(xf.position, xf.GetAngle());
4518
}
4519
b2Body.prototype.GetTransform = function () {
4520
return this.m_xf;
4521
}
4522
b2Body.prototype.GetPosition = function () {
4523
return this.m_xf.position;
4524
}
4525
b2Body.prototype.SetPosition = function (position) {
4526
this.SetPositionAndAngle(position, this.GetAngle());
4527
}
4528
b2Body.prototype.GetAngle = function () {
4529
return this.m_sweep.a;
4530
}
4531
b2Body.prototype.SetAngle = function (angle) {
4532
if (angle === undefined) angle = 0;
4533
this.SetPositionAndAngle(this.GetPosition(), angle);
4534
}
4535
b2Body.prototype.GetWorldCenter = function () {
4536
return this.m_sweep.c;
4537
}
4538
b2Body.prototype.GetLocalCenter = function () {
4539
return this.m_sweep.localCenter;
4540
}
4541
b2Body.prototype.SetLinearVelocity = function (v) {
4542
if (this.m_type == b2Body.b2_staticBody) {
4543
return;
4544
}
4545
this.m_linearVelocity.SetV(v);
4546
}
4547
b2Body.prototype.GetLinearVelocity = function () {
4548
return this.m_linearVelocity;
4549
}
4550
b2Body.prototype.SetAngularVelocity = function (omega) {
4551
if (omega === undefined) omega = 0;
4552
if (this.m_type == b2Body.b2_staticBody) {
4553
return;
4554
}
4555
this.m_angularVelocity = omega;
4556
}
4557
b2Body.prototype.GetAngularVelocity = function () {
4558
return this.m_angularVelocity;
4559
}
4560
b2Body.prototype.GetDefinition = function () {
4561
var bd = new b2BodyDef();
4562
bd.type = this.GetType();
4563
bd.allowSleep = (this.m_flags & b2Body.e_allowSleepFlag) == b2Body.e_allowSleepFlag;
4564
bd.angle = this.GetAngle();
4565
bd.angularDamping = this.m_angularDamping;
4566
bd.angularVelocity = this.m_angularVelocity;
4567
bd.fixedRotation = (this.m_flags & b2Body.e_fixedRotationFlag) == b2Body.e_fixedRotationFlag;
4568
bd.bullet = (this.m_flags & b2Body.e_bulletFlag) == b2Body.e_bulletFlag;
4569
bd.awake = (this.m_flags & b2Body.e_awakeFlag) == b2Body.e_awakeFlag;
4570
bd.linearDamping = this.m_linearDamping;
4571
bd.linearVelocity.SetV(this.GetLinearVelocity());
4572
bd.position = this.GetPosition();
4573
bd.userData = this.GetUserData();
4574
return bd;
4575
}
4576
b2Body.prototype.ApplyForce = function (force, point) {
4577
if (this.m_type != b2Body.b2_dynamicBody) {
4578
return;
4579
}
4580
if (this.IsAwake() == false) {
4581
this.SetAwake(true);
4582
}
4583
this.m_force.x += force.x;
4584
this.m_force.y += force.y;
4585
this.m_torque += ((point.x - this.m_sweep.c.x) * force.y - (point.y - this.m_sweep.c.y) * force.x);
4586
}
4587
b2Body.prototype.ApplyTorque = function (torque) {
4588
if (torque === undefined) torque = 0;
4589
if (this.m_type != b2Body.b2_dynamicBody) {
4590
return;
4591
}
4592
if (this.IsAwake() == false) {
4593
this.SetAwake(true);
4594
}
4595
this.m_torque += torque;
4596
}
4597
b2Body.prototype.ApplyImpulse = function (impulse, point) {
4598
if (this.m_type != b2Body.b2_dynamicBody) {
4599
return;
4600
}
4601
if (this.IsAwake() == false) {
4602
this.SetAwake(true);
4603
}
4604
this.m_linearVelocity.x += this.m_invMass * impulse.x;
4605
this.m_linearVelocity.y += this.m_invMass * impulse.y;
4606
this.m_angularVelocity += this.m_invI * ((point.x - this.m_sweep.c.x) * impulse.y - (point.y - this.m_sweep.c.y) * impulse.x);
4607
}
4608
b2Body.prototype.Split = function (callback) {
4609
var linearVelocity = this.GetLinearVelocity().Copy();
4610
var angularVelocity = this.GetAngularVelocity();
4611
var center = this.GetWorldCenter();
4612
var body1 = this;
4613
var body2 = this.m_world.CreateBody(this.GetDefinition());
4614
var prev;
4615
for (var f = body1.m_fixtureList; f;) {
4616
if (callback(f)) {
4617
var next = f.m_next;
4618
if (prev) {
4619
prev.m_next = next;
4620
}
4621
else {
4622
body1.m_fixtureList = next;
4623
}
4624
body1.m_fixtureCount--;
4625
f.m_next = body2.m_fixtureList;
4626
body2.m_fixtureList = f;
4627
body2.m_fixtureCount++;
4628
f.m_body = body2;
4629
f = next;
4630
}
4631
else {
4632
prev = f;
4633
f = f.m_next;
4634
}
4635
}
4636
body1.ResetMassData();
4637
body2.ResetMassData();
4638
var center1 = body1.GetWorldCenter();
4639
var center2 = body2.GetWorldCenter();
4640
var velocity1 = b2Math.AddVV(linearVelocity, b2Math.CrossFV(angularVelocity, b2Math.SubtractVV(center1, center)));
4641
var velocity2 = b2Math.AddVV(linearVelocity, b2Math.CrossFV(angularVelocity, b2Math.SubtractVV(center2, center)));
4642
body1.SetLinearVelocity(velocity1);
4643
body2.SetLinearVelocity(velocity2);
4644
body1.SetAngularVelocity(angularVelocity);
4645
body2.SetAngularVelocity(angularVelocity);
4646
body1.SynchronizeFixtures();
4647
body2.SynchronizeFixtures();
4648
return body2;
4649
}
4650
b2Body.prototype.Merge = function (other) {
4651
var f;
4652
for (f = other.m_fixtureList;
4653
f;) {
4654
var next = f.m_next;
4655
other.m_fixtureCount--;
4656
f.m_next = this.m_fixtureList;
4657
this.m_fixtureList = f;
4658
this.m_fixtureCount++;
4659
f.m_body = body2;
4660
f = next;
4661
}
4662
body1.m_fixtureCount = 0;
4663
var body1 = this;
4664
var body2 = other;
4665
var center1 = body1.GetWorldCenter();
4666
var center2 = body2.GetWorldCenter();
4667
var velocity1 = body1.GetLinearVelocity().Copy();
4668
var velocity2 = body2.GetLinearVelocity().Copy();
4669
var angular1 = body1.GetAngularVelocity();
4670
var angular = body2.GetAngularVelocity();
4671
body1.ResetMassData();
4672
this.SynchronizeFixtures();
4673
}
4674
b2Body.prototype.GetMass = function () {
4675
return this.m_mass;
4676
}
4677
b2Body.prototype.GetInertia = function () {
4678
return this.m_I;
4679
}
4680
b2Body.prototype.GetMassData = function (data) {
4681
data.mass = this.m_mass;
4682
data.I = this.m_I;
4683
data.center.SetV(this.m_sweep.localCenter);
4684
}
4685
b2Body.prototype.SetMassData = function (massData) {
4686
b2Settings.b2Assert(this.m_world.IsLocked() == false);
4687
if (this.m_world.IsLocked() == true) {
4688
return;
4689
}
4690
if (this.m_type != b2Body.b2_dynamicBody) {
4691
return;
4692
}
4693
this.m_invMass = 0.0;
4694
this.m_I = 0.0;
4695
this.m_invI = 0.0;
4696
this.m_mass = massData.mass;
4697
if (this.m_mass <= 0.0) {
4698
this.m_mass = 1.0;
4699
}
4700
this.m_invMass = 1.0 / this.m_mass;
4701
if (massData.I > 0.0 && (this.m_flags & b2Body.e_fixedRotationFlag) == 0) {
4702
this.m_I = massData.I - this.m_mass * (massData.center.x * massData.center.x + massData.center.y * massData.center.y);
4703
this.m_invI = 1.0 / this.m_I;
4704
}
4705
var oldCenter = this.m_sweep.c.Copy();
4706
this.m_sweep.localCenter.SetV(massData.center);
4707
this.m_sweep.c0.SetV(b2Math.MulX(this.m_xf, this.m_sweep.localCenter));
4708
this.m_sweep.c.SetV(this.m_sweep.c0);
4709
this.m_linearVelocity.x += this.m_angularVelocity * (-(this.m_sweep.c.y - oldCenter.y));
4710
this.m_linearVelocity.y += this.m_angularVelocity * (+(this.m_sweep.c.x - oldCenter.x));
4711
}
4712
b2Body.prototype.ResetMassData = function () {
4713
this.m_mass = 0.0;
4714
this.m_invMass = 0.0;
4715
this.m_I = 0.0;
4716
this.m_invI = 0.0;
4717
this.m_sweep.localCenter.SetZero();
4718
if (this.m_type == b2Body.b2_staticBody || this.m_type == b2Body.b2_kinematicBody) {
4719
return;
4720
}
4721
var center = b2Vec2.Make(0, 0);
4722
for (var f = this.m_fixtureList; f; f = f.m_next) {
4723
if (f.m_density == 0.0) {
4724
continue;
4725
}
4726
var massData = f.GetMassData();
4727
this.m_mass += massData.mass;
4728
center.x += massData.center.x * massData.mass;
4729
center.y += massData.center.y * massData.mass;
4730
this.m_I += massData.I;
4731
}
4732
if (this.m_mass > 0.0) {
4733
this.m_invMass = 1.0 / this.m_mass;
4734
center.x *= this.m_invMass;
4735
center.y *= this.m_invMass;
4736
}
4737
else {
4738
this.m_mass = 1.0;
4739
this.m_invMass = 1.0;
4740
}
4741
if (this.m_I > 0.0 && (this.m_flags & b2Body.e_fixedRotationFlag) == 0) {
4742
this.m_I -= this.m_mass * (center.x * center.x + center.y * center.y);
4743
this.m_I *= this.m_inertiaScale;
4744
b2Settings.b2Assert(this.m_I > 0);
4745
this.m_invI = 1.0 / this.m_I;
4746
}
4747
else {
4748
this.m_I = 0.0;
4749
this.m_invI = 0.0;
4750
}
4751
var oldCenter = this.m_sweep.c.Copy();
4752
this.m_sweep.localCenter.SetV(center);
4753
this.m_sweep.c0.SetV(b2Math.MulX(this.m_xf, this.m_sweep.localCenter));
4754
this.m_sweep.c.SetV(this.m_sweep.c0);
4755
this.m_linearVelocity.x += this.m_angularVelocity * (-(this.m_sweep.c.y - oldCenter.y));
4756
this.m_linearVelocity.y += this.m_angularVelocity * (+(this.m_sweep.c.x - oldCenter.x));
4757
}
4758
b2Body.prototype.GetWorldPoint = function (localPoint) {
4759
var A = this.m_xf.R;
4760
var u = new b2Vec2(A.col1.x * localPoint.x + A.col2.x * localPoint.y, A.col1.y * localPoint.x + A.col2.y * localPoint.y);
4761
u.x += this.m_xf.position.x;
4762
u.y += this.m_xf.position.y;
4763
return u;
4764
}
4765
b2Body.prototype.GetWorldVector = function (localVector) {
4766
return b2Math.MulMV(this.m_xf.R, localVector);
4767
}
4768
b2Body.prototype.GetLocalPoint = function (worldPoint) {
4769
return b2Math.MulXT(this.m_xf, worldPoint);
4770
}
4771
b2Body.prototype.GetLocalVector = function (worldVector) {
4772
return b2Math.MulTMV(this.m_xf.R, worldVector);
4773
}
4774
b2Body.prototype.GetLinearVelocityFromWorldPoint = function (worldPoint) {
4775
return new b2Vec2(this.m_linearVelocity.x - this.m_angularVelocity * (worldPoint.y - this.m_sweep.c.y), this.m_linearVelocity.y + this.m_angularVelocity * (worldPoint.x - this.m_sweep.c.x));
4776
}
4777
b2Body.prototype.GetLinearVelocityFromLocalPoint = function (localPoint) {
4778
var A = this.m_xf.R;
4779
var worldPoint = new b2Vec2(A.col1.x * localPoint.x + A.col2.x * localPoint.y, A.col1.y * localPoint.x + A.col2.y * localPoint.y);
4780
worldPoint.x += this.m_xf.position.x;
4781
worldPoint.y += this.m_xf.position.y;
4782
return new b2Vec2(this.m_linearVelocity.x - this.m_angularVelocity * (worldPoint.y - this.m_sweep.c.y), this.m_linearVelocity.y + this.m_angularVelocity * (worldPoint.x - this.m_sweep.c.x));
4783
}
4784
b2Body.prototype.GetLinearDamping = function () {
4785
return this.m_linearDamping;
4786
}
4787
b2Body.prototype.SetLinearDamping = function (linearDamping) {
4788
if (linearDamping === undefined) linearDamping = 0;
4789
this.m_linearDamping = linearDamping;
4790
}
4791
b2Body.prototype.GetAngularDamping = function () {
4792
return this.m_angularDamping;
4793
}
4794
b2Body.prototype.SetAngularDamping = function (angularDamping) {
4795
if (angularDamping === undefined) angularDamping = 0;
4796
this.m_angularDamping = angularDamping;
4797
}
4798
b2Body.prototype.SetType = function (type) {
4799
if (type === undefined) type = 0;
4800
if (this.m_type == type) {
4801
return;
4802
}
4803
this.m_type = type;
4804
this.ResetMassData();
4805
if (this.m_type == b2Body.b2_staticBody) {
4806
this.m_linearVelocity.SetZero();
4807
this.m_angularVelocity = 0.0;
4808
}
4809
this.SetAwake(true);
4810
this.m_force.SetZero();
4811
this.m_torque = 0.0;
4812
for (var ce = this.m_contactList; ce; ce = ce.next) {
4813
ce.contact.FlagForFiltering();
4814
}
4815
}
4816
b2Body.prototype.GetType = function () {
4817
return this.m_type;
4818
}
4819
b2Body.prototype.SetBullet = function (flag) {
4820
if (flag) {
4821
this.m_flags |= b2Body.e_bulletFlag;
4822
}
4823
else {
4824
this.m_flags &= ~b2Body.e_bulletFlag;
4825
}
4826
}
4827
b2Body.prototype.IsBullet = function () {
4828
return (this.m_flags & b2Body.e_bulletFlag) == b2Body.e_bulletFlag;
4829
}
4830
b2Body.prototype.SetSleepingAllowed = function (flag) {
4831
if (flag) {
4832
this.m_flags |= b2Body.e_allowSleepFlag;
4833
}
4834
else {
4835
this.m_flags &= ~b2Body.e_allowSleepFlag;
4836
this.SetAwake(true);
4837
}
4838
}
4839
b2Body.prototype.SetAwake = function (flag) {
4840
if (flag) {
4841
this.m_flags |= b2Body.e_awakeFlag;
4842
this.m_sleepTime = 0.0;
4843
}
4844
else {
4845
this.m_flags &= ~b2Body.e_awakeFlag;
4846
this.m_sleepTime = 0.0;
4847
this.m_linearVelocity.SetZero();
4848
this.m_angularVelocity = 0.0;
4849
this.m_force.SetZero();
4850
this.m_torque = 0.0;
4851
}
4852
}
4853
b2Body.prototype.IsAwake = function () {
4854
return (this.m_flags & b2Body.e_awakeFlag) == b2Body.e_awakeFlag;
4855
}
4856
b2Body.prototype.SetFixedRotation = function (fixed) {
4857
if (fixed) {
4858
this.m_flags |= b2Body.e_fixedRotationFlag;
4859
}
4860
else {
4861
this.m_flags &= ~b2Body.e_fixedRotationFlag;
4862
}
4863
this.ResetMassData();
4864
}
4865
b2Body.prototype.IsFixedRotation = function () {
4866
return (this.m_flags & b2Body.e_fixedRotationFlag) == b2Body.e_fixedRotationFlag;
4867
}
4868
b2Body.prototype.SetActive = function (flag) {
4869
if (flag == this.IsActive()) {
4870
return;
4871
}
4872
var broadPhase;
4873
var f;
4874
if (flag) {
4875
this.m_flags |= b2Body.e_activeFlag;
4876
broadPhase = this.m_world.m_contactManager.m_broadPhase;
4877
for (f = this.m_fixtureList;
4878
f; f = f.m_next) {
4879
f.CreateProxy(broadPhase, this.m_xf);
4880
}
4881
}
4882
else {
4883
this.m_flags &= ~b2Body.e_activeFlag;
4884
broadPhase = this.m_world.m_contactManager.m_broadPhase;
4885
for (f = this.m_fixtureList;
4886
f; f = f.m_next) {
4887
f.DestroyProxy(broadPhase);
4888
}
4889
var ce = this.m_contactList;
4890
while (ce) {
4891
var ce0 = ce;
4892
ce = ce.next;
4893
this.m_world.m_contactManager.Destroy(ce0.contact);
4894
}
4895
this.m_contactList = null;
4896
}
4897
}
4898
b2Body.prototype.IsActive = function () {
4899
return (this.m_flags & b2Body.e_activeFlag) == b2Body.e_activeFlag;
4900
}
4901
b2Body.prototype.IsSleepingAllowed = function () {
4902
return (this.m_flags & b2Body.e_allowSleepFlag) == b2Body.e_allowSleepFlag;
4903
}
4904
b2Body.prototype.GetFixtureList = function () {
4905
return this.m_fixtureList;
4906
}
4907
b2Body.prototype.GetJointList = function () {
4908
return this.m_jointList;
4909
}
4910
b2Body.prototype.GetControllerList = function () {
4911
return this.m_controllerList;
4912
}
4913
b2Body.prototype.GetContactList = function () {
4914
return this.m_contactList;
4915
}
4916
b2Body.prototype.GetNext = function () {
4917
return this.m_next;
4918
}
4919
b2Body.prototype.GetUserData = function () {
4920
return this.m_userData;
4921
}
4922
b2Body.prototype.SetUserData = function (data) {
4923
this.m_userData = data;
4924
}
4925
b2Body.prototype.GetWorld = function () {
4926
return this.m_world;
4927
}
4928
b2Body.prototype.b2Body = function (bd, world) {
4929
this.m_flags = 0;
4930
if (bd.bullet) {
4931
this.m_flags |= b2Body.e_bulletFlag;
4932
}
4933
if (bd.fixedRotation) {
4934
this.m_flags |= b2Body.e_fixedRotationFlag;
4935
}
4936
if (bd.allowSleep) {
4937
this.m_flags |= b2Body.e_allowSleepFlag;
4938
}
4939
if (bd.awake) {
4940
this.m_flags |= b2Body.e_awakeFlag;
4941
}
4942
if (bd.active) {
4943
this.m_flags |= b2Body.e_activeFlag;
4944
}
4945
this.m_world = world;
4946
this.m_xf.position.SetV(bd.position);
4947
this.m_xf.R.Set(bd.angle);
4948
this.m_sweep.localCenter.SetZero();
4949
this.m_sweep.t0 = 1.0;
4950
this.m_sweep.a0 = this.m_sweep.a = bd.angle;
4951
var tMat = this.m_xf.R;
4952
var tVec = this.m_sweep.localCenter;
4953
this.m_sweep.c.x = (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
4954
this.m_sweep.c.y = (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
4955
this.m_sweep.c.x += this.m_xf.position.x;
4956
this.m_sweep.c.y += this.m_xf.position.y;
4957
this.m_sweep.c0.SetV(this.m_sweep.c);
4958
this.m_jointList = null;
4959
this.m_controllerList = null;
4960
this.m_contactList = null;
4961
this.m_controllerCount = 0;
4962
this.m_prev = null;
4963
this.m_next = null;
4964
this.m_linearVelocity.SetV(bd.linearVelocity);
4965
this.m_angularVelocity = bd.angularVelocity;
4966
this.m_linearDamping = bd.linearDamping;
4967
this.m_angularDamping = bd.angularDamping;
4968
this.m_force.Set(0.0, 0.0);
4969
this.m_torque = 0.0;
4970
this.m_sleepTime = 0.0;
4971
this.m_type = bd.type;
4972
if (this.m_type == b2Body.b2_dynamicBody) {
4973
this.m_mass = 1.0;
4974
this.m_invMass = 1.0;
4975
}
4976
else {
4977
this.m_mass = 0.0;
4978
this.m_invMass = 0.0;
4979
}
4980
this.m_I = 0.0;
4981
this.m_invI = 0.0;
4982
this.m_inertiaScale = bd.inertiaScale;
4983
this.m_userData = bd.userData;
4984
this.m_fixtureList = null;
4985
this.m_fixtureCount = 0;
4986
}
4987
b2Body.prototype.SynchronizeFixtures = function () {
4988
var xf1 = b2Body.s_xf1;
4989
xf1.R.Set(this.m_sweep.a0);
4990
var tMat = xf1.R;
4991
var tVec = this.m_sweep.localCenter;
4992
xf1.position.x = this.m_sweep.c0.x - (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
4993
xf1.position.y = this.m_sweep.c0.y - (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
4994
var f;
4995
var broadPhase = this.m_world.m_contactManager.m_broadPhase;
4996
for (f = this.m_fixtureList;
4997
f; f = f.m_next) {
4998
f.Synchronize(broadPhase, xf1, this.m_xf);
4999
}
5000
}
5001
b2Body.prototype.SynchronizeTransform = function () {
5002
this.m_xf.R.Set(this.m_sweep.a);
5003
var tMat = this.m_xf.R;
5004
var tVec = this.m_sweep.localCenter;
5005
this.m_xf.position.x = this.m_sweep.c.x - (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
5006
this.m_xf.position.y = this.m_sweep.c.y - (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
5007
}
5008
b2Body.prototype.ShouldCollide = function (other) {
5009
if (this.m_type != b2Body.b2_dynamicBody && other.m_type != b2Body.b2_dynamicBody) {
5010
return false;
5011
}
5012
for (var jn = this.m_jointList; jn; jn = jn.next) {
5013
if (jn.other == other) if (jn.joint.m_collideConnected == false) {
5014
return false;
5015
}
5016
}
5017
return true;
5018
}
5019
b2Body.prototype.Advance = function (t) {
5020
if (t === undefined) t = 0;
5021
this.m_sweep.Advance(t);
5022
this.m_sweep.c.SetV(this.m_sweep.c0);
5023
this.m_sweep.a = this.m_sweep.a0;
5024
this.SynchronizeTransform();
5025
}
5026
Box2D.postDefs.push(function () {
5027
Box2D.Dynamics.b2Body.s_xf1 = new b2Transform();
5028
Box2D.Dynamics.b2Body.e_islandFlag = 0x0001;
5029
Box2D.Dynamics.b2Body.e_awakeFlag = 0x0002;
5030
Box2D.Dynamics.b2Body.e_allowSleepFlag = 0x0004;
5031
Box2D.Dynamics.b2Body.e_bulletFlag = 0x0008;
5032
Box2D.Dynamics.b2Body.e_fixedRotationFlag = 0x0010;
5033
Box2D.Dynamics.b2Body.e_activeFlag = 0x0020;
5034
Box2D.Dynamics.b2Body.b2_staticBody = 0;
5035
Box2D.Dynamics.b2Body.b2_kinematicBody = 1;
5036
Box2D.Dynamics.b2Body.b2_dynamicBody = 2;
5037
});
5038
b2BodyDef.b2BodyDef = function () {
5039
this.position = new b2Vec2();
5040
this.linearVelocity = new b2Vec2();
5041
};
5042
b2BodyDef.prototype.b2BodyDef = function () {
5043
this.userData = null;
5044
this.position.Set(0.0, 0.0);
5045
this.angle = 0.0;
5046
this.linearVelocity.Set(0, 0);
5047
this.angularVelocity = 0.0;
5048
this.linearDamping = 0.0;
5049
this.angularDamping = 0.0;
5050
this.allowSleep = true;
5051
this.awake = true;
5052
this.fixedRotation = false;
5053
this.bullet = false;
5054
this.type = b2Body.b2_staticBody;
5055
this.active = true;
5056
this.inertiaScale = 1.0;
5057
}
5058
b2ContactFilter.b2ContactFilter = function () {};
5059
b2ContactFilter.prototype.ShouldCollide = function (fixtureA, fixtureB) {
5060
var filter1 = fixtureA.GetFilterData();
5061
var filter2 = fixtureB.GetFilterData();
5062
if (filter1.groupIndex == filter2.groupIndex && filter1.groupIndex != 0) {
5063
return filter1.groupIndex > 0;
5064
}
5065
var collide = (filter1.maskBits & filter2.categoryBits) != 0 && (filter1.categoryBits & filter2.maskBits) != 0;
5066
return collide;
5067
}
5068
b2ContactFilter.prototype.RayCollide = function (userData, fixture) {
5069
if (!userData) return true;
5070
return this.ShouldCollide((userData instanceof b2Fixture ? userData : null), fixture);
5071
}
5072
Box2D.postDefs.push(function () {
5073
Box2D.Dynamics.b2ContactFilter.b2_defaultFilter = new b2ContactFilter();
5074
});
5075
b2ContactImpulse.b2ContactImpulse = function () {
5076
this.normalImpulses = new Vector_a2j_Number(b2Settings.b2_maxManifoldPoints);
5077
this.tangentImpulses = new Vector_a2j_Number(b2Settings.b2_maxManifoldPoints);
5078
};
5079
b2ContactListener.b2ContactListener = function () {};
5080
b2ContactListener.prototype.BeginContact = function (contact) {}
5081
b2ContactListener.prototype.EndContact = function (contact) {}
5082
b2ContactListener.prototype.PreSolve = function (contact, oldManifold) {}
5083
b2ContactListener.prototype.PostSolve = function (contact, impulse) {}
5084
Box2D.postDefs.push(function () {
5085
Box2D.Dynamics.b2ContactListener.b2_defaultListener = new b2ContactListener();
5086
});
5087
b2ContactManager.b2ContactManager = function () {};
5088
b2ContactManager.prototype.b2ContactManager = function () {
5089
this.m_world = null;
5090
this.m_contactCount = 0;
5091
this.m_contactFilter = b2ContactFilter.b2_defaultFilter;
5092
this.m_contactListener = b2ContactListener.b2_defaultListener;
5093
this.m_contactFactory = new b2ContactFactory(this.m_allocator);
5094
this.m_broadPhase = new b2DynamicTreeBroadPhase();
5095
}
5096
b2ContactManager.prototype.AddPair = function (proxyUserDataA, proxyUserDataB) {
5097
var fixtureA = (proxyUserDataA instanceof b2Fixture ? proxyUserDataA : null);
5098
var fixtureB = (proxyUserDataB instanceof b2Fixture ? proxyUserDataB : null);
5099
var bodyA = fixtureA.GetBody();
5100
var bodyB = fixtureB.GetBody();
5101
if (bodyA == bodyB) return;
5102
var edge = bodyB.GetContactList();
5103
while (edge) {
5104
if (edge.other == bodyA) {
5105
var fA = edge.contact.GetFixtureA();
5106
var fB = edge.contact.GetFixtureB();
5107
if (fA == fixtureA && fB == fixtureB) return;
5108
if (fA == fixtureB && fB == fixtureA) return;
5109
}
5110
edge = edge.next;
5111
}
5112
if (bodyB.ShouldCollide(bodyA) == false) {
5113
return;
5114
}
5115
if (this.m_contactFilter.ShouldCollide(fixtureA, fixtureB) == false) {
5116
return;
5117
}
5118
var c = this.m_contactFactory.Create(fixtureA, fixtureB);
5119
fixtureA = c.GetFixtureA();
5120
fixtureB = c.GetFixtureB();
5121
bodyA = fixtureA.m_body;
5122
bodyB = fixtureB.m_body;
5123
c.m_prev = null;
5124
c.m_next = this.m_world.m_contactList;
5125
if (this.m_world.m_contactList != null) {
5126
this.m_world.m_contactList.m_prev = c;
5127
}
5128
this.m_world.m_contactList = c;
5129
c.m_nodeA.contact = c;
5130
c.m_nodeA.other = bodyB;
5131
c.m_nodeA.prev = null;
5132
c.m_nodeA.next = bodyA.m_contactList;
5133
if (bodyA.m_contactList != null) {
5134
bodyA.m_contactList.prev = c.m_nodeA;
5135
}
5136
bodyA.m_contactList = c.m_nodeA;
5137
c.m_nodeB.contact = c;
5138
c.m_nodeB.other = bodyA;
5139
c.m_nodeB.prev = null;
5140
c.m_nodeB.next = bodyB.m_contactList;
5141
if (bodyB.m_contactList != null) {
5142
bodyB.m_contactList.prev = c.m_nodeB;
5143
}
5144
bodyB.m_contactList = c.m_nodeB;
5145
++this.m_world.m_contactCount;
5146
return;
5147
}
5148
b2ContactManager.prototype.FindNewContacts = function () {
5149
this.m_broadPhase.UpdatePairs(Box2D.generateCallback(this, this.AddPair));
5150
}
5151
b2ContactManager.prototype.Destroy = function (c) {
5152
var fixtureA = c.GetFixtureA();
5153
var fixtureB = c.GetFixtureB();
5154
var bodyA = fixtureA.GetBody();
5155
var bodyB = fixtureB.GetBody();
5156
if (c.IsTouching()) {
5157
this.m_contactListener.EndContact(c);
5158
}
5159
if (c.m_prev) {
5160
c.m_prev.m_next = c.m_next;
5161
}
5162
if (c.m_next) {
5163
c.m_next.m_prev = c.m_prev;
5164
}
5165
if (c == this.m_world.m_contactList) {
5166
this.m_world.m_contactList = c.m_next;
5167
}
5168
if (c.m_nodeA.prev) {
5169
c.m_nodeA.prev.next = c.m_nodeA.next;
5170
}
5171
if (c.m_nodeA.next) {
5172
c.m_nodeA.next.prev = c.m_nodeA.prev;
5173
}
5174
if (c.m_nodeA == bodyA.m_contactList) {
5175
bodyA.m_contactList = c.m_nodeA.next;
5176
}
5177
if (c.m_nodeB.prev) {
5178
c.m_nodeB.prev.next = c.m_nodeB.next;
5179
}
5180
if (c.m_nodeB.next) {
5181
c.m_nodeB.next.prev = c.m_nodeB.prev;
5182
}
5183
if (c.m_nodeB == bodyB.m_contactList) {
5184
bodyB.m_contactList = c.m_nodeB.next;
5185
}
5186
this.m_contactFactory.Destroy(c);
5187
--this.m_contactCount;
5188
}
5189
b2ContactManager.prototype.Collide = function () {
5190
var c = this.m_world.m_contactList;
5191
while (c) {
5192
var fixtureA = c.GetFixtureA();
5193
var fixtureB = c.GetFixtureB();
5194
var bodyA = fixtureA.GetBody();
5195
var bodyB = fixtureB.GetBody();
5196
if (bodyA.IsAwake() == false && bodyB.IsAwake() == false) {
5197
c = c.GetNext();
5198
continue;
5199
}
5200
if (c.m_flags & b2Contact.e_filterFlag) {
5201
if (bodyB.ShouldCollide(bodyA) == false) {
5202
var cNuke = c;
5203
c = cNuke.GetNext();
5204
this.Destroy(cNuke);
5205
continue;
5206
}
5207
if (this.m_contactFilter.ShouldCollide(fixtureA, fixtureB) == false) {
5208
cNuke = c;
5209
c = cNuke.GetNext();
5210
this.Destroy(cNuke);
5211
continue;
5212
}
5213
c.m_flags &= ~b2Contact.e_filterFlag;
5214
}
5215
var proxyA = fixtureA.m_proxy;
5216
var proxyB = fixtureB.m_proxy;
5217
var overlap = this.m_broadPhase.TestOverlap(proxyA, proxyB);
5218
if (overlap == false) {
5219
cNuke = c;
5220
c = cNuke.GetNext();
5221
this.Destroy(cNuke);
5222
continue;
5223
}
5224
c.Update(this.m_contactListener);
5225
c = c.GetNext();
5226
}
5227
}
5228
Box2D.postDefs.push(function () {
5229
Box2D.Dynamics.b2ContactManager.s_evalCP = new b2ContactPoint();
5230
});
5231
b2DebugDraw.b2DebugDraw = function () {};
5232
b2DebugDraw.prototype.b2DebugDraw = function () {}
5233
b2DebugDraw.prototype.SetFlags = function (flags) {
5234
if (flags === undefined) flags = 0;
5235
}
5236
b2DebugDraw.prototype.GetFlags = function () {}
5237
b2DebugDraw.prototype.AppendFlags = function (flags) {
5238
if (flags === undefined) flags = 0;
5239
}
5240
b2DebugDraw.prototype.ClearFlags = function (flags) {
5241
if (flags === undefined) flags = 0;
5242
}
5243
b2DebugDraw.prototype.SetSprite = function (sprite) {}
5244
b2DebugDraw.prototype.GetSprite = function () {}
5245
b2DebugDraw.prototype.SetDrawScale = function (drawScale) {
5246
if (drawScale === undefined) drawScale = 0;
5247
}
5248
b2DebugDraw.prototype.GetDrawScale = function () {}
5249
b2DebugDraw.prototype.SetLineThickness = function (lineThickness) {
5250
if (lineThickness === undefined) lineThickness = 0;
5251
}
5252
b2DebugDraw.prototype.GetLineThickness = function () {}
5253
b2DebugDraw.prototype.SetAlpha = function (alpha) {
5254
if (alpha === undefined) alpha = 0;
5255
}
5256
b2DebugDraw.prototype.GetAlpha = function () {}
5257
b2DebugDraw.prototype.SetFillAlpha = function (alpha) {
5258
if (alpha === undefined) alpha = 0;
5259
}
5260
b2DebugDraw.prototype.GetFillAlpha = function () {}
5261
b2DebugDraw.prototype.SetXFormScale = function (xformScale) {
5262
if (xformScale === undefined) xformScale = 0;
5263
}
5264
b2DebugDraw.prototype.GetXFormScale = function () {}
5265
b2DebugDraw.prototype.DrawPolygon = function (vertices, vertexCount, color) {
5266
if (vertexCount === undefined) vertexCount = 0;
5267
}
5268
b2DebugDraw.prototype.DrawSolidPolygon = function (vertices, vertexCount, color) {
5269
if (vertexCount === undefined) vertexCount = 0;
5270
}
5271
b2DebugDraw.prototype.DrawCircle = function (center, radius, color) {
5272
if (radius === undefined) radius = 0;
5273
}
5274
b2DebugDraw.prototype.DrawSolidCircle = function (center, radius, axis, color) {
5275
if (radius === undefined) radius = 0;
5276
}
5277
b2DebugDraw.prototype.DrawSegment = function (p1, p2, color) {}
5278
b2DebugDraw.prototype.DrawTransform = function (xf) {}
5279
Box2D.postDefs.push(function () {
5280
Box2D.Dynamics.b2DebugDraw.e_shapeBit = 0x0001;
5281
Box2D.Dynamics.b2DebugDraw.e_jointBit = 0x0002;
5282
Box2D.Dynamics.b2DebugDraw.e_aabbBit = 0x0004;
5283
Box2D.Dynamics.b2DebugDraw.e_pairBit = 0x0008;
5284
Box2D.Dynamics.b2DebugDraw.e_centerOfMassBit = 0x0010;
5285
Box2D.Dynamics.b2DebugDraw.e_controllerBit = 0x0020;
5286
});
5287
b2DestructionListener.b2DestructionListener = function () {};
5288
b2DestructionListener.prototype.SayGoodbyeJoint = function (joint) {}
5289
b2DestructionListener.prototype.SayGoodbyeFixture = function (fixture) {}
5290
b2FilterData.b2FilterData = function () {
5291
this.categoryBits = 0x0001;
5292
this.maskBits = 0xFFFF;
5293
this.groupIndex = 0;
5294
};
5295
b2FilterData.prototype.Copy = function () {
5296
var copy = new b2FilterData();
5297
copy.categoryBits = this.categoryBits;
5298
copy.maskBits = this.maskBits;
5299
copy.groupIndex = this.groupIndex;
5300
return copy;
5301
}
5302
b2Fixture.b2Fixture = function () {
5303
this.m_filter = new b2FilterData();
5304
};
5305
b2Fixture.prototype.GetType = function () {
5306
return this.m_shape.GetType();
5307
}
5308
b2Fixture.prototype.GetShape = function () {
5309
return this.m_shape;
5310
}
5311
b2Fixture.prototype.SetSensor = function (sensor) {
5312
if (this.m_isSensor == sensor) return;
5313
this.m_isSensor = sensor;
5314
if (this.m_body == null) return;
5315
var edge = this.m_body.GetContactList();
5316
while (edge) {
5317
var contact = edge.contact;
5318
var fixtureA = contact.GetFixtureA();
5319
var fixtureB = contact.GetFixtureB();
5320
if (fixtureA == this || fixtureB == this) contact.SetSensor(fixtureA.IsSensor() || fixtureB.IsSensor());
5321
edge = edge.next;
5322
}
5323
}
5324
b2Fixture.prototype.IsSensor = function () {
5325
return this.m_isSensor;
5326
}
5327
b2Fixture.prototype.SetFilterData = function (filter) {
5328
this.m_filter = filter.Copy();
5329
if (this.m_body) return;
5330
var edge = this.m_body.GetContactList();
5331
while (edge) {
5332
var contact = edge.contact;
5333
var fixtureA = contact.GetFixtureA();
5334
var fixtureB = contact.GetFixtureB();
5335
if (fixtureA == this || fixtureB == this) contact.FlagForFiltering();
5336
edge = edge.next;
5337
}
5338
}
5339
b2Fixture.prototype.GetFilterData = function () {
5340
return this.m_filter.Copy();
5341
}
5342
b2Fixture.prototype.GetBody = function () {
5343
return this.m_body;
5344
}
5345
b2Fixture.prototype.GetNext = function () {
5346
return this.m_next;
5347
}
5348
b2Fixture.prototype.GetUserData = function () {
5349
return this.m_userData;
5350
}
5351
b2Fixture.prototype.SetUserData = function (data) {
5352
this.m_userData = data;
5353
}
5354
b2Fixture.prototype.TestPoint = function (p) {
5355
return this.m_shape.TestPoint(this.m_body.GetTransform(), p);
5356
}
5357
b2Fixture.prototype.RayCast = function (output, input) {
5358
return this.m_shape.RayCast(output, input, this.m_body.GetTransform());
5359
}
5360
b2Fixture.prototype.GetMassData = function (massData) {
5361
if (massData === undefined) massData = null;
5362
if (massData == null) {
5363
massData = new b2MassData();
5364
}
5365
this.m_shape.ComputeMass(massData, this.m_density);
5366
return massData;
5367
}
5368
b2Fixture.prototype.SetDensity = function (density) {
5369
if (density === undefined) density = 0;
5370
this.m_density = density;
5371
}
5372
b2Fixture.prototype.GetDensity = function () {
5373
return this.m_density;
5374
}
5375
b2Fixture.prototype.GetFriction = function () {
5376
return this.m_friction;
5377
}
5378
b2Fixture.prototype.SetFriction = function (friction) {
5379
if (friction === undefined) friction = 0;
5380
this.m_friction = friction;
5381
}
5382
b2Fixture.prototype.GetRestitution = function () {
5383
return this.m_restitution;
5384
}
5385
b2Fixture.prototype.SetRestitution = function (restitution) {
5386
if (restitution === undefined) restitution = 0;
5387
this.m_restitution = restitution;
5388
}
5389
b2Fixture.prototype.GetAABB = function () {
5390
return this.m_aabb;
5391
}
5392
b2Fixture.prototype.b2Fixture = function () {
5393
this.m_aabb = new b2AABB();
5394
this.m_userData = null;
5395
this.m_body = null;
5396
this.m_next = null;
5397
this.m_shape = null;
5398
this.m_density = 0.0;
5399
this.m_friction = 0.0;
5400
this.m_restitution = 0.0;
5401
}
5402
b2Fixture.prototype.Create = function (body, xf, def) {
5403
this.m_userData = def.userData;
5404
this.m_friction = def.friction;
5405
this.m_restitution = def.restitution;
5406
this.m_body = body;
5407
this.m_next = null;
5408
this.m_filter = def.filter.Copy();
5409
this.m_isSensor = def.isSensor;
5410
this.m_shape = def.shape.Copy();
5411
this.m_density = def.density;
5412
}
5413
b2Fixture.prototype.Destroy = function () {
5414
this.m_shape = null;
5415
}
5416
b2Fixture.prototype.CreateProxy = function (broadPhase, xf) {
5417
this.m_shape.ComputeAABB(this.m_aabb, xf);
5418
this.m_proxy = broadPhase.CreateProxy(this.m_aabb, this);
5419
}
5420
b2Fixture.prototype.DestroyProxy = function (broadPhase) {
5421
if (this.m_proxy == null) {
5422
return;
5423
}
5424
broadPhase.DestroyProxy(this.m_proxy);
5425
this.m_proxy = null;
5426
}
5427
b2Fixture.prototype.Synchronize = function (broadPhase, transform1, transform2) {
5428
if (!this.m_proxy) return;
5429
var aabb1 = new b2AABB();
5430
var aabb2 = new b2AABB();
5431
this.m_shape.ComputeAABB(aabb1, transform1);
5432
this.m_shape.ComputeAABB(aabb2, transform2);
5433
this.m_aabb.Combine(aabb1, aabb2);
5434
var displacement = b2Math.SubtractVV(transform2.position, transform1.position);
5435
broadPhase.MoveProxy(this.m_proxy, this.m_aabb, displacement);
5436
}
5437
b2FixtureDef.b2FixtureDef = function () {
5438
this.filter = new b2FilterData();
5439
};
5440
b2FixtureDef.prototype.b2FixtureDef = function () {
5441
this.shape = null;
5442
this.userData = null;
5443
this.friction = 0.2;
5444
this.restitution = 0.0;
5445
this.density = 0.0;
5446
this.filter.categoryBits = 0x0001;
5447
this.filter.maskBits = 0xFFFF;
5448
this.filter.groupIndex = 0;
5449
this.isSensor = false;
5450
}
5451
b2Island.b2Island = function () {};
5452
b2Island.prototype.b2Island = function () {
5453
this.m_bodies = new Vector();
5454
this.m_contacts = new Vector();
5455
this.m_joints = new Vector();
5456
}
5457
b2Island.prototype.Initialize = function (bodyCapacity, contactCapacity, jointCapacity, allocator, listener, contactSolver) {
5458
if (bodyCapacity === undefined) bodyCapacity = 0;
5459
if (contactCapacity === undefined) contactCapacity = 0;
5460
if (jointCapacity === undefined) jointCapacity = 0;
5461
var i = 0;
5462
this.m_bodyCapacity = bodyCapacity;
5463
this.m_contactCapacity = contactCapacity;
5464
this.m_jointCapacity = jointCapacity;
5465
this.m_bodyCount = 0;
5466
this.m_contactCount = 0;
5467
this.m_jointCount = 0;
5468
this.m_allocator = allocator;
5469
this.m_listener = listener;
5470
this.m_contactSolver = contactSolver;
5471
for (i = this.m_bodies.length;
5472
i < bodyCapacity; i++)
5473
this.m_bodies[i] = null;
5474
for (i = this.m_contacts.length;
5475
i < contactCapacity; i++)
5476
this.m_contacts[i] = null;
5477
for (i = this.m_joints.length;
5478
i < jointCapacity; i++)
5479
this.m_joints[i] = null;
5480
}
5481
b2Island.prototype.Clear = function () {
5482
this.m_bodyCount = 0;
5483
this.m_contactCount = 0;
5484
this.m_jointCount = 0;
5485
}
5486
b2Island.prototype.Solve = function (step, gravity, allowSleep) {
5487
var i = 0;
5488
var j = 0;
5489
var b;
5490
var joint;
5491
for (i = 0;
5492
i < this.m_bodyCount; ++i) {
5493
b = this.m_bodies[i];
5494
if (b.GetType() != b2Body.b2_dynamicBody) continue;
5495
b.m_linearVelocity.x += step.dt * (gravity.x + b.m_invMass * b.m_force.x);
5496
b.m_linearVelocity.y += step.dt * (gravity.y + b.m_invMass * b.m_force.y);
5497
b.m_angularVelocity += step.dt * b.m_invI * b.m_torque;
5498
b.m_linearVelocity.Multiply(b2Math.Clamp(1.0 - step.dt * b.m_linearDamping, 0.0, 1.0));
5499
b.m_angularVelocity *= b2Math.Clamp(1.0 - step.dt * b.m_angularDamping, 0.0, 1.0);
5500
}
5501
this.m_contactSolver.Initialize(step, this.m_contacts, this.m_contactCount, this.m_allocator);
5502
var contactSolver = this.m_contactSolver;
5503
contactSolver.InitVelocityConstraints(step);
5504
for (i = 0;
5505
i < this.m_jointCount; ++i) {
5506
joint = this.m_joints[i];
5507
joint.InitVelocityConstraints(step);
5508
}
5509
for (i = 0;
5510
i < step.velocityIterations; ++i) {
5511
for (j = 0;
5512
j < this.m_jointCount; ++j) {
5513
joint = this.m_joints[j];
5514
joint.SolveVelocityConstraints(step);
5515
}
5516
contactSolver.SolveVelocityConstraints();
5517
}
5518
for (i = 0;
5519
i < this.m_jointCount; ++i) {
5520
joint = this.m_joints[i];
5521
joint.FinalizeVelocityConstraints();
5522
}
5523
contactSolver.FinalizeVelocityConstraints();
5524
for (i = 0;
5525
i < this.m_bodyCount; ++i) {
5526
b = this.m_bodies[i];
5527
if (b.GetType() == b2Body.b2_staticBody) continue;
5528
var translationX = step.dt * b.m_linearVelocity.x;
5529
var translationY = step.dt * b.m_linearVelocity.y;
5530
if ((translationX * translationX + translationY * translationY) > b2Settings.b2_maxTranslationSquared) {
5531
b.m_linearVelocity.Normalize();
5532
b.m_linearVelocity.x *= b2Settings.b2_maxTranslation * step.inv_dt;
5533
b.m_linearVelocity.y *= b2Settings.b2_maxTranslation * step.inv_dt;
5534
}
5535
var rotation = step.dt * b.m_angularVelocity;
5536
if (rotation * rotation > b2Settings.b2_maxRotationSquared) {
5537
if (b.m_angularVelocity < 0.0) {
5538
b.m_angularVelocity = (-b2Settings.b2_maxRotation * step.inv_dt);
5539
}
5540
else {
5541
b.m_angularVelocity = b2Settings.b2_maxRotation * step.inv_dt;
5542
}
5543
}
5544
b.m_sweep.c0.SetV(b.m_sweep.c);
5545
b.m_sweep.a0 = b.m_sweep.a;
5546
b.m_sweep.c.x += step.dt * b.m_linearVelocity.x;
5547
b.m_sweep.c.y += step.dt * b.m_linearVelocity.y;
5548
b.m_sweep.a += step.dt * b.m_angularVelocity;
5549
b.SynchronizeTransform();
5550
}
5551
for (i = 0;
5552
i < step.positionIterations; ++i) {
5553
var contactsOkay = contactSolver.SolvePositionConstraints(b2Settings.b2_contactBaumgarte);
5554
var jointsOkay = true;
5555
for (j = 0;
5556
j < this.m_jointCount; ++j) {
5557
joint = this.m_joints[j];
5558
var jointOkay = joint.SolvePositionConstraints(b2Settings.b2_contactBaumgarte);
5559
jointsOkay = jointsOkay && jointOkay;
5560
}
5561
if (contactsOkay && jointsOkay) {
5562
break;
5563
}
5564
}
5565
this.Report(contactSolver.m_constraints);
5566
if (allowSleep) {
5567
var minSleepTime = Number.MAX_VALUE;
5568
var linTolSqr = b2Settings.b2_linearSleepTolerance * b2Settings.b2_linearSleepTolerance;
5569
var angTolSqr = b2Settings.b2_angularSleepTolerance * b2Settings.b2_angularSleepTolerance;
5570
for (i = 0;
5571
i < this.m_bodyCount; ++i) {
5572
b = this.m_bodies[i];
5573
if (b.GetType() == b2Body.b2_staticBody) {
5574
continue;
5575
}
5576
if ((b.m_flags & b2Body.e_allowSleepFlag) == 0) {
5577
b.m_sleepTime = 0.0;
5578
minSleepTime = 0.0;
5579
}
5580
if ((b.m_flags & b2Body.e_allowSleepFlag) == 0 || b.m_angularVelocity * b.m_angularVelocity > angTolSqr || b2Math.Dot(b.m_linearVelocity, b.m_linearVelocity) > linTolSqr) {
5581
b.m_sleepTime = 0.0;
5582
minSleepTime = 0.0;
5583
}
5584
else {
5585
b.m_sleepTime += step.dt;
5586
minSleepTime = b2Math.Min(minSleepTime, b.m_sleepTime);
5587
}
5588
}
5589
if (minSleepTime >= b2Settings.b2_timeToSleep) {
5590
for (i = 0;
5591
i < this.m_bodyCount; ++i) {
5592
b = this.m_bodies[i];
5593
b.SetAwake(false);
5594
}
5595
}
5596
}
5597
}
5598
b2Island.prototype.SolveTOI = function (subStep) {
5599
var i = 0;
5600
var j = 0;
5601
this.m_contactSolver.Initialize(subStep, this.m_contacts, this.m_contactCount, this.m_allocator);
5602
var contactSolver = this.m_contactSolver;
5603
for (i = 0;
5604
i < this.m_jointCount; ++i) {
5605
this.m_joints[i].InitVelocityConstraints(subStep);
5606
}
5607
for (i = 0;
5608
i < subStep.velocityIterations; ++i) {
5609
contactSolver.SolveVelocityConstraints();
5610
for (j = 0;
5611
j < this.m_jointCount; ++j) {
5612
this.m_joints[j].SolveVelocityConstraints(subStep);
5613
}
5614
}
5615
for (i = 0;
5616
i < this.m_bodyCount; ++i) {
5617
var b = this.m_bodies[i];
5618
if (b.GetType() == b2Body.b2_staticBody) continue;
5619
var translationX = subStep.dt * b.m_linearVelocity.x;
5620
var translationY = subStep.dt * b.m_linearVelocity.y;
5621
if ((translationX * translationX + translationY * translationY) > b2Settings.b2_maxTranslationSquared) {
5622
b.m_linearVelocity.Normalize();
5623
b.m_linearVelocity.x *= b2Settings.b2_maxTranslation * subStep.inv_dt;
5624
b.m_linearVelocity.y *= b2Settings.b2_maxTranslation * subStep.inv_dt;
5625
}
5626
var rotation = subStep.dt * b.m_angularVelocity;
5627
if (rotation * rotation > b2Settings.b2_maxRotationSquared) {
5628
if (b.m_angularVelocity < 0.0) {
5629
b.m_angularVelocity = (-b2Settings.b2_maxRotation * subStep.inv_dt);
5630
}
5631
else {
5632
b.m_angularVelocity = b2Settings.b2_maxRotation * subStep.inv_dt;
5633
}
5634
}
5635
b.m_sweep.c0.SetV(b.m_sweep.c);
5636
b.m_sweep.a0 = b.m_sweep.a;
5637
b.m_sweep.c.x += subStep.dt * b.m_linearVelocity.x;
5638
b.m_sweep.c.y += subStep.dt * b.m_linearVelocity.y;
5639
b.m_sweep.a += subStep.dt * b.m_angularVelocity;
5640
b.SynchronizeTransform();
5641
}
5642
var k_toiBaumgarte = 0.75;
5643
for (i = 0;
5644
i < subStep.positionIterations; ++i) {
5645
var contactsOkay = contactSolver.SolvePositionConstraints(k_toiBaumgarte);
5646
var jointsOkay = true;
5647
for (j = 0;
5648
j < this.m_jointCount; ++j) {
5649
var jointOkay = this.m_joints[j].SolvePositionConstraints(b2Settings.b2_contactBaumgarte);
5650
jointsOkay = jointsOkay && jointOkay;
5651
}
5652
if (contactsOkay && jointsOkay) {
5653
break;
5654
}
5655
}
5656
this.Report(contactSolver.m_constraints);
5657
}
5658
b2Island.prototype.Report = function (constraints) {
5659
if (this.m_listener == null) {
5660
return;
5661
}
5662
for (var i = 0; i < this.m_contactCount; ++i) {
5663
var c = this.m_contacts[i];
5664
var cc = constraints[i];
5665
for (var j = 0; j < cc.pointCount; ++j) {
5666
b2Island.s_impulse.normalImpulses[j] = cc.points[j].normalImpulse;
5667
b2Island.s_impulse.tangentImpulses[j] = cc.points[j].tangentImpulse;
5668
}
5669
this.m_listener.PostSolve(c, b2Island.s_impulse);
5670
}
5671
}
5672
b2Island.prototype.AddBody = function (body) {
5673
body.m_islandIndex = this.m_bodyCount;
5674
this.m_bodies[this.m_bodyCount++] = body;
5675
}
5676
b2Island.prototype.AddContact = function (contact) {
5677
this.m_contacts[this.m_contactCount++] = contact;
5678
}
5679
b2Island.prototype.AddJoint = function (joint) {
5680
this.m_joints[this.m_jointCount++] = joint;
5681
}
5682
Box2D.postDefs.push(function () {
5683
Box2D.Dynamics.b2Island.s_impulse = new b2ContactImpulse();
5684
});
5685
b2TimeStep.b2TimeStep = function () {};
5686
b2TimeStep.prototype.Set = function (step) {
5687
this.dt = step.dt;
5688
this.inv_dt = step.inv_dt;
5689
this.positionIterations = step.positionIterations;
5690
this.velocityIterations = step.velocityIterations;
5691
this.warmStarting = step.warmStarting;
5692
}
5693
b2World.b2World = function () {
5694
this.s_stack = new Vector();
5695
this.m_contactManager = new b2ContactManager();
5696
this.m_contactSolver = new b2ContactSolver();
5697
this.m_island = new b2Island();
5698
};
5699
b2World.prototype.b2World = function (gravity, doSleep) {
5700
this.m_destructionListener = null;
5701
this.m_debugDraw = null;
5702
this.m_bodyList = null;
5703
this.m_contactList = null;
5704
this.m_jointList = null;
5705
this.m_controllerList = null;
5706
this.m_bodyCount = 0;
5707
this.m_contactCount = 0;
5708
this.m_jointCount = 0;
5709
this.m_controllerCount = 0;
5710
b2World.m_warmStarting = true;
5711
b2World.m_continuousPhysics = true;
5712
this.m_allowSleep = doSleep;
5713
this.m_gravity = gravity;
5714
this.m_inv_dt0 = 0.0;
5715
this.m_contactManager.m_world = this;
5716
var bd = new b2BodyDef();
5717
this.m_groundBody = this.CreateBody(bd);
5718
}
5719
b2World.prototype.SetDestructionListener = function (listener) {
5720
this.m_destructionListener = listener;
5721
}
5722
b2World.prototype.SetContactFilter = function (filter) {
5723
this.m_contactManager.m_contactFilter = filter;
5724
}
5725
b2World.prototype.SetContactListener = function (listener) {
5726
this.m_contactManager.m_contactListener = listener;
5727
}
5728
b2World.prototype.SetDebugDraw = function (debugDraw) {
5729
this.m_debugDraw = debugDraw;
5730
}
5731
b2World.prototype.SetBroadPhase = function (broadPhase) {
5732
var oldBroadPhase = this.m_contactManager.m_broadPhase;
5733
this.m_contactManager.m_broadPhase = broadPhase;
5734
for (var b = this.m_bodyList; b; b = b.m_next) {
5735
for (var f = b.m_fixtureList; f; f = f.m_next) {
5736
f.m_proxy = broadPhase.CreateProxy(oldBroadPhase.GetFatAABB(f.m_proxy), f);
5737
}
5738
}
5739
}
5740
b2World.prototype.Validate = function () {
5741
this.m_contactManager.m_broadPhase.Validate();
5742
}
5743
b2World.prototype.GetProxyCount = function () {
5744
return this.m_contactManager.m_broadPhase.GetProxyCount();
5745
}
5746
b2World.prototype.CreateBody = function (def) {
5747
if (this.IsLocked() == true) {
5748
return null;
5749
}
5750
var b = new b2Body(def, this);
5751
b.m_prev = null;
5752
b.m_next = this.m_bodyList;
5753
if (this.m_bodyList) {
5754
this.m_bodyList.m_prev = b;
5755
}
5756
this.m_bodyList = b;
5757
++this.m_bodyCount;
5758
return b;
5759
}
5760
b2World.prototype.DestroyBody = function (b) {
5761
if (this.IsLocked() == true) {
5762
return;
5763
}
5764
var jn = b.m_jointList;
5765
while (jn) {
5766
var jn0 = jn;
5767
jn = jn.next;
5768
if (this.m_destructionListener) {
5769
this.m_destructionListener.SayGoodbyeJoint(jn0.joint);
5770
}
5771
this.DestroyJoint(jn0.joint);
5772
}
5773
var coe = b.m_controllerList;
5774
while (coe) {
5775
var coe0 = coe;
5776
coe = coe.nextController;
5777
coe0.controller.RemoveBody(b);
5778
}
5779
var ce = b.m_contactList;
5780
while (ce) {
5781
var ce0 = ce;
5782
ce = ce.next;
5783
this.m_contactManager.Destroy(ce0.contact);
5784
}
5785
b.m_contactList = null;
5786
var f = b.m_fixtureList;
5787
while (f) {
5788
var f0 = f;
5789
f = f.m_next;
5790
if (this.m_destructionListener) {
5791
this.m_destructionListener.SayGoodbyeFixture(f0);
5792
}
5793
f0.DestroyProxy(this.m_contactManager.m_broadPhase);
5794
f0.Destroy();
5795
}
5796
b.m_fixtureList = null;
5797
b.m_fixtureCount = 0;
5798
if (b.m_prev) {
5799
b.m_prev.m_next = b.m_next;
5800
}
5801
if (b.m_next) {
5802
b.m_next.m_prev = b.m_prev;
5803
}
5804
if (b == this.m_bodyList) {
5805
this.m_bodyList = b.m_next;
5806
}--this.m_bodyCount;
5807
}
5808
b2World.prototype.CreateJoint = function (def) {
5809
var j = b2Joint.Create(def, null);
5810
j.m_prev = null;
5811
j.m_next = this.m_jointList;
5812
if (this.m_jointList) {
5813
this.m_jointList.m_prev = j;
5814
}
5815
this.m_jointList = j;
5816
++this.m_jointCount;
5817
j.m_edgeA.joint = j;
5818
j.m_edgeA.other = j.m_bodyB;
5819
j.m_edgeA.prev = null;
5820
j.m_edgeA.next = j.m_bodyA.m_jointList;
5821
if (j.m_bodyA.m_jointList) j.m_bodyA.m_jointList.prev = j.m_edgeA;
5822
j.m_bodyA.m_jointList = j.m_edgeA;
5823
j.m_edgeB.joint = j;
5824
j.m_edgeB.other = j.m_bodyA;
5825
j.m_edgeB.prev = null;
5826
j.m_edgeB.next = j.m_bodyB.m_jointList;
5827
if (j.m_bodyB.m_jointList) j.m_bodyB.m_jointList.prev = j.m_edgeB;
5828
j.m_bodyB.m_jointList = j.m_edgeB;
5829
var bodyA = def.bodyA;
5830
var bodyB = def.bodyB;
5831
if (def.collideConnected == false) {
5832
var edge = bodyB.GetContactList();
5833
while (edge) {
5834
if (edge.other == bodyA) {
5835
edge.contact.FlagForFiltering();
5836
}
5837
edge = edge.next;
5838
}
5839
}
5840
return j;
5841
}
5842
b2World.prototype.DestroyJoint = function (j) {
5843
var collideConnected = j.m_collideConnected;
5844
if (j.m_prev) {
5845
j.m_prev.m_next = j.m_next;
5846
}
5847
if (j.m_next) {
5848
j.m_next.m_prev = j.m_prev;
5849
}
5850
if (j == this.m_jointList) {
5851
this.m_jointList = j.m_next;
5852
}
5853
var bodyA = j.m_bodyA;
5854
var bodyB = j.m_bodyB;
5855
bodyA.SetAwake(true);
5856
bodyB.SetAwake(true);
5857
if (j.m_edgeA.prev) {
5858
j.m_edgeA.prev.next = j.m_edgeA.next;
5859
}
5860
if (j.m_edgeA.next) {
5861
j.m_edgeA.next.prev = j.m_edgeA.prev;
5862
}
5863
if (j.m_edgeA == bodyA.m_jointList) {
5864
bodyA.m_jointList = j.m_edgeA.next;
5865
}
5866
j.m_edgeA.prev = null;
5867
j.m_edgeA.next = null;
5868
if (j.m_edgeB.prev) {
5869
j.m_edgeB.prev.next = j.m_edgeB.next;
5870
}
5871
if (j.m_edgeB.next) {
5872
j.m_edgeB.next.prev = j.m_edgeB.prev;
5873
}
5874
if (j.m_edgeB == bodyB.m_jointList) {
5875
bodyB.m_jointList = j.m_edgeB.next;
5876
}
5877
j.m_edgeB.prev = null;
5878
j.m_edgeB.next = null;
5879
b2Joint.Destroy(j, null);
5880
--this.m_jointCount;
5881
if (collideConnected == false) {
5882
var edge = bodyB.GetContactList();
5883
while (edge) {
5884
if (edge.other == bodyA) {
5885
edge.contact.FlagForFiltering();
5886
}
5887
edge = edge.next;
5888
}
5889
}
5890
}
5891
b2World.prototype.AddController = function (c) {
5892
c.m_next = this.m_controllerList;
5893
c.m_prev = null;
5894
this.m_controllerList = c;
5895
c.m_world = this;
5896
this.m_controllerCount++;
5897
return c;
5898
}
5899
b2World.prototype.RemoveController = function (c) {
5900
if (c.m_prev) c.m_prev.m_next = c.m_next;
5901
if (c.m_next) c.m_next.m_prev = c.m_prev;
5902
if (this.m_controllerList == c) this.m_controllerList = c.m_next;
5903
this.m_controllerCount--;
5904
}
5905
b2World.prototype.CreateController = function (controller) {
5906
if (controller.m_world != this) throw new Error("Controller can only be a member of one world");
5907
controller.m_next = this.m_controllerList;
5908
controller.m_prev = null;
5909
if (this.m_controllerList) this.m_controllerList.m_prev = controller;
5910
this.m_controllerList = controller;
5911
++this.m_controllerCount;
5912
controller.m_world = this;
5913
return controller;
5914
}
5915
b2World.prototype.DestroyController = function (controller) {
5916
controller.Clear();
5917
if (controller.m_next) controller.m_next.m_prev = controller.m_prev;
5918
if (controller.m_prev) controller.m_prev.m_next = controller.m_next;
5919
if (controller == this.m_controllerList) this.m_controllerList = controller.m_next;
5920
--this.m_controllerCount;
5921
}
5922
b2World.prototype.SetWarmStarting = function (flag) {
5923
b2World.m_warmStarting = flag;
5924
}
5925
b2World.prototype.SetContinuousPhysics = function (flag) {
5926
b2World.m_continuousPhysics = flag;
5927
}
5928
b2World.prototype.GetBodyCount = function () {
5929
return this.m_bodyCount;
5930
}
5931
b2World.prototype.GetJointCount = function () {
5932
return this.m_jointCount;
5933
}
5934
b2World.prototype.GetContactCount = function () {
5935
return this.m_contactCount;
5936
}
5937
b2World.prototype.SetGravity = function (gravity) {
5938
this.m_gravity = gravity;
5939
}
5940
b2World.prototype.GetGravity = function () {
5941
return this.m_gravity;
5942
}
5943
b2World.prototype.GetGroundBody = function () {
5944
return this.m_groundBody;
5945
}
5946
b2World.prototype.Step = function (dt, velocityIterations, positionIterations) {
5947
if (dt === undefined) dt = 0;
5948
if (velocityIterations === undefined) velocityIterations = 0;
5949
if (positionIterations === undefined) positionIterations = 0;
5950
if (this.m_flags & b2World.e_newFixture) {
5951
this.m_contactManager.FindNewContacts();
5952
this.m_flags &= ~b2World.e_newFixture;
5953
}
5954
this.m_flags |= b2World.e_locked;
5955
var step = b2World.s_timestep2;
5956
step.dt = dt;
5957
step.velocityIterations = velocityIterations;
5958
step.positionIterations = positionIterations;
5959
if (dt > 0.0) {
5960
step.inv_dt = 1.0 / dt;
5961
}
5962
else {
5963
step.inv_dt = 0.0;
5964
}
5965
step.dtRatio = this.m_inv_dt0 * dt;
5966
step.warmStarting = b2World.m_warmStarting;
5967
this.m_contactManager.Collide();
5968
if (step.dt > 0.0) {
5969
this.Solve(step);
5970
}
5971
if (b2World.m_continuousPhysics && step.dt > 0.0) {
5972
this.SolveTOI(step);
5973
}
5974
if (step.dt > 0.0) {
5975
this.m_inv_dt0 = step.inv_dt;
5976
}
5977
this.m_flags &= ~b2World.e_locked;
5978
}
5979
b2World.prototype.ClearForces = function () {
5980
for (var body = this.m_bodyList; body; body = body.m_next) {
5981
body.m_force.SetZero();
5982
body.m_torque = 0.0;
5983
}
5984
}
5985
b2World.prototype.DrawDebugData = function () {
5986
if (this.m_debugDraw == null) {
5987
return;
5988
}
5989
this.m_debugDraw.m_sprite.graphics.clear();
5990
var flags = this.m_debugDraw.GetFlags();
5991
var i = 0;
5992
var b;
5993
var f;
5994
var s;
5995
var j;
5996
var bp;
5997
var invQ = new b2Vec2;
5998
var x1 = new b2Vec2;
5999
var x2 = new b2Vec2;
6000
var xf;
6001
var b1 = new b2AABB();
6002
var b2 = new b2AABB();
6003
var vs = [new b2Vec2(), new b2Vec2(), new b2Vec2(), new b2Vec2()];
6004
var color = new b2Color(0, 0, 0);
6005
if (flags & b2DebugDraw.e_shapeBit) {
6006
for (b = this.m_bodyList;
6007
b; b = b.m_next) {
6008
xf = b.m_xf;
6009
for (f = b.GetFixtureList();
6010
f; f = f.m_next) {
6011
s = f.GetShape();
6012
if (b.IsActive() == false) {
6013
color.Set(0.5, 0.5, 0.3);
6014
this.DrawShape(s, xf, color);
6015
}
6016
else if (b.GetType() == b2Body.b2_staticBody) {
6017
color.Set(0.5, 0.9, 0.5);
6018
this.DrawShape(s, xf, color);
6019
}
6020
else if (b.GetType() == b2Body.b2_kinematicBody) {
6021
color.Set(0.5, 0.5, 0.9);
6022
this.DrawShape(s, xf, color);
6023
}
6024
else if (b.IsAwake() == false) {
6025
color.Set(0.6, 0.6, 0.6);
6026
this.DrawShape(s, xf, color);
6027
}
6028
else {
6029
color.Set(0.9, 0.7, 0.7);
6030
this.DrawShape(s, xf, color);
6031
}
6032
}
6033
}
6034
}
6035
if (flags & b2DebugDraw.e_jointBit) {
6036
for (j = this.m_jointList;
6037
j; j = j.m_next) {
6038
this.DrawJoint(j);
6039
}
6040
}
6041
if (flags & b2DebugDraw.e_controllerBit) {
6042
for (var c = this.m_controllerList; c; c = c.m_next) {
6043
c.Draw(this.m_debugDraw);
6044
}
6045
}
6046
if (flags & b2DebugDraw.e_pairBit) {
6047
color.Set(0.3, 0.9, 0.9);
6048
for (var contact = this.m_contactManager.m_contactList; contact; contact = contact.GetNext()) {
6049
var fixtureA = contact.GetFixtureA();
6050
var fixtureB = contact.GetFixtureB();
6051
var cA = fixtureA.GetAABB().GetCenter();
6052
var cB = fixtureB.GetAABB().GetCenter();
6053
this.m_debugDraw.DrawSegment(cA, cB, color);
6054
}
6055
}
6056
if (flags & b2DebugDraw.e_aabbBit) {
6057
bp = this.m_contactManager.m_broadPhase;
6058
vs = [new b2Vec2(), new b2Vec2(), new b2Vec2(), new b2Vec2()];
6059
for (b = this.m_bodyList;
6060
b; b = b.GetNext()) {
6061
if (b.IsActive() == false) {
6062
continue;
6063
}
6064
for (f = b.GetFixtureList();
6065
f; f = f.GetNext()) {
6066
var aabb = bp.GetFatAABB(f.m_proxy);
6067
vs[0].Set(aabb.lowerBound.x, aabb.lowerBound.y);
6068
vs[1].Set(aabb.upperBound.x, aabb.lowerBound.y);
6069
vs[2].Set(aabb.upperBound.x, aabb.upperBound.y);
6070
vs[3].Set(aabb.lowerBound.x, aabb.upperBound.y);
6071
this.m_debugDraw.DrawPolygon(vs, 4, color);
6072
}
6073
}
6074
}
6075
if (flags & b2DebugDraw.e_centerOfMassBit) {
6076
for (b = this.m_bodyList;
6077
b; b = b.m_next) {
6078
xf = b2World.s_xf;
6079
xf.R = b.m_xf.R;
6080
xf.position = b.GetWorldCenter();
6081
this.m_debugDraw.DrawTransform(xf);
6082
}
6083
}
6084
}
6085
b2World.prototype.QueryAABB = function (callback, aabb) {
6086
var __this = this;
6087
var broadPhase = __this.m_contactManager.m_broadPhase;
6088
6089
function WorldQueryWrapper(proxy) {
6090
return callback(broadPhase.GetUserData(proxy));
6091
};
6092
broadPhase.Query(WorldQueryWrapper, aabb);
6093
}
6094
b2World.prototype.QueryShape = function (callback, shape, transform) {
6095
var __this = this;
6096
if (transform === undefined) transform = null;
6097
if (transform == null) {
6098
transform = new b2Transform();
6099
transform.SetIdentity();
6100
}
6101
var broadPhase = __this.m_contactManager.m_broadPhase;
6102
6103
function WorldQueryWrapper(proxy) {
6104
var fixture = (broadPhase.GetUserData(proxy) instanceof b2Fixture ? broadPhase.GetUserData(proxy) : null);
6105
if (b2Shape.TestOverlap(shape, transform, fixture.GetShape(), fixture.GetBody().GetTransform())) return callback(fixture);
6106
return true;
6107
};
6108
var aabb = new b2AABB();
6109
shape.ComputeAABB(aabb, transform);
6110
broadPhase.Query(WorldQueryWrapper, aabb);
6111
}
6112
b2World.prototype.QueryPoint = function (callback, p) {
6113
var __this = this;
6114
var broadPhase = __this.m_contactManager.m_broadPhase;
6115
6116
function WorldQueryWrapper(proxy) {
6117
var fixture = (broadPhase.GetUserData(proxy) instanceof b2Fixture ? broadPhase.GetUserData(proxy) : null);
6118
if (fixture.TestPoint(p)) return callback(fixture);
6119
return true;
6120
};
6121
var aabb = new b2AABB();
6122
aabb.lowerBound.Set(p.x - b2Settings.b2_linearSlop, p.y - b2Settings.b2_linearSlop);
6123
aabb.upperBound.Set(p.x + b2Settings.b2_linearSlop, p.y + b2Settings.b2_linearSlop);
6124
broadPhase.Query(WorldQueryWrapper, aabb);
6125
}
6126
b2World.prototype.RayCast = function (callback, point1, point2) {
6127
var __this = this;
6128
var broadPhase = __this.m_contactManager.m_broadPhase;
6129
var output = new b2RayCastOutput;
6130
6131
function RayCastWrapper(input, proxy) {
6132
var userData = broadPhase.GetUserData(proxy);
6133
var fixture = (userData instanceof b2Fixture ? userData : null);
6134
var hit = fixture.RayCast(output, input);
6135
if (hit) {
6136
var fraction = output.fraction;
6137
var point = new b2Vec2((1.0 - fraction) * point1.x + fraction * point2.x, (1.0 - fraction) * point1.y + fraction * point2.y);
6138
return callback(fixture, point, output.normal, fraction);
6139
}
6140
return input.maxFraction;
6141
};
6142
var input = new b2RayCastInput(point1, point2);
6143
broadPhase.RayCast(RayCastWrapper, input);
6144
}
6145
b2World.prototype.RayCastOne = function (point1, point2) {
6146
var __this = this;
6147
var result;
6148
6149
function RayCastOneWrapper(fixture, point, normal, fraction) {
6150
if (fraction === undefined) fraction = 0;
6151
result = fixture;
6152
return fraction;
6153
};
6154
__this.RayCast(RayCastOneWrapper, point1, point2);
6155
return result;
6156
}
6157
b2World.prototype.RayCastAll = function (point1, point2) {
6158
var __this = this;
6159
var result = new Vector();
6160
6161
function RayCastAllWrapper(fixture, point, normal, fraction) {
6162
if (fraction === undefined) fraction = 0;
6163
result[result.length] = fixture;
6164
return 1;
6165
};
6166
__this.RayCast(RayCastAllWrapper, point1, point2);
6167
return result;
6168
}
6169
b2World.prototype.GetBodyList = function () {
6170
return this.m_bodyList;
6171
}
6172
b2World.prototype.GetJointList = function () {
6173
return this.m_jointList;
6174
}
6175
b2World.prototype.GetContactList = function () {
6176
return this.m_contactList;
6177
}
6178
b2World.prototype.IsLocked = function () {
6179
return (this.m_flags & b2World.e_locked) > 0;
6180
}
6181
b2World.prototype.Solve = function (step) {
6182
var b;
6183
for (var controller = this.m_controllerList; controller; controller = controller.m_next) {
6184
controller.Step(step);
6185
}
6186
var island = this.m_island;
6187
island.Initialize(this.m_bodyCount, this.m_contactCount, this.m_jointCount, null, this.m_contactManager.m_contactListener, this.m_contactSolver);
6188
for (b = this.m_bodyList;
6189
b; b = b.m_next) {
6190
b.m_flags &= ~b2Body.e_islandFlag;
6191
}
6192
for (var c = this.m_contactList; c; c = c.m_next) {
6193
c.m_flags &= ~b2Contact.e_islandFlag;
6194
}
6195
for (var j = this.m_jointList; j; j = j.m_next) {
6196
j.m_islandFlag = false;
6197
}
6198
var stackSize = parseInt(this.m_bodyCount);
6199
var stack = this.s_stack;
6200
for (var seed = this.m_bodyList; seed; seed = seed.m_next) {
6201
if (seed.m_flags & b2Body.e_islandFlag) {
6202
continue;
6203
}
6204
if (seed.IsAwake() == false || seed.IsActive() == false) {
6205
continue;
6206
}
6207
if (seed.GetType() == b2Body.b2_staticBody) {
6208
continue;
6209
}
6210
island.Clear();
6211
var stackCount = 0;
6212
stack[stackCount++] = seed;
6213
seed.m_flags |= b2Body.e_islandFlag;
6214
while (stackCount > 0) {
6215
b = stack[--stackCount];
6216
island.AddBody(b);
6217
if (b.IsAwake() == false) {
6218
b.SetAwake(true);
6219
}
6220
if (b.GetType() == b2Body.b2_staticBody) {
6221
continue;
6222
}
6223
var other;
6224
for (var ce = b.m_contactList; ce; ce = ce.next) {
6225
if (ce.contact.m_flags & b2Contact.e_islandFlag) {
6226
continue;
6227
}
6228
if (ce.contact.IsSensor() == true || ce.contact.IsEnabled() == false || ce.contact.IsTouching() == false) {
6229
continue;
6230
}
6231
island.AddContact(ce.contact);
6232
ce.contact.m_flags |= b2Contact.e_islandFlag;
6233
other = ce.other;
6234
if (other.m_flags & b2Body.e_islandFlag) {
6235
continue;
6236
}
6237
stack[stackCount++] = other;
6238
other.m_flags |= b2Body.e_islandFlag;
6239
}
6240
for (var jn = b.m_jointList; jn; jn = jn.next) {
6241
if (jn.joint.m_islandFlag == true) {
6242
continue;
6243
}
6244
other = jn.other;
6245
if (other.IsActive() == false) {
6246
continue;
6247
}
6248
island.AddJoint(jn.joint);
6249
jn.joint.m_islandFlag = true;
6250
if (other.m_flags & b2Body.e_islandFlag) {
6251
continue;
6252
}
6253
stack[stackCount++] = other;
6254
other.m_flags |= b2Body.e_islandFlag;
6255
}
6256
}
6257
island.Solve(step, this.m_gravity, this.m_allowSleep);
6258
for (var i = 0; i < island.m_bodyCount; ++i) {
6259
b = island.m_bodies[i];
6260
if (b.GetType() == b2Body.b2_staticBody) {
6261
b.m_flags &= ~b2Body.e_islandFlag;
6262
}
6263
}
6264
}
6265
for (i = 0;
6266
i < stack.length; ++i) {
6267
if (!stack[i]) break;
6268
stack[i] = null;
6269
}
6270
for (b = this.m_bodyList;
6271
b; b = b.m_next) {
6272
if (b.IsAwake() == false || b.IsActive() == false) {
6273
continue;
6274
}
6275
if (b.GetType() == b2Body.b2_staticBody) {
6276
continue;
6277
}
6278
b.SynchronizeFixtures();
6279
}
6280
this.m_contactManager.FindNewContacts();
6281
}
6282
b2World.prototype.SolveTOI = function (step) {
6283
var b;
6284
var fA;
6285
var fB;
6286
var bA;
6287
var bB;
6288
var cEdge;
6289
var j;
6290
var island = this.m_island;
6291
island.Initialize(this.m_bodyCount, b2Settings.b2_maxTOIContactsPerIsland, b2Settings.b2_maxTOIJointsPerIsland, null, this.m_contactManager.m_contactListener, this.m_contactSolver);
6292
var queue = b2World.s_queue;
6293
for (b = this.m_bodyList;
6294
b; b = b.m_next) {
6295
b.m_flags &= ~b2Body.e_islandFlag;
6296
b.m_sweep.t0 = 0.0;
6297
}
6298
var c;
6299
for (c = this.m_contactList;
6300
c; c = c.m_next) {
6301
c.m_flags &= ~ (b2Contact.e_toiFlag | b2Contact.e_islandFlag);
6302
}
6303
for (j = this.m_jointList;
6304
j; j = j.m_next) {
6305
j.m_islandFlag = false;
6306
}
6307
for (;;) {
6308
var minContact = null;
6309
var minTOI = 1.0;
6310
for (c = this.m_contactList;
6311
c; c = c.m_next) {
6312
if (c.IsSensor() == true || c.IsEnabled() == false || c.IsContinuous() == false) {
6313
continue;
6314
}
6315
var toi = 1.0;
6316
if (c.m_flags & b2Contact.e_toiFlag) {
6317
toi = c.m_toi;
6318
}
6319
else {
6320
fA = c.m_fixtureA;
6321
fB = c.m_fixtureB;
6322
bA = fA.m_body;
6323
bB = fB.m_body;
6324
if ((bA.GetType() != b2Body.b2_dynamicBody || bA.IsAwake() == false) && (bB.GetType() != b2Body.b2_dynamicBody || bB.IsAwake() == false)) {
6325
continue;
6326
}
6327
var t0 = bA.m_sweep.t0;
6328
if (bA.m_sweep.t0 < bB.m_sweep.t0) {
6329
t0 = bB.m_sweep.t0;
6330
bA.m_sweep.Advance(t0);
6331
}
6332
else if (bB.m_sweep.t0 < bA.m_sweep.t0) {
6333
t0 = bA.m_sweep.t0;
6334
bB.m_sweep.Advance(t0);
6335
}
6336
toi = c.ComputeTOI(bA.m_sweep, bB.m_sweep);
6337
b2Settings.b2Assert(0.0 <= toi && toi <= 1.0);
6338
if (toi > 0.0 && toi < 1.0) {
6339
toi = (1.0 - toi) * t0 + toi;
6340
if (toi > 1) toi = 1;
6341
}
6342
c.m_toi = toi;
6343
c.m_flags |= b2Contact.e_toiFlag;
6344
}
6345
if (Number.MIN_VALUE < toi && toi < minTOI) {
6346
minContact = c;
6347
minTOI = toi;
6348
}
6349
}
6350
if (minContact == null || 1.0 - 100.0 * Number.MIN_VALUE < minTOI) {
6351
break;
6352
}
6353
fA = minContact.m_fixtureA;
6354
fB = minContact.m_fixtureB;
6355
bA = fA.m_body;
6356
bB = fB.m_body;
6357
b2World.s_backupA.Set(bA.m_sweep);
6358
b2World.s_backupB.Set(bB.m_sweep);
6359
bA.Advance(minTOI);
6360
bB.Advance(minTOI);
6361
minContact.Update(this.m_contactManager.m_contactListener);
6362
minContact.m_flags &= ~b2Contact.e_toiFlag;
6363
if (minContact.IsSensor() == true || minContact.IsEnabled() == false) {
6364
bA.m_sweep.Set(b2World.s_backupA);
6365
bB.m_sweep.Set(b2World.s_backupB);
6366
bA.SynchronizeTransform();
6367
bB.SynchronizeTransform();
6368
continue;
6369
}
6370
if (minContact.IsTouching() == false) {
6371
continue;
6372
}
6373
var seed = bA;
6374
if (seed.GetType() != b2Body.b2_dynamicBody) {
6375
seed = bB;
6376
}
6377
island.Clear();
6378
var queueStart = 0;
6379
var queueSize = 0;
6380
queue[queueStart + queueSize++] = seed;
6381
seed.m_flags |= b2Body.e_islandFlag;
6382
while (queueSize > 0) {
6383
b = queue[queueStart++];
6384
--queueSize;
6385
island.AddBody(b);
6386
if (b.IsAwake() == false) {
6387
b.SetAwake(true);
6388
}
6389
if (b.GetType() != b2Body.b2_dynamicBody) {
6390
continue;
6391
}
6392
for (cEdge = b.m_contactList;
6393
cEdge; cEdge = cEdge.next) {
6394
if (island.m_contactCount == island.m_contactCapacity) {
6395
break;
6396
}
6397
if (cEdge.contact.m_flags & b2Contact.e_islandFlag) {
6398
continue;
6399
}
6400
if (cEdge.contact.IsSensor() == true || cEdge.contact.IsEnabled() == false || cEdge.contact.IsTouching() == false) {
6401
continue;
6402
}
6403
island.AddContact(cEdge.contact);
6404
cEdge.contact.m_flags |= b2Contact.e_islandFlag;
6405
var other = cEdge.other;
6406
if (other.m_flags & b2Body.e_islandFlag) {
6407
continue;
6408
}
6409
if (other.GetType() != b2Body.b2_staticBody) {
6410
other.Advance(minTOI);
6411
other.SetAwake(true);
6412
}
6413
queue[queueStart + queueSize] = other;
6414
++queueSize;
6415
other.m_flags |= b2Body.e_islandFlag;
6416
}
6417
for (var jEdge = b.m_jointList; jEdge; jEdge = jEdge.next) {
6418
if (island.m_jointCount == island.m_jointCapacity) continue;
6419
if (jEdge.joint.m_islandFlag == true) continue;
6420
other = jEdge.other;
6421
if (other.IsActive() == false) {
6422
continue;
6423
}
6424
island.AddJoint(jEdge.joint);
6425
jEdge.joint.m_islandFlag = true;
6426
if (other.m_flags & b2Body.e_islandFlag) continue;
6427
if (other.GetType() != b2Body.b2_staticBody) {
6428
other.Advance(minTOI);
6429
other.SetAwake(true);
6430
}
6431
queue[queueStart + queueSize] = other;
6432
++queueSize;
6433
other.m_flags |= b2Body.e_islandFlag;
6434
}
6435
}
6436
var subStep = b2World.s_timestep;
6437
subStep.warmStarting = false;
6438
subStep.dt = (1.0 - minTOI) * step.dt;
6439
subStep.inv_dt = 1.0 / subStep.dt;
6440
subStep.dtRatio = 0.0;
6441
subStep.velocityIterations = step.velocityIterations;
6442
subStep.positionIterations = step.positionIterations;
6443
island.SolveTOI(subStep);
6444
var i = 0;
6445
for (i = 0;
6446
i < island.m_bodyCount; ++i) {
6447
b = island.m_bodies[i];
6448
b.m_flags &= ~b2Body.e_islandFlag;
6449
if (b.IsAwake() == false) {
6450
continue;
6451
}
6452
if (b.GetType() != b2Body.b2_dynamicBody) {
6453
continue;
6454
}
6455
b.SynchronizeFixtures();
6456
for (cEdge = b.m_contactList;
6457
cEdge; cEdge = cEdge.next) {
6458
cEdge.contact.m_flags &= ~b2Contact.e_toiFlag;
6459
}
6460
}
6461
for (i = 0;
6462
i < island.m_contactCount; ++i) {
6463
c = island.m_contacts[i];
6464
c.m_flags &= ~ (b2Contact.e_toiFlag | b2Contact.e_islandFlag);
6465
}
6466
for (i = 0;
6467
i < island.m_jointCount; ++i) {
6468
j = island.m_joints[i];
6469
j.m_islandFlag = false;
6470
}
6471
this.m_contactManager.FindNewContacts();
6472
}
6473
}
6474
b2World.prototype.DrawJoint = function (joint) {
6475
var b1 = joint.GetBodyA();
6476
var b2 = joint.GetBodyB();
6477
var xf1 = b1.m_xf;
6478
var xf2 = b2.m_xf;
6479
var x1 = xf1.position;
6480
var x2 = xf2.position;
6481
var p1 = joint.GetAnchorA();
6482
var p2 = joint.GetAnchorB();
6483
var color = b2World.s_jointColor;
6484
switch (joint.m_type) {
6485
case b2Joint.e_distanceJoint:
6486
this.m_debugDraw.DrawSegment(p1, p2, color);
6487
break;
6488
case b2Joint.e_pulleyJoint:
6489
{
6490
var pulley = ((joint instanceof b2PulleyJoint ? joint : null));
6491
var s1 = pulley.GetGroundAnchorA();
6492
var s2 = pulley.GetGroundAnchorB();
6493
this.m_debugDraw.DrawSegment(s1, p1, color);
6494
this.m_debugDraw.DrawSegment(s2, p2, color);
6495
this.m_debugDraw.DrawSegment(s1, s2, color);
6496
}
6497
break;
6498
case b2Joint.e_mouseJoint:
6499
this.m_debugDraw.DrawSegment(p1, p2, color);
6500
break;
6501
default:
6502
if (b1 != this.m_groundBody) this.m_debugDraw.DrawSegment(x1, p1, color);
6503
this.m_debugDraw.DrawSegment(p1, p2, color);
6504
if (b2 != this.m_groundBody) this.m_debugDraw.DrawSegment(x2, p2, color);
6505
}
6506
}
6507
b2World.prototype.DrawShape = function (shape, xf, color) {
6508
switch (shape.m_type) {
6509
case b2Shape.e_circleShape:
6510
{
6511
var circle = ((shape instanceof b2CircleShape ? shape : null));
6512
var center = b2Math.MulX(xf, circle.m_p);
6513
var radius = circle.m_radius;
6514
var axis = xf.R.col1;
6515
this.m_debugDraw.DrawSolidCircle(center, radius, axis, color);
6516
}
6517
break;
6518
case b2Shape.e_polygonShape:
6519
{
6520
var i = 0;
6521
var poly = ((shape instanceof b2PolygonShape ? shape : null));
6522
var vertexCount = parseInt(poly.GetVertexCount());
6523
var localVertices = poly.GetVertices();
6524
var vertices = new Vector(vertexCount);
6525
for (i = 0;
6526
i < vertexCount; ++i) {
6527
vertices[i] = b2Math.MulX(xf, localVertices[i]);
6528
}
6529
this.m_debugDraw.DrawSolidPolygon(vertices, vertexCount, color);
6530
}
6531
break;
6532
case b2Shape.e_edgeShape:
6533
{
6534
var edge = (shape instanceof b2EdgeShape ? shape : null);
6535
this.m_debugDraw.DrawSegment(b2Math.MulX(xf, edge.GetVertex1()), b2Math.MulX(xf, edge.GetVertex2()), color);
6536
}
6537
break;
6538
}
6539
}
6540
Box2D.postDefs.push(function () {
6541
Box2D.Dynamics.b2World.s_timestep2 = new b2TimeStep();
6542
Box2D.Dynamics.b2World.s_xf = new b2Transform();
6543
Box2D.Dynamics.b2World.s_backupA = new b2Sweep();
6544
Box2D.Dynamics.b2World.s_backupB = new b2Sweep();
6545
Box2D.Dynamics.b2World.s_timestep = new b2TimeStep();
6546
Box2D.Dynamics.b2World.s_queue = new Vector();
6547
Box2D.Dynamics.b2World.s_jointColor = new b2Color(0.5, 0.8, 0.8);
6548
Box2D.Dynamics.b2World.e_newFixture = 0x0001;
6549
Box2D.Dynamics.b2World.e_locked = 0x0002;
6550
});
6551
})();
6552
(function () {
6553
var b2CircleShape = Box2D.Collision.Shapes.b2CircleShape,
6554
b2EdgeChainDef = Box2D.Collision.Shapes.b2EdgeChainDef,
6555
b2EdgeShape = Box2D.Collision.Shapes.b2EdgeShape,
6556
b2MassData = Box2D.Collision.Shapes.b2MassData,
6557
b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape,
6558
b2Shape = Box2D.Collision.Shapes.b2Shape,
6559
b2CircleContact = Box2D.Dynamics.Contacts.b2CircleContact,
6560
b2Contact = Box2D.Dynamics.Contacts.b2Contact,
6561
b2ContactConstraint = Box2D.Dynamics.Contacts.b2ContactConstraint,
6562
b2ContactConstraintPoint = Box2D.Dynamics.Contacts.b2ContactConstraintPoint,
6563
b2ContactEdge = Box2D.Dynamics.Contacts.b2ContactEdge,
6564
b2ContactFactory = Box2D.Dynamics.Contacts.b2ContactFactory,
6565
b2ContactRegister = Box2D.Dynamics.Contacts.b2ContactRegister,
6566
b2ContactResult = Box2D.Dynamics.Contacts.b2ContactResult,
6567
b2ContactSolver = Box2D.Dynamics.Contacts.b2ContactSolver,
6568
b2EdgeAndCircleContact = Box2D.Dynamics.Contacts.b2EdgeAndCircleContact,
6569
b2NullContact = Box2D.Dynamics.Contacts.b2NullContact,
6570
b2PolyAndCircleContact = Box2D.Dynamics.Contacts.b2PolyAndCircleContact,
6571
b2PolyAndEdgeContact = Box2D.Dynamics.Contacts.b2PolyAndEdgeContact,
6572
b2PolygonContact = Box2D.Dynamics.Contacts.b2PolygonContact,
6573
b2PositionSolverManifold = Box2D.Dynamics.Contacts.b2PositionSolverManifold,
6574
b2Body = Box2D.Dynamics.b2Body,
6575
b2BodyDef = Box2D.Dynamics.b2BodyDef,
6576
b2ContactFilter = Box2D.Dynamics.b2ContactFilter,
6577
b2ContactImpulse = Box2D.Dynamics.b2ContactImpulse,
6578
b2ContactListener = Box2D.Dynamics.b2ContactListener,
6579
b2ContactManager = Box2D.Dynamics.b2ContactManager,
6580
b2DebugDraw = Box2D.Dynamics.b2DebugDraw,
6581
b2DestructionListener = Box2D.Dynamics.b2DestructionListener,
6582
b2FilterData = Box2D.Dynamics.b2FilterData,
6583
b2Fixture = Box2D.Dynamics.b2Fixture,
6584
b2FixtureDef = Box2D.Dynamics.b2FixtureDef,
6585
b2Island = Box2D.Dynamics.b2Island,
6586
b2TimeStep = Box2D.Dynamics.b2TimeStep,
6587
b2World = Box2D.Dynamics.b2World,
6588
b2Color = Box2D.Common.b2Color,
6589
b2internal = Box2D.Common.b2internal,
6590
b2Settings = Box2D.Common.b2Settings,
6591
b2Mat22 = Box2D.Common.Math.b2Mat22,
6592
b2Mat33 = Box2D.Common.Math.b2Mat33,
6593
b2Math = Box2D.Common.Math.b2Math,
6594
b2Sweep = Box2D.Common.Math.b2Sweep,
6595
b2Transform = Box2D.Common.Math.b2Transform,
6596
b2Vec2 = Box2D.Common.Math.b2Vec2,
6597
b2Vec3 = Box2D.Common.Math.b2Vec3,
6598
b2AABB = Box2D.Collision.b2AABB,
6599
b2Bound = Box2D.Collision.b2Bound,
6600
b2BoundValues = Box2D.Collision.b2BoundValues,
6601
b2Collision = Box2D.Collision.b2Collision,
6602
b2ContactID = Box2D.Collision.b2ContactID,
6603
b2ContactPoint = Box2D.Collision.b2ContactPoint,
6604
b2Distance = Box2D.Collision.b2Distance,
6605
b2DistanceInput = Box2D.Collision.b2DistanceInput,
6606
b2DistanceOutput = Box2D.Collision.b2DistanceOutput,
6607
b2DistanceProxy = Box2D.Collision.b2DistanceProxy,
6608
b2DynamicTree = Box2D.Collision.b2DynamicTree,
6609
b2DynamicTreeBroadPhase = Box2D.Collision.b2DynamicTreeBroadPhase,
6610
b2DynamicTreeNode = Box2D.Collision.b2DynamicTreeNode,
6611
b2DynamicTreePair = Box2D.Collision.b2DynamicTreePair,
6612
b2Manifold = Box2D.Collision.b2Manifold,
6613
b2ManifoldPoint = Box2D.Collision.b2ManifoldPoint,
6614
b2Point = Box2D.Collision.b2Point,
6615
b2RayCastInput = Box2D.Collision.b2RayCastInput,
6616
b2RayCastOutput = Box2D.Collision.b2RayCastOutput,
6617
b2Segment = Box2D.Collision.b2Segment,
6618
b2SeparationFunction = Box2D.Collision.b2SeparationFunction,
6619
b2Simplex = Box2D.Collision.b2Simplex,
6620
b2SimplexCache = Box2D.Collision.b2SimplexCache,
6621
b2SimplexVertex = Box2D.Collision.b2SimplexVertex,
6622
b2TimeOfImpact = Box2D.Collision.b2TimeOfImpact,
6623
b2TOIInput = Box2D.Collision.b2TOIInput,
6624
b2WorldManifold = Box2D.Collision.b2WorldManifold,
6625
ClipVertex = Box2D.Collision.ClipVertex,
6626
Features = Box2D.Collision.Features,
6627
IBroadPhase = Box2D.Collision.IBroadPhase;
6628
6629
Box2D.inherit(b2CircleContact, Box2D.Dynamics.Contacts.b2Contact);
6630
b2CircleContact.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype;
6631
b2CircleContact.b2CircleContact = function () {
6632
Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments);
6633
};
6634
b2CircleContact.Create = function (allocator) {
6635
return new b2CircleContact();
6636
}
6637
b2CircleContact.Destroy = function (contact, allocator) {}
6638
b2CircleContact.prototype.Reset = function (fixtureA, fixtureB) {
6639
this.__super.Reset.call(this, fixtureA, fixtureB);
6640
}
6641
b2CircleContact.prototype.Evaluate = function () {
6642
var bA = this.m_fixtureA.GetBody();
6643
var bB = this.m_fixtureB.GetBody();
6644
b2Collision.CollideCircles(this.m_manifold, (this.m_fixtureA.GetShape() instanceof b2CircleShape ? this.m_fixtureA.GetShape() : null), bA.m_xf, (this.m_fixtureB.GetShape() instanceof b2CircleShape ? this.m_fixtureB.GetShape() : null), bB.m_xf);
6645
}
6646
b2Contact.b2Contact = function () {
6647
this.m_nodeA = new b2ContactEdge();
6648
this.m_nodeB = new b2ContactEdge();
6649
this.m_manifold = new b2Manifold();
6650
this.m_oldManifold = new b2Manifold();
6651
};
6652
b2Contact.prototype.GetManifold = function () {
6653
return this.m_manifold;
6654
}
6655
b2Contact.prototype.GetWorldManifold = function (worldManifold) {
6656
var bodyA = this.m_fixtureA.GetBody();
6657
var bodyB = this.m_fixtureB.GetBody();
6658
var shapeA = this.m_fixtureA.GetShape();
6659
var shapeB = this.m_fixtureB.GetShape();
6660
worldManifold.Initialize(this.m_manifold, bodyA.GetTransform(), shapeA.m_radius, bodyB.GetTransform(), shapeB.m_radius);
6661
}
6662
b2Contact.prototype.IsTouching = function () {
6663
return (this.m_flags & b2Contact.e_touchingFlag) == b2Contact.e_touchingFlag;
6664
}
6665
b2Contact.prototype.IsContinuous = function () {
6666
return (this.m_flags & b2Contact.e_continuousFlag) == b2Contact.e_continuousFlag;
6667
}
6668
b2Contact.prototype.SetSensor = function (sensor) {
6669
if (sensor) {
6670
this.m_flags |= b2Contact.e_sensorFlag;
6671
}
6672
else {
6673
this.m_flags &= ~b2Contact.e_sensorFlag;
6674
}
6675
}
6676
b2Contact.prototype.IsSensor = function () {
6677
return (this.m_flags & b2Contact.e_sensorFlag) == b2Contact.e_sensorFlag;
6678
}
6679
b2Contact.prototype.SetEnabled = function (flag) {
6680
if (flag) {
6681
this.m_flags |= b2Contact.e_enabledFlag;
6682
}
6683
else {
6684
this.m_flags &= ~b2Contact.e_enabledFlag;
6685
}
6686
}
6687
b2Contact.prototype.IsEnabled = function () {
6688
return (this.m_flags & b2Contact.e_enabledFlag) == b2Contact.e_enabledFlag;
6689
}
6690
b2Contact.prototype.GetNext = function () {
6691
return this.m_next;
6692
}
6693
b2Contact.prototype.GetFixtureA = function () {
6694
return this.m_fixtureA;
6695
}
6696
b2Contact.prototype.GetFixtureB = function () {
6697
return this.m_fixtureB;
6698
}
6699
b2Contact.prototype.FlagForFiltering = function () {
6700
this.m_flags |= b2Contact.e_filterFlag;
6701
}
6702
b2Contact.prototype.b2Contact = function () {}
6703
b2Contact.prototype.Reset = function (fixtureA, fixtureB) {
6704
if (fixtureA === undefined) fixtureA = null;
6705
if (fixtureB === undefined) fixtureB = null;
6706
this.m_flags = b2Contact.e_enabledFlag;
6707
if (!fixtureA || !fixtureB) {
6708
this.m_fixtureA = null;
6709
this.m_fixtureB = null;
6710
return;
6711
}
6712
if (fixtureA.IsSensor() || fixtureB.IsSensor()) {
6713
this.m_flags |= b2Contact.e_sensorFlag;
6714
}
6715
var bodyA = fixtureA.GetBody();
6716
var bodyB = fixtureB.GetBody();
6717
if (bodyA.GetType() != b2Body.b2_dynamicBody || bodyA.IsBullet() || bodyB.GetType() != b2Body.b2_dynamicBody || bodyB.IsBullet()) {
6718
this.m_flags |= b2Contact.e_continuousFlag;
6719
}
6720
this.m_fixtureA = fixtureA;
6721
this.m_fixtureB = fixtureB;
6722
this.m_manifold.m_pointCount = 0;
6723
this.m_prev = null;
6724
this.m_next = null;
6725
this.m_nodeA.contact = null;
6726
this.m_nodeA.prev = null;
6727
this.m_nodeA.next = null;
6728
this.m_nodeA.other = null;
6729
this.m_nodeB.contact = null;
6730
this.m_nodeB.prev = null;
6731
this.m_nodeB.next = null;
6732
this.m_nodeB.other = null;
6733
}
6734
b2Contact.prototype.Update = function (listener) {
6735
var tManifold = this.m_oldManifold;
6736
this.m_oldManifold = this.m_manifold;
6737
this.m_manifold = tManifold;
6738
this.m_flags |= b2Contact.e_enabledFlag;
6739
var touching = false;
6740
var wasTouching = (this.m_flags & b2Contact.e_touchingFlag) == b2Contact.e_touchingFlag;
6741
var bodyA = this.m_fixtureA.m_body;
6742
var bodyB = this.m_fixtureB.m_body;
6743
var aabbOverlap = this.m_fixtureA.m_aabb.TestOverlap(this.m_fixtureB.m_aabb);
6744
if (this.m_flags & b2Contact.e_sensorFlag) {
6745
if (aabbOverlap) {
6746
var shapeA = this.m_fixtureA.GetShape();
6747
var shapeB = this.m_fixtureB.GetShape();
6748
var xfA = bodyA.GetTransform();
6749
var xfB = bodyB.GetTransform();
6750
touching = b2Shape.TestOverlap(shapeA, xfA, shapeB, xfB);
6751
}
6752
this.m_manifold.m_pointCount = 0;
6753
}
6754
else {
6755
if (bodyA.GetType() != b2Body.b2_dynamicBody || bodyA.IsBullet() || bodyB.GetType() != b2Body.b2_dynamicBody || bodyB.IsBullet()) {
6756
this.m_flags |= b2Contact.e_continuousFlag;
6757
}
6758
else {
6759
this.m_flags &= ~b2Contact.e_continuousFlag;
6760
}
6761
if (aabbOverlap) {
6762
this.Evaluate();
6763
touching = this.m_manifold.m_pointCount > 0;
6764
for (var i = 0; i < this.m_manifold.m_pointCount; ++i) {
6765
var mp2 = this.m_manifold.m_points[i];
6766
mp2.m_normalImpulse = 0.0;
6767
mp2.m_tangentImpulse = 0.0;
6768
var id2 = mp2.m_id;
6769
for (var j = 0; j < this.m_oldManifold.m_pointCount; ++j) {
6770
var mp1 = this.m_oldManifold.m_points[j];
6771
if (mp1.m_id.key == id2.key) {
6772
mp2.m_normalImpulse = mp1.m_normalImpulse;
6773
mp2.m_tangentImpulse = mp1.m_tangentImpulse;
6774
break;
6775
}
6776
}
6777
}
6778
}
6779
else {
6780
this.m_manifold.m_pointCount = 0;
6781
}
6782
if (touching != wasTouching) {
6783
bodyA.SetAwake(true);
6784
bodyB.SetAwake(true);
6785
}
6786
}
6787
if (touching) {
6788
this.m_flags |= b2Contact.e_touchingFlag;
6789
}
6790
else {
6791
this.m_flags &= ~b2Contact.e_touchingFlag;
6792
}
6793
if (wasTouching == false && touching == true) {
6794
listener.BeginContact(this);
6795
}
6796
if (wasTouching == true && touching == false) {
6797
listener.EndContact(this);
6798
}
6799
if ((this.m_flags & b2Contact.e_sensorFlag) == 0) {
6800
listener.PreSolve(this, this.m_oldManifold);
6801
}
6802
}
6803
b2Contact.prototype.Evaluate = function () {}
6804
b2Contact.prototype.ComputeTOI = function (sweepA, sweepB) {
6805
b2Contact.s_input.proxyA.Set(this.m_fixtureA.GetShape());
6806
b2Contact.s_input.proxyB.Set(this.m_fixtureB.GetShape());
6807
b2Contact.s_input.sweepA = sweepA;
6808
b2Contact.s_input.sweepB = sweepB;
6809
b2Contact.s_input.tolerance = b2Settings.b2_linearSlop;
6810
return b2TimeOfImpact.TimeOfImpact(b2Contact.s_input);
6811
}
6812
Box2D.postDefs.push(function () {
6813
Box2D.Dynamics.Contacts.b2Contact.e_sensorFlag = 0x0001;
6814
Box2D.Dynamics.Contacts.b2Contact.e_continuousFlag = 0x0002;
6815
Box2D.Dynamics.Contacts.b2Contact.e_islandFlag = 0x0004;
6816
Box2D.Dynamics.Contacts.b2Contact.e_toiFlag = 0x0008;
6817
Box2D.Dynamics.Contacts.b2Contact.e_touchingFlag = 0x0010;
6818
Box2D.Dynamics.Contacts.b2Contact.e_enabledFlag = 0x0020;
6819
Box2D.Dynamics.Contacts.b2Contact.e_filterFlag = 0x0040;
6820
Box2D.Dynamics.Contacts.b2Contact.s_input = new b2TOIInput();
6821
});
6822
b2ContactConstraint.b2ContactConstraint = function () {
6823
this.localPlaneNormal = new b2Vec2();
6824
this.localPoint = new b2Vec2();
6825
this.normal = new b2Vec2();
6826
this.normalMass = new b2Mat22();
6827
this.K = new b2Mat22();
6828
};
6829
b2ContactConstraint.prototype.b2ContactConstraint = function () {
6830
this.points = new Vector(b2Settings.b2_maxManifoldPoints);
6831
for (var i = 0; i < b2Settings.b2_maxManifoldPoints; i++) {
6832
this.points[i] = new b2ContactConstraintPoint();
6833
}
6834
}
6835
b2ContactConstraintPoint.b2ContactConstraintPoint = function () {
6836
this.localPoint = new b2Vec2();
6837
this.rA = new b2Vec2();
6838
this.rB = new b2Vec2();
6839
};
6840
b2ContactEdge.b2ContactEdge = function () {};
6841
b2ContactFactory.b2ContactFactory = function () {};
6842
b2ContactFactory.prototype.b2ContactFactory = function (allocator) {
6843
this.m_allocator = allocator;
6844
this.InitializeRegisters();
6845
}
6846
b2ContactFactory.prototype.AddType = function (createFcn, destroyFcn, type1, type2) {
6847
if (type1 === undefined) type1 = 0;
6848
if (type2 === undefined) type2 = 0;
6849
this.m_registers[type1][type2].createFcn = createFcn;
6850
this.m_registers[type1][type2].destroyFcn = destroyFcn;
6851
this.m_registers[type1][type2].primary = true;
6852
if (type1 != type2) {
6853
this.m_registers[type2][type1].createFcn = createFcn;
6854
this.m_registers[type2][type1].destroyFcn = destroyFcn;
6855
this.m_registers[type2][type1].primary = false;
6856
}
6857
}
6858
b2ContactFactory.prototype.InitializeRegisters = function () {
6859
this.m_registers = new Vector(b2Shape.e_shapeTypeCount);
6860
for (var i = 0; i < b2Shape.e_shapeTypeCount; i++) {
6861
this.m_registers[i] = new Vector(b2Shape.e_shapeTypeCount);
6862
for (var j = 0; j < b2Shape.e_shapeTypeCount; j++) {
6863
this.m_registers[i][j] = new b2ContactRegister();
6864
}
6865
}
6866
this.AddType(b2CircleContact.Create, b2CircleContact.Destroy, b2Shape.e_circleShape, b2Shape.e_circleShape);
6867
this.AddType(b2PolyAndCircleContact.Create, b2PolyAndCircleContact.Destroy, b2Shape.e_polygonShape, b2Shape.e_circleShape);
6868
this.AddType(b2PolygonContact.Create, b2PolygonContact.Destroy, b2Shape.e_polygonShape, b2Shape.e_polygonShape);
6869
this.AddType(b2EdgeAndCircleContact.Create, b2EdgeAndCircleContact.Destroy, b2Shape.e_edgeShape, b2Shape.e_circleShape);
6870
this.AddType(b2PolyAndEdgeContact.Create, b2PolyAndEdgeContact.Destroy, b2Shape.e_polygonShape, b2Shape.e_edgeShape);
6871
}
6872
b2ContactFactory.prototype.Create = function (fixtureA, fixtureB) {
6873
var type1 = parseInt(fixtureA.GetType());
6874
var type2 = parseInt(fixtureB.GetType());
6875
var reg = this.m_registers[type1][type2];
6876
var c;
6877
if (reg.pool) {
6878
c = reg.pool;
6879
reg.pool = c.m_next;
6880
reg.poolCount--;
6881
c.Reset(fixtureA, fixtureB);
6882
return c;
6883
}
6884
var createFcn = reg.createFcn;
6885
if (createFcn != null) {
6886
if (reg.primary) {
6887
c = createFcn(this.m_allocator);
6888
c.Reset(fixtureA, fixtureB);
6889
return c;
6890
}
6891
else {
6892
c = createFcn(this.m_allocator);
6893
c.Reset(fixtureB, fixtureA);
6894
return c;
6895
}
6896
}
6897
else {
6898
return null;
6899
}
6900
}
6901
b2ContactFactory.prototype.Destroy = function (contact) {
6902
if (contact.m_manifold.m_pointCount > 0) {
6903
contact.m_fixtureA.m_body.SetAwake(true);
6904
contact.m_fixtureB.m_body.SetAwake(true);
6905
}
6906
var type1 = parseInt(contact.m_fixtureA.GetType());
6907
var type2 = parseInt(contact.m_fixtureB.GetType());
6908
var reg = this.m_registers[type1][type2];
6909
if (true) {
6910
reg.poolCount++;
6911
contact.m_next = reg.pool;
6912
reg.pool = contact;
6913
}
6914
var destroyFcn = reg.destroyFcn;
6915
destroyFcn(contact, this.m_allocator);
6916
}
6917
b2ContactRegister.b2ContactRegister = function () {};
6918
b2ContactResult.b2ContactResult = function () {
6919
this.position = new b2Vec2();
6920
this.normal = new b2Vec2();
6921
this.id = new b2ContactID();
6922
};
6923
b2ContactSolver.b2ContactSolver = function () {
6924
this.m_step = new b2TimeStep();
6925
this.m_constraints = new Vector();
6926
};
6927
b2ContactSolver.prototype.b2ContactSolver = function () {}
6928
b2ContactSolver.prototype.Initialize = function (step, contacts, contactCount, allocator) {
6929
if (contactCount === undefined) contactCount = 0;
6930
var contact;
6931
this.m_step.Set(step);
6932
this.m_allocator = allocator;
6933
var i = 0;
6934
var tVec;
6935
var tMat;
6936
this.m_constraintCount = contactCount;
6937
while (this.m_constraints.length < this.m_constraintCount) {
6938
this.m_constraints[this.m_constraints.length] = new b2ContactConstraint();
6939
}
6940
for (i = 0;
6941
i < contactCount; ++i) {
6942
contact = contacts[i];
6943
var fixtureA = contact.m_fixtureA;
6944
var fixtureB = contact.m_fixtureB;
6945
var shapeA = fixtureA.m_shape;
6946
var shapeB = fixtureB.m_shape;
6947
var radiusA = shapeA.m_radius;
6948
var radiusB = shapeB.m_radius;
6949
var bodyA = fixtureA.m_body;
6950
var bodyB = fixtureB.m_body;
6951
var manifold = contact.GetManifold();
6952
var friction = b2Settings.b2MixFriction(fixtureA.GetFriction(), fixtureB.GetFriction());
6953
var restitution = b2Settings.b2MixRestitution(fixtureA.GetRestitution(), fixtureB.GetRestitution());
6954
var vAX = bodyA.m_linearVelocity.x;
6955
var vAY = bodyA.m_linearVelocity.y;
6956
var vBX = bodyB.m_linearVelocity.x;
6957
var vBY = bodyB.m_linearVelocity.y;
6958
var wA = bodyA.m_angularVelocity;
6959
var wB = bodyB.m_angularVelocity;
6960
b2Settings.b2Assert(manifold.m_pointCount > 0);
6961
b2ContactSolver.s_worldManifold.Initialize(manifold, bodyA.m_xf, radiusA, bodyB.m_xf, radiusB);
6962
var normalX = b2ContactSolver.s_worldManifold.m_normal.x;
6963
var normalY = b2ContactSolver.s_worldManifold.m_normal.y;
6964
var cc = this.m_constraints[i];
6965
cc.bodyA = bodyA;
6966
cc.bodyB = bodyB;
6967
cc.manifold = manifold;
6968
cc.normal.x = normalX;
6969
cc.normal.y = normalY;
6970
cc.pointCount = manifold.m_pointCount;
6971
cc.friction = friction;
6972
cc.restitution = restitution;
6973
cc.localPlaneNormal.x = manifold.m_localPlaneNormal.x;
6974
cc.localPlaneNormal.y = manifold.m_localPlaneNormal.y;
6975
cc.localPoint.x = manifold.m_localPoint.x;
6976
cc.localPoint.y = manifold.m_localPoint.y;
6977
cc.radius = radiusA + radiusB;
6978
cc.type = manifold.m_type;
6979
for (var k = 0; k < cc.pointCount; ++k) {
6980
var cp = manifold.m_points[k];
6981
var ccp = cc.points[k];
6982
ccp.normalImpulse = cp.m_normalImpulse;
6983
ccp.tangentImpulse = cp.m_tangentImpulse;
6984
ccp.localPoint.SetV(cp.m_localPoint);
6985
var rAX = ccp.rA.x = b2ContactSolver.s_worldManifold.m_points[k].x - bodyA.m_sweep.c.x;
6986
var rAY = ccp.rA.y = b2ContactSolver.s_worldManifold.m_points[k].y - bodyA.m_sweep.c.y;
6987
var rBX = ccp.rB.x = b2ContactSolver.s_worldManifold.m_points[k].x - bodyB.m_sweep.c.x;
6988
var rBY = ccp.rB.y = b2ContactSolver.s_worldManifold.m_points[k].y - bodyB.m_sweep.c.y;
6989
var rnA = rAX * normalY - rAY * normalX;
6990
var rnB = rBX * normalY - rBY * normalX;
6991
rnA *= rnA;
6992
rnB *= rnB;
6993
var kNormal = bodyA.m_invMass + bodyB.m_invMass + bodyA.m_invI * rnA + bodyB.m_invI * rnB;
6994
ccp.normalMass = 1.0 / kNormal;
6995
var kEqualized = bodyA.m_mass * bodyA.m_invMass + bodyB.m_mass * bodyB.m_invMass;
6996
kEqualized += bodyA.m_mass * bodyA.m_invI * rnA + bodyB.m_mass * bodyB.m_invI * rnB;
6997
ccp.equalizedMass = 1.0 / kEqualized;
6998
var tangentX = normalY;
6999
var tangentY = (-normalX);
7000
var rtA = rAX * tangentY - rAY * tangentX;
7001
var rtB = rBX * tangentY - rBY * tangentX;
7002
rtA *= rtA;
7003
rtB *= rtB;
7004
var kTangent = bodyA.m_invMass + bodyB.m_invMass + bodyA.m_invI * rtA + bodyB.m_invI * rtB;
7005
ccp.tangentMass = 1.0 / kTangent;
7006
ccp.velocityBias = 0.0;
7007
var tX = vBX + ((-wB * rBY)) - vAX - ((-wA * rAY));
7008
var tY = vBY + (wB * rBX) - vAY - (wA * rAX);
7009
var vRel = cc.normal.x * tX + cc.normal.y * tY;
7010
if (vRel < (-b2Settings.b2_velocityThreshold)) {
7011
ccp.velocityBias += (-cc.restitution * vRel);
7012
}
7013
}
7014
if (cc.pointCount == 2) {
7015
var ccp1 = cc.points[0];
7016
var ccp2 = cc.points[1];
7017
var invMassA = bodyA.m_invMass;
7018
var invIA = bodyA.m_invI;
7019
var invMassB = bodyB.m_invMass;
7020
var invIB = bodyB.m_invI;
7021
var rn1A = ccp1.rA.x * normalY - ccp1.rA.y * normalX;
7022
var rn1B = ccp1.rB.x * normalY - ccp1.rB.y * normalX;
7023
var rn2A = ccp2.rA.x * normalY - ccp2.rA.y * normalX;
7024
var rn2B = ccp2.rB.x * normalY - ccp2.rB.y * normalX;
7025
var k11 = invMassA + invMassB + invIA * rn1A * rn1A + invIB * rn1B * rn1B;
7026
var k22 = invMassA + invMassB + invIA * rn2A * rn2A + invIB * rn2B * rn2B;
7027
var k12 = invMassA + invMassB + invIA * rn1A * rn2A + invIB * rn1B * rn2B;
7028
var k_maxConditionNumber = 100.0;
7029
if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) {
7030
cc.K.col1.Set(k11, k12);
7031
cc.K.col2.Set(k12, k22);
7032
cc.K.GetInverse(cc.normalMass);
7033
}
7034
else {
7035
cc.pointCount = 1;
7036
}
7037
}
7038
}
7039
}
7040
b2ContactSolver.prototype.InitVelocityConstraints = function (step) {
7041
var tVec;
7042
var tVec2;
7043
var tMat;
7044
for (var i = 0; i < this.m_constraintCount; ++i) {
7045
var c = this.m_constraints[i];
7046
var bodyA = c.bodyA;
7047
var bodyB = c.bodyB;
7048
var invMassA = bodyA.m_invMass;
7049
var invIA = bodyA.m_invI;
7050
var invMassB = bodyB.m_invMass;
7051
var invIB = bodyB.m_invI;
7052
var normalX = c.normal.x;
7053
var normalY = c.normal.y;
7054
var tangentX = normalY;
7055
var tangentY = (-normalX);
7056
var tX = 0;
7057
var j = 0;
7058
var tCount = 0;
7059
if (step.warmStarting) {
7060
tCount = c.pointCount;
7061
for (j = 0;
7062
j < tCount; ++j) {
7063
var ccp = c.points[j];
7064
ccp.normalImpulse *= step.dtRatio;
7065
ccp.tangentImpulse *= step.dtRatio;
7066
var PX = ccp.normalImpulse * normalX + ccp.tangentImpulse * tangentX;
7067
var PY = ccp.normalImpulse * normalY + ccp.tangentImpulse * tangentY;
7068
bodyA.m_angularVelocity -= invIA * (ccp.rA.x * PY - ccp.rA.y * PX);
7069
bodyA.m_linearVelocity.x -= invMassA * PX;
7070
bodyA.m_linearVelocity.y -= invMassA * PY;
7071
bodyB.m_angularVelocity += invIB * (ccp.rB.x * PY - ccp.rB.y * PX);
7072
bodyB.m_linearVelocity.x += invMassB * PX;
7073
bodyB.m_linearVelocity.y += invMassB * PY;
7074
}
7075
}
7076
else {
7077
tCount = c.pointCount;
7078
for (j = 0;
7079
j < tCount; ++j) {
7080
var ccp2 = c.points[j];
7081
ccp2.normalImpulse = 0.0;
7082
ccp2.tangentImpulse = 0.0;
7083
}
7084
}
7085
}
7086
}
7087
b2ContactSolver.prototype.SolveVelocityConstraints = function () {
7088
var j = 0;
7089
var ccp;
7090
var rAX = 0;
7091
var rAY = 0;
7092
var rBX = 0;
7093
var rBY = 0;
7094
var dvX = 0;
7095
var dvY = 0;
7096
var vn = 0;
7097
var vt = 0;
7098
var lambda = 0;
7099
var maxFriction = 0;
7100
var newImpulse = 0;
7101
var PX = 0;
7102
var PY = 0;
7103
var dX = 0;
7104
var dY = 0;
7105
var P1X = 0;
7106
var P1Y = 0;
7107
var P2X = 0;
7108
var P2Y = 0;
7109
var tMat;
7110
var tVec;
7111
for (var i = 0; i < this.m_constraintCount; ++i) {
7112
var c = this.m_constraints[i];
7113
var bodyA = c.bodyA;
7114
var bodyB = c.bodyB;
7115
var wA = bodyA.m_angularVelocity;
7116
var wB = bodyB.m_angularVelocity;
7117
var vA = bodyA.m_linearVelocity;
7118
var vB = bodyB.m_linearVelocity;
7119
var invMassA = bodyA.m_invMass;
7120
var invIA = bodyA.m_invI;
7121
var invMassB = bodyB.m_invMass;
7122
var invIB = bodyB.m_invI;
7123
var normalX = c.normal.x;
7124
var normalY = c.normal.y;
7125
var tangentX = normalY;
7126
var tangentY = (-normalX);
7127
var friction = c.friction;
7128
var tX = 0;
7129
for (j = 0;
7130
j < c.pointCount; j++) {
7131
ccp = c.points[j];
7132
dvX = vB.x - wB * ccp.rB.y - vA.x + wA * ccp.rA.y;
7133
dvY = vB.y + wB * ccp.rB.x - vA.y - wA * ccp.rA.x;
7134
vt = dvX * tangentX + dvY * tangentY;
7135
lambda = ccp.tangentMass * (-vt);
7136
maxFriction = friction * ccp.normalImpulse;
7137
newImpulse = b2Math.Clamp(ccp.tangentImpulse + lambda, (-maxFriction), maxFriction);
7138
lambda = newImpulse - ccp.tangentImpulse;
7139
PX = lambda * tangentX;
7140
PY = lambda * tangentY;
7141
vA.x -= invMassA * PX;
7142
vA.y -= invMassA * PY;
7143
wA -= invIA * (ccp.rA.x * PY - ccp.rA.y * PX);
7144
vB.x += invMassB * PX;
7145
vB.y += invMassB * PY;
7146
wB += invIB * (ccp.rB.x * PY - ccp.rB.y * PX);
7147
ccp.tangentImpulse = newImpulse;
7148
}
7149
var tCount = parseInt(c.pointCount);
7150
if (c.pointCount == 1) {
7151
ccp = c.points[0];
7152
dvX = vB.x + ((-wB * ccp.rB.y)) - vA.x - ((-wA * ccp.rA.y));
7153
dvY = vB.y + (wB * ccp.rB.x) - vA.y - (wA * ccp.rA.x);
7154
vn = dvX * normalX + dvY * normalY;
7155
lambda = (-ccp.normalMass * (vn - ccp.velocityBias));
7156
newImpulse = ccp.normalImpulse + lambda;
7157
newImpulse = newImpulse > 0 ? newImpulse : 0.0;
7158
lambda = newImpulse - ccp.normalImpulse;
7159
PX = lambda * normalX;
7160
PY = lambda * normalY;
7161
vA.x -= invMassA * PX;
7162
vA.y -= invMassA * PY;
7163
wA -= invIA * (ccp.rA.x * PY - ccp.rA.y * PX);
7164
vB.x += invMassB * PX;
7165
vB.y += invMassB * PY;
7166
wB += invIB * (ccp.rB.x * PY - ccp.rB.y * PX);
7167
ccp.normalImpulse = newImpulse;
7168
}
7169
else {
7170
var cp1 = c.points[0];
7171
var cp2 = c.points[1];
7172
var aX = cp1.normalImpulse;
7173
var aY = cp2.normalImpulse;
7174
var dv1X = vB.x - wB * cp1.rB.y - vA.x + wA * cp1.rA.y;
7175
var dv1Y = vB.y + wB * cp1.rB.x - vA.y - wA * cp1.rA.x;
7176
var dv2X = vB.x - wB * cp2.rB.y - vA.x + wA * cp2.rA.y;
7177
var dv2Y = vB.y + wB * cp2.rB.x - vA.y - wA * cp2.rA.x;
7178
var vn1 = dv1X * normalX + dv1Y * normalY;
7179
var vn2 = dv2X * normalX + dv2Y * normalY;
7180
var bX = vn1 - cp1.velocityBias;
7181
var bY = vn2 - cp2.velocityBias;
7182
tMat = c.K;
7183
bX -= tMat.col1.x * aX + tMat.col2.x * aY;
7184
bY -= tMat.col1.y * aX + tMat.col2.y * aY;
7185
var k_errorTol = 0.001;
7186
for (;;) {
7187
tMat = c.normalMass;
7188
var xX = (-(tMat.col1.x * bX + tMat.col2.x * bY));
7189
var xY = (-(tMat.col1.y * bX + tMat.col2.y * bY));
7190
if (xX >= 0.0 && xY >= 0.0) {
7191
dX = xX - aX;
7192
dY = xY - aY;
7193
P1X = dX * normalX;
7194
P1Y = dX * normalY;
7195
P2X = dY * normalX;
7196
P2Y = dY * normalY;
7197
vA.x -= invMassA * (P1X + P2X);
7198
vA.y -= invMassA * (P1Y + P2Y);
7199
wA -= invIA * (cp1.rA.x * P1Y - cp1.rA.y * P1X + cp2.rA.x * P2Y - cp2.rA.y * P2X);
7200
vB.x += invMassB * (P1X + P2X);
7201
vB.y += invMassB * (P1Y + P2Y);
7202
wB += invIB * (cp1.rB.x * P1Y - cp1.rB.y * P1X + cp2.rB.x * P2Y - cp2.rB.y * P2X);
7203
cp1.normalImpulse = xX;
7204
cp2.normalImpulse = xY;
7205
break;
7206
}
7207
xX = (-cp1.normalMass * bX);
7208
xY = 0.0;
7209
vn1 = 0.0;
7210
vn2 = c.K.col1.y * xX + bY;
7211
if (xX >= 0.0 && vn2 >= 0.0) {
7212
dX = xX - aX;
7213
dY = xY - aY;
7214
P1X = dX * normalX;
7215
P1Y = dX * normalY;
7216
P2X = dY * normalX;
7217
P2Y = dY * normalY;
7218
vA.x -= invMassA * (P1X + P2X);
7219
vA.y -= invMassA * (P1Y + P2Y);
7220
wA -= invIA * (cp1.rA.x * P1Y - cp1.rA.y * P1X + cp2.rA.x * P2Y - cp2.rA.y * P2X);
7221
vB.x += invMassB * (P1X + P2X);
7222
vB.y += invMassB * (P1Y + P2Y);
7223
wB += invIB * (cp1.rB.x * P1Y - cp1.rB.y * P1X + cp2.rB.x * P2Y - cp2.rB.y * P2X);
7224
cp1.normalImpulse = xX;
7225
cp2.normalImpulse = xY;
7226
break;
7227
}
7228
xX = 0.0;
7229
xY = (-cp2.normalMass * bY);
7230
vn1 = c.K.col2.x * xY + bX;
7231
vn2 = 0.0;
7232
if (xY >= 0.0 && vn1 >= 0.0) {
7233
dX = xX - aX;
7234
dY = xY - aY;
7235
P1X = dX * normalX;
7236
P1Y = dX * normalY;
7237
P2X = dY * normalX;
7238
P2Y = dY * normalY;
7239
vA.x -= invMassA * (P1X + P2X);
7240
vA.y -= invMassA * (P1Y + P2Y);
7241
wA -= invIA * (cp1.rA.x * P1Y - cp1.rA.y * P1X + cp2.rA.x * P2Y - cp2.rA.y * P2X);
7242
vB.x += invMassB * (P1X + P2X);
7243
vB.y += invMassB * (P1Y + P2Y);
7244
wB += invIB * (cp1.rB.x * P1Y - cp1.rB.y * P1X + cp2.rB.x * P2Y - cp2.rB.y * P2X);
7245
cp1.normalImpulse = xX;
7246
cp2.normalImpulse = xY;
7247
break;
7248
}
7249
xX = 0.0;
7250
xY = 0.0;
7251
vn1 = bX;
7252
vn2 = bY;
7253
if (vn1 >= 0.0 && vn2 >= 0.0) {
7254
dX = xX - aX;
7255
dY = xY - aY;
7256
P1X = dX * normalX;
7257
P1Y = dX * normalY;
7258
P2X = dY * normalX;
7259
P2Y = dY * normalY;
7260
vA.x -= invMassA * (P1X + P2X);
7261
vA.y -= invMassA * (P1Y + P2Y);
7262
wA -= invIA * (cp1.rA.x * P1Y - cp1.rA.y * P1X + cp2.rA.x * P2Y - cp2.rA.y * P2X);
7263
vB.x += invMassB * (P1X + P2X);
7264
vB.y += invMassB * (P1Y + P2Y);
7265
wB += invIB * (cp1.rB.x * P1Y - cp1.rB.y * P1X + cp2.rB.x * P2Y - cp2.rB.y * P2X);
7266
cp1.normalImpulse = xX;
7267
cp2.normalImpulse = xY;
7268
break;
7269
}
7270
break;
7271
}
7272
}
7273
bodyA.m_angularVelocity = wA;
7274
bodyB.m_angularVelocity = wB;
7275
}
7276
}
7277
b2ContactSolver.prototype.FinalizeVelocityConstraints = function () {
7278
for (var i = 0; i < this.m_constraintCount; ++i) {
7279
var c = this.m_constraints[i];
7280
var m = c.manifold;
7281
for (var j = 0; j < c.pointCount; ++j) {
7282
var point1 = m.m_points[j];
7283
var point2 = c.points[j];
7284
point1.m_normalImpulse = point2.normalImpulse;
7285
point1.m_tangentImpulse = point2.tangentImpulse;
7286
}
7287
}
7288
}
7289
b2ContactSolver.prototype.SolvePositionConstraints = function (baumgarte) {
7290
if (baumgarte === undefined) baumgarte = 0;
7291
var minSeparation = 0.0;
7292
for (var i = 0; i < this.m_constraintCount; i++) {
7293
var c = this.m_constraints[i];
7294
var bodyA = c.bodyA;
7295
var bodyB = c.bodyB;
7296
var invMassA = bodyA.m_mass * bodyA.m_invMass;
7297
var invIA = bodyA.m_mass * bodyA.m_invI;
7298
var invMassB = bodyB.m_mass * bodyB.m_invMass;
7299
var invIB = bodyB.m_mass * bodyB.m_invI;
7300
b2ContactSolver.s_psm.Initialize(c);
7301
var normal = b2ContactSolver.s_psm.m_normal;
7302
for (var j = 0; j < c.pointCount; j++) {
7303
var ccp = c.points[j];
7304
var point = b2ContactSolver.s_psm.m_points[j];
7305
var separation = b2ContactSolver.s_psm.m_separations[j];
7306
var rAX = point.x - bodyA.m_sweep.c.x;
7307
var rAY = point.y - bodyA.m_sweep.c.y;
7308
var rBX = point.x - bodyB.m_sweep.c.x;
7309
var rBY = point.y - bodyB.m_sweep.c.y;
7310
minSeparation = minSeparation < separation ? minSeparation : separation;
7311
var C = b2Math.Clamp(baumgarte * (separation + b2Settings.b2_linearSlop), (-b2Settings.b2_maxLinearCorrection), 0.0);
7312
var impulse = (-ccp.equalizedMass * C);
7313
var PX = impulse * normal.x;
7314
var PY = impulse * normal.y;bodyA.m_sweep.c.x -= invMassA * PX;
7315
bodyA.m_sweep.c.y -= invMassA * PY;
7316
bodyA.m_sweep.a -= invIA * (rAX * PY - rAY * PX);
7317
bodyA.SynchronizeTransform();
7318
bodyB.m_sweep.c.x += invMassB * PX;
7319
bodyB.m_sweep.c.y += invMassB * PY;
7320
bodyB.m_sweep.a += invIB * (rBX * PY - rBY * PX);
7321
bodyB.SynchronizeTransform();
7322
}
7323
}
7324
return minSeparation > (-1.5 * b2Settings.b2_linearSlop);
7325
}
7326
Box2D.postDefs.push(function () {
7327
Box2D.Dynamics.Contacts.b2ContactSolver.s_worldManifold = new b2WorldManifold();
7328
Box2D.Dynamics.Contacts.b2ContactSolver.s_psm = new b2PositionSolverManifold();
7329
});
7330
Box2D.inherit(b2EdgeAndCircleContact, Box2D.Dynamics.Contacts.b2Contact);
7331
b2EdgeAndCircleContact.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype;
7332
b2EdgeAndCircleContact.b2EdgeAndCircleContact = function () {
7333
Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments);
7334
};
7335
b2EdgeAndCircleContact.Create = function (allocator) {
7336
return new b2EdgeAndCircleContact();
7337
}
7338
b2EdgeAndCircleContact.Destroy = function (contact, allocator) {}
7339
b2EdgeAndCircleContact.prototype.Reset = function (fixtureA, fixtureB) {
7340
this.__super.Reset.call(this, fixtureA, fixtureB);
7341
}
7342
b2EdgeAndCircleContact.prototype.Evaluate = function () {
7343
var bA = this.m_fixtureA.GetBody();
7344
var bB = this.m_fixtureB.GetBody();
7345
this.b2CollideEdgeAndCircle(this.m_manifold, (this.m_fixtureA.GetShape() instanceof b2EdgeShape ? this.m_fixtureA.GetShape() : null), bA.m_xf, (this.m_fixtureB.GetShape() instanceof b2CircleShape ? this.m_fixtureB.GetShape() : null), bB.m_xf);
7346
}
7347
b2EdgeAndCircleContact.prototype.b2CollideEdgeAndCircle = function (manifold, edge, xf1, circle, xf2) {}
7348
Box2D.inherit(b2NullContact, Box2D.Dynamics.Contacts.b2Contact);
7349
b2NullContact.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype;
7350
b2NullContact.b2NullContact = function () {
7351
Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments);
7352
};
7353
b2NullContact.prototype.b2NullContact = function () {
7354
this.__super.b2Contact.call(this);
7355
}
7356
b2NullContact.prototype.Evaluate = function () {}
7357
Box2D.inherit(b2PolyAndCircleContact, Box2D.Dynamics.Contacts.b2Contact);
7358
b2PolyAndCircleContact.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype;
7359
b2PolyAndCircleContact.b2PolyAndCircleContact = function () {
7360
Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments);
7361
};
7362
b2PolyAndCircleContact.Create = function (allocator) {
7363
return new b2PolyAndCircleContact();
7364
}
7365
b2PolyAndCircleContact.Destroy = function (contact, allocator) {}
7366
b2PolyAndCircleContact.prototype.Reset = function (fixtureA, fixtureB) {
7367
this.__super.Reset.call(this, fixtureA, fixtureB);
7368
b2Settings.b2Assert(fixtureA.GetType() == b2Shape.e_polygonShape);
7369
b2Settings.b2Assert(fixtureB.GetType() == b2Shape.e_circleShape);
7370
}
7371
b2PolyAndCircleContact.prototype.Evaluate = function () {
7372
var bA = this.m_fixtureA.m_body;
7373
var bB = this.m_fixtureB.m_body;
7374
b2Collision.CollidePolygonAndCircle(this.m_manifold, (this.m_fixtureA.GetShape() instanceof b2PolygonShape ? this.m_fixtureA.GetShape() : null), bA.m_xf, (this.m_fixtureB.GetShape() instanceof b2CircleShape ? this.m_fixtureB.GetShape() : null), bB.m_xf);
7375
}
7376
Box2D.inherit(b2PolyAndEdgeContact, Box2D.Dynamics.Contacts.b2Contact);
7377
b2PolyAndEdgeContact.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype;
7378
b2PolyAndEdgeContact.b2PolyAndEdgeContact = function () {
7379
Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments);
7380
};
7381
b2PolyAndEdgeContact.Create = function (allocator) {
7382
return new b2PolyAndEdgeContact();
7383
}
7384
b2PolyAndEdgeContact.Destroy = function (contact, allocator) {}
7385
b2PolyAndEdgeContact.prototype.Reset = function (fixtureA, fixtureB) {
7386
this.__super.Reset.call(this, fixtureA, fixtureB);
7387
b2Settings.b2Assert(fixtureA.GetType() == b2Shape.e_polygonShape);
7388
b2Settings.b2Assert(fixtureB.GetType() == b2Shape.e_edgeShape);
7389
}
7390
b2PolyAndEdgeContact.prototype.Evaluate = function () {
7391
var bA = this.m_fixtureA.GetBody();
7392
var bB = this.m_fixtureB.GetBody();
7393
this.b2CollidePolyAndEdge(this.m_manifold, (this.m_fixtureA.GetShape() instanceof b2PolygonShape ? this.m_fixtureA.GetShape() : null), bA.m_xf, (this.m_fixtureB.GetShape() instanceof b2EdgeShape ? this.m_fixtureB.GetShape() : null), bB.m_xf);
7394
}
7395
b2PolyAndEdgeContact.prototype.b2CollidePolyAndEdge = function (manifold, polygon, xf1, edge, xf2) {}
7396
Box2D.inherit(b2PolygonContact, Box2D.Dynamics.Contacts.b2Contact);
7397
b2PolygonContact.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype;
7398
b2PolygonContact.b2PolygonContact = function () {
7399
Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments);
7400
};
7401
b2PolygonContact.Create = function (allocator) {
7402
return new b2PolygonContact();
7403
}
7404
b2PolygonContact.Destroy = function (contact, allocator) {}
7405
b2PolygonContact.prototype.Reset = function (fixtureA, fixtureB) {
7406
this.__super.Reset.call(this, fixtureA, fixtureB);
7407
}
7408
b2PolygonContact.prototype.Evaluate = function () {
7409
var bA = this.m_fixtureA.GetBody();
7410
var bB = this.m_fixtureB.GetBody();
7411
b2Collision.CollidePolygons(this.m_manifold, (this.m_fixtureA.GetShape() instanceof b2PolygonShape ? this.m_fixtureA.GetShape() : null), bA.m_xf, (this.m_fixtureB.GetShape() instanceof b2PolygonShape ? this.m_fixtureB.GetShape() : null), bB.m_xf);
7412
}
7413
b2PositionSolverManifold.b2PositionSolverManifold = function () {};
7414
b2PositionSolverManifold.prototype.b2PositionSolverManifold = function () {
7415
this.m_normal = new b2Vec2();
7416
this.m_separations = new Vector_a2j_Number(b2Settings.b2_maxManifoldPoints);
7417
this.m_points = new Vector(b2Settings.b2_maxManifoldPoints);
7418
for (var i = 0; i < b2Settings.b2_maxManifoldPoints; i++) {
7419
this.m_points[i] = new b2Vec2();
7420
}
7421
}
7422
b2PositionSolverManifold.prototype.Initialize = function (cc) {
7423
b2Settings.b2Assert(cc.pointCount > 0);
7424
var i = 0;
7425
var clipPointX = 0;
7426
var clipPointY = 0;
7427
var tMat;
7428
var tVec;
7429
var planePointX = 0;
7430
var planePointY = 0;
7431
switch (cc.type) {
7432
case b2Manifold.e_circles:
7433
{
7434
tMat = cc.bodyA.m_xf.R;
7435
tVec = cc.localPoint;
7436
var pointAX = cc.bodyA.m_xf.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
7437
var pointAY = cc.bodyA.m_xf.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
7438
tMat = cc.bodyB.m_xf.R;
7439
tVec = cc.points[0].localPoint;
7440
var pointBX = cc.bodyB.m_xf.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
7441
var pointBY = cc.bodyB.m_xf.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
7442
var dX = pointBX - pointAX;
7443
var dY = pointBY - pointAY;
7444
var d2 = dX * dX + dY * dY;
7445
if (d2 > Number.MIN_VALUE * Number.MIN_VALUE) {
7446
var d = Math.sqrt(d2);
7447
this.m_normal.x = dX / d;
7448
this.m_normal.y = dY / d;
7449
}
7450
else {
7451
this.m_normal.x = 1.0;
7452
this.m_normal.y = 0.0;
7453
}
7454
this.m_points[0].x = 0.5 * (pointAX + pointBX);
7455
this.m_points[0].y = 0.5 * (pointAY + pointBY);
7456
this.m_separations[0] = dX * this.m_normal.x + dY * this.m_normal.y - cc.radius;
7457
}
7458
break;
7459
case b2Manifold.e_faceA:
7460
{
7461
tMat = cc.bodyA.m_xf.R;
7462
tVec = cc.localPlaneNormal;
7463
this.m_normal.x = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
7464
this.m_normal.y = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
7465
tMat = cc.bodyA.m_xf.R;
7466
tVec = cc.localPoint;
7467
planePointX = cc.bodyA.m_xf.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
7468
planePointY = cc.bodyA.m_xf.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
7469
tMat = cc.bodyB.m_xf.R;
7470
for (i = 0;
7471
i < cc.pointCount; ++i) {
7472
tVec = cc.points[i].localPoint;
7473
clipPointX = cc.bodyB.m_xf.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
7474
clipPointY = cc.bodyB.m_xf.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
7475
this.m_separations[i] = (clipPointX - planePointX) * this.m_normal.x + (clipPointY - planePointY) * this.m_normal.y - cc.radius;
7476
this.m_points[i].x = clipPointX;
7477
this.m_points[i].y = clipPointY;
7478
}
7479
}
7480
break;
7481
case b2Manifold.e_faceB:
7482
{
7483
tMat = cc.bodyB.m_xf.R;
7484
tVec = cc.localPlaneNormal;
7485
this.m_normal.x = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
7486
this.m_normal.y = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
7487
tMat = cc.bodyB.m_xf.R;
7488
tVec = cc.localPoint;
7489
planePointX = cc.bodyB.m_xf.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
7490
planePointY = cc.bodyB.m_xf.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
7491
tMat = cc.bodyA.m_xf.R;
7492
for (i = 0;
7493
i < cc.pointCount; ++i) {
7494
tVec = cc.points[i].localPoint;
7495
clipPointX = cc.bodyA.m_xf.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
7496
clipPointY = cc.bodyA.m_xf.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
7497
this.m_separations[i] = (clipPointX - planePointX) * this.m_normal.x + (clipPointY - planePointY) * this.m_normal.y - cc.radius;
7498
this.m_points[i].Set(clipPointX, clipPointY);
7499
}
7500
this.m_normal.x *= (-1);
7501
this.m_normal.y *= (-1);
7502
}
7503
break;
7504
}
7505
}
7506
Box2D.postDefs.push(function () {
7507
Box2D.Dynamics.Contacts.b2PositionSolverManifold.circlePointA = new b2Vec2();
7508
Box2D.Dynamics.Contacts.b2PositionSolverManifold.circlePointB = new b2Vec2();
7509
});
7510
})();
7511
(function () {
7512
var b2Body = Box2D.Dynamics.b2Body,
7513
b2BodyDef = Box2D.Dynamics.b2BodyDef,
7514
b2ContactFilter = Box2D.Dynamics.b2ContactFilter,
7515
b2ContactImpulse = Box2D.Dynamics.b2ContactImpulse,
7516
b2ContactListener = Box2D.Dynamics.b2ContactListener,
7517
b2ContactManager = Box2D.Dynamics.b2ContactManager,
7518
b2DebugDraw = Box2D.Dynamics.b2DebugDraw,
7519
b2DestructionListener = Box2D.Dynamics.b2DestructionListener,
7520
b2FilterData = Box2D.Dynamics.b2FilterData,
7521
b2Fixture = Box2D.Dynamics.b2Fixture,
7522
b2FixtureDef = Box2D.Dynamics.b2FixtureDef,
7523
b2Island = Box2D.Dynamics.b2Island,
7524
b2TimeStep = Box2D.Dynamics.b2TimeStep,
7525
b2World = Box2D.Dynamics.b2World,
7526
b2Mat22 = Box2D.Common.Math.b2Mat22,
7527
b2Mat33 = Box2D.Common.Math.b2Mat33,
7528
b2Math = Box2D.Common.Math.b2Math,
7529
b2Sweep = Box2D.Common.Math.b2Sweep,
7530
b2Transform = Box2D.Common.Math.b2Transform,
7531
b2Vec2 = Box2D.Common.Math.b2Vec2,
7532
b2Vec3 = Box2D.Common.Math.b2Vec3,
7533
b2Color = Box2D.Common.b2Color,
7534
b2internal = Box2D.Common.b2internal,
7535
b2Settings = Box2D.Common.b2Settings,
7536
b2CircleShape = Box2D.Collision.Shapes.b2CircleShape,
7537
b2EdgeChainDef = Box2D.Collision.Shapes.b2EdgeChainDef,
7538
b2EdgeShape = Box2D.Collision.Shapes.b2EdgeShape,
7539
b2MassData = Box2D.Collision.Shapes.b2MassData,
7540
b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape,
7541
b2Shape = Box2D.Collision.Shapes.b2Shape,
7542
b2BuoyancyController = Box2D.Dynamics.Controllers.b2BuoyancyController,
7543
b2ConstantAccelController = Box2D.Dynamics.Controllers.b2ConstantAccelController,
7544
b2ConstantForceController = Box2D.Dynamics.Controllers.b2ConstantForceController,
7545
b2Controller = Box2D.Dynamics.Controllers.b2Controller,
7546
b2ControllerEdge = Box2D.Dynamics.Controllers.b2ControllerEdge,
7547
b2GravityController = Box2D.Dynamics.Controllers.b2GravityController,
7548
b2TensorDampingController = Box2D.Dynamics.Controllers.b2TensorDampingController;
7549
7550
Box2D.inherit(b2BuoyancyController, Box2D.Dynamics.Controllers.b2Controller);
7551
b2BuoyancyController.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype;
7552
b2BuoyancyController.b2BuoyancyController = function () {
7553
Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments);
7554
this.normal = new b2Vec2(0, (-1));
7555
this.offset = 0;
7556
this.density = 0;
7557
this.velocity = new b2Vec2(0, 0);
7558
this.linearDrag = 2;
7559
this.angularDrag = 1;
7560
this.useDensity = false;
7561
this.useWorldGravity = true;
7562
this.gravity = null;
7563
};
7564
b2BuoyancyController.prototype.Step = function (step) {
7565
if (!this.m_bodyList) return;
7566
if (this.useWorldGravity) {
7567
this.gravity = this.GetWorld().GetGravity().Copy();
7568
}
7569
for (var i = this.m_bodyList; i; i = i.nextBody) {
7570
var body = i.body;
7571
if (body.IsAwake() == false) {
7572
continue;
7573
}
7574
var areac = new b2Vec2();
7575
var massc = new b2Vec2();
7576
var area = 0.0;
7577
var mass = 0.0;
7578
for (var fixture = body.GetFixtureList(); fixture; fixture = fixture.GetNext()) {
7579
var sc = new b2Vec2();
7580
var sarea = fixture.GetShape().ComputeSubmergedArea(this.normal, this.offset, body.GetTransform(), sc);
7581
area += sarea;
7582
areac.x += sarea * sc.x;
7583
areac.y += sarea * sc.y;
7584
var shapeDensity = 0;
7585
if (this.useDensity) {
7586
shapeDensity = 1;
7587
}
7588
else {
7589
shapeDensity = 1;
7590
}
7591
mass += sarea * shapeDensity;
7592
massc.x += sarea * sc.x * shapeDensity;
7593
massc.y += sarea * sc.y * shapeDensity;
7594
}
7595
areac.x /= area;
7596
areac.y /= area;
7597
massc.x /= mass;
7598
massc.y /= mass;
7599
if (area < Number.MIN_VALUE) continue;
7600
var buoyancyForce = this.gravity.GetNegative();
7601
buoyancyForce.Multiply(this.density * area);
7602
body.ApplyForce(buoyancyForce, massc);
7603
var dragForce = body.GetLinearVelocityFromWorldPoint(areac);
7604
dragForce.Subtract(this.velocity);
7605
dragForce.Multiply((-this.linearDrag * area));
7606
body.ApplyForce(dragForce, areac);
7607
body.ApplyTorque((-body.GetInertia() / body.GetMass() * area * body.GetAngularVelocity() * this.angularDrag));
7608
}
7609
}
7610
b2BuoyancyController.prototype.Draw = function (debugDraw) {
7611
var r = 1000;
7612
var p1 = new b2Vec2();
7613
var p2 = new b2Vec2();
7614
p1.x = this.normal.x * this.offset + this.normal.y * r;
7615
p1.y = this.normal.y * this.offset - this.normal.x * r;
7616
p2.x = this.normal.x * this.offset - this.normal.y * r;
7617
p2.y = this.normal.y * this.offset + this.normal.x * r;
7618
var color = new b2Color(0, 0, 1);
7619
debugDraw.DrawSegment(p1, p2, color);
7620
}
7621
Box2D.inherit(b2ConstantAccelController, Box2D.Dynamics.Controllers.b2Controller);
7622
b2ConstantAccelController.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype;
7623
b2ConstantAccelController.b2ConstantAccelController = function () {
7624
Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments);
7625
this.A = new b2Vec2(0, 0);
7626
};
7627
b2ConstantAccelController.prototype.Step = function (step) {
7628
var smallA = new b2Vec2(this.A.x * step.dt, this.A.y * step.dt);
7629
for (var i = this.m_bodyList; i; i = i.nextBody) {
7630
var body = i.body;
7631
if (!body.IsAwake()) continue;
7632
body.SetLinearVelocity(new b2Vec2(body.GetLinearVelocity().x + smallA.x, body.GetLinearVelocity().y + smallA.y));
7633
}
7634
}
7635
Box2D.inherit(b2ConstantForceController, Box2D.Dynamics.Controllers.b2Controller);
7636
b2ConstantForceController.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype;
7637
b2ConstantForceController.b2ConstantForceController = function () {
7638
Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments);
7639
this.F = new b2Vec2(0, 0);
7640
};
7641
b2ConstantForceController.prototype.Step = function (step) {
7642
for (var i = this.m_bodyList; i; i = i.nextBody) {
7643
var body = i.body;
7644
if (!body.IsAwake()) continue;
7645
body.ApplyForce(this.F, body.GetWorldCenter());
7646
}
7647
}
7648
b2Controller.b2Controller = function () {};
7649
b2Controller.prototype.Step = function (step) {}
7650
b2Controller.prototype.Draw = function (debugDraw) {}
7651
b2Controller.prototype.AddBody = function (body) {
7652
var edge = new b2ControllerEdge();
7653
edge.controller = this;
7654
edge.body = body;
7655
edge.nextBody = this.m_bodyList;
7656
edge.prevBody = null;
7657
this.m_bodyList = edge;
7658
if (edge.nextBody) edge.nextBody.prevBody = edge;
7659
this.m_bodyCount++;
7660
edge.nextController = body.m_controllerList;
7661
edge.prevController = null;
7662
body.m_controllerList = edge;
7663
if (edge.nextController) edge.nextController.prevController = edge;
7664
body.m_controllerCount++;
7665
}
7666
b2Controller.prototype.RemoveBody = function (body) {
7667
var edge = body.m_controllerList;
7668
while (edge && edge.controller != this)
7669
edge = edge.nextController;
7670
if (edge.prevBody) edge.prevBody.nextBody = edge.nextBody;
7671
if (edge.nextBody) edge.nextBody.prevBody = edge.prevBody;
7672
if (edge.nextController) edge.nextController.prevController = edge.prevController;
7673
if (edge.prevController) edge.prevController.nextController = edge.nextController;
7674
if (this.m_bodyList == edge) this.m_bodyList = edge.nextBody;
7675
if (body.m_controllerList == edge) body.m_controllerList = edge.nextController;
7676
body.m_controllerCount--;
7677
this.m_bodyCount--;
7678
}
7679
b2Controller.prototype.Clear = function () {
7680
while (this.m_bodyList)
7681
this.RemoveBody(this.m_bodyList.body);
7682
}
7683
b2Controller.prototype.GetNext = function () {
7684
return this.m_next;
7685
}
7686
b2Controller.prototype.GetWorld = function () {
7687
return this.m_world;
7688
}
7689
b2Controller.prototype.GetBodyList = function () {
7690
return this.m_bodyList;
7691
}
7692
b2ControllerEdge.b2ControllerEdge = function () {};
7693
Box2D.inherit(b2GravityController, Box2D.Dynamics.Controllers.b2Controller);
7694
b2GravityController.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype;
7695
b2GravityController.b2GravityController = function () {
7696
Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments);
7697
this.G = 1;
7698
this.invSqr = true;
7699
};
7700
b2GravityController.prototype.Step = function (step) {
7701
var i = null;
7702
var body1 = null;
7703
var p1 = null;
7704
var mass1 = 0;
7705
var j = null;
7706
var body2 = null;
7707
var p2 = null;
7708
var dx = 0;
7709
var dy = 0;
7710
var r2 = 0;
7711
var f = null;
7712
if (this.invSqr) {
7713
for (i = this.m_bodyList;
7714
i; i = i.nextBody) {
7715
body1 = i.body;
7716
p1 = body1.GetWorldCenter();
7717
mass1 = body1.GetMass();
7718
for (j = this.m_bodyList;
7719
j != i; j = j.nextBody) {
7720
body2 = j.body;
7721
p2 = body2.GetWorldCenter();
7722
dx = p2.x - p1.x;
7723
dy = p2.y - p1.y;
7724
r2 = dx * dx + dy * dy;
7725
if (r2 < Number.MIN_VALUE) continue;
7726
f = new b2Vec2(dx, dy);
7727
f.Multiply(this.G / r2 / Math.sqrt(r2) * mass1 * body2.GetMass());
7728
if (body1.IsAwake()) body1.ApplyForce(f, p1);
7729
f.Multiply((-1));
7730
if (body2.IsAwake()) body2.ApplyForce(f, p2);
7731
}
7732
}
7733
}
7734
else {
7735
for (i = this.m_bodyList;
7736
i; i = i.nextBody) {
7737
body1 = i.body;
7738
p1 = body1.GetWorldCenter();
7739
mass1 = body1.GetMass();
7740
for (j = this.m_bodyList;
7741
j != i; j = j.nextBody) {
7742
body2 = j.body;
7743
p2 = body2.GetWorldCenter();
7744
dx = p2.x - p1.x;
7745
dy = p2.y - p1.y;
7746
r2 = dx * dx + dy * dy;
7747
if (r2 < Number.MIN_VALUE) continue;
7748
f = new b2Vec2(dx, dy);
7749
f.Multiply(this.G / r2 * mass1 * body2.GetMass());
7750
if (body1.IsAwake()) body1.ApplyForce(f, p1);
7751
f.Multiply((-1));
7752
if (body2.IsAwake()) body2.ApplyForce(f, p2);
7753
}
7754
}
7755
}
7756
}
7757
Box2D.inherit(b2TensorDampingController, Box2D.Dynamics.Controllers.b2Controller);
7758
b2TensorDampingController.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype;
7759
b2TensorDampingController.b2TensorDampingController = function () {
7760
Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments);
7761
this.T = new b2Mat22();
7762
this.maxTimestep = 0;
7763
};
7764
b2TensorDampingController.prototype.SetAxisAligned = function (xDamping, yDamping) {
7765
if (xDamping === undefined) xDamping = 0;
7766
if (yDamping === undefined) yDamping = 0;
7767
this.T.col1.x = (-xDamping);
7768
this.T.col1.y = 0;
7769
this.T.col2.x = 0;
7770
this.T.col2.y = (-yDamping);
7771
if (xDamping > 0 || yDamping > 0) {
7772
this.maxTimestep = 1 / Math.max(xDamping, yDamping);
7773
}
7774
else {
7775
this.maxTimestep = 0;
7776
}
7777
}
7778
b2TensorDampingController.prototype.Step = function (step) {
7779
var timestep = step.dt;
7780
if (timestep <= Number.MIN_VALUE) return;
7781
if (timestep > this.maxTimestep && this.maxTimestep > 0) timestep = this.maxTimestep;
7782
for (var i = this.m_bodyList; i; i = i.nextBody) {
7783
var body = i.body;
7784
if (!body.IsAwake()) {
7785
continue;
7786
}
7787
var damping = body.GetWorldVector(b2Math.MulMV(this.T, body.GetLocalVector(body.GetLinearVelocity())));
7788
body.SetLinearVelocity(new b2Vec2(body.GetLinearVelocity().x + damping.x * timestep, body.GetLinearVelocity().y + damping.y * timestep));
7789
}
7790
}
7791
})();
7792
(function () {
7793
var b2Color = Box2D.Common.b2Color,
7794
b2internal = Box2D.Common.b2internal,
7795
b2Settings = Box2D.Common.b2Settings,
7796
b2Mat22 = Box2D.Common.Math.b2Mat22,
7797
b2Mat33 = Box2D.Common.Math.b2Mat33,
7798
b2Math = Box2D.Common.Math.b2Math,
7799
b2Sweep = Box2D.Common.Math.b2Sweep,
7800
b2Transform = Box2D.Common.Math.b2Transform,
7801
b2Vec2 = Box2D.Common.Math.b2Vec2,
7802
b2Vec3 = Box2D.Common.Math.b2Vec3,
7803
b2DistanceJoint = Box2D.Dynamics.Joints.b2DistanceJoint,
7804
b2DistanceJointDef = Box2D.Dynamics.Joints.b2DistanceJointDef,
7805
b2FrictionJoint = Box2D.Dynamics.Joints.b2FrictionJoint,
7806
b2FrictionJointDef = Box2D.Dynamics.Joints.b2FrictionJointDef,
7807
b2GearJoint = Box2D.Dynamics.Joints.b2GearJoint,
7808
b2GearJointDef = Box2D.Dynamics.Joints.b2GearJointDef,
7809
b2Jacobian = Box2D.Dynamics.Joints.b2Jacobian,
7810
b2Joint = Box2D.Dynamics.Joints.b2Joint,
7811
b2JointDef = Box2D.Dynamics.Joints.b2JointDef,
7812
b2JointEdge = Box2D.Dynamics.Joints.b2JointEdge,
7813
b2LineJoint = Box2D.Dynamics.Joints.b2LineJoint,
7814
b2LineJointDef = Box2D.Dynamics.Joints.b2LineJointDef,
7815
b2MouseJoint = Box2D.Dynamics.Joints.b2MouseJoint,
7816
b2MouseJointDef = Box2D.Dynamics.Joints.b2MouseJointDef,
7817
b2PrismaticJoint = Box2D.Dynamics.Joints.b2PrismaticJoint,
7818
b2PrismaticJointDef = Box2D.Dynamics.Joints.b2PrismaticJointDef,
7819
b2PulleyJoint = Box2D.Dynamics.Joints.b2PulleyJoint,
7820
b2PulleyJointDef = Box2D.Dynamics.Joints.b2PulleyJointDef,
7821
b2RevoluteJoint = Box2D.Dynamics.Joints.b2RevoluteJoint,
7822
b2RevoluteJointDef = Box2D.Dynamics.Joints.b2RevoluteJointDef,
7823
b2WeldJoint = Box2D.Dynamics.Joints.b2WeldJoint,
7824
b2WeldJointDef = Box2D.Dynamics.Joints.b2WeldJointDef,
7825
b2Body = Box2D.Dynamics.b2Body,
7826
b2BodyDef = Box2D.Dynamics.b2BodyDef,
7827
b2ContactFilter = Box2D.Dynamics.b2ContactFilter,
7828
b2ContactImpulse = Box2D.Dynamics.b2ContactImpulse,
7829
b2ContactListener = Box2D.Dynamics.b2ContactListener,
7830
b2ContactManager = Box2D.Dynamics.b2ContactManager,
7831
b2DebugDraw = Box2D.Dynamics.b2DebugDraw,
7832
b2DestructionListener = Box2D.Dynamics.b2DestructionListener,
7833
b2FilterData = Box2D.Dynamics.b2FilterData,
7834
b2Fixture = Box2D.Dynamics.b2Fixture,
7835
b2FixtureDef = Box2D.Dynamics.b2FixtureDef,
7836
b2Island = Box2D.Dynamics.b2Island,
7837
b2TimeStep = Box2D.Dynamics.b2TimeStep,
7838
b2World = Box2D.Dynamics.b2World;
7839
7840
Box2D.inherit(b2DistanceJoint, Box2D.Dynamics.Joints.b2Joint);
7841
b2DistanceJoint.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
7842
b2DistanceJoint.b2DistanceJoint = function () {
7843
Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
7844
this.m_localAnchor1 = new b2Vec2();
7845
this.m_localAnchor2 = new b2Vec2();
7846
this.m_u = new b2Vec2();
7847
};
7848
b2DistanceJoint.prototype.GetAnchorA = function () {
7849
return this.m_bodyA.GetWorldPoint(this.m_localAnchor1);
7850
}
7851
b2DistanceJoint.prototype.GetAnchorB = function () {
7852
return this.m_bodyB.GetWorldPoint(this.m_localAnchor2);
7853
}
7854
b2DistanceJoint.prototype.GetReactionForce = function (inv_dt) {
7855
if (inv_dt === undefined) inv_dt = 0;
7856
return new b2Vec2(inv_dt * this.m_impulse * this.m_u.x, inv_dt * this.m_impulse * this.m_u.y);
7857
}
7858
b2DistanceJoint.prototype.GetReactionTorque = function (inv_dt) {
7859
if (inv_dt === undefined) inv_dt = 0;
7860
return 0.0;
7861
}
7862
b2DistanceJoint.prototype.GetLength = function () {
7863
return this.m_length;
7864
}
7865
b2DistanceJoint.prototype.SetLength = function (length) {
7866
if (length === undefined) length = 0;
7867
this.m_length = length;
7868
}
7869
b2DistanceJoint.prototype.GetFrequency = function () {
7870
return this.m_frequencyHz;
7871
}
7872
b2DistanceJoint.prototype.SetFrequency = function (hz) {
7873
if (hz === undefined) hz = 0;
7874
this.m_frequencyHz = hz;
7875
}
7876
b2DistanceJoint.prototype.GetDampingRatio = function () {
7877
return this.m_dampingRatio;
7878
}
7879
b2DistanceJoint.prototype.SetDampingRatio = function (ratio) {
7880
if (ratio === undefined) ratio = 0;
7881
this.m_dampingRatio = ratio;
7882
}
7883
b2DistanceJoint.prototype.b2DistanceJoint = function (def) {
7884
this.__super.b2Joint.call(this, def);
7885
var tMat;
7886
var tX = 0;
7887
var tY = 0;
7888
this.m_localAnchor1.SetV(def.localAnchorA);
7889
this.m_localAnchor2.SetV(def.localAnchorB);
7890
this.m_length = def.length;
7891
this.m_frequencyHz = def.frequencyHz;
7892
this.m_dampingRatio = def.dampingRatio;
7893
this.m_impulse = 0.0;
7894
this.m_gamma = 0.0;
7895
this.m_bias = 0.0;
7896
}
7897
b2DistanceJoint.prototype.InitVelocityConstraints = function (step) {
7898
var tMat;
7899
var tX = 0;
7900
var bA = this.m_bodyA;
7901
var bB = this.m_bodyB;
7902
tMat = bA.m_xf.R;
7903
var r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
7904
var r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
7905
tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
7906
r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
7907
r1X = tX;
7908
tMat = bB.m_xf.R;
7909
var r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
7910
var r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
7911
tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
7912
r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
7913
r2X = tX;
7914
this.m_u.x = bB.m_sweep.c.x + r2X - bA.m_sweep.c.x - r1X;
7915
this.m_u.y = bB.m_sweep.c.y + r2Y - bA.m_sweep.c.y - r1Y;
7916
var length = Math.sqrt(this.m_u.x * this.m_u.x + this.m_u.y * this.m_u.y);
7917
if (length > b2Settings.b2_linearSlop) {
7918
this.m_u.Multiply(1.0 / length);
7919
}
7920
else {
7921
this.m_u.SetZero();
7922
}
7923
var cr1u = (r1X * this.m_u.y - r1Y * this.m_u.x);
7924
var cr2u = (r2X * this.m_u.y - r2Y * this.m_u.x);
7925
var invMass = bA.m_invMass + bA.m_invI * cr1u * cr1u + bB.m_invMass + bB.m_invI * cr2u * cr2u;
7926
this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;
7927
if (this.m_frequencyHz > 0.0) {
7928
var C = length - this.m_length;
7929
var omega = 2.0 * Math.PI * this.m_frequencyHz;
7930
var d = 2.0 * this.m_mass * this.m_dampingRatio * omega;
7931
var k = this.m_mass * omega * omega;
7932
this.m_gamma = step.dt * (d + step.dt * k);
7933
this.m_gamma = this.m_gamma != 0.0 ? 1 / this.m_gamma : 0.0;
7934
this.m_bias = C * step.dt * k * this.m_gamma;
7935
this.m_mass = invMass + this.m_gamma;
7936
this.m_mass = this.m_mass != 0.0 ? 1.0 / this.m_mass : 0.0;
7937
}
7938
if (step.warmStarting) {
7939
this.m_impulse *= step.dtRatio;
7940
var PX = this.m_impulse * this.m_u.x;
7941
var PY = this.m_impulse * this.m_u.y;
7942
bA.m_linearVelocity.x -= bA.m_invMass * PX;
7943
bA.m_linearVelocity.y -= bA.m_invMass * PY;
7944
bA.m_angularVelocity -= bA.m_invI * (r1X * PY - r1Y * PX);
7945
bB.m_linearVelocity.x += bB.m_invMass * PX;
7946
bB.m_linearVelocity.y += bB.m_invMass * PY;
7947
bB.m_angularVelocity += bB.m_invI * (r2X * PY - r2Y * PX);
7948
}
7949
else {
7950
this.m_impulse = 0.0;
7951
}
7952
}
7953
b2DistanceJoint.prototype.SolveVelocityConstraints = function (step) {
7954
var tMat;
7955
var bA = this.m_bodyA;
7956
var bB = this.m_bodyB;
7957
tMat = bA.m_xf.R;
7958
var r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
7959
var r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
7960
var tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
7961
r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
7962
r1X = tX;
7963
tMat = bB.m_xf.R;
7964
var r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
7965
var r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
7966
tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
7967
r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
7968
r2X = tX;
7969
var v1X = bA.m_linearVelocity.x + ((-bA.m_angularVelocity * r1Y));
7970
var v1Y = bA.m_linearVelocity.y + (bA.m_angularVelocity * r1X);
7971
var v2X = bB.m_linearVelocity.x + ((-bB.m_angularVelocity * r2Y));
7972
var v2Y = bB.m_linearVelocity.y + (bB.m_angularVelocity * r2X);
7973
var Cdot = (this.m_u.x * (v2X - v1X) + this.m_u.y * (v2Y - v1Y));
7974
var impulse = (-this.m_mass * (Cdot + this.m_bias + this.m_gamma * this.m_impulse));
7975
this.m_impulse += impulse;
7976
var PX = impulse * this.m_u.x;
7977
var PY = impulse * this.m_u.y;
7978
bA.m_linearVelocity.x -= bA.m_invMass * PX;
7979
bA.m_linearVelocity.y -= bA.m_invMass * PY;
7980
bA.m_angularVelocity -= bA.m_invI * (r1X * PY - r1Y * PX);
7981
bB.m_linearVelocity.x += bB.m_invMass * PX;
7982
bB.m_linearVelocity.y += bB.m_invMass * PY;
7983
bB.m_angularVelocity += bB.m_invI * (r2X * PY - r2Y * PX);
7984
}
7985
b2DistanceJoint.prototype.SolvePositionConstraints = function (baumgarte) {
7986
if (baumgarte === undefined) baumgarte = 0;
7987
var tMat;
7988
if (this.m_frequencyHz > 0.0) {
7989
return true;
7990
}
7991
var bA = this.m_bodyA;
7992
var bB = this.m_bodyB;
7993
tMat = bA.m_xf.R;
7994
var r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
7995
var r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
7996
var tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
7997
r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
7998
r1X = tX;
7999
tMat = bB.m_xf.R;
8000
var r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
8001
var r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
8002
tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
8003
r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
8004
r2X = tX;
8005
var dX = bB.m_sweep.c.x + r2X - bA.m_sweep.c.x - r1X;
8006
var dY = bB.m_sweep.c.y + r2Y - bA.m_sweep.c.y - r1Y;
8007
var length = Math.sqrt(dX * dX + dY * dY);
8008
dX /= length;
8009
dY /= length;
8010
var C = length - this.m_length;
8011
C = b2Math.Clamp(C, (-b2Settings.b2_maxLinearCorrection), b2Settings.b2_maxLinearCorrection);
8012
var impulse = (-this.m_mass * C);
8013
this.m_u.Set(dX, dY);
8014
var PX = impulse * this.m_u.x;
8015
var PY = impulse * this.m_u.y;
8016
bA.m_sweep.c.x -= bA.m_invMass * PX;
8017
bA.m_sweep.c.y -= bA.m_invMass * PY;
8018
bA.m_sweep.a -= bA.m_invI * (r1X * PY - r1Y * PX);
8019
bB.m_sweep.c.x += bB.m_invMass * PX;
8020
bB.m_sweep.c.y += bB.m_invMass * PY;
8021
bB.m_sweep.a += bB.m_invI * (r2X * PY - r2Y * PX);
8022
bA.SynchronizeTransform();
8023
bB.SynchronizeTransform();
8024
return b2Math.Abs(C) < b2Settings.b2_linearSlop;
8025
}
8026
Box2D.inherit(b2DistanceJointDef, Box2D.Dynamics.Joints.b2JointDef);
8027
b2DistanceJointDef.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
8028
b2DistanceJointDef.b2DistanceJointDef = function () {
8029
Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
8030
this.localAnchorA = new b2Vec2();
8031
this.localAnchorB = new b2Vec2();
8032
};
8033
b2DistanceJointDef.prototype.b2DistanceJointDef = function () {
8034
this.__super.b2JointDef.call(this);
8035
this.type = b2Joint.e_distanceJoint;
8036
this.length = 1.0;
8037
this.frequencyHz = 0.0;
8038
this.dampingRatio = 0.0;
8039
}
8040
b2DistanceJointDef.prototype.Initialize = function (bA, bB, anchorA, anchorB) {
8041
this.bodyA = bA;
8042
this.bodyB = bB;
8043
this.localAnchorA.SetV(this.bodyA.GetLocalPoint(anchorA));
8044
this.localAnchorB.SetV(this.bodyB.GetLocalPoint(anchorB));
8045
var dX = anchorB.x - anchorA.x;
8046
var dY = anchorB.y - anchorA.y;
8047
this.length = Math.sqrt(dX * dX + dY * dY);
8048
this.frequencyHz = 0.0;
8049
this.dampingRatio = 0.0;
8050
}
8051
Box2D.inherit(b2FrictionJoint, Box2D.Dynamics.Joints.b2Joint);
8052
b2FrictionJoint.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
8053
b2FrictionJoint.b2FrictionJoint = function () {
8054
Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
8055
this.m_localAnchorA = new b2Vec2();
8056
this.m_localAnchorB = new b2Vec2();
8057
this.m_linearMass = new b2Mat22();
8058
this.m_linearImpulse = new b2Vec2();
8059
};
8060
b2FrictionJoint.prototype.GetAnchorA = function () {
8061
return this.m_bodyA.GetWorldPoint(this.m_localAnchorA);
8062
}
8063
b2FrictionJoint.prototype.GetAnchorB = function () {
8064
return this.m_bodyB.GetWorldPoint(this.m_localAnchorB);
8065
}
8066
b2FrictionJoint.prototype.GetReactionForce = function (inv_dt) {
8067
if (inv_dt === undefined) inv_dt = 0;
8068
return new b2Vec2(inv_dt * this.m_linearImpulse.x, inv_dt * this.m_linearImpulse.y);
8069
}
8070
b2FrictionJoint.prototype.GetReactionTorque = function (inv_dt) {
8071
if (inv_dt === undefined) inv_dt = 0;
8072
return inv_dt * this.m_angularImpulse;
8073
}
8074
b2FrictionJoint.prototype.SetMaxForce = function (force) {
8075
if (force === undefined) force = 0;
8076
this.m_maxForce = force;
8077
}
8078
b2FrictionJoint.prototype.GetMaxForce = function () {
8079
return this.m_maxForce;
8080
}
8081
b2FrictionJoint.prototype.SetMaxTorque = function (torque) {
8082
if (torque === undefined) torque = 0;
8083
this.m_maxTorque = torque;
8084
}
8085
b2FrictionJoint.prototype.GetMaxTorque = function () {
8086
return this.m_maxTorque;
8087
}
8088
b2FrictionJoint.prototype.b2FrictionJoint = function (def) {
8089
this.__super.b2Joint.call(this, def);
8090
this.m_localAnchorA.SetV(def.localAnchorA);
8091
this.m_localAnchorB.SetV(def.localAnchorB);
8092
this.m_linearMass.SetZero();
8093
this.m_angularMass = 0.0;
8094
this.m_linearImpulse.SetZero();
8095
this.m_angularImpulse = 0.0;
8096
this.m_maxForce = def.maxForce;
8097
this.m_maxTorque = def.maxTorque;
8098
}
8099
b2FrictionJoint.prototype.InitVelocityConstraints = function (step) {
8100
var tMat;
8101
var tX = 0;
8102
var bA = this.m_bodyA;
8103
var bB = this.m_bodyB;
8104
tMat = bA.m_xf.R;
8105
var rAX = this.m_localAnchorA.x - bA.m_sweep.localCenter.x;
8106
var rAY = this.m_localAnchorA.y - bA.m_sweep.localCenter.y;
8107
tX = (tMat.col1.x * rAX + tMat.col2.x * rAY);
8108
rAY = (tMat.col1.y * rAX + tMat.col2.y * rAY);
8109
rAX = tX;
8110
tMat = bB.m_xf.R;
8111
var rBX = this.m_localAnchorB.x - bB.m_sweep.localCenter.x;
8112
var rBY = this.m_localAnchorB.y - bB.m_sweep.localCenter.y;
8113
tX = (tMat.col1.x * rBX + tMat.col2.x * rBY);
8114
rBY = (tMat.col1.y * rBX + tMat.col2.y * rBY);
8115
rBX = tX;
8116
var mA = bA.m_invMass;
8117
var mB = bB.m_invMass;
8118
var iA = bA.m_invI;
8119
var iB = bB.m_invI;
8120
var K = new b2Mat22();
8121
K.col1.x = mA + mB;
8122
K.col2.x = 0.0;
8123
K.col1.y = 0.0;
8124
K.col2.y = mA + mB;
8125
K.col1.x += iA * rAY * rAY;
8126
K.col2.x += (-iA * rAX * rAY);
8127
K.col1.y += (-iA * rAX * rAY);
8128
K.col2.y += iA * rAX * rAX;
8129
K.col1.x += iB * rBY * rBY;
8130
K.col2.x += (-iB * rBX * rBY);
8131
K.col1.y += (-iB * rBX * rBY);
8132
K.col2.y += iB * rBX * rBX;
8133
K.GetInverse(this.m_linearMass);
8134
this.m_angularMass = iA + iB;
8135
if (this.m_angularMass > 0.0) {
8136
this.m_angularMass = 1.0 / this.m_angularMass;
8137
}
8138
if (step.warmStarting) {
8139
this.m_linearImpulse.x *= step.dtRatio;
8140
this.m_linearImpulse.y *= step.dtRatio;
8141
this.m_angularImpulse *= step.dtRatio;
8142
var P = this.m_linearImpulse;
8143
bA.m_linearVelocity.x -= mA * P.x;
8144
bA.m_linearVelocity.y -= mA * P.y;
8145
bA.m_angularVelocity -= iA * (rAX * P.y - rAY * P.x + this.m_angularImpulse);
8146
bB.m_linearVelocity.x += mB * P.x;
8147
bB.m_linearVelocity.y += mB * P.y;
8148
bB.m_angularVelocity += iB * (rBX * P.y - rBY * P.x + this.m_angularImpulse);
8149
}
8150
else {
8151
this.m_linearImpulse.SetZero();
8152
this.m_angularImpulse = 0.0;
8153
}
8154
}
8155
b2FrictionJoint.prototype.SolveVelocityConstraints = function (step) {
8156
var tMat;
8157
var tX = 0;
8158
var bA = this.m_bodyA;
8159
var bB = this.m_bodyB;
8160
var vA = bA.m_linearVelocity;
8161
var wA = bA.m_angularVelocity;
8162
var vB = bB.m_linearVelocity;
8163
var wB = bB.m_angularVelocity;
8164
var mA = bA.m_invMass;
8165
var mB = bB.m_invMass;
8166
var iA = bA.m_invI;
8167
var iB = bB.m_invI;
8168
tMat = bA.m_xf.R;
8169
var rAX = this.m_localAnchorA.x - bA.m_sweep.localCenter.x;
8170
var rAY = this.m_localAnchorA.y - bA.m_sweep.localCenter.y;
8171
tX = (tMat.col1.x * rAX + tMat.col2.x * rAY);
8172
rAY = (tMat.col1.y * rAX + tMat.col2.y * rAY);
8173
rAX = tX;
8174
tMat = bB.m_xf.R;
8175
var rBX = this.m_localAnchorB.x - bB.m_sweep.localCenter.x;
8176
var rBY = this.m_localAnchorB.y - bB.m_sweep.localCenter.y;
8177
tX = (tMat.col1.x * rBX + tMat.col2.x * rBY);
8178
rBY = (tMat.col1.y * rBX + tMat.col2.y * rBY);
8179
rBX = tX;
8180
var maxImpulse = 0; {
8181
var Cdot = wB - wA;
8182
var impulse = (-this.m_angularMass * Cdot);
8183
var oldImpulse = this.m_angularImpulse;
8184
maxImpulse = step.dt * this.m_maxTorque;
8185
this.m_angularImpulse = b2Math.Clamp(this.m_angularImpulse + impulse, (-maxImpulse), maxImpulse);
8186
impulse = this.m_angularImpulse - oldImpulse;
8187
wA -= iA * impulse;
8188
wB += iB * impulse;
8189
} {
8190
var CdotX = vB.x - wB * rBY - vA.x + wA * rAY;
8191
var CdotY = vB.y + wB * rBX - vA.y - wA * rAX;
8192
var impulseV = b2Math.MulMV(this.m_linearMass, new b2Vec2((-CdotX), (-CdotY)));
8193
var oldImpulseV = this.m_linearImpulse.Copy();
8194
this.m_linearImpulse.Add(impulseV);
8195
maxImpulse = step.dt * this.m_maxForce;
8196
if (this.m_linearImpulse.LengthSquared() > maxImpulse * maxImpulse) {
8197
this.m_linearImpulse.Normalize();
8198
this.m_linearImpulse.Multiply(maxImpulse);
8199
}
8200
impulseV = b2Math.SubtractVV(this.m_linearImpulse, oldImpulseV);
8201
vA.x -= mA * impulseV.x;
8202
vA.y -= mA * impulseV.y;
8203
wA -= iA * (rAX * impulseV.y - rAY * impulseV.x);
8204
vB.x += mB * impulseV.x;
8205
vB.y += mB * impulseV.y;
8206
wB += iB * (rBX * impulseV.y - rBY * impulseV.x);
8207
}
8208
bA.m_angularVelocity = wA;
8209
bB.m_angularVelocity = wB;
8210
}
8211
b2FrictionJoint.prototype.SolvePositionConstraints = function (baumgarte) {
8212
if (baumgarte === undefined) baumgarte = 0;
8213
return true;
8214
}
8215
Box2D.inherit(b2FrictionJointDef, Box2D.Dynamics.Joints.b2JointDef);
8216
b2FrictionJointDef.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
8217
b2FrictionJointDef.b2FrictionJointDef = function () {
8218
Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
8219
this.localAnchorA = new b2Vec2();
8220
this.localAnchorB = new b2Vec2();
8221
};
8222
b2FrictionJointDef.prototype.b2FrictionJointDef = function () {
8223
this.__super.b2JointDef.call(this);
8224
this.type = b2Joint.e_frictionJoint;
8225
this.maxForce = 0.0;
8226
this.maxTorque = 0.0;
8227
}
8228
b2FrictionJointDef.prototype.Initialize = function (bA, bB, anchor) {
8229
this.bodyA = bA;
8230
this.bodyB = bB;
8231
this.localAnchorA.SetV(this.bodyA.GetLocalPoint(anchor));
8232
this.localAnchorB.SetV(this.bodyB.GetLocalPoint(anchor));
8233
}
8234
Box2D.inherit(b2GearJoint, Box2D.Dynamics.Joints.b2Joint);
8235
b2GearJoint.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
8236
b2GearJoint.b2GearJoint = function () {
8237
Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
8238
this.m_groundAnchor1 = new b2Vec2();
8239
this.m_groundAnchor2 = new b2Vec2();
8240
this.m_localAnchor1 = new b2Vec2();
8241
this.m_localAnchor2 = new b2Vec2();
8242
this.m_J = new b2Jacobian();
8243
};
8244
b2GearJoint.prototype.GetAnchorA = function () {
8245
return this.m_bodyA.GetWorldPoint(this.m_localAnchor1);
8246
}
8247
b2GearJoint.prototype.GetAnchorB = function () {
8248
return this.m_bodyB.GetWorldPoint(this.m_localAnchor2);
8249
}
8250
b2GearJoint.prototype.GetReactionForce = function (inv_dt) {
8251
if (inv_dt === undefined) inv_dt = 0;
8252
return new b2Vec2(inv_dt * this.m_impulse * this.m_J.linearB.x, inv_dt * this.m_impulse * this.m_J.linearB.y);
8253
}
8254
b2GearJoint.prototype.GetReactionTorque = function (inv_dt) {
8255
if (inv_dt === undefined) inv_dt = 0;
8256
var tMat = this.m_bodyB.m_xf.R;
8257
var rX = this.m_localAnchor1.x - this.m_bodyB.m_sweep.localCenter.x;
8258
var rY = this.m_localAnchor1.y - this.m_bodyB.m_sweep.localCenter.y;
8259
var tX = tMat.col1.x * rX + tMat.col2.x * rY;
8260
rY = tMat.col1.y * rX + tMat.col2.y * rY;
8261
rX = tX;
8262
var PX = this.m_impulse * this.m_J.linearB.x;
8263
var PY = this.m_impulse * this.m_J.linearB.y;
8264
return inv_dt * (this.m_impulse * this.m_J.angularB - rX * PY + rY * PX);
8265
}
8266
b2GearJoint.prototype.GetRatio = function () {
8267
return this.m_ratio;
8268
}
8269
b2GearJoint.prototype.SetRatio = function (ratio) {
8270
if (ratio === undefined) ratio = 0;
8271
this.m_ratio = ratio;
8272
}
8273
b2GearJoint.prototype.b2GearJoint = function (def) {
8274
this.__super.b2Joint.call(this, def);
8275
var type1 = parseInt(def.joint1.m_type);
8276
var type2 = parseInt(def.joint2.m_type);
8277
this.m_revolute1 = null;
8278
this.m_prismatic1 = null;
8279
this.m_revolute2 = null;
8280
this.m_prismatic2 = null;
8281
var coordinate1 = 0;
8282
var coordinate2 = 0;
8283
this.m_ground1 = def.joint1.GetBodyA();
8284
this.m_bodyA = def.joint1.GetBodyB();
8285
if (type1 == b2Joint.e_revoluteJoint) {
8286
this.m_revolute1 = (def.joint1 instanceof b2RevoluteJoint ? def.joint1 : null);
8287
this.m_groundAnchor1.SetV(this.m_revolute1.m_localAnchor1);
8288
this.m_localAnchor1.SetV(this.m_revolute1.m_localAnchor2);
8289
coordinate1 = this.m_revolute1.GetJointAngle();
8290
}
8291
else {
8292
this.m_prismatic1 = (def.joint1 instanceof b2PrismaticJoint ? def.joint1 : null);
8293
this.m_groundAnchor1.SetV(this.m_prismatic1.m_localAnchor1);
8294
this.m_localAnchor1.SetV(this.m_prismatic1.m_localAnchor2);
8295
coordinate1 = this.m_prismatic1.GetJointTranslation();
8296
}
8297
this.m_ground2 = def.joint2.GetBodyA();
8298
this.m_bodyB = def.joint2.GetBodyB();
8299
if (type2 == b2Joint.e_revoluteJoint) {
8300
this.m_revolute2 = (def.joint2 instanceof b2RevoluteJoint ? def.joint2 : null);
8301
this.m_groundAnchor2.SetV(this.m_revolute2.m_localAnchor1);
8302
this.m_localAnchor2.SetV(this.m_revolute2.m_localAnchor2);
8303
coordinate2 = this.m_revolute2.GetJointAngle();
8304
}
8305
else {
8306
this.m_prismatic2 = (def.joint2 instanceof b2PrismaticJoint ? def.joint2 : null);
8307
this.m_groundAnchor2.SetV(this.m_prismatic2.m_localAnchor1);
8308
this.m_localAnchor2.SetV(this.m_prismatic2.m_localAnchor2);
8309
coordinate2 = this.m_prismatic2.GetJointTranslation();
8310
}
8311
this.m_ratio = def.ratio;
8312
this.m_constant = coordinate1 + this.m_ratio * coordinate2;
8313
this.m_impulse = 0.0;
8314
}
8315
b2GearJoint.prototype.InitVelocityConstraints = function (step) {
8316
var g1 = this.m_ground1;
8317
var g2 = this.m_ground2;
8318
var bA = this.m_bodyA;
8319
var bB = this.m_bodyB;
8320
var ugX = 0;
8321
var ugY = 0;
8322
var rX = 0;
8323
var rY = 0;
8324
var tMat;
8325
var tVec;
8326
var crug = 0;
8327
var tX = 0;
8328
var K = 0.0;
8329
this.m_J.SetZero();
8330
if (this.m_revolute1) {
8331
this.m_J.angularA = (-1.0);
8332
K += bA.m_invI;
8333
}
8334
else {
8335
tMat = g1.m_xf.R;
8336
tVec = this.m_prismatic1.m_localXAxis1;
8337
ugX = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
8338
ugY = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
8339
tMat = bA.m_xf.R;
8340
rX = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
8341
rY = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
8342
tX = tMat.col1.x * rX + tMat.col2.x * rY;
8343
rY = tMat.col1.y * rX + tMat.col2.y * rY;
8344
rX = tX;
8345
crug = rX * ugY - rY * ugX;
8346
this.m_J.linearA.Set((-ugX), (-ugY));
8347
this.m_J.angularA = (-crug);
8348
K += bA.m_invMass + bA.m_invI * crug * crug;
8349
}
8350
if (this.m_revolute2) {
8351
this.m_J.angularB = (-this.m_ratio);
8352
K += this.m_ratio * this.m_ratio * bB.m_invI;
8353
}
8354
else {
8355
tMat = g2.m_xf.R;
8356
tVec = this.m_prismatic2.m_localXAxis1;
8357
ugX = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
8358
ugY = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
8359
tMat = bB.m_xf.R;
8360
rX = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
8361
rY = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
8362
tX = tMat.col1.x * rX + tMat.col2.x * rY;
8363
rY = tMat.col1.y * rX + tMat.col2.y * rY;
8364
rX = tX;
8365
crug = rX * ugY - rY * ugX;
8366
this.m_J.linearB.Set((-this.m_ratio * ugX), (-this.m_ratio * ugY));
8367
this.m_J.angularB = (-this.m_ratio * crug);
8368
K += this.m_ratio * this.m_ratio * (bB.m_invMass + bB.m_invI * crug * crug);
8369
}
8370
this.m_mass = K > 0.0 ? 1.0 / K : 0.0;
8371
if (step.warmStarting) {
8372
bA.m_linearVelocity.x += bA.m_invMass * this.m_impulse * this.m_J.linearA.x;
8373
bA.m_linearVelocity.y += bA.m_invMass * this.m_impulse * this.m_J.linearA.y;
8374
bA.m_angularVelocity += bA.m_invI * this.m_impulse * this.m_J.angularA;
8375
bB.m_linearVelocity.x += bB.m_invMass * this.m_impulse * this.m_J.linearB.x;
8376
bB.m_linearVelocity.y += bB.m_invMass * this.m_impulse * this.m_J.linearB.y;
8377
bB.m_angularVelocity += bB.m_invI * this.m_impulse * this.m_J.angularB;
8378
}
8379
else {
8380
this.m_impulse = 0.0;
8381
}
8382
}
8383
b2GearJoint.prototype.SolveVelocityConstraints = function (step) {
8384
var bA = this.m_bodyA;
8385
var bB = this.m_bodyB;
8386
var Cdot = this.m_J.Compute(bA.m_linearVelocity, bA.m_angularVelocity, bB.m_linearVelocity, bB.m_angularVelocity);
8387
var impulse = (-this.m_mass * Cdot);
8388
this.m_impulse += impulse;
8389
bA.m_linearVelocity.x += bA.m_invMass * impulse * this.m_J.linearA.x;
8390
bA.m_linearVelocity.y += bA.m_invMass * impulse * this.m_J.linearA.y;
8391
bA.m_angularVelocity += bA.m_invI * impulse * this.m_J.angularA;
8392
bB.m_linearVelocity.x += bB.m_invMass * impulse * this.m_J.linearB.x;
8393
bB.m_linearVelocity.y += bB.m_invMass * impulse * this.m_J.linearB.y;
8394
bB.m_angularVelocity += bB.m_invI * impulse * this.m_J.angularB;
8395
}
8396
b2GearJoint.prototype.SolvePositionConstraints = function (baumgarte) {
8397
if (baumgarte === undefined) baumgarte = 0;
8398
var linearError = 0.0;
8399
var bA = this.m_bodyA;
8400
var bB = this.m_bodyB;
8401
var coordinate1 = 0;
8402
var coordinate2 = 0;
8403
if (this.m_revolute1) {
8404
coordinate1 = this.m_revolute1.GetJointAngle();
8405
}
8406
else {
8407
coordinate1 = this.m_prismatic1.GetJointTranslation();
8408
}
8409
if (this.m_revolute2) {
8410
coordinate2 = this.m_revolute2.GetJointAngle();
8411
}
8412
else {
8413
coordinate2 = this.m_prismatic2.GetJointTranslation();
8414
}
8415
var C = this.m_constant - (coordinate1 + this.m_ratio * coordinate2);
8416
var impulse = (-this.m_mass * C);
8417
bA.m_sweep.c.x += bA.m_invMass * impulse * this.m_J.linearA.x;
8418
bA.m_sweep.c.y += bA.m_invMass * impulse * this.m_J.linearA.y;
8419
bA.m_sweep.a += bA.m_invI * impulse * this.m_J.angularA;
8420
bB.m_sweep.c.x += bB.m_invMass * impulse * this.m_J.linearB.x;
8421
bB.m_sweep.c.y += bB.m_invMass * impulse * this.m_J.linearB.y;
8422
bB.m_sweep.a += bB.m_invI * impulse * this.m_J.angularB;
8423
bA.SynchronizeTransform();
8424
bB.SynchronizeTransform();
8425
return linearError < b2Settings.b2_linearSlop;
8426
}
8427
Box2D.inherit(b2GearJointDef, Box2D.Dynamics.Joints.b2JointDef);
8428
b2GearJointDef.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
8429
b2GearJointDef.b2GearJointDef = function () {
8430
Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
8431
};
8432
b2GearJointDef.prototype.b2GearJointDef = function () {
8433
this.__super.b2JointDef.call(this);
8434
this.type = b2Joint.e_gearJoint;
8435
this.joint1 = null;
8436
this.joint2 = null;
8437
this.ratio = 1.0;
8438
}
8439
b2Jacobian.b2Jacobian = function () {
8440
this.linearA = new b2Vec2();
8441
this.linearB = new b2Vec2();
8442
};
8443
b2Jacobian.prototype.SetZero = function () {
8444
this.linearA.SetZero();
8445
this.angularA = 0.0;
8446
this.linearB.SetZero();
8447
this.angularB = 0.0;
8448
}
8449
b2Jacobian.prototype.Set = function (x1, a1, x2, a2) {
8450
if (a1 === undefined) a1 = 0;
8451
if (a2 === undefined) a2 = 0;
8452
this.linearA.SetV(x1);
8453
this.angularA = a1;
8454
this.linearB.SetV(x2);
8455
this.angularB = a2;
8456
}
8457
b2Jacobian.prototype.Compute = function (x1, a1, x2, a2) {
8458
if (a1 === undefined) a1 = 0;
8459
if (a2 === undefined) a2 = 0;
8460
return (this.linearA.x * x1.x + this.linearA.y * x1.y) + this.angularA * a1 + (this.linearB.x * x2.x + this.linearB.y * x2.y) + this.angularB * a2;
8461
}
8462
b2Joint.b2Joint = function () {
8463
this.m_edgeA = new b2JointEdge();
8464
this.m_edgeB = new b2JointEdge();
8465
this.m_localCenterA = new b2Vec2();
8466
this.m_localCenterB = new b2Vec2();
8467
};
8468
b2Joint.prototype.GetType = function () {
8469
return this.m_type;
8470
}
8471
b2Joint.prototype.GetAnchorA = function () {
8472
return null;
8473
}
8474
b2Joint.prototype.GetAnchorB = function () {
8475
return null;
8476
}
8477
b2Joint.prototype.GetReactionForce = function (inv_dt) {
8478
if (inv_dt === undefined) inv_dt = 0;
8479
return null;
8480
}
8481
b2Joint.prototype.GetReactionTorque = function (inv_dt) {
8482
if (inv_dt === undefined) inv_dt = 0;
8483
return 0.0;
8484
}
8485
b2Joint.prototype.GetBodyA = function () {
8486
return this.m_bodyA;
8487
}
8488
b2Joint.prototype.GetBodyB = function () {
8489
return this.m_bodyB;
8490
}
8491
b2Joint.prototype.GetNext = function () {
8492
return this.m_next;
8493
}
8494
b2Joint.prototype.GetUserData = function () {
8495
return this.m_userData;
8496
}
8497
b2Joint.prototype.SetUserData = function (data) {
8498
this.m_userData = data;
8499
}
8500
b2Joint.prototype.IsActive = function () {
8501
return this.m_bodyA.IsActive() && this.m_bodyB.IsActive();
8502
}
8503
b2Joint.Create = function (def, allocator) {
8504
var joint = null;
8505
switch (def.type) {
8506
case b2Joint.e_distanceJoint:
8507
{
8508
joint = new b2DistanceJoint((def instanceof b2DistanceJointDef ? def : null));
8509
}
8510
break;
8511
case b2Joint.e_mouseJoint:
8512
{
8513
joint = new b2MouseJoint((def instanceof b2MouseJointDef ? def : null));
8514
}
8515
break;
8516
case b2Joint.e_prismaticJoint:
8517
{
8518
joint = new b2PrismaticJoint((def instanceof b2PrismaticJointDef ? def : null));
8519
}
8520
break;
8521
case b2Joint.e_revoluteJoint:
8522
{
8523
joint = new b2RevoluteJoint((def instanceof b2RevoluteJointDef ? def : null));
8524
}
8525
break;
8526
case b2Joint.e_pulleyJoint:
8527
{
8528
joint = new b2PulleyJoint((def instanceof b2PulleyJointDef ? def : null));
8529
}
8530
break;
8531
case b2Joint.e_gearJoint:
8532
{
8533
joint = new b2GearJoint((def instanceof b2GearJointDef ? def : null));
8534
}
8535
break;
8536
case b2Joint.e_lineJoint:
8537
{
8538
joint = new b2LineJoint((def instanceof b2LineJointDef ? def : null));
8539
}
8540
break;
8541
case b2Joint.e_weldJoint:
8542
{
8543
joint = new b2WeldJoint((def instanceof b2WeldJointDef ? def : null));
8544
}
8545
break;
8546
case b2Joint.e_frictionJoint:
8547
{
8548
joint = new b2FrictionJoint((def instanceof b2FrictionJointDef ? def : null));
8549
}
8550
break;
8551
default:
8552
break;
8553
}
8554
return joint;
8555
}
8556
b2Joint.Destroy = function (joint, allocator) {}
8557
b2Joint.prototype.b2Joint = function (def) {
8558
b2Settings.b2Assert(def.bodyA != def.bodyB);
8559
this.m_type = def.type;
8560
this.m_prev = null;
8561
this.m_next = null;
8562
this.m_bodyA = def.bodyA;
8563
this.m_bodyB = def.bodyB;
8564
this.m_collideConnected = def.collideConnected;
8565
this.m_islandFlag = false;
8566
this.m_userData = def.userData;
8567
}
8568
b2Joint.prototype.InitVelocityConstraints = function (step) {}
8569
b2Joint.prototype.SolveVelocityConstraints = function (step) {}
8570
b2Joint.prototype.FinalizeVelocityConstraints = function () {}
8571
b2Joint.prototype.SolvePositionConstraints = function (baumgarte) {
8572
if (baumgarte === undefined) baumgarte = 0;
8573
return false;
8574
}
8575
Box2D.postDefs.push(function () {
8576
Box2D.Dynamics.Joints.b2Joint.e_unknownJoint = 0;
8577
Box2D.Dynamics.Joints.b2Joint.e_revoluteJoint = 1;
8578
Box2D.Dynamics.Joints.b2Joint.e_prismaticJoint = 2;
8579
Box2D.Dynamics.Joints.b2Joint.e_distanceJoint = 3;
8580
Box2D.Dynamics.Joints.b2Joint.e_pulleyJoint = 4;
8581
Box2D.Dynamics.Joints.b2Joint.e_mouseJoint = 5;
8582
Box2D.Dynamics.Joints.b2Joint.e_gearJoint = 6;
8583
Box2D.Dynamics.Joints.b2Joint.e_lineJoint = 7;
8584
Box2D.Dynamics.Joints.b2Joint.e_weldJoint = 8;
8585
Box2D.Dynamics.Joints.b2Joint.e_frictionJoint = 9;
8586
Box2D.Dynamics.Joints.b2Joint.e_inactiveLimit = 0;
8587
Box2D.Dynamics.Joints.b2Joint.e_atLowerLimit = 1;
8588
Box2D.Dynamics.Joints.b2Joint.e_atUpperLimit = 2;
8589
Box2D.Dynamics.Joints.b2Joint.e_equalLimits = 3;
8590
});
8591
b2JointDef.b2JointDef = function () {};
8592
b2JointDef.prototype.b2JointDef = function () {
8593
this.type = b2Joint.e_unknownJoint;
8594
this.userData = null;
8595
this.bodyA = null;
8596
this.bodyB = null;
8597
this.collideConnected = false;
8598
}
8599
b2JointEdge.b2JointEdge = function () {};
8600
Box2D.inherit(b2LineJoint, Box2D.Dynamics.Joints.b2Joint);
8601
b2LineJoint.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
8602
b2LineJoint.b2LineJoint = function () {
8603
Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
8604
this.m_localAnchor1 = new b2Vec2();
8605
this.m_localAnchor2 = new b2Vec2();
8606
this.m_localXAxis1 = new b2Vec2();
8607
this.m_localYAxis1 = new b2Vec2();
8608
this.m_axis = new b2Vec2();
8609
this.m_perp = new b2Vec2();
8610
this.m_K = new b2Mat22();
8611
this.m_impulse = new b2Vec2();
8612
};
8613
b2LineJoint.prototype.GetAnchorA = function () {
8614
return this.m_bodyA.GetWorldPoint(this.m_localAnchor1);
8615
}
8616
b2LineJoint.prototype.GetAnchorB = function () {
8617
return this.m_bodyB.GetWorldPoint(this.m_localAnchor2);
8618
}
8619
b2LineJoint.prototype.GetReactionForce = function (inv_dt) {
8620
if (inv_dt === undefined) inv_dt = 0;
8621
return new b2Vec2(inv_dt * (this.m_impulse.x * this.m_perp.x + (this.m_motorImpulse + this.m_impulse.y) * this.m_axis.x), inv_dt * (this.m_impulse.x * this.m_perp.y + (this.m_motorImpulse + this.m_impulse.y) * this.m_axis.y));
8622
}
8623
b2LineJoint.prototype.GetReactionTorque = function (inv_dt) {
8624
if (inv_dt === undefined) inv_dt = 0;
8625
return inv_dt * this.m_impulse.y;
8626
}
8627
b2LineJoint.prototype.GetJointTranslation = function () {
8628
var bA = this.m_bodyA;
8629
var bB = this.m_bodyB;
8630
var tMat;
8631
var p1 = bA.GetWorldPoint(this.m_localAnchor1);
8632
var p2 = bB.GetWorldPoint(this.m_localAnchor2);
8633
var dX = p2.x - p1.x;
8634
var dY = p2.y - p1.y;
8635
var axis = bA.GetWorldVector(this.m_localXAxis1);
8636
var translation = axis.x * dX + axis.y * dY;
8637
return translation;
8638
}
8639
b2LineJoint.prototype.GetJointSpeed = function () {
8640
var bA = this.m_bodyA;
8641
var bB = this.m_bodyB;
8642
var tMat;
8643
tMat = bA.m_xf.R;
8644
var r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
8645
var r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
8646
var tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
8647
r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
8648
r1X = tX;
8649
tMat = bB.m_xf.R;
8650
var r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
8651
var r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
8652
tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
8653
r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
8654
r2X = tX;
8655
var p1X = bA.m_sweep.c.x + r1X;
8656
var p1Y = bA.m_sweep.c.y + r1Y;
8657
var p2X = bB.m_sweep.c.x + r2X;
8658
var p2Y = bB.m_sweep.c.y + r2Y;
8659
var dX = p2X - p1X;
8660
var dY = p2Y - p1Y;
8661
var axis = bA.GetWorldVector(this.m_localXAxis1);
8662
var v1 = bA.m_linearVelocity;
8663
var v2 = bB.m_linearVelocity;
8664
var w1 = bA.m_angularVelocity;
8665
var w2 = bB.m_angularVelocity;
8666
var speed = (dX * ((-w1 * axis.y)) + dY * (w1 * axis.x)) + (axis.x * (((v2.x + ((-w2 * r2Y))) - v1.x) - ((-w1 * r1Y))) + axis.y * (((v2.y + (w2 * r2X)) - v1.y) - (w1 * r1X)));
8667
return speed;
8668
}
8669
b2LineJoint.prototype.IsLimitEnabled = function () {
8670
return this.m_enableLimit;
8671
}
8672
b2LineJoint.prototype.EnableLimit = function (flag) {
8673
this.m_bodyA.SetAwake(true);
8674
this.m_bodyB.SetAwake(true);
8675
this.m_enableLimit = flag;
8676
}
8677
b2LineJoint.prototype.GetLowerLimit = function () {
8678
return this.m_lowerTranslation;
8679
}
8680
b2LineJoint.prototype.GetUpperLimit = function () {
8681
return this.m_upperTranslation;
8682
}
8683
b2LineJoint.prototype.SetLimits = function (lower, upper) {
8684
if (lower === undefined) lower = 0;
8685
if (upper === undefined) upper = 0;
8686
this.m_bodyA.SetAwake(true);
8687
this.m_bodyB.SetAwake(true);
8688
this.m_lowerTranslation = lower;
8689
this.m_upperTranslation = upper;
8690
}
8691
b2LineJoint.prototype.IsMotorEnabled = function () {
8692
return this.m_enableMotor;
8693
}
8694
b2LineJoint.prototype.EnableMotor = function (flag) {
8695
this.m_bodyA.SetAwake(true);
8696
this.m_bodyB.SetAwake(true);
8697
this.m_enableMotor = flag;
8698
}
8699
b2LineJoint.prototype.SetMotorSpeed = function (speed) {
8700
if (speed === undefined) speed = 0;
8701
this.m_bodyA.SetAwake(true);
8702
this.m_bodyB.SetAwake(true);
8703
this.m_motorSpeed = speed;
8704
}
8705
b2LineJoint.prototype.GetMotorSpeed = function () {
8706
return this.m_motorSpeed;
8707
}
8708
b2LineJoint.prototype.SetMaxMotorForce = function (force) {
8709
if (force === undefined) force = 0;
8710
this.m_bodyA.SetAwake(true);
8711
this.m_bodyB.SetAwake(true);
8712
this.m_maxMotorForce = force;
8713
}
8714
b2LineJoint.prototype.GetMaxMotorForce = function () {
8715
return this.m_maxMotorForce;
8716
}
8717
b2LineJoint.prototype.GetMotorForce = function () {
8718
return this.m_motorImpulse;
8719
}
8720
b2LineJoint.prototype.b2LineJoint = function (def) {
8721
this.__super.b2Joint.call(this, def);
8722
var tMat;
8723
var tX = 0;
8724
var tY = 0;
8725
this.m_localAnchor1.SetV(def.localAnchorA);
8726
this.m_localAnchor2.SetV(def.localAnchorB);
8727
this.m_localXAxis1.SetV(def.localAxisA);
8728
this.m_localYAxis1.x = (-this.m_localXAxis1.y);
8729
this.m_localYAxis1.y = this.m_localXAxis1.x;
8730
this.m_impulse.SetZero();
8731
this.m_motorMass = 0.0;
8732
this.m_motorImpulse = 0.0;
8733
this.m_lowerTranslation = def.lowerTranslation;
8734
this.m_upperTranslation = def.upperTranslation;
8735
this.m_maxMotorForce = def.maxMotorForce;
8736
this.m_motorSpeed = def.motorSpeed;
8737
this.m_enableLimit = def.enableLimit;
8738
this.m_enableMotor = def.enableMotor;
8739
this.m_limitState = b2Joint.e_inactiveLimit;
8740
this.m_axis.SetZero();
8741
this.m_perp.SetZero();
8742
}
8743
b2LineJoint.prototype.InitVelocityConstraints = function (step) {
8744
var bA = this.m_bodyA;
8745
var bB = this.m_bodyB;
8746
var tMat;
8747
var tX = 0;
8748
this.m_localCenterA.SetV(bA.GetLocalCenter());
8749
this.m_localCenterB.SetV(bB.GetLocalCenter());
8750
var xf1 = bA.GetTransform();
8751
var xf2 = bB.GetTransform();
8752
tMat = bA.m_xf.R;
8753
var r1X = this.m_localAnchor1.x - this.m_localCenterA.x;
8754
var r1Y = this.m_localAnchor1.y - this.m_localCenterA.y;
8755
tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
8756
r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
8757
r1X = tX;
8758
tMat = bB.m_xf.R;
8759
var r2X = this.m_localAnchor2.x - this.m_localCenterB.x;
8760
var r2Y = this.m_localAnchor2.y - this.m_localCenterB.y;
8761
tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
8762
r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
8763
r2X = tX;
8764
var dX = bB.m_sweep.c.x + r2X - bA.m_sweep.c.x - r1X;
8765
var dY = bB.m_sweep.c.y + r2Y - bA.m_sweep.c.y - r1Y;
8766
this.m_invMassA = bA.m_invMass;
8767
this.m_invMassB = bB.m_invMass;
8768
this.m_invIA = bA.m_invI;
8769
this.m_invIB = bB.m_invI; {
8770
this.m_axis.SetV(b2Math.MulMV(xf1.R, this.m_localXAxis1));
8771
this.m_a1 = (dX + r1X) * this.m_axis.y - (dY + r1Y) * this.m_axis.x;
8772
this.m_a2 = r2X * this.m_axis.y - r2Y * this.m_axis.x;
8773
this.m_motorMass = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_a1 * this.m_a1 + this.m_invIB * this.m_a2 * this.m_a2;
8774
this.m_motorMass = this.m_motorMass > Number.MIN_VALUE ? 1.0 / this.m_motorMass : 0.0;
8775
} {
8776
this.m_perp.SetV(b2Math.MulMV(xf1.R, this.m_localYAxis1));
8777
this.m_s1 = (dX + r1X) * this.m_perp.y - (dY + r1Y) * this.m_perp.x;
8778
this.m_s2 = r2X * this.m_perp.y - r2Y * this.m_perp.x;
8779
var m1 = this.m_invMassA;
8780
var m2 = this.m_invMassB;
8781
var i1 = this.m_invIA;
8782
var i2 = this.m_invIB;
8783
this.m_K.col1.x = m1 + m2 + i1 * this.m_s1 * this.m_s1 + i2 * this.m_s2 * this.m_s2;
8784
this.m_K.col1.y = i1 * this.m_s1 * this.m_a1 + i2 * this.m_s2 * this.m_a2;
8785
this.m_K.col2.x = this.m_K.col1.y;
8786
this.m_K.col2.y = m1 + m2 + i1 * this.m_a1 * this.m_a1 + i2 * this.m_a2 * this.m_a2;
8787
}
8788
if (this.m_enableLimit) {
8789
var jointTransition = this.m_axis.x * dX + this.m_axis.y * dY;
8790
if (b2Math.Abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * b2Settings.b2_linearSlop) {
8791
this.m_limitState = b2Joint.e_equalLimits;
8792
}
8793
else if (jointTransition <= this.m_lowerTranslation) {
8794
if (this.m_limitState != b2Joint.e_atLowerLimit) {
8795
this.m_limitState = b2Joint.e_atLowerLimit;
8796
this.m_impulse.y = 0.0;
8797
}
8798
}
8799
else if (jointTransition >= this.m_upperTranslation) {
8800
if (this.m_limitState != b2Joint.e_atUpperLimit) {
8801
this.m_limitState = b2Joint.e_atUpperLimit;
8802
this.m_impulse.y = 0.0;
8803
}
8804
}
8805
else {
8806
this.m_limitState = b2Joint.e_inactiveLimit;
8807
this.m_impulse.y = 0.0;
8808
}
8809
}
8810
else {
8811
this.m_limitState = b2Joint.e_inactiveLimit;
8812
}
8813
if (this.m_enableMotor == false) {
8814
this.m_motorImpulse = 0.0;
8815
}
8816
if (step.warmStarting) {
8817
this.m_impulse.x *= step.dtRatio;
8818
this.m_impulse.y *= step.dtRatio;
8819
this.m_motorImpulse *= step.dtRatio;
8820
var PX = this.m_impulse.x * this.m_perp.x + (this.m_motorImpulse + this.m_impulse.y) * this.m_axis.x;
8821
var PY = this.m_impulse.x * this.m_perp.y + (this.m_motorImpulse + this.m_impulse.y) * this.m_axis.y;
8822
var L1 = this.m_impulse.x * this.m_s1 + (this.m_motorImpulse + this.m_impulse.y) * this.m_a1;
8823
var L2 = this.m_impulse.x * this.m_s2 + (this.m_motorImpulse + this.m_impulse.y) * this.m_a2;
8824
bA.m_linearVelocity.x -= this.m_invMassA * PX;
8825
bA.m_linearVelocity.y -= this.m_invMassA * PY;
8826
bA.m_angularVelocity -= this.m_invIA * L1;
8827
bB.m_linearVelocity.x += this.m_invMassB * PX;
8828
bB.m_linearVelocity.y += this.m_invMassB * PY;
8829
bB.m_angularVelocity += this.m_invIB * L2;
8830
}
8831
else {
8832
this.m_impulse.SetZero();
8833
this.m_motorImpulse = 0.0;
8834
}
8835
}
8836
b2LineJoint.prototype.SolveVelocityConstraints = function (step) {
8837
var bA = this.m_bodyA;
8838
var bB = this.m_bodyB;
8839
var v1 = bA.m_linearVelocity;
8840
var w1 = bA.m_angularVelocity;
8841
var v2 = bB.m_linearVelocity;
8842
var w2 = bB.m_angularVelocity;
8843
var PX = 0;
8844
var PY = 0;
8845
var L1 = 0;
8846
var L2 = 0;
8847
if (this.m_enableMotor && this.m_limitState != b2Joint.e_equalLimits) {
8848
var Cdot = this.m_axis.x * (v2.x - v1.x) + this.m_axis.y * (v2.y - v1.y) + this.m_a2 * w2 - this.m_a1 * w1;
8849
var impulse = this.m_motorMass * (this.m_motorSpeed - Cdot);
8850
var oldImpulse = this.m_motorImpulse;
8851
var maxImpulse = step.dt * this.m_maxMotorForce;
8852
this.m_motorImpulse = b2Math.Clamp(this.m_motorImpulse + impulse, (-maxImpulse), maxImpulse);
8853
impulse = this.m_motorImpulse - oldImpulse;
8854
PX = impulse * this.m_axis.x;
8855
PY = impulse * this.m_axis.y;
8856
L1 = impulse * this.m_a1;
8857
L2 = impulse * this.m_a2;
8858
v1.x -= this.m_invMassA * PX;
8859
v1.y -= this.m_invMassA * PY;
8860
w1 -= this.m_invIA * L1;
8861
v2.x += this.m_invMassB * PX;
8862
v2.y += this.m_invMassB * PY;
8863
w2 += this.m_invIB * L2;
8864
}
8865
var Cdot1 = this.m_perp.x * (v2.x - v1.x) + this.m_perp.y * (v2.y - v1.y) + this.m_s2 * w2 - this.m_s1 * w1;
8866
if (this.m_enableLimit && this.m_limitState != b2Joint.e_inactiveLimit) {
8867
var Cdot2 = this.m_axis.x * (v2.x - v1.x) + this.m_axis.y * (v2.y - v1.y) + this.m_a2 * w2 - this.m_a1 * w1;
8868
var f1 = this.m_impulse.Copy();
8869
var df = this.m_K.Solve(new b2Vec2(), (-Cdot1), (-Cdot2));
8870
this.m_impulse.Add(df);
8871
if (this.m_limitState == b2Joint.e_atLowerLimit) {
8872
this.m_impulse.y = b2Math.Max(this.m_impulse.y, 0.0);
8873
}
8874
else if (this.m_limitState == b2Joint.e_atUpperLimit) {
8875
this.m_impulse.y = b2Math.Min(this.m_impulse.y, 0.0);
8876
}
8877
var b = (-Cdot1) - (this.m_impulse.y - f1.y) * this.m_K.col2.x;
8878
var f2r = 0;
8879
if (this.m_K.col1.x != 0.0) {
8880
f2r = b / this.m_K.col1.x + f1.x;
8881
}
8882
else {
8883
f2r = f1.x;
8884
}
8885
this.m_impulse.x = f2r;
8886
df.x = this.m_impulse.x - f1.x;
8887
df.y = this.m_impulse.y - f1.y;
8888
PX = df.x * this.m_perp.x + df.y * this.m_axis.x;
8889
PY = df.x * this.m_perp.y + df.y * this.m_axis.y;
8890
L1 = df.x * this.m_s1 + df.y * this.m_a1;
8891
L2 = df.x * this.m_s2 + df.y * this.m_a2;
8892
v1.x -= this.m_invMassA * PX;
8893
v1.y -= this.m_invMassA * PY;
8894
w1 -= this.m_invIA * L1;
8895
v2.x += this.m_invMassB * PX;
8896
v2.y += this.m_invMassB * PY;
8897
w2 += this.m_invIB * L2;
8898
}
8899
else {
8900
var df2 = 0;
8901
if (this.m_K.col1.x != 0.0) {
8902
df2 = ((-Cdot1)) / this.m_K.col1.x;
8903
}
8904
else {
8905
df2 = 0.0;
8906
}
8907
this.m_impulse.x += df2;
8908
PX = df2 * this.m_perp.x;
8909
PY = df2 * this.m_perp.y;
8910
L1 = df2 * this.m_s1;
8911
L2 = df2 * this.m_s2;
8912
v1.x -= this.m_invMassA * PX;
8913
v1.y -= this.m_invMassA * PY;
8914
w1 -= this.m_invIA * L1;
8915
v2.x += this.m_invMassB * PX;
8916
v2.y += this.m_invMassB * PY;
8917
w2 += this.m_invIB * L2;
8918
}
8919
bA.m_linearVelocity.SetV(v1);
8920
bA.m_angularVelocity = w1;
8921
bB.m_linearVelocity.SetV(v2);
8922
bB.m_angularVelocity = w2;
8923
}
8924
b2LineJoint.prototype.SolvePositionConstraints = function (baumgarte) {
8925
if (baumgarte === undefined) baumgarte = 0;
8926
var limitC = 0;
8927
var oldLimitImpulse = 0;
8928
var bA = this.m_bodyA;
8929
var bB = this.m_bodyB;
8930
var c1 = bA.m_sweep.c;
8931
var a1 = bA.m_sweep.a;
8932
var c2 = bB.m_sweep.c;
8933
var a2 = bB.m_sweep.a;
8934
var tMat;
8935
var tX = 0;
8936
var m1 = 0;
8937
var m2 = 0;
8938
var i1 = 0;
8939
var i2 = 0;
8940
var linearError = 0.0;
8941
var angularError = 0.0;
8942
var active = false;
8943
var C2 = 0.0;
8944
var R1 = b2Mat22.FromAngle(a1);
8945
var R2 = b2Mat22.FromAngle(a2);
8946
tMat = R1;
8947
var r1X = this.m_localAnchor1.x - this.m_localCenterA.x;
8948
var r1Y = this.m_localAnchor1.y - this.m_localCenterA.y;
8949
tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
8950
r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
8951
r1X = tX;
8952
tMat = R2;
8953
var r2X = this.m_localAnchor2.x - this.m_localCenterB.x;
8954
var r2Y = this.m_localAnchor2.y - this.m_localCenterB.y;
8955
tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
8956
r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
8957
r2X = tX;
8958
var dX = c2.x + r2X - c1.x - r1X;
8959
var dY = c2.y + r2Y - c1.y - r1Y;
8960
if (this.m_enableLimit) {
8961
this.m_axis = b2Math.MulMV(R1, this.m_localXAxis1);
8962
this.m_a1 = (dX + r1X) * this.m_axis.y - (dY + r1Y) * this.m_axis.x;
8963
this.m_a2 = r2X * this.m_axis.y - r2Y * this.m_axis.x;
8964
var translation = this.m_axis.x * dX + this.m_axis.y * dY;
8965
if (b2Math.Abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * b2Settings.b2_linearSlop) {
8966
C2 = b2Math.Clamp(translation, (-b2Settings.b2_maxLinearCorrection), b2Settings.b2_maxLinearCorrection);
8967
linearError = b2Math.Abs(translation);
8968
active = true;
8969
}
8970
else if (translation <= this.m_lowerTranslation) {
8971
C2 = b2Math.Clamp(translation - this.m_lowerTranslation + b2Settings.b2_linearSlop, (-b2Settings.b2_maxLinearCorrection), 0.0);
8972
linearError = this.m_lowerTranslation - translation;
8973
active = true;
8974
}
8975
else if (translation >= this.m_upperTranslation) {
8976
C2 = b2Math.Clamp(translation - this.m_upperTranslation + b2Settings.b2_linearSlop, 0.0, b2Settings.b2_maxLinearCorrection);
8977
linearError = translation - this.m_upperTranslation;
8978
active = true;
8979
}
8980
}
8981
this.m_perp = b2Math.MulMV(R1, this.m_localYAxis1);
8982
this.m_s1 = (dX + r1X) * this.m_perp.y - (dY + r1Y) * this.m_perp.x;
8983
this.m_s2 = r2X * this.m_perp.y - r2Y * this.m_perp.x;
8984
var impulse = new b2Vec2();
8985
var C1 = this.m_perp.x * dX + this.m_perp.y * dY;
8986
linearError = b2Math.Max(linearError, b2Math.Abs(C1));
8987
angularError = 0.0;
8988
if (active) {
8989
m1 = this.m_invMassA;
8990
m2 = this.m_invMassB;
8991
i1 = this.m_invIA;
8992
i2 = this.m_invIB;
8993
this.m_K.col1.x = m1 + m2 + i1 * this.m_s1 * this.m_s1 + i2 * this.m_s2 * this.m_s2;
8994
this.m_K.col1.y = i1 * this.m_s1 * this.m_a1 + i2 * this.m_s2 * this.m_a2;
8995
this.m_K.col2.x = this.m_K.col1.y;
8996
this.m_K.col2.y = m1 + m2 + i1 * this.m_a1 * this.m_a1 + i2 * this.m_a2 * this.m_a2;
8997
this.m_K.Solve(impulse, (-C1), (-C2));
8998
}
8999
else {
9000
m1 = this.m_invMassA;
9001
m2 = this.m_invMassB;
9002
i1 = this.m_invIA;
9003
i2 = this.m_invIB;
9004
var k11 = m1 + m2 + i1 * this.m_s1 * this.m_s1 + i2 * this.m_s2 * this.m_s2;
9005
var impulse1 = 0;
9006
if (k11 != 0.0) {
9007
impulse1 = ((-C1)) / k11;
9008
}
9009
else {
9010
impulse1 = 0.0;
9011
}
9012
impulse.x = impulse1;
9013
impulse.y = 0.0;
9014
}
9015
var PX = impulse.x * this.m_perp.x + impulse.y * this.m_axis.x;
9016
var PY = impulse.x * this.m_perp.y + impulse.y * this.m_axis.y;
9017
var L1 = impulse.x * this.m_s1 + impulse.y * this.m_a1;
9018
var L2 = impulse.x * this.m_s2 + impulse.y * this.m_a2;
9019
c1.x -= this.m_invMassA * PX;
9020
c1.y -= this.m_invMassA * PY;
9021
a1 -= this.m_invIA * L1;
9022
c2.x += this.m_invMassB * PX;
9023
c2.y += this.m_invMassB * PY;
9024
a2 += this.m_invIB * L2;
9025
bA.m_sweep.a = a1;
9026
bB.m_sweep.a = a2;
9027
bA.SynchronizeTransform();
9028
bB.SynchronizeTransform();
9029
return linearError <= b2Settings.b2_linearSlop && angularError <= b2Settings.b2_angularSlop;
9030
}
9031
Box2D.inherit(b2LineJointDef, Box2D.Dynamics.Joints.b2JointDef);
9032
b2LineJointDef.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
9033
b2LineJointDef.b2LineJointDef = function () {
9034
Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
9035
this.localAnchorA = new b2Vec2();
9036
this.localAnchorB = new b2Vec2();
9037
this.localAxisA = new b2Vec2();
9038
};
9039
b2LineJointDef.prototype.b2LineJointDef = function () {
9040
this.__super.b2JointDef.call(this);
9041
this.type = b2Joint.e_lineJoint;
9042
this.localAxisA.Set(1.0, 0.0);
9043
this.enableLimit = false;
9044
this.lowerTranslation = 0.0;
9045
this.upperTranslation = 0.0;
9046
this.enableMotor = false;
9047
this.maxMotorForce = 0.0;
9048
this.motorSpeed = 0.0;
9049
}
9050
b2LineJointDef.prototype.Initialize = function (bA, bB, anchor, axis) {
9051
this.bodyA = bA;
9052
this.bodyB = bB;
9053
this.localAnchorA = this.bodyA.GetLocalPoint(anchor);
9054
this.localAnchorB = this.bodyB.GetLocalPoint(anchor);
9055
this.localAxisA = this.bodyA.GetLocalVector(axis);
9056
}
9057
Box2D.inherit(b2MouseJoint, Box2D.Dynamics.Joints.b2Joint);
9058
b2MouseJoint.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
9059
b2MouseJoint.b2MouseJoint = function () {
9060
Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
9061
this.K = new b2Mat22();
9062
this.K1 = new b2Mat22();
9063
this.K2 = new b2Mat22();
9064
this.m_localAnchor = new b2Vec2();
9065
this.m_target = new b2Vec2();
9066
this.m_impulse = new b2Vec2();
9067
this.m_mass = new b2Mat22();
9068
this.m_C = new b2Vec2();
9069
};
9070
b2MouseJoint.prototype.GetAnchorA = function () {
9071
return this.m_target;
9072
}
9073
b2MouseJoint.prototype.GetAnchorB = function () {
9074
return this.m_bodyB.GetWorldPoint(this.m_localAnchor);
9075
}
9076
b2MouseJoint.prototype.GetReactionForce = function (inv_dt) {
9077
if (inv_dt === undefined) inv_dt = 0;
9078
return new b2Vec2(inv_dt * this.m_impulse.x, inv_dt * this.m_impulse.y);
9079
}
9080
b2MouseJoint.prototype.GetReactionTorque = function (inv_dt) {
9081
if (inv_dt === undefined) inv_dt = 0;
9082
return 0.0;
9083
}
9084
b2MouseJoint.prototype.GetTarget = function () {
9085
return this.m_target;
9086
}
9087
b2MouseJoint.prototype.SetTarget = function (target) {
9088
if (this.m_bodyB.IsAwake() == false) {
9089
this.m_bodyB.SetAwake(true);
9090
}
9091
this.m_target = target;
9092
}
9093
b2MouseJoint.prototype.GetMaxForce = function () {
9094
return this.m_maxForce;
9095
}
9096
b2MouseJoint.prototype.SetMaxForce = function (maxForce) {
9097
if (maxForce === undefined) maxForce = 0;
9098
this.m_maxForce = maxForce;
9099
}
9100
b2MouseJoint.prototype.GetFrequency = function () {
9101
return this.m_frequencyHz;
9102
}
9103
b2MouseJoint.prototype.SetFrequency = function (hz) {
9104
if (hz === undefined) hz = 0;
9105
this.m_frequencyHz = hz;
9106
}
9107
b2MouseJoint.prototype.GetDampingRatio = function () {
9108
return this.m_dampingRatio;
9109
}
9110
b2MouseJoint.prototype.SetDampingRatio = function (ratio) {
9111
if (ratio === undefined) ratio = 0;
9112
this.m_dampingRatio = ratio;
9113
}
9114
b2MouseJoint.prototype.b2MouseJoint = function (def) {
9115
this.__super.b2Joint.call(this, def);
9116
this.m_target.SetV(def.target);
9117
var tX = this.m_target.x - this.m_bodyB.m_xf.position.x;
9118
var tY = this.m_target.y - this.m_bodyB.m_xf.position.y;
9119
var tMat = this.m_bodyB.m_xf.R;
9120
this.m_localAnchor.x = (tX * tMat.col1.x + tY * tMat.col1.y);
9121
this.m_localAnchor.y = (tX * tMat.col2.x + tY * tMat.col2.y);
9122
this.m_maxForce = def.maxForce;
9123
this.m_impulse.SetZero();
9124
this.m_frequencyHz = def.frequencyHz;
9125
this.m_dampingRatio = def.dampingRatio;
9126
this.m_beta = 0.0;
9127
this.m_gamma = 0.0;
9128
}
9129
b2MouseJoint.prototype.InitVelocityConstraints = function (step) {
9130
var b = this.m_bodyB;
9131
var mass = b.GetMass();
9132
var omega = 2.0 * Math.PI * this.m_frequencyHz;
9133
var d = 2.0 * mass * this.m_dampingRatio * omega;
9134
var k = mass * omega * omega;
9135
this.m_gamma = step.dt * (d + step.dt * k);
9136
this.m_gamma = this.m_gamma != 0 ? 1 / this.m_gamma : 0.0;
9137
this.m_beta = step.dt * k * this.m_gamma;
9138
var tMat;tMat = b.m_xf.R;
9139
var rX = this.m_localAnchor.x - b.m_sweep.localCenter.x;
9140
var rY = this.m_localAnchor.y - b.m_sweep.localCenter.y;
9141
var tX = (tMat.col1.x * rX + tMat.col2.x * rY);rY = (tMat.col1.y * rX + tMat.col2.y * rY);
9142
rX = tX;
9143
var invMass = b.m_invMass;
9144
var invI = b.m_invI;this.K1.col1.x = invMass;
9145
this.K1.col2.x = 0.0;
9146
this.K1.col1.y = 0.0;
9147
this.K1.col2.y = invMass;
9148
this.K2.col1.x = invI * rY * rY;
9149
this.K2.col2.x = (-invI * rX * rY);
9150
this.K2.col1.y = (-invI * rX * rY);
9151
this.K2.col2.y = invI * rX * rX;
9152
this.K.SetM(this.K1);
9153
this.K.AddM(this.K2);
9154
this.K.col1.x += this.m_gamma;
9155
this.K.col2.y += this.m_gamma;
9156
this.K.GetInverse(this.m_mass);
9157
this.m_C.x = b.m_sweep.c.x + rX - this.m_target.x;
9158
this.m_C.y = b.m_sweep.c.y + rY - this.m_target.y;
9159
b.m_angularVelocity *= 0.98;
9160
this.m_impulse.x *= step.dtRatio;
9161
this.m_impulse.y *= step.dtRatio;
9162
b.m_linearVelocity.x += invMass * this.m_impulse.x;
9163
b.m_linearVelocity.y += invMass * this.m_impulse.y;
9164
b.m_angularVelocity += invI * (rX * this.m_impulse.y - rY * this.m_impulse.x);
9165
}
9166
b2MouseJoint.prototype.SolveVelocityConstraints = function (step) {
9167
var b = this.m_bodyB;
9168
var tMat;
9169
var tX = 0;
9170
var tY = 0;
9171
tMat = b.m_xf.R;
9172
var rX = this.m_localAnchor.x - b.m_sweep.localCenter.x;
9173
var rY = this.m_localAnchor.y - b.m_sweep.localCenter.y;
9174
tX = (tMat.col1.x * rX + tMat.col2.x * rY);
9175
rY = (tMat.col1.y * rX + tMat.col2.y * rY);
9176
rX = tX;
9177
var CdotX = b.m_linearVelocity.x + ((-b.m_angularVelocity * rY));
9178
var CdotY = b.m_linearVelocity.y + (b.m_angularVelocity * rX);
9179
tMat = this.m_mass;
9180
tX = CdotX + this.m_beta * this.m_C.x + this.m_gamma * this.m_impulse.x;
9181
tY = CdotY + this.m_beta * this.m_C.y + this.m_gamma * this.m_impulse.y;
9182
var impulseX = (-(tMat.col1.x * tX + tMat.col2.x * tY));
9183
var impulseY = (-(tMat.col1.y * tX + tMat.col2.y * tY));
9184
var oldImpulseX = this.m_impulse.x;
9185
var oldImpulseY = this.m_impulse.y;
9186
this.m_impulse.x += impulseX;
9187
this.m_impulse.y += impulseY;
9188
var maxImpulse = step.dt * this.m_maxForce;
9189
if (this.m_impulse.LengthSquared() > maxImpulse * maxImpulse) {
9190
this.m_impulse.Multiply(maxImpulse / this.m_impulse.Length());
9191
}
9192
impulseX = this.m_impulse.x - oldImpulseX;
9193
impulseY = this.m_impulse.y - oldImpulseY;
9194
b.m_linearVelocity.x += b.m_invMass * impulseX;
9195
b.m_linearVelocity.y += b.m_invMass * impulseY;
9196
b.m_angularVelocity += b.m_invI * (rX * impulseY - rY * impulseX);
9197
}
9198
b2MouseJoint.prototype.SolvePositionConstraints = function (baumgarte) {
9199
if (baumgarte === undefined) baumgarte = 0;
9200
return true;
9201
}
9202
Box2D.inherit(b2MouseJointDef, Box2D.Dynamics.Joints.b2JointDef);
9203
b2MouseJointDef.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
9204
b2MouseJointDef.b2MouseJointDef = function () {
9205
Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
9206
this.target = new b2Vec2();
9207
};
9208
b2MouseJointDef.prototype.b2MouseJointDef = function () {
9209
this.__super.b2JointDef.call(this);
9210
this.type = b2Joint.e_mouseJoint;
9211
this.maxForce = 0.0;
9212
this.frequencyHz = 5.0;
9213
this.dampingRatio = 0.7;
9214
}
9215
Box2D.inherit(b2PrismaticJoint, Box2D.Dynamics.Joints.b2Joint);
9216
b2PrismaticJoint.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
9217
b2PrismaticJoint.b2PrismaticJoint = function () {
9218
Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
9219
this.m_localAnchor1 = new b2Vec2();
9220
this.m_localAnchor2 = new b2Vec2();
9221
this.m_localXAxis1 = new b2Vec2();
9222
this.m_localYAxis1 = new b2Vec2();
9223
this.m_axis = new b2Vec2();
9224
this.m_perp = new b2Vec2();
9225
this.m_K = new b2Mat33();
9226
this.m_impulse = new b2Vec3();
9227
};
9228
b2PrismaticJoint.prototype.GetAnchorA = function () {
9229
return this.m_bodyA.GetWorldPoint(this.m_localAnchor1);
9230
}
9231
b2PrismaticJoint.prototype.GetAnchorB = function () {
9232
return this.m_bodyB.GetWorldPoint(this.m_localAnchor2);
9233
}
9234
b2PrismaticJoint.prototype.GetReactionForce = function (inv_dt) {
9235
if (inv_dt === undefined) inv_dt = 0;
9236
return new b2Vec2(inv_dt * (this.m_impulse.x * this.m_perp.x + (this.m_motorImpulse + this.m_impulse.z) * this.m_axis.x), inv_dt * (this.m_impulse.x * this.m_perp.y + (this.m_motorImpulse + this.m_impulse.z) * this.m_axis.y));
9237
}
9238
b2PrismaticJoint.prototype.GetReactionTorque = function (inv_dt) {
9239
if (inv_dt === undefined) inv_dt = 0;
9240
return inv_dt * this.m_impulse.y;
9241
}
9242
b2PrismaticJoint.prototype.GetJointTranslation = function () {
9243
var bA = this.m_bodyA;
9244
var bB = this.m_bodyB;
9245
var tMat;
9246
var p1 = bA.GetWorldPoint(this.m_localAnchor1);
9247
var p2 = bB.GetWorldPoint(this.m_localAnchor2);
9248
var dX = p2.x - p1.x;
9249
var dY = p2.y - p1.y;
9250
var axis = bA.GetWorldVector(this.m_localXAxis1);
9251
var translation = axis.x * dX + axis.y * dY;
9252
return translation;
9253
}
9254
b2PrismaticJoint.prototype.GetJointSpeed = function () {
9255
var bA = this.m_bodyA;
9256
var bB = this.m_bodyB;
9257
var tMat;
9258
tMat = bA.m_xf.R;
9259
var r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
9260
var r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
9261
var tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
9262
r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
9263
r1X = tX;
9264
tMat = bB.m_xf.R;
9265
var r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
9266
var r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
9267
tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
9268
r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
9269
r2X = tX;
9270
var p1X = bA.m_sweep.c.x + r1X;
9271
var p1Y = bA.m_sweep.c.y + r1Y;
9272
var p2X = bB.m_sweep.c.x + r2X;
9273
var p2Y = bB.m_sweep.c.y + r2Y;
9274
var dX = p2X - p1X;
9275
var dY = p2Y - p1Y;
9276
var axis = bA.GetWorldVector(this.m_localXAxis1);
9277
var v1 = bA.m_linearVelocity;
9278
var v2 = bB.m_linearVelocity;
9279
var w1 = bA.m_angularVelocity;
9280
var w2 = bB.m_angularVelocity;
9281
var speed = (dX * ((-w1 * axis.y)) + dY * (w1 * axis.x)) + (axis.x * (((v2.x + ((-w2 * r2Y))) - v1.x) - ((-w1 * r1Y))) + axis.y * (((v2.y + (w2 * r2X)) - v1.y) - (w1 * r1X)));
9282
return speed;
9283
}
9284
b2PrismaticJoint.prototype.IsLimitEnabled = function () {
9285
return this.m_enableLimit;
9286
}
9287
b2PrismaticJoint.prototype.EnableLimit = function (flag) {
9288
this.m_bodyA.SetAwake(true);
9289
this.m_bodyB.SetAwake(true);
9290
this.m_enableLimit = flag;
9291
}
9292
b2PrismaticJoint.prototype.GetLowerLimit = function () {
9293
return this.m_lowerTranslation;
9294
}
9295
b2PrismaticJoint.prototype.GetUpperLimit = function () {
9296
return this.m_upperTranslation;
9297
}
9298
b2PrismaticJoint.prototype.SetLimits = function (lower, upper) {
9299
if (lower === undefined) lower = 0;
9300
if (upper === undefined) upper = 0;
9301
this.m_bodyA.SetAwake(true);
9302
this.m_bodyB.SetAwake(true);
9303
this.m_lowerTranslation = lower;
9304
this.m_upperTranslation = upper;
9305
}
9306
b2PrismaticJoint.prototype.IsMotorEnabled = function () {
9307
return this.m_enableMotor;
9308
}
9309
b2PrismaticJoint.prototype.EnableMotor = function (flag) {
9310
this.m_bodyA.SetAwake(true);
9311
this.m_bodyB.SetAwake(true);
9312
this.m_enableMotor = flag;
9313
}
9314
b2PrismaticJoint.prototype.SetMotorSpeed = function (speed) {
9315
if (speed === undefined) speed = 0;
9316
this.m_bodyA.SetAwake(true);
9317
this.m_bodyB.SetAwake(true);
9318
this.m_motorSpeed = speed;
9319
}
9320
b2PrismaticJoint.prototype.GetMotorSpeed = function () {
9321
return this.m_motorSpeed;
9322
}
9323
b2PrismaticJoint.prototype.SetMaxMotorForce = function (force) {
9324
if (force === undefined) force = 0;
9325
this.m_bodyA.SetAwake(true);
9326
this.m_bodyB.SetAwake(true);
9327
this.m_maxMotorForce = force;
9328
}
9329
b2PrismaticJoint.prototype.GetMotorForce = function () {
9330
return this.m_motorImpulse;
9331
}
9332
b2PrismaticJoint.prototype.b2PrismaticJoint = function (def) {
9333
this.__super.b2Joint.call(this, def);
9334
var tMat;
9335
var tX = 0;
9336
var tY = 0;
9337
this.m_localAnchor1.SetV(def.localAnchorA);
9338
this.m_localAnchor2.SetV(def.localAnchorB);
9339
this.m_localXAxis1.SetV(def.localAxisA);
9340
this.m_localYAxis1.x = (-this.m_localXAxis1.y);
9341
this.m_localYAxis1.y = this.m_localXAxis1.x;
9342
this.m_refAngle = def.referenceAngle;
9343
this.m_impulse.SetZero();
9344
this.m_motorMass = 0.0;
9345
this.m_motorImpulse = 0.0;
9346
this.m_lowerTranslation = def.lowerTranslation;
9347
this.m_upperTranslation = def.upperTranslation;
9348
this.m_maxMotorForce = def.maxMotorForce;
9349
this.m_motorSpeed = def.motorSpeed;
9350
this.m_enableLimit = def.enableLimit;
9351
this.m_enableMotor = def.enableMotor;
9352
this.m_limitState = b2Joint.e_inactiveLimit;
9353
this.m_axis.SetZero();
9354
this.m_perp.SetZero();
9355
}
9356
b2PrismaticJoint.prototype.InitVelocityConstraints = function (step) {
9357
var bA = this.m_bodyA;
9358
var bB = this.m_bodyB;
9359
var tMat;
9360
var tX = 0;
9361
this.m_localCenterA.SetV(bA.GetLocalCenter());
9362
this.m_localCenterB.SetV(bB.GetLocalCenter());
9363
var xf1 = bA.GetTransform();
9364
var xf2 = bB.GetTransform();
9365
tMat = bA.m_xf.R;
9366
var r1X = this.m_localAnchor1.x - this.m_localCenterA.x;
9367
var r1Y = this.m_localAnchor1.y - this.m_localCenterA.y;
9368
tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
9369
r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
9370
r1X = tX;
9371
tMat = bB.m_xf.R;
9372
var r2X = this.m_localAnchor2.x - this.m_localCenterB.x;
9373
var r2Y = this.m_localAnchor2.y - this.m_localCenterB.y;
9374
tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
9375
r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
9376
r2X = tX;
9377
var dX = bB.m_sweep.c.x + r2X - bA.m_sweep.c.x - r1X;
9378
var dY = bB.m_sweep.c.y + r2Y - bA.m_sweep.c.y - r1Y;
9379
this.m_invMassA = bA.m_invMass;
9380
this.m_invMassB = bB.m_invMass;
9381
this.m_invIA = bA.m_invI;
9382
this.m_invIB = bB.m_invI; {
9383
this.m_axis.SetV(b2Math.MulMV(xf1.R, this.m_localXAxis1));
9384
this.m_a1 = (dX + r1X) * this.m_axis.y - (dY + r1Y) * this.m_axis.x;
9385
this.m_a2 = r2X * this.m_axis.y - r2Y * this.m_axis.x;
9386
this.m_motorMass = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_a1 * this.m_a1 + this.m_invIB * this.m_a2 * this.m_a2;
9387
if (this.m_motorMass > Number.MIN_VALUE) this.m_motorMass = 1.0 / this.m_motorMass;
9388
} {
9389
this.m_perp.SetV(b2Math.MulMV(xf1.R, this.m_localYAxis1));
9390
this.m_s1 = (dX + r1X) * this.m_perp.y - (dY + r1Y) * this.m_perp.x;
9391
this.m_s2 = r2X * this.m_perp.y - r2Y * this.m_perp.x;
9392
var m1 = this.m_invMassA;
9393
var m2 = this.m_invMassB;
9394
var i1 = this.m_invIA;
9395
var i2 = this.m_invIB;
9396
this.m_K.col1.x = m1 + m2 + i1 * this.m_s1 * this.m_s1 + i2 * this.m_s2 * this.m_s2;
9397
this.m_K.col1.y = i1 * this.m_s1 + i2 * this.m_s2;
9398
this.m_K.col1.z = i1 * this.m_s1 * this.m_a1 + i2 * this.m_s2 * this.m_a2;
9399
this.m_K.col2.x = this.m_K.col1.y;
9400
this.m_K.col2.y = i1 + i2;
9401
this.m_K.col2.z = i1 * this.m_a1 + i2 * this.m_a2;
9402
this.m_K.col3.x = this.m_K.col1.z;
9403
this.m_K.col3.y = this.m_K.col2.z;
9404
this.m_K.col3.z = m1 + m2 + i1 * this.m_a1 * this.m_a1 + i2 * this.m_a2 * this.m_a2;
9405
}
9406
if (this.m_enableLimit) {
9407
var jointTransition = this.m_axis.x * dX + this.m_axis.y * dY;
9408
if (b2Math.Abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * b2Settings.b2_linearSlop) {
9409
this.m_limitState = b2Joint.e_equalLimits;
9410
}
9411
else if (jointTransition <= this.m_lowerTranslation) {
9412
if (this.m_limitState != b2Joint.e_atLowerLimit) {
9413
this.m_limitState = b2Joint.e_atLowerLimit;
9414
this.m_impulse.z = 0.0;
9415
}
9416
}
9417
else if (jointTransition >= this.m_upperTranslation) {
9418
if (this.m_limitState != b2Joint.e_atUpperLimit) {
9419
this.m_limitState = b2Joint.e_atUpperLimit;
9420
this.m_impulse.z = 0.0;
9421
}
9422
}
9423
else {
9424
this.m_limitState = b2Joint.e_inactiveLimit;
9425
this.m_impulse.z = 0.0;
9426
}
9427
}
9428
else {
9429
this.m_limitState = b2Joint.e_inactiveLimit;
9430
}
9431
if (this.m_enableMotor == false) {
9432
this.m_motorImpulse = 0.0;
9433
}
9434
if (step.warmStarting) {
9435
this.m_impulse.x *= step.dtRatio;
9436
this.m_impulse.y *= step.dtRatio;
9437
this.m_motorImpulse *= step.dtRatio;
9438
var PX = this.m_impulse.x * this.m_perp.x + (this.m_motorImpulse + this.m_impulse.z) * this.m_axis.x;
9439
var PY = this.m_impulse.x * this.m_perp.y + (this.m_motorImpulse + this.m_impulse.z) * this.m_axis.y;
9440
var L1 = this.m_impulse.x * this.m_s1 + this.m_impulse.y + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1;
9441
var L2 = this.m_impulse.x * this.m_s2 + this.m_impulse.y + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2;
9442
bA.m_linearVelocity.x -= this.m_invMassA * PX;
9443
bA.m_linearVelocity.y -= this.m_invMassA * PY;
9444
bA.m_angularVelocity -= this.m_invIA * L1;
9445
bB.m_linearVelocity.x += this.m_invMassB * PX;
9446
bB.m_linearVelocity.y += this.m_invMassB * PY;
9447
bB.m_angularVelocity += this.m_invIB * L2;
9448
}
9449
else {
9450
this.m_impulse.SetZero();
9451
this.m_motorImpulse = 0.0;
9452
}
9453
}
9454
b2PrismaticJoint.prototype.SolveVelocityConstraints = function (step) {
9455
var bA = this.m_bodyA;
9456
var bB = this.m_bodyB;
9457
var v1 = bA.m_linearVelocity;
9458
var w1 = bA.m_angularVelocity;
9459
var v2 = bB.m_linearVelocity;
9460
var w2 = bB.m_angularVelocity;
9461
var PX = 0;
9462
var PY = 0;
9463
var L1 = 0;
9464
var L2 = 0;
9465
if (this.m_enableMotor && this.m_limitState != b2Joint.e_equalLimits) {
9466
var Cdot = this.m_axis.x * (v2.x - v1.x) + this.m_axis.y * (v2.y - v1.y) + this.m_a2 * w2 - this.m_a1 * w1;
9467
var impulse = this.m_motorMass * (this.m_motorSpeed - Cdot);
9468
var oldImpulse = this.m_motorImpulse;
9469
var maxImpulse = step.dt * this.m_maxMotorForce;
9470
this.m_motorImpulse = b2Math.Clamp(this.m_motorImpulse + impulse, (-maxImpulse), maxImpulse);
9471
impulse = this.m_motorImpulse - oldImpulse;
9472
PX = impulse * this.m_axis.x;
9473
PY = impulse * this.m_axis.y;
9474
L1 = impulse * this.m_a1;
9475
L2 = impulse * this.m_a2;
9476
v1.x -= this.m_invMassA * PX;
9477
v1.y -= this.m_invMassA * PY;
9478
w1 -= this.m_invIA * L1;
9479
v2.x += this.m_invMassB * PX;
9480
v2.y += this.m_invMassB * PY;
9481
w2 += this.m_invIB * L2;
9482
}
9483
var Cdot1X = this.m_perp.x * (v2.x - v1.x) + this.m_perp.y * (v2.y - v1.y) + this.m_s2 * w2 - this.m_s1 * w1;
9484
var Cdot1Y = w2 - w1;
9485
if (this.m_enableLimit && this.m_limitState != b2Joint.e_inactiveLimit) {
9486
var Cdot2 = this.m_axis.x * (v2.x - v1.x) + this.m_axis.y * (v2.y - v1.y) + this.m_a2 * w2 - this.m_a1 * w1;
9487
var f1 = this.m_impulse.Copy();
9488
var df = this.m_K.Solve33(new b2Vec3(), (-Cdot1X), (-Cdot1Y), (-Cdot2));
9489
this.m_impulse.Add(df);
9490
if (this.m_limitState == b2Joint.e_atLowerLimit) {
9491
this.m_impulse.z = b2Math.Max(this.m_impulse.z, 0.0);
9492
}
9493
else if (this.m_limitState == b2Joint.e_atUpperLimit) {
9494
this.m_impulse.z = b2Math.Min(this.m_impulse.z, 0.0);
9495
}
9496
var bX = (-Cdot1X) - (this.m_impulse.z - f1.z) * this.m_K.col3.x;
9497
var bY = (-Cdot1Y) - (this.m_impulse.z - f1.z) * this.m_K.col3.y;
9498
var f2r = this.m_K.Solve22(new b2Vec2(), bX, bY);
9499
f2r.x += f1.x;
9500
f2r.y += f1.y;
9501
this.m_impulse.x = f2r.x;
9502
this.m_impulse.y = f2r.y;
9503
df.x = this.m_impulse.x - f1.x;
9504
df.y = this.m_impulse.y - f1.y;
9505
df.z = this.m_impulse.z - f1.z;
9506
PX = df.x * this.m_perp.x + df.z * this.m_axis.x;
9507
PY = df.x * this.m_perp.y + df.z * this.m_axis.y;
9508
L1 = df.x * this.m_s1 + df.y + df.z * this.m_a1;
9509
L2 = df.x * this.m_s2 + df.y + df.z * this.m_a2;
9510
v1.x -= this.m_invMassA * PX;
9511
v1.y -= this.m_invMassA * PY;
9512
w1 -= this.m_invIA * L1;
9513
v2.x += this.m_invMassB * PX;
9514
v2.y += this.m_invMassB * PY;
9515
w2 += this.m_invIB * L2;
9516
}
9517
else {
9518
var df2 = this.m_K.Solve22(new b2Vec2(), (-Cdot1X), (-Cdot1Y));
9519
this.m_impulse.x += df2.x;
9520
this.m_impulse.y += df2.y;
9521
PX = df2.x * this.m_perp.x;
9522
PY = df2.x * this.m_perp.y;
9523
L1 = df2.x * this.m_s1 + df2.y;
9524
L2 = df2.x * this.m_s2 + df2.y;
9525
v1.x -= this.m_invMassA * PX;
9526
v1.y -= this.m_invMassA * PY;
9527
w1 -= this.m_invIA * L1;
9528
v2.x += this.m_invMassB * PX;
9529
v2.y += this.m_invMassB * PY;
9530
w2 += this.m_invIB * L2;
9531
}
9532
bA.m_linearVelocity.SetV(v1);
9533
bA.m_angularVelocity = w1;
9534
bB.m_linearVelocity.SetV(v2);
9535
bB.m_angularVelocity = w2;
9536
}
9537
b2PrismaticJoint.prototype.SolvePositionConstraints = function (baumgarte) {
9538
if (baumgarte === undefined) baumgarte = 0;
9539
var limitC = 0;
9540
var oldLimitImpulse = 0;
9541
var bA = this.m_bodyA;
9542
var bB = this.m_bodyB;
9543
var c1 = bA.m_sweep.c;
9544
var a1 = bA.m_sweep.a;
9545
var c2 = bB.m_sweep.c;
9546
var a2 = bB.m_sweep.a;
9547
var tMat;
9548
var tX = 0;
9549
var m1 = 0;
9550
var m2 = 0;
9551
var i1 = 0;
9552
var i2 = 0;
9553
var linearError = 0.0;
9554
var angularError = 0.0;
9555
var active = false;
9556
var C2 = 0.0;
9557
var R1 = b2Mat22.FromAngle(a1);
9558
var R2 = b2Mat22.FromAngle(a2);
9559
tMat = R1;
9560
var r1X = this.m_localAnchor1.x - this.m_localCenterA.x;
9561
var r1Y = this.m_localAnchor1.y - this.m_localCenterA.y;
9562
tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
9563
r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
9564
r1X = tX;
9565
tMat = R2;
9566
var r2X = this.m_localAnchor2.x - this.m_localCenterB.x;
9567
var r2Y = this.m_localAnchor2.y - this.m_localCenterB.y;
9568
tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
9569
r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
9570
r2X = tX;
9571
var dX = c2.x + r2X - c1.x - r1X;
9572
var dY = c2.y + r2Y - c1.y - r1Y;
9573
if (this.m_enableLimit) {
9574
this.m_axis = b2Math.MulMV(R1, this.m_localXAxis1);
9575
this.m_a1 = (dX + r1X) * this.m_axis.y - (dY + r1Y) * this.m_axis.x;
9576
this.m_a2 = r2X * this.m_axis.y - r2Y * this.m_axis.x;
9577
var translation = this.m_axis.x * dX + this.m_axis.y * dY;
9578
if (b2Math.Abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * b2Settings.b2_linearSlop) {
9579
C2 = b2Math.Clamp(translation, (-b2Settings.b2_maxLinearCorrection), b2Settings.b2_maxLinearCorrection);
9580
linearError = b2Math.Abs(translation);
9581
active = true;
9582
}
9583
else if (translation <= this.m_lowerTranslation) {
9584
C2 = b2Math.Clamp(translation - this.m_lowerTranslation + b2Settings.b2_linearSlop, (-b2Settings.b2_maxLinearCorrection), 0.0);
9585
linearError = this.m_lowerTranslation - translation;
9586
active = true;
9587
}
9588
else if (translation >= this.m_upperTranslation) {
9589
C2 = b2Math.Clamp(translation - this.m_upperTranslation + b2Settings.b2_linearSlop, 0.0, b2Settings.b2_maxLinearCorrection);
9590
linearError = translation - this.m_upperTranslation;
9591
active = true;
9592
}
9593
}
9594
this.m_perp = b2Math.MulMV(R1, this.m_localYAxis1);
9595
this.m_s1 = (dX + r1X) * this.m_perp.y - (dY + r1Y) * this.m_perp.x;
9596
this.m_s2 = r2X * this.m_perp.y - r2Y * this.m_perp.x;
9597
var impulse = new b2Vec3();
9598
var C1X = this.m_perp.x * dX + this.m_perp.y * dY;
9599
var C1Y = a2 - a1 - this.m_refAngle;
9600
linearError = b2Math.Max(linearError, b2Math.Abs(C1X));
9601
angularError = b2Math.Abs(C1Y);
9602
if (active) {
9603
m1 = this.m_invMassA;
9604
m2 = this.m_invMassB;
9605
i1 = this.m_invIA;
9606
i2 = this.m_invIB;
9607
this.m_K.col1.x = m1 + m2 + i1 * this.m_s1 * this.m_s1 + i2 * this.m_s2 * this.m_s2;
9608
this.m_K.col1.y = i1 * this.m_s1 + i2 * this.m_s2;
9609
this.m_K.col1.z = i1 * this.m_s1 * this.m_a1 + i2 * this.m_s2 * this.m_a2;
9610
this.m_K.col2.x = this.m_K.col1.y;
9611
this.m_K.col2.y = i1 + i2;
9612
this.m_K.col2.z = i1 * this.m_a1 + i2 * this.m_a2;
9613
this.m_K.col3.x = this.m_K.col1.z;
9614
this.m_K.col3.y = this.m_K.col2.z;
9615
this.m_K.col3.z = m1 + m2 + i1 * this.m_a1 * this.m_a1 + i2 * this.m_a2 * this.m_a2;
9616
this.m_K.Solve33(impulse, (-C1X), (-C1Y), (-C2));
9617
}
9618
else {
9619
m1 = this.m_invMassA;
9620
m2 = this.m_invMassB;
9621
i1 = this.m_invIA;
9622
i2 = this.m_invIB;
9623
var k11 = m1 + m2 + i1 * this.m_s1 * this.m_s1 + i2 * this.m_s2 * this.m_s2;
9624
var k12 = i1 * this.m_s1 + i2 * this.m_s2;
9625
var k22 = i1 + i2;
9626
this.m_K.col1.Set(k11, k12, 0.0);
9627
this.m_K.col2.Set(k12, k22, 0.0);
9628
var impulse1 = this.m_K.Solve22(new b2Vec2(), (-C1X), (-C1Y));
9629
impulse.x = impulse1.x;
9630
impulse.y = impulse1.y;
9631
impulse.z = 0.0;
9632
}
9633
var PX = impulse.x * this.m_perp.x + impulse.z * this.m_axis.x;
9634
var PY = impulse.x * this.m_perp.y + impulse.z * this.m_axis.y;
9635
var L1 = impulse.x * this.m_s1 + impulse.y + impulse.z * this.m_a1;
9636
var L2 = impulse.x * this.m_s2 + impulse.y + impulse.z * this.m_a2;
9637
c1.x -= this.m_invMassA * PX;
9638
c1.y -= this.m_invMassA * PY;
9639
a1 -= this.m_invIA * L1;
9640
c2.x += this.m_invMassB * PX;
9641
c2.y += this.m_invMassB * PY;
9642
a2 += this.m_invIB * L2;
9643
bA.m_sweep.a = a1;
9644
bB.m_sweep.a = a2;
9645
bA.SynchronizeTransform();
9646
bB.SynchronizeTransform();
9647
return linearError <= b2Settings.b2_linearSlop && angularError <= b2Settings.b2_angularSlop;
9648
}
9649
Box2D.inherit(b2PrismaticJointDef, Box2D.Dynamics.Joints.b2JointDef);
9650
b2PrismaticJointDef.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
9651
b2PrismaticJointDef.b2PrismaticJointDef = function () {
9652
Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
9653
this.localAnchorA = new b2Vec2();
9654
this.localAnchorB = new b2Vec2();
9655
this.localAxisA = new b2Vec2();
9656
};
9657
b2PrismaticJointDef.prototype.b2PrismaticJointDef = function () {
9658
this.__super.b2JointDef.call(this);
9659
this.type = b2Joint.e_prismaticJoint;
9660
this.localAxisA.Set(1.0, 0.0);
9661
this.referenceAngle = 0.0;
9662
this.enableLimit = false;
9663
this.lowerTranslation = 0.0;
9664
this.upperTranslation = 0.0;
9665
this.enableMotor = false;
9666
this.maxMotorForce = 0.0;
9667
this.motorSpeed = 0.0;
9668
}
9669
b2PrismaticJointDef.prototype.Initialize = function (bA, bB, anchor, axis) {
9670
this.bodyA = bA;
9671
this.bodyB = bB;
9672
this.localAnchorA = this.bodyA.GetLocalPoint(anchor);
9673
this.localAnchorB = this.bodyB.GetLocalPoint(anchor);
9674
this.localAxisA = this.bodyA.GetLocalVector(axis);
9675
this.referenceAngle = this.bodyB.GetAngle() - this.bodyA.GetAngle();
9676
}
9677
Box2D.inherit(b2PulleyJoint, Box2D.Dynamics.Joints.b2Joint);
9678
b2PulleyJoint.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
9679
b2PulleyJoint.b2PulleyJoint = function () {
9680
Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
9681
this.m_groundAnchor1 = new b2Vec2();
9682
this.m_groundAnchor2 = new b2Vec2();
9683
this.m_localAnchor1 = new b2Vec2();
9684
this.m_localAnchor2 = new b2Vec2();
9685
this.m_u1 = new b2Vec2();
9686
this.m_u2 = new b2Vec2();
9687
};
9688
b2PulleyJoint.prototype.GetAnchorA = function () {
9689
return this.m_bodyA.GetWorldPoint(this.m_localAnchor1);
9690
}
9691
b2PulleyJoint.prototype.GetAnchorB = function () {
9692
return this.m_bodyB.GetWorldPoint(this.m_localAnchor2);
9693
}
9694
b2PulleyJoint.prototype.GetReactionForce = function (inv_dt) {
9695
if (inv_dt === undefined) inv_dt = 0;
9696
return new b2Vec2(inv_dt * this.m_impulse * this.m_u2.x, inv_dt * this.m_impulse * this.m_u2.y);
9697
}
9698
b2PulleyJoint.prototype.GetReactionTorque = function (inv_dt) {
9699
if (inv_dt === undefined) inv_dt = 0;
9700
return 0.0;
9701
}
9702
b2PulleyJoint.prototype.GetGroundAnchorA = function () {
9703
var a = this.m_ground.m_xf.position.Copy();
9704
a.Add(this.m_groundAnchor1);
9705
return a;
9706
}
9707
b2PulleyJoint.prototype.GetGroundAnchorB = function () {
9708
var a = this.m_ground.m_xf.position.Copy();
9709
a.Add(this.m_groundAnchor2);
9710
return a;
9711
}
9712
b2PulleyJoint.prototype.GetLength1 = function () {
9713
var p = this.m_bodyA.GetWorldPoint(this.m_localAnchor1);
9714
var sX = this.m_ground.m_xf.position.x + this.m_groundAnchor1.x;
9715
var sY = this.m_ground.m_xf.position.y + this.m_groundAnchor1.y;
9716
var dX = p.x - sX;
9717
var dY = p.y - sY;
9718
return Math.sqrt(dX * dX + dY * dY);
9719
}
9720
b2PulleyJoint.prototype.GetLength2 = function () {
9721
var p = this.m_bodyB.GetWorldPoint(this.m_localAnchor2);
9722
var sX = this.m_ground.m_xf.position.x + this.m_groundAnchor2.x;
9723
var sY = this.m_ground.m_xf.position.y + this.m_groundAnchor2.y;
9724
var dX = p.x - sX;
9725
var dY = p.y - sY;
9726
return Math.sqrt(dX * dX + dY * dY);
9727
}
9728
b2PulleyJoint.prototype.GetRatio = function () {
9729
return this.m_ratio;
9730
}
9731
b2PulleyJoint.prototype.b2PulleyJoint = function (def) {
9732
this.__super.b2Joint.call(this, def);
9733
var tMat;
9734
var tX = 0;
9735
var tY = 0;
9736
this.m_ground = this.m_bodyA.m_world.m_groundBody;
9737
this.m_groundAnchor1.x = def.groundAnchorA.x - this.m_ground.m_xf.position.x;
9738
this.m_groundAnchor1.y = def.groundAnchorA.y - this.m_ground.m_xf.position.y;
9739
this.m_groundAnchor2.x = def.groundAnchorB.x - this.m_ground.m_xf.position.x;
9740
this.m_groundAnchor2.y = def.groundAnchorB.y - this.m_ground.m_xf.position.y;
9741
this.m_localAnchor1.SetV(def.localAnchorA);
9742
this.m_localAnchor2.SetV(def.localAnchorB);
9743
this.m_ratio = def.ratio;
9744
this.m_constant = def.lengthA + this.m_ratio * def.lengthB;
9745
this.m_maxLength1 = b2Math.Min(def.maxLengthA, this.m_constant - this.m_ratio * b2PulleyJoint.b2_minPulleyLength);
9746
this.m_maxLength2 = b2Math.Min(def.maxLengthB, (this.m_constant - b2PulleyJoint.b2_minPulleyLength) / this.m_ratio);
9747
this.m_impulse = 0.0;
9748
this.m_limitImpulse1 = 0.0;
9749
this.m_limitImpulse2 = 0.0;
9750
}
9751
b2PulleyJoint.prototype.InitVelocityConstraints = function (step) {
9752
var bA = this.m_bodyA;
9753
var bB = this.m_bodyB;
9754
var tMat;
9755
tMat = bA.m_xf.R;
9756
var r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
9757
var r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
9758
var tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
9759
r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
9760
r1X = tX;
9761
tMat = bB.m_xf.R;
9762
var r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
9763
var r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
9764
tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
9765
r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
9766
r2X = tX;
9767
var p1X = bA.m_sweep.c.x + r1X;
9768
var p1Y = bA.m_sweep.c.y + r1Y;
9769
var p2X = bB.m_sweep.c.x + r2X;
9770
var p2Y = bB.m_sweep.c.y + r2Y;
9771
var s1X = this.m_ground.m_xf.position.x + this.m_groundAnchor1.x;
9772
var s1Y = this.m_ground.m_xf.position.y + this.m_groundAnchor1.y;
9773
var s2X = this.m_ground.m_xf.position.x + this.m_groundAnchor2.x;
9774
var s2Y = this.m_ground.m_xf.position.y + this.m_groundAnchor2.y;
9775
this.m_u1.Set(p1X - s1X, p1Y - s1Y);
9776
this.m_u2.Set(p2X - s2X, p2Y - s2Y);
9777
var length1 = this.m_u1.Length();
9778
var length2 = this.m_u2.Length();
9779
if (length1 > b2Settings.b2_linearSlop) {
9780
this.m_u1.Multiply(1.0 / length1);
9781
}
9782
else {
9783
this.m_u1.SetZero();
9784
}
9785
if (length2 > b2Settings.b2_linearSlop) {
9786
this.m_u2.Multiply(1.0 / length2);
9787
}
9788
else {
9789
this.m_u2.SetZero();
9790
}
9791
var C = this.m_constant - length1 - this.m_ratio * length2;
9792
if (C > 0.0) {
9793
this.m_state = b2Joint.e_inactiveLimit;
9794
this.m_impulse = 0.0;
9795
}
9796
else {
9797
this.m_state = b2Joint.e_atUpperLimit;
9798
}
9799
if (length1 < this.m_maxLength1) {
9800
this.m_limitState1 = b2Joint.e_inactiveLimit;
9801
this.m_limitImpulse1 = 0.0;
9802
}
9803
else {
9804
this.m_limitState1 = b2Joint.e_atUpperLimit;
9805
}
9806
if (length2 < this.m_maxLength2) {
9807
this.m_limitState2 = b2Joint.e_inactiveLimit;
9808
this.m_limitImpulse2 = 0.0;
9809
}
9810
else {
9811
this.m_limitState2 = b2Joint.e_atUpperLimit;
9812
}
9813
var cr1u1 = r1X * this.m_u1.y - r1Y * this.m_u1.x;
9814
var cr2u2 = r2X * this.m_u2.y - r2Y * this.m_u2.x;
9815
this.m_limitMass1 = bA.m_invMass + bA.m_invI * cr1u1 * cr1u1;
9816
this.m_limitMass2 = bB.m_invMass + bB.m_invI * cr2u2 * cr2u2;
9817
this.m_pulleyMass = this.m_limitMass1 + this.m_ratio * this.m_ratio * this.m_limitMass2;
9818
this.m_limitMass1 = 1.0 / this.m_limitMass1;
9819
this.m_limitMass2 = 1.0 / this.m_limitMass2;
9820
this.m_pulleyMass = 1.0 / this.m_pulleyMass;
9821
if (step.warmStarting) {
9822
this.m_impulse *= step.dtRatio;
9823
this.m_limitImpulse1 *= step.dtRatio;
9824
this.m_limitImpulse2 *= step.dtRatio;
9825
var P1X = ((-this.m_impulse) - this.m_limitImpulse1) * this.m_u1.x;
9826
var P1Y = ((-this.m_impulse) - this.m_limitImpulse1) * this.m_u1.y;
9827
var P2X = ((-this.m_ratio * this.m_impulse) - this.m_limitImpulse2) * this.m_u2.x;
9828
var P2Y = ((-this.m_ratio * this.m_impulse) - this.m_limitImpulse2) * this.m_u2.y;
9829
bA.m_linearVelocity.x += bA.m_invMass * P1X;
9830
bA.m_linearVelocity.y += bA.m_invMass * P1Y;
9831
bA.m_angularVelocity += bA.m_invI * (r1X * P1Y - r1Y * P1X);
9832
bB.m_linearVelocity.x += bB.m_invMass * P2X;
9833
bB.m_linearVelocity.y += bB.m_invMass * P2Y;
9834
bB.m_angularVelocity += bB.m_invI * (r2X * P2Y - r2Y * P2X);
9835
}
9836
else {
9837
this.m_impulse = 0.0;
9838
this.m_limitImpulse1 = 0.0;
9839
this.m_limitImpulse2 = 0.0;
9840
}
9841
}
9842
b2PulleyJoint.prototype.SolveVelocityConstraints = function (step) {
9843
var bA = this.m_bodyA;
9844
var bB = this.m_bodyB;
9845
var tMat;
9846
tMat = bA.m_xf.R;
9847
var r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
9848
var r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
9849
var tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
9850
r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
9851
r1X = tX;
9852
tMat = bB.m_xf.R;
9853
var r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
9854
var r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
9855
tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
9856
r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
9857
r2X = tX;
9858
var v1X = 0;
9859
var v1Y = 0;
9860
var v2X = 0;
9861
var v2Y = 0;
9862
var P1X = 0;
9863
var P1Y = 0;
9864
var P2X = 0;
9865
var P2Y = 0;
9866
var Cdot = 0;
9867
var impulse = 0;
9868
var oldImpulse = 0;
9869
if (this.m_state == b2Joint.e_atUpperLimit) {
9870
v1X = bA.m_linearVelocity.x + ((-bA.m_angularVelocity * r1Y));
9871
v1Y = bA.m_linearVelocity.y + (bA.m_angularVelocity * r1X);
9872
v2X = bB.m_linearVelocity.x + ((-bB.m_angularVelocity * r2Y));
9873
v2Y = bB.m_linearVelocity.y + (bB.m_angularVelocity * r2X);
9874
Cdot = (-(this.m_u1.x * v1X + this.m_u1.y * v1Y)) - this.m_ratio * (this.m_u2.x * v2X + this.m_u2.y * v2Y);
9875
impulse = this.m_pulleyMass * ((-Cdot));
9876
oldImpulse = this.m_impulse;
9877
this.m_impulse = b2Math.Max(0.0, this.m_impulse + impulse);
9878
impulse = this.m_impulse - oldImpulse;
9879
P1X = (-impulse * this.m_u1.x);
9880
P1Y = (-impulse * this.m_u1.y);
9881
P2X = (-this.m_ratio * impulse * this.m_u2.x);
9882
P2Y = (-this.m_ratio * impulse * this.m_u2.y);
9883
bA.m_linearVelocity.x += bA.m_invMass * P1X;
9884
bA.m_linearVelocity.y += bA.m_invMass * P1Y;
9885
bA.m_angularVelocity += bA.m_invI * (r1X * P1Y - r1Y * P1X);
9886
bB.m_linearVelocity.x += bB.m_invMass * P2X;
9887
bB.m_linearVelocity.y += bB.m_invMass * P2Y;
9888
bB.m_angularVelocity += bB.m_invI * (r2X * P2Y - r2Y * P2X);
9889
}
9890
if (this.m_limitState1 == b2Joint.e_atUpperLimit) {
9891
v1X = bA.m_linearVelocity.x + ((-bA.m_angularVelocity * r1Y));
9892
v1Y = bA.m_linearVelocity.y + (bA.m_angularVelocity * r1X);
9893
Cdot = (-(this.m_u1.x * v1X + this.m_u1.y * v1Y));
9894
impulse = (-this.m_limitMass1 * Cdot);
9895
oldImpulse = this.m_limitImpulse1;
9896
this.m_limitImpulse1 = b2Math.Max(0.0, this.m_limitImpulse1 + impulse);
9897
impulse = this.m_limitImpulse1 - oldImpulse;
9898
P1X = (-impulse * this.m_u1.x);
9899
P1Y = (-impulse * this.m_u1.y);
9900
bA.m_linearVelocity.x += bA.m_invMass * P1X;
9901
bA.m_linearVelocity.y += bA.m_invMass * P1Y;
9902
bA.m_angularVelocity += bA.m_invI * (r1X * P1Y - r1Y * P1X);
9903
}
9904
if (this.m_limitState2 == b2Joint.e_atUpperLimit) {
9905
v2X = bB.m_linearVelocity.x + ((-bB.m_angularVelocity * r2Y));
9906
v2Y = bB.m_linearVelocity.y + (bB.m_angularVelocity * r2X);
9907
Cdot = (-(this.m_u2.x * v2X + this.m_u2.y * v2Y));
9908
impulse = (-this.m_limitMass2 * Cdot);
9909
oldImpulse = this.m_limitImpulse2;
9910
this.m_limitImpulse2 = b2Math.Max(0.0, this.m_limitImpulse2 + impulse);
9911
impulse = this.m_limitImpulse2 - oldImpulse;
9912
P2X = (-impulse * this.m_u2.x);
9913
P2Y = (-impulse * this.m_u2.y);
9914
bB.m_linearVelocity.x += bB.m_invMass * P2X;
9915
bB.m_linearVelocity.y += bB.m_invMass * P2Y;
9916
bB.m_angularVelocity += bB.m_invI * (r2X * P2Y - r2Y * P2X);
9917
}
9918
}
9919
b2PulleyJoint.prototype.SolvePositionConstraints = function (baumgarte) {
9920
if (baumgarte === undefined) baumgarte = 0;
9921
var bA = this.m_bodyA;
9922
var bB = this.m_bodyB;
9923
var tMat;
9924
var s1X = this.m_ground.m_xf.position.x + this.m_groundAnchor1.x;
9925
var s1Y = this.m_ground.m_xf.position.y + this.m_groundAnchor1.y;
9926
var s2X = this.m_ground.m_xf.position.x + this.m_groundAnchor2.x;
9927
var s2Y = this.m_ground.m_xf.position.y + this.m_groundAnchor2.y;
9928
var r1X = 0;
9929
var r1Y = 0;
9930
var r2X = 0;
9931
var r2Y = 0;
9932
var p1X = 0;
9933
var p1Y = 0;
9934
var p2X = 0;
9935
var p2Y = 0;
9936
var length1 = 0;
9937
var length2 = 0;
9938
var C = 0;
9939
var impulse = 0;
9940
var oldImpulse = 0;
9941
var oldLimitPositionImpulse = 0;
9942
var tX = 0;
9943
var linearError = 0.0;
9944
if (this.m_state == b2Joint.e_atUpperLimit) {
9945
tMat = bA.m_xf.R;
9946
r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
9947
r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
9948
tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
9949
r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
9950
r1X = tX;
9951
tMat = bB.m_xf.R;
9952
r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
9953
r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
9954
tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
9955
r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
9956
r2X = tX;
9957
p1X = bA.m_sweep.c.x + r1X;
9958
p1Y = bA.m_sweep.c.y + r1Y;
9959
p2X = bB.m_sweep.c.x + r2X;
9960
p2Y = bB.m_sweep.c.y + r2Y;
9961
this.m_u1.Set(p1X - s1X, p1Y - s1Y);
9962
this.m_u2.Set(p2X - s2X, p2Y - s2Y);
9963
length1 = this.m_u1.Length();
9964
length2 = this.m_u2.Length();
9965
if (length1 > b2Settings.b2_linearSlop) {
9966
this.m_u1.Multiply(1.0 / length1);
9967
}
9968
else {
9969
this.m_u1.SetZero();
9970
}
9971
if (length2 > b2Settings.b2_linearSlop) {
9972
this.m_u2.Multiply(1.0 / length2);
9973
}
9974
else {
9975
this.m_u2.SetZero();
9976
}
9977
C = this.m_constant - length1 - this.m_ratio * length2;
9978
linearError = b2Math.Max(linearError, (-C));
9979
C = b2Math.Clamp(C + b2Settings.b2_linearSlop, (-b2Settings.b2_maxLinearCorrection), 0.0);
9980
impulse = (-this.m_pulleyMass * C);
9981
p1X = (-impulse * this.m_u1.x);
9982
p1Y = (-impulse * this.m_u1.y);
9983
p2X = (-this.m_ratio * impulse * this.m_u2.x);
9984
p2Y = (-this.m_ratio * impulse * this.m_u2.y);
9985
bA.m_sweep.c.x += bA.m_invMass * p1X;
9986
bA.m_sweep.c.y += bA.m_invMass * p1Y;
9987
bA.m_sweep.a += bA.m_invI * (r1X * p1Y - r1Y * p1X);
9988
bB.m_sweep.c.x += bB.m_invMass * p2X;
9989
bB.m_sweep.c.y += bB.m_invMass * p2Y;
9990
bB.m_sweep.a += bB.m_invI * (r2X * p2Y - r2Y * p2X);
9991
bA.SynchronizeTransform();
9992
bB.SynchronizeTransform();
9993
}
9994
if (this.m_limitState1 == b2Joint.e_atUpperLimit) {
9995
tMat = bA.m_xf.R;
9996
r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
9997
r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
9998
tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
9999
r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
10000
r1X = tX;
10001
p1X = bA.m_sweep.c.x + r1X;
10002
p1Y = bA.m_sweep.c.y + r1Y;
10003
this.m_u1.Set(p1X - s1X, p1Y - s1Y);
10004
length1 = this.m_u1.Length();
10005
if (length1 > b2Settings.b2_linearSlop) {
10006
this.m_u1.x *= 1.0 / length1;
10007
this.m_u1.y *= 1.0 / length1;
10008
}
10009
else {
10010
this.m_u1.SetZero();
10011
}
10012
C = this.m_maxLength1 - length1;
10013
linearError = b2Math.Max(linearError, (-C));
10014
C = b2Math.Clamp(C + b2Settings.b2_linearSlop, (-b2Settings.b2_maxLinearCorrection), 0.0);
10015
impulse = (-this.m_limitMass1 * C);
10016
p1X = (-impulse * this.m_u1.x);
10017
p1Y = (-impulse * this.m_u1.y);
10018
bA.m_sweep.c.x += bA.m_invMass * p1X;
10019
bA.m_sweep.c.y += bA.m_invMass * p1Y;
10020
bA.m_sweep.a += bA.m_invI * (r1X * p1Y - r1Y * p1X);
10021
bA.SynchronizeTransform();
10022
}
10023
if (this.m_limitState2 == b2Joint.e_atUpperLimit) {
10024
tMat = bB.m_xf.R;
10025
r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
10026
r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
10027
tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
10028
r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
10029
r2X = tX;
10030
p2X = bB.m_sweep.c.x + r2X;
10031
p2Y = bB.m_sweep.c.y + r2Y;
10032
this.m_u2.Set(p2X - s2X, p2Y - s2Y);
10033
length2 = this.m_u2.Length();
10034
if (length2 > b2Settings.b2_linearSlop) {
10035
this.m_u2.x *= 1.0 / length2;
10036
this.m_u2.y *= 1.0 / length2;
10037
}
10038
else {
10039
this.m_u2.SetZero();
10040
}
10041
C = this.m_maxLength2 - length2;
10042
linearError = b2Math.Max(linearError, (-C));
10043
C = b2Math.Clamp(C + b2Settings.b2_linearSlop, (-b2Settings.b2_maxLinearCorrection), 0.0);
10044
impulse = (-this.m_limitMass2 * C);
10045
p2X = (-impulse * this.m_u2.x);
10046
p2Y = (-impulse * this.m_u2.y);
10047
bB.m_sweep.c.x += bB.m_invMass * p2X;
10048
bB.m_sweep.c.y += bB.m_invMass * p2Y;
10049
bB.m_sweep.a += bB.m_invI * (r2X * p2Y - r2Y * p2X);
10050
bB.SynchronizeTransform();
10051
}
10052
return linearError < b2Settings.b2_linearSlop;
10053
}
10054
Box2D.postDefs.push(function () {
10055
Box2D.Dynamics.Joints.b2PulleyJoint.b2_minPulleyLength = 2.0;
10056
});
10057
Box2D.inherit(b2PulleyJointDef, Box2D.Dynamics.Joints.b2JointDef);
10058
b2PulleyJointDef.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
10059
b2PulleyJointDef.b2PulleyJointDef = function () {
10060
Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
10061
this.groundAnchorA = new b2Vec2();
10062
this.groundAnchorB = new b2Vec2();
10063
this.localAnchorA = new b2Vec2();
10064
this.localAnchorB = new b2Vec2();
10065
};
10066
b2PulleyJointDef.prototype.b2PulleyJointDef = function () {
10067
this.__super.b2JointDef.call(this);
10068
this.type = b2Joint.e_pulleyJoint;
10069
this.groundAnchorA.Set((-1.0), 1.0);
10070
this.groundAnchorB.Set(1.0, 1.0);
10071
this.localAnchorA.Set((-1.0), 0.0);
10072
this.localAnchorB.Set(1.0, 0.0);
10073
this.lengthA = 0.0;
10074
this.maxLengthA = 0.0;
10075
this.lengthB = 0.0;
10076
this.maxLengthB = 0.0;
10077
this.ratio = 1.0;
10078
this.collideConnected = true;
10079
}
10080
b2PulleyJointDef.prototype.Initialize = function (bA, bB, gaA, gaB, anchorA, anchorB, r) {
10081
if (r === undefined) r = 0;
10082
this.bodyA = bA;
10083
this.bodyB = bB;
10084
this.groundAnchorA.SetV(gaA);
10085
this.groundAnchorB.SetV(gaB);
10086
this.localAnchorA = this.bodyA.GetLocalPoint(anchorA);
10087
this.localAnchorB = this.bodyB.GetLocalPoint(anchorB);
10088
var d1X = anchorA.x - gaA.x;
10089
var d1Y = anchorA.y - gaA.y;
10090
this.lengthA = Math.sqrt(d1X * d1X + d1Y * d1Y);
10091
var d2X = anchorB.x - gaB.x;
10092
var d2Y = anchorB.y - gaB.y;
10093
this.lengthB = Math.sqrt(d2X * d2X + d2Y * d2Y);
10094
this.ratio = r;
10095
var C = this.lengthA + this.ratio * this.lengthB;
10096
this.maxLengthA = C - this.ratio * b2PulleyJoint.b2_minPulleyLength;
10097
this.maxLengthB = (C - b2PulleyJoint.b2_minPulleyLength) / this.ratio;
10098
}
10099
Box2D.inherit(b2RevoluteJoint, Box2D.Dynamics.Joints.b2Joint);
10100
b2RevoluteJoint.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
10101
b2RevoluteJoint.b2RevoluteJoint = function () {
10102
Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
10103
this.K = new b2Mat22();
10104
this.K1 = new b2Mat22();
10105
this.K2 = new b2Mat22();
10106
this.K3 = new b2Mat22();
10107
this.impulse3 = new b2Vec3();
10108
this.impulse2 = new b2Vec2();
10109
this.reduced = new b2Vec2();
10110
this.m_localAnchor1 = new b2Vec2();
10111
this.m_localAnchor2 = new b2Vec2();
10112
this.m_impulse = new b2Vec3();
10113
this.m_mass = new b2Mat33();
10114
};
10115
b2RevoluteJoint.prototype.GetAnchorA = function () {
10116
return this.m_bodyA.GetWorldPoint(this.m_localAnchor1);
10117
}
10118
b2RevoluteJoint.prototype.GetAnchorB = function () {
10119
return this.m_bodyB.GetWorldPoint(this.m_localAnchor2);
10120
}
10121
b2RevoluteJoint.prototype.GetReactionForce = function (inv_dt) {
10122
if (inv_dt === undefined) inv_dt = 0;
10123
return new b2Vec2(inv_dt * this.m_impulse.x, inv_dt * this.m_impulse.y);
10124
}
10125
b2RevoluteJoint.prototype.GetReactionTorque = function (inv_dt) {
10126
if (inv_dt === undefined) inv_dt = 0;
10127
return inv_dt * this.m_impulse.z;
10128
}
10129
b2RevoluteJoint.prototype.GetJointAngle = function () {
10130
return this.m_bodyB.m_sweep.a - this.m_bodyA.m_sweep.a - this.m_referenceAngle;
10131
}
10132
b2RevoluteJoint.prototype.GetJointSpeed = function () {
10133
return this.m_bodyB.m_angularVelocity - this.m_bodyA.m_angularVelocity;
10134
}
10135
b2RevoluteJoint.prototype.IsLimitEnabled = function () {
10136
return this.m_enableLimit;
10137
}
10138
b2RevoluteJoint.prototype.EnableLimit = function (flag) {
10139
this.m_enableLimit = flag;
10140
}
10141
b2RevoluteJoint.prototype.GetLowerLimit = function () {
10142
return this.m_lowerAngle;
10143
}
10144
b2RevoluteJoint.prototype.GetUpperLimit = function () {
10145
return this.m_upperAngle;
10146
}
10147
b2RevoluteJoint.prototype.SetLimits = function (lower, upper) {
10148
if (lower === undefined) lower = 0;
10149
if (upper === undefined) upper = 0;
10150
this.m_lowerAngle = lower;
10151
this.m_upperAngle = upper;
10152
}
10153
b2RevoluteJoint.prototype.IsMotorEnabled = function () {
10154
this.m_bodyA.SetAwake(true);
10155
this.m_bodyB.SetAwake(true);
10156
return this.m_enableMotor;
10157
}
10158
b2RevoluteJoint.prototype.EnableMotor = function (flag) {
10159
this.m_enableMotor = flag;
10160
}
10161
b2RevoluteJoint.prototype.SetMotorSpeed = function (speed) {
10162
if (speed === undefined) speed = 0;
10163
this.m_bodyA.SetAwake(true);
10164
this.m_bodyB.SetAwake(true);
10165
this.m_motorSpeed = speed;
10166
}
10167
b2RevoluteJoint.prototype.GetMotorSpeed = function () {
10168
return this.m_motorSpeed;
10169
}
10170
b2RevoluteJoint.prototype.SetMaxMotorTorque = function (torque) {
10171
if (torque === undefined) torque = 0;
10172
this.m_maxMotorTorque = torque;
10173
}
10174
b2RevoluteJoint.prototype.GetMotorTorque = function () {
10175
return this.m_maxMotorTorque;
10176
}
10177
b2RevoluteJoint.prototype.b2RevoluteJoint = function (def) {
10178
this.__super.b2Joint.call(this, def);
10179
this.m_localAnchor1.SetV(def.localAnchorA);
10180
this.m_localAnchor2.SetV(def.localAnchorB);
10181
this.m_referenceAngle = def.referenceAngle;
10182
this.m_impulse.SetZero();
10183
this.m_motorImpulse = 0.0;
10184
this.m_lowerAngle = def.lowerAngle;
10185
this.m_upperAngle = def.upperAngle;
10186
this.m_maxMotorTorque = def.maxMotorTorque;
10187
this.m_motorSpeed = def.motorSpeed;
10188
this.m_enableLimit = def.enableLimit;
10189
this.m_enableMotor = def.enableMotor;
10190
this.m_limitState = b2Joint.e_inactiveLimit;
10191
}
10192
b2RevoluteJoint.prototype.InitVelocityConstraints = function (step) {
10193
var bA = this.m_bodyA;
10194
var bB = this.m_bodyB;
10195
var tMat;
10196
var tX = 0;
10197
if (this.m_enableMotor || this.m_enableLimit) {}
10198
tMat = bA.m_xf.R;
10199
var r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
10200
var r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
10201
tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
10202
r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
10203
r1X = tX;
10204
tMat = bB.m_xf.R;
10205
var r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
10206
var r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
10207
tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
10208
r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
10209
r2X = tX;
10210
var m1 = bA.m_invMass;
10211
var m2 = bB.m_invMass;
10212
var i1 = bA.m_invI;
10213
var i2 = bB.m_invI;
10214
this.m_mass.col1.x = m1 + m2 + r1Y * r1Y * i1 + r2Y * r2Y * i2;
10215
this.m_mass.col2.x = (-r1Y * r1X * i1) - r2Y * r2X * i2;
10216
this.m_mass.col3.x = (-r1Y * i1) - r2Y * i2;
10217
this.m_mass.col1.y = this.m_mass.col2.x;
10218
this.m_mass.col2.y = m1 + m2 + r1X * r1X * i1 + r2X * r2X * i2;
10219
this.m_mass.col3.y = r1X * i1 + r2X * i2;
10220
this.m_mass.col1.z = this.m_mass.col3.x;
10221
this.m_mass.col2.z = this.m_mass.col3.y;
10222
this.m_mass.col3.z = i1 + i2;
10223
this.m_motorMass = 1.0 / (i1 + i2);
10224
if (this.m_enableMotor == false) {
10225
this.m_motorImpulse = 0.0;
10226
}
10227
if (this.m_enableLimit) {
10228
var jointAngle = bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle;
10229
if (b2Math.Abs(this.m_upperAngle - this.m_lowerAngle) < 2.0 * b2Settings.b2_angularSlop) {
10230
this.m_limitState = b2Joint.e_equalLimits;
10231
}
10232
else if (jointAngle <= this.m_lowerAngle) {
10233
if (this.m_limitState != b2Joint.e_atLowerLimit) {
10234
this.m_impulse.z = 0.0;
10235
}
10236
this.m_limitState = b2Joint.e_atLowerLimit;
10237
}
10238
else if (jointAngle >= this.m_upperAngle) {
10239
if (this.m_limitState != b2Joint.e_atUpperLimit) {
10240
this.m_impulse.z = 0.0;
10241
}
10242
this.m_limitState = b2Joint.e_atUpperLimit;
10243
}
10244
else {
10245
this.m_limitState = b2Joint.e_inactiveLimit;
10246
this.m_impulse.z = 0.0;
10247
}
10248
}
10249
else {
10250
this.m_limitState = b2Joint.e_inactiveLimit;
10251
}
10252
if (step.warmStarting) {
10253
this.m_impulse.x *= step.dtRatio;
10254
this.m_impulse.y *= step.dtRatio;
10255
this.m_motorImpulse *= step.dtRatio;
10256
var PX = this.m_impulse.x;
10257
var PY = this.m_impulse.y;
10258
bA.m_linearVelocity.x -= m1 * PX;
10259
bA.m_linearVelocity.y -= m1 * PY;
10260
bA.m_angularVelocity -= i1 * ((r1X * PY - r1Y * PX) + this.m_motorImpulse + this.m_impulse.z);
10261
bB.m_linearVelocity.x += m2 * PX;
10262
bB.m_linearVelocity.y += m2 * PY;
10263
bB.m_angularVelocity += i2 * ((r2X * PY - r2Y * PX) + this.m_motorImpulse + this.m_impulse.z);
10264
}
10265
else {
10266
this.m_impulse.SetZero();
10267
this.m_motorImpulse = 0.0;
10268
}
10269
}
10270
b2RevoluteJoint.prototype.SolveVelocityConstraints = function (step) {
10271
var bA = this.m_bodyA;
10272
var bB = this.m_bodyB;
10273
var tMat;
10274
var tX = 0;
10275
var newImpulse = 0;
10276
var r1X = 0;
10277
var r1Y = 0;
10278
var r2X = 0;
10279
var r2Y = 0;
10280
var v1 = bA.m_linearVelocity;
10281
var w1 = bA.m_angularVelocity;
10282
var v2 = bB.m_linearVelocity;
10283
var w2 = bB.m_angularVelocity;
10284
var m1 = bA.m_invMass;
10285
var m2 = bB.m_invMass;
10286
var i1 = bA.m_invI;
10287
var i2 = bB.m_invI;
10288
if (this.m_enableMotor && this.m_limitState != b2Joint.e_equalLimits) {
10289
var Cdot = w2 - w1 - this.m_motorSpeed;
10290
var impulse = this.m_motorMass * ((-Cdot));
10291
var oldImpulse = this.m_motorImpulse;
10292
var maxImpulse = step.dt * this.m_maxMotorTorque;
10293
this.m_motorImpulse = b2Math.Clamp(this.m_motorImpulse + impulse, (-maxImpulse), maxImpulse);
10294
impulse = this.m_motorImpulse - oldImpulse;
10295
w1 -= i1 * impulse;
10296
w2 += i2 * impulse;
10297
}
10298
if (this.m_enableLimit && this.m_limitState != b2Joint.e_inactiveLimit) {
10299
tMat = bA.m_xf.R;
10300
r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
10301
r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
10302
tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
10303
r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
10304
r1X = tX;
10305
tMat = bB.m_xf.R;
10306
r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
10307
r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
10308
tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
10309
r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
10310
r2X = tX;
10311
var Cdot1X = v2.x + ((-w2 * r2Y)) - v1.x - ((-w1 * r1Y));
10312
var Cdot1Y = v2.y + (w2 * r2X) - v1.y - (w1 * r1X);
10313
var Cdot2 = w2 - w1;
10314
this.m_mass.Solve33(this.impulse3, (-Cdot1X), (-Cdot1Y), (-Cdot2));
10315
if (this.m_limitState == b2Joint.e_equalLimits) {
10316
this.m_impulse.Add(this.impulse3);
10317
}
10318
else if (this.m_limitState == b2Joint.e_atLowerLimit) {
10319
newImpulse = this.m_impulse.z + this.impulse3.z;
10320
if (newImpulse < 0.0) {
10321
this.m_mass.Solve22(this.reduced, (-Cdot1X), (-Cdot1Y));
10322
this.impulse3.x = this.reduced.x;
10323
this.impulse3.y = this.reduced.y;
10324
this.impulse3.z = (-this.m_impulse.z);
10325
this.m_impulse.x += this.reduced.x;
10326
this.m_impulse.y += this.reduced.y;
10327
this.m_impulse.z = 0.0;
10328
}
10329
}
10330
else if (this.m_limitState == b2Joint.e_atUpperLimit) {
10331
newImpulse = this.m_impulse.z + this.impulse3.z;
10332
if (newImpulse > 0.0) {
10333
this.m_mass.Solve22(this.reduced, (-Cdot1X), (-Cdot1Y));
10334
this.impulse3.x = this.reduced.x;
10335
this.impulse3.y = this.reduced.y;
10336
this.impulse3.z = (-this.m_impulse.z);
10337
this.m_impulse.x += this.reduced.x;
10338
this.m_impulse.y += this.reduced.y;
10339
this.m_impulse.z = 0.0;
10340
}
10341
}
10342
v1.x -= m1 * this.impulse3.x;
10343
v1.y -= m1 * this.impulse3.y;
10344
w1 -= i1 * (r1X * this.impulse3.y - r1Y * this.impulse3.x + this.impulse3.z);
10345
v2.x += m2 * this.impulse3.x;
10346
v2.y += m2 * this.impulse3.y;
10347
w2 += i2 * (r2X * this.impulse3.y - r2Y * this.impulse3.x + this.impulse3.z);
10348
}
10349
else {
10350
tMat = bA.m_xf.R;
10351
r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
10352
r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
10353
tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
10354
r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
10355
r1X = tX;
10356
tMat = bB.m_xf.R;
10357
r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
10358
r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
10359
tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
10360
r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
10361
r2X = tX;
10362
var CdotX = v2.x + ((-w2 * r2Y)) - v1.x - ((-w1 * r1Y));
10363
var CdotY = v2.y + (w2 * r2X) - v1.y - (w1 * r1X);
10364
this.m_mass.Solve22(this.impulse2, (-CdotX), (-CdotY));
10365
this.m_impulse.x += this.impulse2.x;
10366
this.m_impulse.y += this.impulse2.y;
10367
v1.x -= m1 * this.impulse2.x;
10368
v1.y -= m1 * this.impulse2.y;
10369
w1 -= i1 * (r1X * this.impulse2.y - r1Y * this.impulse2.x);
10370
v2.x += m2 * this.impulse2.x;
10371
v2.y += m2 * this.impulse2.y;
10372
w2 += i2 * (r2X * this.impulse2.y - r2Y * this.impulse2.x);
10373
}
10374
bA.m_linearVelocity.SetV(v1);
10375
bA.m_angularVelocity = w1;
10376
bB.m_linearVelocity.SetV(v2);
10377
bB.m_angularVelocity = w2;
10378
}
10379
b2RevoluteJoint.prototype.SolvePositionConstraints = function (baumgarte) {
10380
if (baumgarte === undefined) baumgarte = 0;
10381
var oldLimitImpulse = 0;
10382
var C = 0;
10383
var tMat;
10384
var bA = this.m_bodyA;
10385
var bB = this.m_bodyB;
10386
var angularError = 0.0;
10387
var positionError = 0.0;
10388
var tX = 0;
10389
var impulseX = 0;
10390
var impulseY = 0;
10391
if (this.m_enableLimit && this.m_limitState != b2Joint.e_inactiveLimit) {
10392
var angle = bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle;
10393
var limitImpulse = 0.0;
10394
if (this.m_limitState == b2Joint.e_equalLimits) {
10395
C = b2Math.Clamp(angle - this.m_lowerAngle, (-b2Settings.b2_maxAngularCorrection), b2Settings.b2_maxAngularCorrection);
10396
limitImpulse = (-this.m_motorMass * C);
10397
angularError = b2Math.Abs(C);
10398
}
10399
else if (this.m_limitState == b2Joint.e_atLowerLimit) {
10400
C = angle - this.m_lowerAngle;
10401
angularError = (-C);
10402
C = b2Math.Clamp(C + b2Settings.b2_angularSlop, (-b2Settings.b2_maxAngularCorrection), 0.0);
10403
limitImpulse = (-this.m_motorMass * C);
10404
}
10405
else if (this.m_limitState == b2Joint.e_atUpperLimit) {
10406
C = angle - this.m_upperAngle;
10407
angularError = C;
10408
C = b2Math.Clamp(C - b2Settings.b2_angularSlop, 0.0, b2Settings.b2_maxAngularCorrection);
10409
limitImpulse = (-this.m_motorMass * C);
10410
}
10411
bA.m_sweep.a -= bA.m_invI * limitImpulse;
10412
bB.m_sweep.a += bB.m_invI * limitImpulse;
10413
bA.SynchronizeTransform();
10414
bB.SynchronizeTransform();
10415
} {
10416
tMat = bA.m_xf.R;
10417
var r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
10418
var r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
10419
tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
10420
r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
10421
r1X = tX;
10422
tMat = bB.m_xf.R;
10423
var r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
10424
var r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
10425
tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
10426
r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
10427
r2X = tX;
10428
var CX = bB.m_sweep.c.x + r2X - bA.m_sweep.c.x - r1X;
10429
var CY = bB.m_sweep.c.y + r2Y - bA.m_sweep.c.y - r1Y;
10430
var CLengthSquared = CX * CX + CY * CY;
10431
var CLength = Math.sqrt(CLengthSquared);
10432
positionError = CLength;
10433
var invMass1 = bA.m_invMass;
10434
var invMass2 = bB.m_invMass;
10435
var invI1 = bA.m_invI;
10436
var invI2 = bB.m_invI;
10437
var k_allowedStretch = 10.0 * b2Settings.b2_linearSlop;
10438
if (CLengthSquared > k_allowedStretch * k_allowedStretch) {
10439
var uX = CX / CLength;
10440
var uY = CY / CLength;
10441
var k = invMass1 + invMass2;
10442
var m = 1.0 / k;
10443
impulseX = m * ((-CX));
10444
impulseY = m * ((-CY));
10445
var k_beta = 0.5;
10446
bA.m_sweep.c.x -= k_beta * invMass1 * impulseX;
10447
bA.m_sweep.c.y -= k_beta * invMass1 * impulseY;
10448
bB.m_sweep.c.x += k_beta * invMass2 * impulseX;
10449
bB.m_sweep.c.y += k_beta * invMass2 * impulseY;
10450
CX = bB.m_sweep.c.x + r2X - bA.m_sweep.c.x - r1X;
10451
CY = bB.m_sweep.c.y + r2Y - bA.m_sweep.c.y - r1Y;
10452
}
10453
this.K1.col1.x = invMass1 + invMass2;
10454
this.K1.col2.x = 0.0;
10455
this.K1.col1.y = 0.0;
10456
this.K1.col2.y = invMass1 + invMass2;
10457
this.K2.col1.x = invI1 * r1Y * r1Y;
10458
this.K2.col2.x = (-invI1 * r1X * r1Y);
10459
this.K2.col1.y = (-invI1 * r1X * r1Y);
10460
this.K2.col2.y = invI1 * r1X * r1X;
10461
this.K3.col1.x = invI2 * r2Y * r2Y;
10462
this.K3.col2.x = (-invI2 * r2X * r2Y);
10463
this.K3.col1.y = (-invI2 * r2X * r2Y);
10464
this.K3.col2.y = invI2 * r2X * r2X;
10465
this.K.SetM(this.K1);
10466
this.K.AddM(this.K2);
10467
this.K.AddM(this.K3);
10468
this.K.Solve(b2RevoluteJoint.tImpulse, (-CX), (-CY));
10469
impulseX = b2RevoluteJoint.tImpulse.x;
10470
impulseY = b2RevoluteJoint.tImpulse.y;
10471
bA.m_sweep.c.x -= bA.m_invMass * impulseX;
10472
bA.m_sweep.c.y -= bA.m_invMass * impulseY;
10473
bA.m_sweep.a -= bA.m_invI * (r1X * impulseY - r1Y * impulseX);
10474
bB.m_sweep.c.x += bB.m_invMass * impulseX;
10475
bB.m_sweep.c.y += bB.m_invMass * impulseY;
10476
bB.m_sweep.a += bB.m_invI * (r2X * impulseY - r2Y * impulseX);
10477
bA.SynchronizeTransform();
10478
bB.SynchronizeTransform();
10479
}
10480
return positionError <= b2Settings.b2_linearSlop && angularError <= b2Settings.b2_angularSlop;
10481
}
10482
Box2D.postDefs.push(function () {
10483
Box2D.Dynamics.Joints.b2RevoluteJoint.tImpulse = new b2Vec2();
10484
});
10485
Box2D.inherit(b2RevoluteJointDef, Box2D.Dynamics.Joints.b2JointDef);
10486
b2RevoluteJointDef.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
10487
b2RevoluteJointDef.b2RevoluteJointDef = function () {
10488
Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
10489
this.localAnchorA = new b2Vec2();
10490
this.localAnchorB = new b2Vec2();
10491
};
10492
b2RevoluteJointDef.prototype.b2RevoluteJointDef = function () {
10493
this.__super.b2JointDef.call(this);
10494
this.type = b2Joint.e_revoluteJoint;
10495
this.localAnchorA.Set(0.0, 0.0);
10496
this.localAnchorB.Set(0.0, 0.0);
10497
this.referenceAngle = 0.0;
10498
this.lowerAngle = 0.0;
10499
this.upperAngle = 0.0;
10500
this.maxMotorTorque = 0.0;
10501
this.motorSpeed = 0.0;
10502
this.enableLimit = false;
10503
this.enableMotor = false;
10504
}
10505
b2RevoluteJointDef.prototype.Initialize = function (bA, bB, anchor) {
10506
this.bodyA = bA;
10507
this.bodyB = bB;
10508
this.localAnchorA = this.bodyA.GetLocalPoint(anchor);
10509
this.localAnchorB = this.bodyB.GetLocalPoint(anchor);
10510
this.referenceAngle = this.bodyB.GetAngle() - this.bodyA.GetAngle();
10511
}
10512
Box2D.inherit(b2WeldJoint, Box2D.Dynamics.Joints.b2Joint);
10513
b2WeldJoint.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
10514
b2WeldJoint.b2WeldJoint = function () {
10515
Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
10516
this.m_localAnchorA = new b2Vec2();
10517
this.m_localAnchorB = new b2Vec2();
10518
this.m_impulse = new b2Vec3();
10519
this.m_mass = new b2Mat33();
10520
};
10521
b2WeldJoint.prototype.GetAnchorA = function () {
10522
return this.m_bodyA.GetWorldPoint(this.m_localAnchorA);
10523
}
10524
b2WeldJoint.prototype.GetAnchorB = function () {
10525
return this.m_bodyB.GetWorldPoint(this.m_localAnchorB);
10526
}
10527
b2WeldJoint.prototype.GetReactionForce = function (inv_dt) {
10528
if (inv_dt === undefined) inv_dt = 0;
10529
return new b2Vec2(inv_dt * this.m_impulse.x, inv_dt * this.m_impulse.y);
10530
}
10531
b2WeldJoint.prototype.GetReactionTorque = function (inv_dt) {
10532
if (inv_dt === undefined) inv_dt = 0;
10533
return inv_dt * this.m_impulse.z;
10534
}
10535
b2WeldJoint.prototype.b2WeldJoint = function (def) {
10536
this.__super.b2Joint.call(this, def);
10537
this.m_localAnchorA.SetV(def.localAnchorA);
10538
this.m_localAnchorB.SetV(def.localAnchorB);
10539
this.m_referenceAngle = def.referenceAngle;
10540
this.m_impulse.SetZero();
10541
this.m_mass = new b2Mat33();
10542
}
10543
b2WeldJoint.prototype.InitVelocityConstraints = function (step) {
10544
var tMat;
10545
var tX = 0;
10546
var bA = this.m_bodyA;
10547
var bB = this.m_bodyB;
10548
tMat = bA.m_xf.R;
10549
var rAX = this.m_localAnchorA.x - bA.m_sweep.localCenter.x;
10550
var rAY = this.m_localAnchorA.y - bA.m_sweep.localCenter.y;
10551
tX = (tMat.col1.x * rAX + tMat.col2.x * rAY);
10552
rAY = (tMat.col1.y * rAX + tMat.col2.y * rAY);
10553
rAX = tX;
10554
tMat = bB.m_xf.R;
10555
var rBX = this.m_localAnchorB.x - bB.m_sweep.localCenter.x;
10556
var rBY = this.m_localAnchorB.y - bB.m_sweep.localCenter.y;
10557
tX = (tMat.col1.x * rBX + tMat.col2.x * rBY);
10558
rBY = (tMat.col1.y * rBX + tMat.col2.y * rBY);
10559
rBX = tX;
10560
var mA = bA.m_invMass;
10561
var mB = bB.m_invMass;
10562
var iA = bA.m_invI;
10563
var iB = bB.m_invI;
10564
this.m_mass.col1.x = mA + mB + rAY * rAY * iA + rBY * rBY * iB;
10565
this.m_mass.col2.x = (-rAY * rAX * iA) - rBY * rBX * iB;
10566
this.m_mass.col3.x = (-rAY * iA) - rBY * iB;
10567
this.m_mass.col1.y = this.m_mass.col2.x;
10568
this.m_mass.col2.y = mA + mB + rAX * rAX * iA + rBX * rBX * iB;
10569
this.m_mass.col3.y = rAX * iA + rBX * iB;
10570
this.m_mass.col1.z = this.m_mass.col3.x;
10571
this.m_mass.col2.z = this.m_mass.col3.y;
10572
this.m_mass.col3.z = iA + iB;
10573
if (step.warmStarting) {
10574
this.m_impulse.x *= step.dtRatio;
10575
this.m_impulse.y *= step.dtRatio;
10576
this.m_impulse.z *= step.dtRatio;
10577
bA.m_linearVelocity.x -= mA * this.m_impulse.x;
10578
bA.m_linearVelocity.y -= mA * this.m_impulse.y;
10579
bA.m_angularVelocity -= iA * (rAX * this.m_impulse.y - rAY * this.m_impulse.x + this.m_impulse.z);
10580
bB.m_linearVelocity.x += mB * this.m_impulse.x;
10581
bB.m_linearVelocity.y += mB * this.m_impulse.y;
10582
bB.m_angularVelocity += iB * (rBX * this.m_impulse.y - rBY * this.m_impulse.x + this.m_impulse.z);
10583
}
10584
else {
10585
this.m_impulse.SetZero();
10586
}
10587
}
10588
b2WeldJoint.prototype.SolveVelocityConstraints = function (step) {
10589
var tMat;
10590
var tX = 0;
10591
var bA = this.m_bodyA;
10592
var bB = this.m_bodyB;
10593
var vA = bA.m_linearVelocity;
10594
var wA = bA.m_angularVelocity;
10595
var vB = bB.m_linearVelocity;
10596
var wB = bB.m_angularVelocity;
10597
var mA = bA.m_invMass;
10598
var mB = bB.m_invMass;
10599
var iA = bA.m_invI;
10600
var iB = bB.m_invI;
10601
tMat = bA.m_xf.R;
10602
var rAX = this.m_localAnchorA.x - bA.m_sweep.localCenter.x;
10603
var rAY = this.m_localAnchorA.y - bA.m_sweep.localCenter.y;
10604
tX = (tMat.col1.x * rAX + tMat.col2.x * rAY);
10605
rAY = (tMat.col1.y * rAX + tMat.col2.y * rAY);
10606
rAX = tX;
10607
tMat = bB.m_xf.R;
10608
var rBX = this.m_localAnchorB.x - bB.m_sweep.localCenter.x;
10609
var rBY = this.m_localAnchorB.y - bB.m_sweep.localCenter.y;
10610
tX = (tMat.col1.x * rBX + tMat.col2.x * rBY);
10611
rBY = (tMat.col1.y * rBX + tMat.col2.y * rBY);
10612
rBX = tX;
10613
var Cdot1X = vB.x - wB * rBY - vA.x + wA * rAY;
10614
var Cdot1Y = vB.y + wB * rBX - vA.y - wA * rAX;
10615
var Cdot2 = wB - wA;
10616
var impulse = new b2Vec3();
10617
this.m_mass.Solve33(impulse, (-Cdot1X), (-Cdot1Y), (-Cdot2));
10618
this.m_impulse.Add(impulse);
10619
vA.x -= mA * impulse.x;
10620
vA.y -= mA * impulse.y;
10621
wA -= iA * (rAX * impulse.y - rAY * impulse.x + impulse.z);
10622
vB.x += mB * impulse.x;
10623
vB.y += mB * impulse.y;
10624
wB += iB * (rBX * impulse.y - rBY * impulse.x + impulse.z);
10625
bA.m_angularVelocity = wA;
10626
bB.m_angularVelocity = wB;
10627
}
10628
b2WeldJoint.prototype.SolvePositionConstraints = function (baumgarte) {
10629
if (baumgarte === undefined) baumgarte = 0;
10630
var tMat;
10631
var tX = 0;
10632
var bA = this.m_bodyA;
10633
var bB = this.m_bodyB;
10634
tMat = bA.m_xf.R;
10635
var rAX = this.m_localAnchorA.x - bA.m_sweep.localCenter.x;
10636
var rAY = this.m_localAnchorA.y - bA.m_sweep.localCenter.y;
10637
tX = (tMat.col1.x * rAX + tMat.col2.x * rAY);
10638
rAY = (tMat.col1.y * rAX + tMat.col2.y * rAY);
10639
rAX = tX;
10640
tMat = bB.m_xf.R;
10641
var rBX = this.m_localAnchorB.x - bB.m_sweep.localCenter.x;
10642
var rBY = this.m_localAnchorB.y - bB.m_sweep.localCenter.y;
10643
tX = (tMat.col1.x * rBX + tMat.col2.x * rBY);
10644
rBY = (tMat.col1.y * rBX + tMat.col2.y * rBY);
10645
rBX = tX;
10646
var mA = bA.m_invMass;
10647
var mB = bB.m_invMass;
10648
var iA = bA.m_invI;
10649
var iB = bB.m_invI;
10650
var C1X = bB.m_sweep.c.x + rBX - bA.m_sweep.c.x - rAX;
10651
var C1Y = bB.m_sweep.c.y + rBY - bA.m_sweep.c.y - rAY;
10652
var C2 = bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle;
10653
var k_allowedStretch = 10.0 * b2Settings.b2_linearSlop;
10654
var positionError = Math.sqrt(C1X * C1X + C1Y * C1Y);
10655
var angularError = b2Math.Abs(C2);
10656
if (positionError > k_allowedStretch) {
10657
iA *= 1.0;
10658
iB *= 1.0;
10659
}
10660
this.m_mass.col1.x = mA + mB + rAY * rAY * iA + rBY * rBY * iB;
10661
this.m_mass.col2.x = (-rAY * rAX * iA) - rBY * rBX * iB;
10662
this.m_mass.col3.x = (-rAY * iA) - rBY * iB;
10663
this.m_mass.col1.y = this.m_mass.col2.x;
10664
this.m_mass.col2.y = mA + mB + rAX * rAX * iA + rBX * rBX * iB;
10665
this.m_mass.col3.y = rAX * iA + rBX * iB;
10666
this.m_mass.col1.z = this.m_mass.col3.x;
10667
this.m_mass.col2.z = this.m_mass.col3.y;
10668
this.m_mass.col3.z = iA + iB;
10669
var impulse = new b2Vec3();
10670
this.m_mass.Solve33(impulse, (-C1X), (-C1Y), (-C2));
10671
bA.m_sweep.c.x -= mA * impulse.x;
10672
bA.m_sweep.c.y -= mA * impulse.y;
10673
bA.m_sweep.a -= iA * (rAX * impulse.y - rAY * impulse.x + impulse.z);
10674
bB.m_sweep.c.x += mB * impulse.x;
10675
bB.m_sweep.c.y += mB * impulse.y;
10676
bB.m_sweep.a += iB * (rBX * impulse.y - rBY * impulse.x + impulse.z);
10677
bA.SynchronizeTransform();
10678
bB.SynchronizeTransform();
10679
return positionError <= b2Settings.b2_linearSlop && angularError <= b2Settings.b2_angularSlop;
10680
}
10681
Box2D.inherit(b2WeldJointDef, Box2D.Dynamics.Joints.b2JointDef);
10682
b2WeldJointDef.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
10683
b2WeldJointDef.b2WeldJointDef = function () {
10684
Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
10685
this.localAnchorA = new b2Vec2();
10686
this.localAnchorB = new b2Vec2();
10687
};
10688
b2WeldJointDef.prototype.b2WeldJointDef = function () {
10689
this.__super.b2JointDef.call(this);
10690
this.type = b2Joint.e_weldJoint;
10691
this.referenceAngle = 0.0;
10692
}
10693
b2WeldJointDef.prototype.Initialize = function (bA, bB, anchor) {
10694
this.bodyA = bA;
10695
this.bodyB = bB;
10696
this.localAnchorA.SetV(this.bodyA.GetLocalPoint(anchor));
10697
this.localAnchorB.SetV(this.bodyB.GetLocalPoint(anchor));
10698
this.referenceAngle = this.bodyB.GetAngle() - this.bodyA.GetAngle();
10699
}
10700
})();
10701
(function () {
10702
var b2DebugDraw = Box2D.Dynamics.b2DebugDraw;
10703
b2DebugDraw.b2DebugDraw = function () {
10704
this.m_drawScale = 1.0;
10705
this.m_lineThickness = 1.0;
10706
this.m_alpha = 1.0;
10707
this.m_fillAlpha = 1.0;
10708
this.m_xformScale = 1.0;
10709
var __this = this;
10710
//#WORKAROUND
10711
this.m_sprite = {
10712
graphics: {
10713
clear: function () {
10714
__this.m_ctx.clearRect(0, 0, __this.m_ctx.canvas.width, __this.m_ctx.canvas.height)
10715
}
10716
}
10717
};
10718
};
10719
b2DebugDraw.prototype._color = function (color, alpha) {
10720
return "rgba(" + ((color & 0xFF0000) >> 16) + "," + ((color & 0xFF00) >> 8) + "," + (color & 0xFF) + "," + alpha + ")";
10721
};
10722
b2DebugDraw.prototype.b2DebugDraw = function () {
10723
this.m_drawFlags = 0;
10724
};
10725
b2DebugDraw.prototype.SetFlags = function (flags) {
10726
if (flags === undefined) flags = 0;
10727
this.m_drawFlags = flags;
10728
};
10729
b2DebugDraw.prototype.GetFlags = function () {
10730
return this.m_drawFlags;
10731
};
10732
b2DebugDraw.prototype.AppendFlags = function (flags) {
10733
if (flags === undefined) flags = 0;
10734
this.m_drawFlags |= flags;
10735
};
10736
b2DebugDraw.prototype.ClearFlags = function (flags) {
10737
if (flags === undefined) flags = 0;
10738
this.m_drawFlags &= ~flags;
10739
};
10740
b2DebugDraw.prototype.SetSprite = function (sprite) {
10741
this.m_ctx = sprite;
10742
};
10743
b2DebugDraw.prototype.GetSprite = function () {
10744
return this.m_ctx;
10745
};
10746
b2DebugDraw.prototype.SetDrawScale = function (drawScale) {
10747
if (drawScale === undefined) drawScale = 0;
10748
this.m_drawScale = drawScale;
10749
};
10750
b2DebugDraw.prototype.GetDrawScale = function () {
10751
return this.m_drawScale;
10752
};
10753
b2DebugDraw.prototype.SetLineThickness = function (lineThickness) {
10754
if (lineThickness === undefined) lineThickness = 0;
10755
this.m_lineThickness = lineThickness;
10756
this.m_ctx.strokeWidth = lineThickness;
10757
};
10758
b2DebugDraw.prototype.GetLineThickness = function () {
10759
return this.m_lineThickness;
10760
};
10761
b2DebugDraw.prototype.SetAlpha = function (alpha) {
10762
if (alpha === undefined) alpha = 0;
10763
this.m_alpha = alpha;
10764
};
10765
b2DebugDraw.prototype.GetAlpha = function () {
10766
return this.m_alpha;
10767
};
10768
b2DebugDraw.prototype.SetFillAlpha = function (alpha) {
10769
if (alpha === undefined) alpha = 0;
10770
this.m_fillAlpha = alpha;
10771
};
10772
b2DebugDraw.prototype.GetFillAlpha = function () {
10773
return this.m_fillAlpha;
10774
};
10775
b2DebugDraw.prototype.SetXFormScale = function (xformScale) {
10776
if (xformScale === undefined) xformScale = 0;
10777
this.m_xformScale = xformScale;
10778
};
10779
b2DebugDraw.prototype.GetXFormScale = function () {
10780
return this.m_xformScale;
10781
};
10782
b2DebugDraw.prototype.DrawPolygon = function (vertices, vertexCount, color) {
10783
if (!vertexCount) return;
10784
var s = this.m_ctx;
10785
var drawScale = this.m_drawScale;
10786
s.beginPath();
10787
s.strokeStyle = this._color(color.color, this.m_alpha);
10788
s.moveTo(vertices[0].x * drawScale, vertices[0].y * drawScale);
10789
for (var i = 1; i < vertexCount; i++) {
10790
s.lineTo(vertices[i].x * drawScale, vertices[i].y * drawScale);
10791
}
10792
s.lineTo(vertices[0].x * drawScale, vertices[0].y * drawScale);
10793
s.closePath();
10794
s.stroke();
10795
};
10796
b2DebugDraw.prototype.DrawSolidPolygon = function (vertices, vertexCount, color) {
10797
if (!vertexCount) return;
10798
var s = this.m_ctx;
10799
var drawScale = this.m_drawScale;
10800
s.beginPath();
10801
s.strokeStyle = this._color(color.color, this.m_alpha);
10802
s.fillStyle = this._color(color.color, this.m_fillAlpha);
10803
s.moveTo(vertices[0].x * drawScale, vertices[0].y * drawScale);
10804
for (var i = 1; i < vertexCount; i++) {
10805
s.lineTo(vertices[i].x * drawScale, vertices[i].y * drawScale);
10806
}
10807
s.lineTo(vertices[0].x * drawScale, vertices[0].y * drawScale);
10808
s.closePath();
10809
s.fill();
10810
s.stroke();
10811
};
10812
b2DebugDraw.prototype.DrawCircle = function (center, radius, color) {
10813
if (!radius) return;
10814
var s = this.m_ctx;
10815
var drawScale = this.m_drawScale;
10816
s.beginPath();
10817
s.strokeStyle = this._color(color.color, this.m_alpha);
10818
s.arc(center.x * drawScale, center.y * drawScale, radius * drawScale, 0, Math.PI * 2, true);
10819
s.closePath();
10820
s.stroke();
10821
};
10822
b2DebugDraw.prototype.DrawSolidCircle = function (center, radius, axis, color) {
10823
if (!radius) return;
10824
var s = this.m_ctx,
10825
drawScale = this.m_drawScale,
10826
cx = center.x * drawScale,
10827
cy = center.y * drawScale;
10828
s.moveTo(0, 0);
10829
s.beginPath();
10830
s.strokeStyle = this._color(color.color, this.m_alpha);
10831
s.fillStyle = this._color(color.color, this.m_fillAlpha);
10832
s.arc(cx, cy, radius * drawScale, 0, Math.PI * 2, true);
10833
s.moveTo(cx, cy);
10834
s.lineTo((center.x + axis.x * radius) * drawScale, (center.y + axis.y * radius) * drawScale);
10835
s.closePath();
10836
s.fill();
10837
s.stroke();
10838
};
10839
b2DebugDraw.prototype.DrawSegment = function (p1, p2, color) {
10840
var s = this.m_ctx,
10841
drawScale = this.m_drawScale;
10842
s.strokeStyle = this._color(color.color, this.m_alpha);
10843
s.beginPath();
10844
s.moveTo(p1.x * drawScale, p1.y * drawScale);
10845
s.lineTo(p2.x * drawScale, p2.y * drawScale);
10846
s.closePath();
10847
s.stroke();
10848
};
10849
b2DebugDraw.prototype.DrawTransform = function (xf) {
10850
var s = this.m_ctx,
10851
drawScale = this.m_drawScale;
10852
s.beginPath();
10853
s.strokeStyle = this._color(0xff0000, this.m_alpha);
10854
s.moveTo(xf.position.x * drawScale, xf.position.y * drawScale);
10855
s.lineTo((xf.position.x + this.m_xformScale * xf.R.col1.x) * drawScale, (xf.position.y + this.m_xformScale * xf.R.col1.y) * drawScale);
10856
10857
s.strokeStyle = this._color(0xff00, this.m_alpha);
10858
s.moveTo(xf.position.x * drawScale, xf.position.y * drawScale);
10859
s.lineTo((xf.position.x + this.m_xformScale * xf.R.col2.x) * drawScale, (xf.position.y + this.m_xformScale * xf.R.col2.y) * drawScale);
10860
s.closePath();
10861
s.stroke();
10862
};
10863
})(); //post-definitions
10864
var i;
10865
for (i = 0; i < Box2D.postDefs.length; ++i) Box2D.postDefs[i]();
10866
delete Box2D.postDefs;
10867