integ/js/vs/lib/Box2DWeb/Box2DWeb-2.1.a.3.js
changeset 28 84719280c84d
equal deleted inserted replaced
27:c21cffd36f98 28:84719280c84d
       
     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;