/* * Copyright (c) 2006-2007 Erin Catto * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked, and must not be * misrepresented the original software. * 3. This notice may not be removed or altered from any source distribution. */ var b2Settings=Class.create();b2Settings.prototype={initialize:function(){}};b2Settings.USHRT_MAX=65535;b2Settings.b2_pi=Math.PI;b2Settings.b2_massUnitsPerKilogram=1;b2Settings.b2_timeUnitsPerSecond=1;b2Settings.b2_lengthUnitsPerMeter=30;b2Settings.b2_maxManifoldPoints=2;b2Settings.b2_maxShapesPerBody=64;b2Settings.b2_maxPolyVertices=8;b2Settings.b2_maxProxies=1024;b2Settings.b2_maxPairs=8*b2Settings.b2_maxProxies;b2Settings.b2_linearSlop=0.005*b2Settings.b2_lengthUnitsPerMeter;b2Settings.b2_angularSlop=2/180*b2Settings.b2_pi;b2Settings.b2_velocityThreshold=1*b2Settings.b2_lengthUnitsPerMeter/b2Settings.b2_timeUnitsPerSecond;b2Settings.b2_maxLinearCorrection=0.2*b2Settings.b2_lengthUnitsPerMeter;b2Settings.b2_maxAngularCorrection=8/180*b2Settings.b2_pi;b2Settings.b2_contactBaumgarte=0.2;b2Settings.b2_timeToSleep=0.5*b2Settings.b2_timeUnitsPerSecond;b2Settings.b2_linearSleepTolerance=0.01*b2Settings.b2_lengthUnitsPerMeter/b2Settings.b2_timeUnitsPerSecond;b2Settings.b2_angularSleepTolerance=2/180/b2Settings.b2_timeUnitsPerSecond;b2Settings.b2Assert=function(b){if(!b){var c;c.x++}};var b2Vec2=Class.create();b2Vec2.prototype={initialize:function(a,b){this.x=a;this.y=b},SetZero:function(){this.x=0;this.y=0},Set:function(a,b){this.x=a;this.y=b},SetV:function(a){this.x=a.x;this.y=a.y},Negative:function(){return new b2Vec2(-this.x,-this.y)},Copy:function(){return new b2Vec2(this.x,this.y)},Add:function(a){this.x+=a.x;this.y+=a.y},Subtract:function(a){this.x-=a.x;this.y-=a.y},Multiply:function(b){this.x*=b;this.y*=b},MulM:function(b){var a=this.x;this.x=b.col1.x*a+b.col2.x*this.y;this.y=b.col1.y*a+b.col2.y*this.y},MulTM:function(b){var a=b2Math.b2Dot(this,b.col1);this.y=b2Math.b2Dot(this,b.col2);this.x=a},CrossVF:function(b){var a=this.x;this.x=b*this.y;this.y=-b*a},CrossFV:function(b){var a=this.x;this.x=-b*this.y;this.y=b*a},MinV:function(a){this.x=this.xa.x?this.x:a.x;this.y=this.y>a.y?this.y:a.y},Abs:function(){this.x=Math.abs(this.x);this.y=Math.abs(this.y)},Length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},Normalize:function(){var b=this.Length();if(b0?b:-b};b2Math.b2AbsV=function(e){var c=new b2Vec2(b2Math.b2Abs(e.x),b2Math.b2Abs(e.y));return c};b2Math.b2AbsM=function(a){var b=new b2Mat22(0,b2Math.b2AbsV(a.col1),b2Math.b2AbsV(a.col2));return b};b2Math.b2Min=function(e,c){return ec?e:c};b2Math.b2MaxV=function(f,e){var g=new b2Vec2(b2Math.b2Max(f.x,e.x),b2Math.b2Max(f.y,e.y));return g};b2Math.b2Clamp=function(c,b,e){return b2Math.b2Max(b,b2Math.b2Min(c,e))};b2Math.b2ClampV=function(c,b,e){return b2Math.b2MaxV(b,b2Math.b2MinV(c,e))};b2Math.b2Swap=function(e,c){var f=e[0];e[0]=c[0];c[0]=f};b2Math.b2Random=function(){return Math.random()*2-1};b2Math.b2NextPowerOfTwo=function(a){a|=(a>>1)&2147483647;a|=(a>>2)&1073741823;a|=(a>>4)&268435455;a|=(a>>8)&16777215;a|=(a>>16)&65535;return a+1};b2Math.b2IsPowerOfTwo=function(b){var a=b>0&&(b&(b-1))==0;return a};b2Math.tempVec2=new b2Vec2();b2Math.tempVec3=new b2Vec2();b2Math.tempVec4=new b2Vec2();b2Math.tempVec5=new b2Vec2();b2Math.tempMat=new b2Mat22();var b2AABB=Class.create();b2AABB.prototype={IsValid:function(){var b=this.maxVertex.x;var a=this.maxVertex.y;b=this.maxVertex.x;a=this.maxVertex.y;b-=this.minVertex.x;a-=this.minVertex.y;var c=b>=0&&a>=0;c=c&&this.minVertex.IsValid()&&this.maxVertex.IsValid();return c},minVertex:new b2Vec2(),maxVertex:new b2Vec2(),initialize:function(){this.minVertex=new b2Vec2();this.maxVertex=new b2Vec2()}};var b2Bound=Class.create();b2Bound.prototype={IsLower:function(){return(this.value&1)==0},IsUpper:function(){return(this.value&1)==1},Swap:function(c){var f=this.value;var e=this.proxyId;var a=this.stabbingCount;this.value=c.value;this.proxyId=c.proxyId;this.stabbingCount=c.stabbingCount;c.value=f;c.proxyId=e;c.stabbingCount=a},value:0,proxyId:0,stabbingCount:0,initialize:function(){}};var b2BoundValues=Class.create();b2BoundValues.prototype={lowerValues:[0,0],upperValues:[0,0],initialize:function(){this.lowerValues=[0,0];this.upperValues=[0,0]}};var b2Pair=Class.create();b2Pair.prototype={SetBuffered:function(){this.status|=b2Pair.e_pairBuffered},ClearBuffered:function(){this.status&=~b2Pair.e_pairBuffered},IsBuffered:function(){return(this.status&b2Pair.e_pairBuffered)==b2Pair.e_pairBuffered},SetRemoved:function(){this.status|=b2Pair.e_pairRemoved},ClearRemoved:function(){this.status&=~b2Pair.e_pairRemoved},IsRemoved:function(){return(this.status&b2Pair.e_pairRemoved)==b2Pair.e_pairRemoved},SetFinal:function(){this.status|=b2Pair.e_pairFinal},IsFinal:function(){return(this.status&b2Pair.e_pairFinal)==b2Pair.e_pairFinal},userData:null,proxyId1:0,proxyId2:0,next:0,status:0,initialize:function(){}};b2Pair.b2_nullPair=b2Settings.USHRT_MAX;b2Pair.b2_nullProxy=b2Settings.USHRT_MAX;b2Pair.b2_tableCapacity=b2Settings.b2_maxPairs;b2Pair.b2_tableMask=b2Pair.b2_tableCapacity-1;b2Pair.e_pairBuffered=1;b2Pair.e_pairRemoved=2;b2Pair.e_pairFinal=4;var b2PairCallback=Class.create();b2PairCallback.prototype={PairAdded:function(b,a){return null},PairRemoved:function(c,b,a){},initialize:function(){}};var b2BufferedPair=Class.create();b2BufferedPair.prototype={proxyId1:0,proxyId2:0,initialize:function(){}};var b2PairManager=Class.create();b2PairManager.prototype={initialize:function(){var a=0;this.m_hashTable=new Array(b2Pair.b2_tableCapacity);for(a=0;aa){var c=b;b=a;a=c}var e=b2PairManager.Hash(b,a)&b2Pair.b2_tableMask;var g=g=this.FindHash(b,a,e);if(g!=null){return g}var f=this.m_freePair;g=this.m_pairs[f];this.m_freePair=g.next;g.proxyId1=b;g.proxyId2=a;g.status=0;g.userData=null;g.next=this.m_hashTable[e];this.m_hashTable[e]=f;++this.m_pairCount;return g},RemovePair:function(h,g){if(h>g){var j=h;h=g;g=j}var e=b2PairManager.Hash(h,g)&b2Pair.b2_tableMask;var b=this.m_hashTable[e];var i=null;while(b!=b2Pair.b2_nullPair){if(b2PairManager.Equals(this.m_pairs[b],h,g)){var f=b;if(i){i.next=this.m_pairs[b].next}else{this.m_hashTable[e]=this.m_pairs[b].next}var c=this.m_pairs[f];var a=c.userData;c.next=this.m_freePair;c.proxyId1=b2Pair.b2_nullProxy;c.proxyId2=b2Pair.b2_nullProxy;c.userData=null;c.status=0;this.m_freePair=f;--this.m_pairCount;return a}else{i=this.m_pairs[b];b=i.next}}return null},Find:function(b,a){if(b>a){var c=b;b=a;a=c}var e=b2PairManager.Hash(b,a)&b2Pair.b2_tableMask;return this.FindHash(b,a,e)},FindHash:function(b,a,e){var c=this.m_hashTable[e];while(c!=b2Pair.b2_nullPair&&b2PairManager.Equals(this.m_pairs[c],b,a)==false){c=this.m_pairs[c].next}if(c==b2Pair.b2_nullPair){return null}return this.m_pairs[c]},ValidateBuffer:function(){},ValidateTable:function(){},m_broadPhase:null,m_callback:null,m_pairs:null,m_freePair:0,m_pairCount:0,m_pairBuffer:null,m_pairBufferCount:0,m_hashTable:null};b2PairManager.Hash=function(b,a){var c=((a<<16)&4294901760)|b;c=~c+((c<<15)&4294934528);c=c^((c>>12)&1048575);c=c+((c<<2)&4294967292);c=c^((c>>4)&268435455);c=c*2057;c=c^((c>>16)&65535);return c};b2PairManager.Equals=function(c,b,a){return(c.proxyId1==b&&c.proxyId2==a)};b2PairManager.EqualsPair=function(b,a){return b.proxyId1==a.proxyId1&&b.proxyId2==a.proxyId2};var b2BroadPhase=Class.create();b2BroadPhase.prototype={initialize:function(g,h){this.m_pairManager=new b2PairManager();this.m_proxyPool=new Array(b2Settings.b2_maxPairs);this.m_bounds=new Array(2*b2Settings.b2_maxProxies);this.m_queryResults=new Array(b2Settings.b2_maxProxies);this.m_quantizationFactor=new b2Vec2();var e=0;this.m_pairManager.Initialize(this,h);this.m_worldAABB=g;this.m_proxyCount=0;for(e=0;e0&&u0){h=n;while(h0){h=l;while(h0&&bb[c.upperBounds[a]].value){return false}if(b[e.upperBounds[a]].valuee[f.upperBounds[c]].value){return false}if(a.upperValues[c]0){var h=c-1;var o=a[h].stabbingCount;while(o){if(a[h].IsLower()){var l=this.m_proxyPool[a[h].proxyId];if(c<=l.upperBounds[b]){this.IncrementOverlapCount(a[h].proxyId);--o}}--h}}k[0]=c;e[0]=m},IncrementOverlapCount:function(b){var a=this.m_proxyPool[b];if(a.timeStampg){f=b-1}else{if(e[b].value0){g[c].id=b[0].id}else{g[c].id=b[1].id}++c}return c};b2Collision.EdgeSeparation=function(q,r,p){var g=q.m_vertices;var h=p.m_vertexCount;var s=p.m_vertices;var f=q.m_normals[r].x;var e=q.m_normals[r].y;var t=f;var m=q.m_R;f=m.col1.x*t+m.col2.x*e;e=m.col1.y*t+m.col2.y*e;var x=f;var v=e;m=p.m_R;t=x*m.col1.x+v*m.col1.y;v=x*m.col2.x+v*m.col2.y;x=t;var o=0;var n=Number.MAX_VALUE;for(var y=0;ya){a=p;j=q}}var o=b2Collision.EdgeSeparation(n,j,m);if(o>0&&y==false){return o}var h=j-1>=0?j-1:k-1;var u=b2Collision.EdgeSeparation(n,h,m);if(u>0&&y==false){return u}var r=j+10&&y==false){return v}var b=0;var l;var x=0;if(u>o&&u>v){x=-1;b=h;l=u}else{if(v>o){x=1;b=r;l=v}else{t[0]=j;return o}}while(true){if(x==-1){j=b-1>=0?b-1:k-1}else{j=b+10&&y==false){return o}if(o>l){b=j;l=o}else{break}}t[0]=b;return l};b2Collision.FindIncidentEdge=function(F,q,r,o){var j=q.m_vertexCount;var g=q.m_vertices;var h=o.m_vertexCount;var t=o.m_vertices;var a=r;var H=r+1==j?0:r+1;var f=g[H];var E=f.x;var C=f.y;f=g[a];E-=f.x;C-=f.y;var x=E;E=C;C=-x;var G=1/Math.sqrt(E*E+C*C);E*=G;C*=G;var s=E;var p=C;x=s;var m=q.m_R;s=m.col1.x*x+m.col2.x*p;p=m.col1.y*x+m.col2.y*p;var e=s;var b=p;m=o.m_R;x=e*m.col1.x+b*m.col1.y;b=e*m.col2.x+b*m.col2.y;e=x;var l=0;var k=0;var n=Number.MAX_VALUE;for(var D=0;D0&&b==false){return}var M=0;var h=[M];var G=b2Collision.FindMaxSeparation(h,k,l,b);M=h[0];if(G>0&&b==false){return}var q;var p;var a=0;var T=0;var e=0.98;var Q=0.001;if(G>e*H+Q){q=k;p=l;a=M;T=1}else{q=l;p=k;a=O;T=0}var c=[new ClipVertex(),new ClipVertex()];b2Collision.FindIncidentEdge(c,q,a,p);var D=q.m_vertexCount;var r=q.m_vertices;var K=r[a];var J=a+1m*m&&b==false){return}var e;if(nh){return}if(v>p){p=v;D=C}}if(ph){return}z.pointCount=1;z.normal.Set(o.col1.x*f+o.col2.x*e,o.col1.y*f+o.col2.y*e);j=z.points[0];j.id.features.incidentEdge=b2Collision.b2_nullFeature;j.id.features.incidentVertex=b;j.id.features.referenceFace=b2Collision.b2_nullFeature;j.id.features.flip=0;j.position.x=l.m_position.x-h*z.normal.x;j.position.y=l.m_position.y-h*z.normal.y;j.separation=y-h;return}var r=(B-n.m_vertices[b].x)*t+(A-n.m_vertices[b].y)*q;j=z.points[0];j.id.features.incidentEdge=b2Collision.b2_nullFeature;j.id.features.incidentVertex=b2Collision.b2_nullFeature;j.id.features.referenceFace=b2Collision.b2_nullFeature;j.id.features.flip=0;var m,k;if(r<=0){m=n.m_vertices[b].x;k=n.m_vertices[b].y;j.id.features.incidentVertex=b}else{if(r>=g){m=n.m_vertices[a].x;k=n.m_vertices[a].y;j.id.features.incidentVertex=a}else{m=t*r+n.m_vertices[b].x;k=q*r+n.m_vertices[b].y;j.id.features.incidentEdge=b}}f=B-m;e=A-k;y=Math.sqrt(f*f+e*e);f/=y;e/=y;if(y>h){return}z.pointCount=1;z.normal.Set(o.col1.x*f+o.col2.x*e,o.col1.y*f+o.col2.y*e);j.position.x=l.m_position.x-h*z.normal.x;j.position.y=l.m_position.y-h*z.normal.y;j.separation=y-h};b2Collision.b2TestOverlap=function(e,c){var j=c.minVertex;var h=e.maxVertex;var g=j.x-h.x;var f=j.y-h.y;j=e.minVertex;h=c.maxVertex;var k=j.x-h.x;var i=j.y-h.y;if(g>0||f>0){return false}if(k>0||i>0){return false}return true};var Features=Class.create();Features.prototype={set_referenceFace:function(a){this._referenceFace=a;this._m_id._key=(this._m_id._key&4294967040)|(this._referenceFace&255)},get_referenceFace:function(){return this._referenceFace},_referenceFace:0,set_incidentEdge:function(a){this._incidentEdge=a;this._m_id._key=(this._m_id._key&4294902015)|((this._incidentEdge<<8)&65280)},get_incidentEdge:function(){return this._incidentEdge},_incidentEdge:0,set_incidentVertex:function(a){this._incidentVertex=a;this._m_id._key=(this._m_id._key&4278255615)|((this._incidentVertex<<16)&16711680)},get_incidentVertex:function(){return this._incidentVertex},_incidentVertex:0,set_flip:function(a){this._flip=a;this._m_id._key=(this._m_id._key&16777215)|((this._flip<<24)&4278190080)},get_flip:function(){return this._flip},_flip:0,_m_id:null,initialize:function(){}};var b2ContactID=Class.create();b2ContactID.prototype={initialize:function(){this.features=new Features();this.features._m_id=this},Set:function(a){this.set_key(a._key)},Copy:function(){var a=new b2ContactID();a.set_key(this._key);return a},get_key:function(){return this._key},set_key:function(a){this._key=a;this.features._referenceFace=this._key&255;this.features._incidentEdge=((this._key&65280)>>8)&255;this.features._incidentVertex=((this._key&16711680)>>16)&255;this.features._flip=((this._key&4278190080)>>24)&255},features:new Features(),_key:0};var b2ContactPoint=Class.create();b2ContactPoint.prototype={position:new b2Vec2(),separation:null,normalImpulse:null,tangentImpulse:null,id:new b2ContactID(),initialize:function(){this.position=new b2Vec2();this.id=new b2ContactID()}};var b2Distance=Class.create();b2Distance.prototype={initialize:function(){}};b2Distance.ProcessTwo=function(k,i,b,l,j){var g=-j[1].x;var f=-j[1].y;var e=j[0].x-j[1].x;var c=j[0].y-j[1].y;var a=Math.sqrt(e*e+c*c);e/=a;c/=a;var h=g*e+f*c;if(h<=0||a=0&&G>=0){var C=y/(y+G);r.x=o[1].x+C*(o[2].x-o[1].x);r.y=o[1].y+C*(o[2].y-o[1].y);E.x=D[1].x+C*(D[2].x-D[1].x);E.y=D[1].y+C*(D[2].y-D[1].y);o[0].SetV(o[2]);D[0].SetV(D[2]);H[0].SetV(H[2]);return 2}var g=F*(K*i-J*l);if(g<=0&&k>=0&&p>=0){var C=k/(k+p);r.x=o[0].x+C*(o[2].x-o[0].x);r.y=o[0].y+C*(o[2].y-o[0].y);E.x=D[0].x+C*(D[2].x-D[0].x);E.y=D[0].y+C*(D[2].y-D[0].y);o[1].SetV(o[2]);D[1].SetV(D[2]);H[1].SetV(H[2]);return 2}var e=h+g+f;e=1/e;var B=h*e;var x=g*e;var q=1-B-x;r.x=B*o[0].x+x*o[1].x+q*o[2].x;r.y=B*o[0].y+x*o[1].y+q*o[2].y;E.x=B*D[0].x+x*D[1].x+q*D[2].x;E.y=B*D[0].y+x*D[1].y+q*D[2].y;return 3};b2Distance.InPoinsts=function(a,c,e){for(var b=0;b0){return false}}return true},initialize:function(t,p,a){this.m_R=new b2Mat22();this.m_position=new b2Vec2();this.m_userData=t.userData;this.m_friction=t.friction;this.m_restitution=t.restitution;this.m_body=p;this.m_proxyId=b2Pair.b2_nullProxy;this.m_maxRadius=0;this.m_categoryBits=t.categoryBits;this.m_maskBits=t.maskBits;this.m_groupIndex=t.groupIndex;this.syncAABB=new b2AABB();this.syncMat=new b2Mat22();this.m_localCentroid=new b2Vec2();this.m_localOBB=new b2OBB();var y=0;var s;var r;var b;var l=new b2AABB();this.m_vertices=new Array(b2Settings.b2_maxPolyVertices);this.m_coreVertices=new Array(b2Settings.b2_maxPolyVertices);this.m_normals=new Array(b2Settings.b2_maxPolyVertices);this.m_type=b2Shape.e_polyShape;var c=new b2Mat22(t.localRotation);if(t.type==b2Shape.e_boxShape){this.m_localCentroid.x=t.localPosition.x-a.x;this.m_localCentroid.y=t.localPosition.y-a.y;var o=t;this.m_vertexCount=4;s=o.extents.x;r=o.extents.y;var k=Math.max(0,s-2*b2Settings.b2_linearSlop);var h=Math.max(0,r-2*b2Settings.b2_linearSlop);b=this.m_vertices[0]=new b2Vec2();b.x=c.col1.x*s+c.col2.x*r;b.y=c.col1.y*s+c.col2.y*r;b=this.m_vertices[1]=new b2Vec2();b.x=c.col1.x*-s+c.col2.x*r;b.y=c.col1.y*-s+c.col2.y*r;b=this.m_vertices[2]=new b2Vec2();b.x=c.col1.x*-s+c.col2.x*-r;b.y=c.col1.y*-s+c.col2.y*-r;b=this.m_vertices[3]=new b2Vec2();b.x=c.col1.x*s+c.col2.x*-r;b.y=c.col1.y*s+c.col2.y*-r;b=this.m_coreVertices[0]=new b2Vec2();b.x=c.col1.x*k+c.col2.x*h;b.y=c.col1.y*k+c.col2.y*h;b=this.m_coreVertices[1]=new b2Vec2();b.x=c.col1.x*-k+c.col2.x*h;b.y=c.col1.y*-k+c.col2.y*h;b=this.m_coreVertices[2]=new b2Vec2();b.x=c.col1.x*-k+c.col2.x*-h;b.y=c.col1.y*-k+c.col2.y*-h;b=this.m_coreVertices[3]=new b2Vec2();b.x=c.col1.x*k+c.col2.x*-h;b.y=c.col1.y*k+c.col2.y*-h}else{var f=t;this.m_vertexCount=f.vertexCount;b2Shape.PolyCentroid(f.vertices,f.vertexCount,b2PolyShape.tempVec);var j=b2PolyShape.tempVec.x;var g=b2PolyShape.tempVec.y;this.m_localCentroid.x=t.localPosition.x+(c.col1.x*j+c.col2.x*g)-a.x;this.m_localCentroid.y=t.localPosition.y+(c.col1.y*j+c.col2.y*g)-a.y;for(y=0;yNumber.MIN_VALUE){F*=1/e;E*=1/e}this.m_coreVertices[y].x=this.m_vertices[y].x-2*b2Settings.b2_linearSlop*F;this.m_coreVertices[y].y=this.m_vertices[y].y-2*b2Settings.b2_linearSlop*E}}var A=Number.MAX_VALUE;var z=Number.MAX_VALUE;var n=-Number.MAX_VALUE;var m=-Number.MAX_VALUE;this.m_maxRadius=0;for(y=0;yk){f=e;k=j}}b.Set(this.m_position.x+(this.m_R.col1.x*this.m_coreVertices[f].x+this.m_R.col2.x*this.m_coreVertices[f].y),this.m_position.y+(this.m_R.col1.y*this.m_coreVertices[f].x+this.m_R.col2.y*this.m_coreVertices[f].y))},m_localCentroid:new b2Vec2(),m_localOBB:new b2OBB(),m_vertices:null,m_coreVertices:null,m_vertexCount:0,m_normals:null});b2PolyShape.tempVec=new b2Vec2();b2PolyShape.tAbsR=new b2Mat22();var b2Body=Class.create();b2Body.prototype={SetOriginPosition:function(a,b){if(this.IsFrozen()){return}this.m_rotation=b;this.m_R.Set(this.m_rotation);this.m_position=b2Math.AddVV(a,b2Math.b2MulMV(this.m_R,this.m_center));this.m_position0.SetV(this.m_position);this.m_rotation0=this.m_rotation;for(var c=this.m_shapeList;c!=null;c=c.m_next){c.Synchronize(this.m_position,this.m_R,this.m_position,this.m_R)}this.m_world.m_broadPhase.Commit()},GetOriginPosition:function(){return b2Math.SubtractVV(this.m_position,b2Math.b2MulMV(this.m_R,this.m_center))},SetCenterPosition:function(a,b){if(this.IsFrozen()){return}this.m_rotation=b;this.m_R.Set(this.m_rotation);this.m_position.SetV(a);this.m_position0.SetV(this.m_position);this.m_rotation0=this.m_rotation;for(var c=this.m_shapeList;c!=null;c=c.m_next){c.Synchronize(this.m_position,this.m_R,this.m_position,this.m_R)}this.m_world.m_broadPhase.Commit()},GetCenterPosition:function(){return this.m_position},GetRotation:function(){return this.m_rotation},GetRotationMatrix:function(){return this.m_R},SetLinearVelocity:function(a){this.m_linearVelocity.SetV(a)},GetLinearVelocity:function(){return this.m_linearVelocity},SetAngularVelocity:function(a){this.m_angularVelocity=a},GetAngularVelocity:function(){return this.m_angularVelocity},ApplyForce:function(b,a){if(this.IsSleeping()==false){this.m_force.Add(b);this.m_torque+=b2Math.b2CrossVV(b2Math.SubtractVV(a,this.m_position),b)}},ApplyTorque:function(a){if(this.IsSleeping()==false){this.m_torque+=a}},ApplyImpulse:function(b,a){if(this.IsSleeping()==false){this.m_linearVelocity.Add(b2Math.MulFV(this.m_invMass,b));this.m_angularVelocity+=(this.m_invI*b2Math.b2CrossVV(b2Math.SubtractVV(a,this.m_position),b))}},GetMass:function(){return this.m_mass},GetInertia:function(){return this.m_I},GetWorldPoint:function(a){return b2Math.AddVV(this.m_position,b2Math.b2MulMV(this.m_R,a))},GetWorldVector:function(a){return b2Math.b2MulMV(this.m_R,a)},GetLocalPoint:function(a){return b2Math.b2MulTMV(this.m_R,b2Math.SubtractVV(a,this.m_position))},GetLocalVector:function(a){return b2Math.b2MulTMV(this.m_R,a)},IsStatic:function(){return(this.m_flags&b2Body.e_staticFlag)==b2Body.e_staticFlag},IsFrozen:function(){return(this.m_flags&b2Body.e_frozenFlag)==b2Body.e_frozenFlag},IsSleeping:function(){return(this.m_flags&b2Body.e_sleepFlag)==b2Body.e_sleepFlag},AllowSleeping:function(a){if(a){this.m_flags|=b2Body.e_allowSleepFlag}else{this.m_flags&=~b2Body.e_allowSleepFlag;this.WakeUp()}},WakeUp:function(){this.m_flags&=~b2Body.e_sleepFlag;this.m_sleepTime=0},GetShapeList:function(){return this.m_shapeList},GetContactList:function(){return this.m_contactList},GetJointList:function(){return this.m_jointList},GetNext:function(){return this.m_next},GetUserData:function(){return this.m_userData},initialize:function(g,f){this.sMat0=new b2Mat22();this.m_position=new b2Vec2();this.m_R=new b2Mat22(0);this.m_position0=new b2Vec2();var c=0;var h;var a;this.m_flags=0;this.m_position.SetV(g.position);this.m_rotation=g.rotation;this.m_R.Set(this.m_rotation);this.m_position0.SetV(this.m_position);this.m_rotation0=this.m_rotation;this.m_world=f;this.m_linearDamping=b2Math.b2Clamp(1-g.linearDamping,0,1);this.m_angularDamping=b2Math.b2Clamp(1-g.angularDamping,0,1);this.m_force=new b2Vec2(0,0);this.m_torque=0;this.m_mass=0;var j=new Array(b2Settings.b2_maxShapesPerBody);for(c=0;c0){this.m_center.Multiply(1/this.m_mass);this.m_position.Add(b2Math.b2MulMV(this.m_R,this.m_center))}else{this.m_flags|=b2Body.e_staticFlag}this.m_I=0;for(c=0;c0){this.m_invMass=1/this.m_mass}else{this.m_invMass=0}if(this.m_I>0&&g.preventRotation==false){this.m_invI=1/this.m_I}else{this.m_I=0;this.m_invI=0}this.m_linearVelocity=b2Math.AddVV(g.linearVelocity,b2Math.b2CrossFV(g.angularVelocity,this.m_center));this.m_angularVelocity=g.angularVelocity;this.m_jointList=null;this.m_contactList=null;this.m_prev=null;this.m_next=null;this.m_shapeList=null;for(c=0;c0}var c=(b.m_maskBits&a.m_categoryBits)!=0&&(b.m_categoryBits&a.m_maskBits)!=0;return c},initialize:function(){}};b2CollisionFilter.b2_defaultFilter=new b2CollisionFilter;var b2Island=Class.create();b2Island.prototype={initialize:function(f,e,c,a){var b=0;this.m_bodyCapacity=f;this.m_contactCapacity=e;this.m_jointCapacity=c;this.m_bodyCount=0;this.m_contactCount=0;this.m_jointCount=0;this.m_bodies=new Array(f);for(b=0;bc||b2Math.b2Dot(a.m_linearVelocity,a.m_linearVelocity)>e){a.m_sleepTime=0;f=0}else{a.m_sleepTime+=h;f=b2Math.b2Min(f,a.m_sleepTime)}}if(f>=b2Settings.b2_timeToSleep){for(g=0;g0){a.m_shape1.m_body.WakeUp();a.m_shape2.m_body.WakeUp()}var e=a.m_shape1.m_type;var b=a.m_shape2.m_type;var f=b2Contact.s_registers[e][b].destroyFcn;f(a,c)};b2Contact.s_registers=null;b2Contact.s_initialized=false;var b2ContactConstraint=Class.create();b2ContactConstraint.prototype={initialize:function(){this.normal=new b2Vec2();this.points=new Array(b2Settings.b2_maxManifoldPoints);for(var a=0;a0){b.velocityBias=-60*b.separation}var l=g+(-H*E)-v-(-I*S);var h=e+(H*F)-t-(I*U);var R=X.normal.x*l+X.normal.y*h;if(R<-b2Settings.b2_velocityThreshold){b.velocityBias+=-X.restitution*R}}++N}}},PreSolve:function(){var b;var C;var s;for(var y=0;y=-b2Settings.b2_linearSlop},PostSolve:function(){for(var e=0;e0){this.m_manifoldCount=1}else{this.m_manifoldCount=0}},GetManifolds:function(){return this.m_manifold},m_manifold:[new b2Manifold()]});b2CircleContact.Create=function(b,a,c){return new b2CircleContact(b,a)};b2CircleContact.Destroy=function(a,b){};var b2Conservative=Class.create();b2Conservative.prototype={initialize:function(){}};b2Conservative.R1=new b2Mat22();b2Conservative.R2=new b2Mat22();b2Conservative.x1=new b2Vec2();b2Conservative.x2=new b2Vec2();b2Conservative.Conservative=function(k,j){var i=k.GetBody();var h=j.GetBody();var s=i.m_position.x-i.m_position0.x;var q=i.m_position.y-i.m_position0.y;var I=i.m_rotation-i.m_rotation0;var b=h.m_position.x-h.m_position0.x;var a=h.m_position.y-h.m_position0.y;var G=h.m_rotation-h.m_rotation0;var m=k.GetMaxRadius();var l=j.GetMaxRadius();var J=i.m_position0.x;var E=i.m_position0.y;var A=i.m_rotation0;var F=h.m_position0.x;var D=h.m_position0.y;var n=h.m_rotation0;var e=J;var c=E;var K=A;var C=F;var B=D;var H=n;b2Conservative.R1.Set(K);b2Conservative.R2.Set(H);k.QuickSync(p1,b2Conservative.R1);j.QuickSync(p2,b2Conservative.R2);var M=0;var o=10;var u;var t;var z=0;var v=true;for(var x=0;xFLT_EPSILON){d*=b2_linearSlop/p}if(i.IsStatic()){i.m_position.x=e;i.m_position.y=c}else{i.m_position.x=e-u;i.m_position.y=c-t}i.m_rotation=K;i.m_R.Set(K);i.QuickSyncShapes();if(h.IsStatic()){h.m_position.x=C;h.m_position.y=B}else{h.m_position.x=C+u;h.m_position.y=B+t}h.m_position.x=C+u;h.m_position.y=B+t;h.m_rotation=H;h.m_R.Set(H);h.QuickSyncShapes();return true}k.QuickSync(i.m_position,i.m_R);j.QuickSync(h.m_position,h.m_R);return false};var b2NullContact=Class.create();Object.extend(b2NullContact.prototype,b2Contact.prototype);Object.extend(b2NullContact.prototype,{initialize:function(b,a){this.m_node1=new b2ContactNode();this.m_node2=new b2ContactNode();this.m_flags=0;if(!b||!a){this.m_shape1=null;this.m_shape2=null;return}this.m_shape1=b;this.m_shape2=a;this.m_manifoldCount=0;this.m_friction=Math.sqrt(this.m_shape1.m_friction*this.m_shape2.m_friction);this.m_restitution=b2Math.b2Max(this.m_shape1.m_restitution,this.m_shape2.m_restitution);this.m_prev=null;this.m_next=null;this.m_node1.contact=null;this.m_node1.prev=null;this.m_node1.next=null;this.m_node1.other=null;this.m_node2.contact=null;this.m_node2.prev=null;this.m_node2.next=null;this.m_node2.other=null},Evaluate:function(){},GetManifolds:function(){return null}});var b2PolyAndCircleContact=Class.create();Object.extend(b2PolyAndCircleContact.prototype,b2Contact.prototype);Object.extend(b2PolyAndCircleContact.prototype,{initialize:function(b,a){this.m_node1=new b2ContactNode();this.m_node2=new b2ContactNode();this.m_flags=0;if(!b||!a){this.m_shape1=null;this.m_shape2=null;return}this.m_shape1=b;this.m_shape2=a;this.m_manifoldCount=0;this.m_friction=Math.sqrt(this.m_shape1.m_friction*this.m_shape2.m_friction);this.m_restitution=b2Math.b2Max(this.m_shape1.m_restitution,this.m_shape2.m_restitution);this.m_prev=null;this.m_next=null;this.m_node1.contact=null;this.m_node1.prev=null;this.m_node1.next=null;this.m_node1.other=null;this.m_node2.contact=null;this.m_node2.prev=null;this.m_node2.next=null;this.m_node2.other=null;this.m_manifold=[new b2Manifold()];b2Settings.b2Assert(this.m_shape1.m_type==b2Shape.e_polyShape);b2Settings.b2Assert(this.m_shape2.m_type==b2Shape.e_circleShape);this.m_manifold[0].pointCount=0;this.m_manifold[0].points[0].normalImpulse=0;this.m_manifold[0].points[0].tangentImpulse=0},Evaluate:function(){b2Collision.b2CollidePolyAndCircle(this.m_manifold[0],this.m_shape1,this.m_shape2,false);if(this.m_manifold[0].pointCount>0){this.m_manifoldCount=1}else{this.m_manifoldCount=0}},GetManifolds:function(){return this.m_manifold},m_manifold:[new b2Manifold()]});b2PolyAndCircleContact.Create=function(b,a,c){return new b2PolyAndCircleContact(b,a)};b2PolyAndCircleContact.Destroy=function(a,b){};var b2PolyContact=Class.create();Object.extend(b2PolyContact.prototype,b2Contact.prototype);Object.extend(b2PolyContact.prototype,{initialize:function(b,a){this.m_node1=new b2ContactNode();this.m_node2=new b2ContactNode();this.m_flags=0;if(!b||!a){this.m_shape1=null;this.m_shape2=null;return}this.m_shape1=b;this.m_shape2=a;this.m_manifoldCount=0;this.m_friction=Math.sqrt(this.m_shape1.m_friction*this.m_shape2.m_friction);this.m_restitution=b2Math.b2Max(this.m_shape1.m_restitution,this.m_shape2.m_restitution);this.m_prev=null;this.m_next=null;this.m_node1.contact=null;this.m_node1.prev=null;this.m_node1.next=null;this.m_node1.other=null;this.m_node2.contact=null;this.m_node2.prev=null;this.m_node2.next=null;this.m_node2.other=null;this.m0=new b2Manifold();this.m_manifold=[new b2Manifold()];this.m_manifold[0].pointCount=0},m0:new b2Manifold(),Evaluate:function(){var a=this.m_manifold[0];var b=this.m0.points;for(var e=0;e0){var l=[false,false];for(var g=0;g0){var f=g.m_shape1.m_body;var e=g.m_shape2.m_body;var b=g.m_node1;var a=g.m_node2;f.WakeUp();e.WakeUp();if(b.prev){b.prev.next=b.next}if(b.next){b.next.prev=b.prev}if(b==f.m_contactList){f.m_contactList=b.next}b.prev=null;b.next=null;if(a.prev){a.prev.next=a.next}if(a.next){a.next.prev=a.prev}if(a==e.m_contactList){e.m_contactList=a.next}a.prev=null;a.next=null}b2Contact.Destroy(g,this.m_world.m_blockAllocator);--this.m_world.m_contactCount},CleanContactList:function(){var b=this.m_world.m_contactList;while(b!=null){var a=b;b=b.m_next;if(a.m_flags&b2Contact.e_destroyFlag){this.DestroyContact(a);a=null}}},Collide:function(){var g;var f;var e;var a;for(var i=this.m_world.m_contactList;i!=null;i=i.m_next){if(i.m_shape1.m_body.IsSleeping()&&i.m_shape2.m_body.IsSleeping()){continue}var b=i.GetManifoldCount();i.Evaluate();var h=i.GetManifoldCount();if(b==0&&h>0){g=i.m_shape1.m_body;f=i.m_shape2.m_body;e=i.m_node1;a=i.m_node2;e.contact=i;e.other=f;e.prev=null;e.next=g.m_contactList;if(e.next!=null){e.next.prev=i.m_node1}g.m_contactList=i.m_node1;a.contact=i;a.other=g;a.prev=null;a.next=f.m_contactList;if(a.next!=null){a.next.prev=a}f.m_contactList=a}else{if(b>0&&h==0){g=i.m_shape1.m_body;f=i.m_shape2.m_body;e=i.m_node1;a=i.m_node2;if(e.prev){e.prev.next=e.next}if(e.next){e.next.prev=e.prev}if(e==g.m_contactList){g.m_contactList=e.next}e.prev=null;e.next=null;if(a.prev){a.prev.next=a.next}if(a.next){a.next.prev=a.prev}if(a==f.m_contactList){f.m_contactList=a.next}a.prev=null;a.next=null}}}},m_world:null,m_nullContact:new b2NullContact(),m_destroyImmediate:null});var b2World=Class.create();b2World.prototype={initialize:function(a,e,c){this.step=new b2TimeStep();this.m_contactManager=new b2ContactManager();this.m_listener=null;this.m_filter=b2CollisionFilter.b2_defaultFilter;this.m_bodyList=null;this.m_contactList=null;this.m_jointList=null;this.m_bodyCount=0;this.m_contactCount=0;this.m_jointCount=0;this.m_bodyDestroyList=null;this.m_allowSleep=c;this.m_gravity=e;this.m_contactManager.m_world=this;this.m_broadPhase=new b2BroadPhase(a,this.m_contactManager);var b=new b2BodyDef();this.m_groundBody=this.CreateBody(b)},SetListener:function(a){this.m_listener=a},SetFilter:function(a){this.m_filter=a},CreateBody:function(c){var a=new b2Body(c,this);a.m_prev=null;a.m_next=this.m_bodyList;if(this.m_bodyList){this.m_bodyList.m_prev=a}this.m_bodyList=a;++this.m_bodyCount;return a},DestroyBody:function(a){if(a.m_flags&b2Body.e_destroyFlag){return}if(a.m_prev){a.m_prev.m_next=a.m_next}if(a.m_next){a.m_next.m_prev=a.m_prev}if(a==this.m_bodyList){this.m_bodyList=a.m_next}a.m_flags|=b2Body.e_destroyFlag;--this.m_bodyCount;a.m_prev=null;a.m_next=this.m_bodyDestroyList;this.m_bodyDestroyList=a},CleanBodyList:function(){this.m_contactManager.m_destroyImmediate=true;var c=this.m_bodyDestroyList;while(c){var f=c;c=c.m_next;var e=f.m_jointList;while(e){var a=e;e=e.next;if(this.m_listener){this.m_listener.NotifyJointDestroyed(a.joint)}this.DestroyJoint(a.joint)}f.Destroy()}this.m_bodyDestroyList=null;this.m_contactManager.m_destroyImmediate=false},CreateJoint:function(f){var c=b2Joint.Create(f,this.m_blockAllocator);c.m_prev=null;c.m_next=this.m_jointList;if(this.m_jointList){this.m_jointList.m_prev=c}this.m_jointList=c;++this.m_jointCount;c.m_node1.joint=c;c.m_node1.other=c.m_body2;c.m_node1.prev=null;c.m_node1.next=c.m_body1.m_jointList;if(c.m_body1.m_jointList){c.m_body1.m_jointList.prev=c.m_node1}c.m_body1.m_jointList=c.m_node1;c.m_node2.joint=c;c.m_node2.other=c.m_body1;c.m_node2.prev=null;c.m_node2.next=c.m_body2.m_jointList;if(c.m_body2.m_jointList){c.m_body2.m_jointList.prev=c.m_node2}c.m_body2.m_jointList=c.m_node2;if(f.collideConnected==false){var a=f.body1.m_shapeCount0){this.step.inv_dt=1/a}else{this.step.inv_dt=0}this.m_positionIterationCount=0;this.m_contactManager.CleanContactList();this.CleanBodyList();this.m_contactManager.Collide();var o=new b2Island(this.m_bodyCount,this.m_contactCount,this.m_jointCount,this.m_stackAllocator);for(s=this.m_bodyList;s!=null;s=s.m_next){s.m_flags&=~b2Body.e_islandFlag}for(var q=this.m_contactList;q!=null;q=q.m_next){q.m_flags&=~b2Contact.e_islandFlag}for(var l=this.m_jointList;l!=null;l=l.m_next){l.m_islandFlag=false}var v=this.m_bodyCount;var r=new Array(this.m_bodyCount);for(var h=0;h0){s=r[--u];o.AddBody(s);s.m_flags&=~b2Body.e_sleepFlag;if(s.m_flags&b2Body.e_staticFlag){continue}for(var t=s.m_contactList;t!=null;t=t.next){if(t.contact.m_flags&b2Contact.e_islandFlag){continue}o.AddContact(t.contact);t.contact.m_flags|=b2Contact.e_islandFlag;p=t.other;if(p.m_flags&b2Body.e_islandFlag){continue}r[u++]=p;p.m_flags|=b2Body.e_islandFlag}for(var g=s.m_jointList;g!=null;g=g.next){if(g.joint.m_islandFlag==true){continue}o.AddJoint(g.joint);g.joint.m_islandFlag=true;p=g.other;if(p.m_flags&b2Body.e_islandFlag){continue}r[u++]=p;p.m_flags|=b2Body.e_islandFlag}}o.Solve(this.step,this.m_gravity);this.m_positionIterationCount=b2Math.b2Max(this.m_positionIterationCount,b2Island.m_positionIterationCount);if(this.m_allowSleep){o.UpdateSleep(a)}for(var m=0;mb2Settings.b2_linearSlop){this.m_u.Multiply(1/a)}else{this.m_u.SetZero()}var i=(k*this.m_u.y-j*this.m_u.x);var e=(g*this.m_u.y-f*this.m_u.x);this.m_mass=this.m_body1.m_invMass+this.m_body1.m_invI*i*i+this.m_body2.m_invMass+this.m_body2.m_invI*e*e;this.m_mass=1/this.m_mass;if(b2World.s_enableWarmStarting){var c=this.m_impulse*this.m_u.x;var b=this.m_impulse*this.m_u.y;this.m_body1.m_linearVelocity.x-=this.m_body1.m_invMass*c;this.m_body1.m_linearVelocity.y-=this.m_body1.m_invMass*b;this.m_body1.m_angularVelocity-=this.m_body1.m_invI*(k*b-j*c);this.m_body2.m_linearVelocity.x+=this.m_body2.m_invMass*c;this.m_body2.m_linearVelocity.y+=this.m_body2.m_invMass*b;this.m_body2.m_angularVelocity+=this.m_body2.m_invI*(g*b-f*c)}else{this.m_impulse=0}},SolveVelocityConstraints:function(b){var k;k=this.m_body1.m_R;var o=k.col1.x*this.m_localAnchor1.x+k.col2.x*this.m_localAnchor1.y;var n=k.col1.y*this.m_localAnchor1.x+k.col2.y*this.m_localAnchor1.y;k=this.m_body2.m_R;var i=k.col1.x*this.m_localAnchor2.x+k.col2.x*this.m_localAnchor2.y;var h=k.col1.y*this.m_localAnchor2.x+k.col2.y*this.m_localAnchor2.y;var m=this.m_body1.m_linearVelocity.x+(-this.m_body1.m_angularVelocity*n);var l=this.m_body1.m_linearVelocity.y+(this.m_body1.m_angularVelocity*o);var g=this.m_body2.m_linearVelocity.x+(-this.m_body2.m_angularVelocity*h);var f=this.m_body2.m_linearVelocity.y+(this.m_body2.m_angularVelocity*i);var j=(this.m_u.x*(g-m)+this.m_u.y*(f-l));var a=-this.m_mass*j;this.m_impulse+=a;var e=a*this.m_u.x;var c=a*this.m_u.y;this.m_body1.m_linearVelocity.x-=this.m_body1.m_invMass*e;this.m_body1.m_linearVelocity.y-=this.m_body1.m_invMass*c;this.m_body1.m_angularVelocity-=this.m_body1.m_invI*(o*c-n*e);this.m_body2.m_linearVelocity.x+=this.m_body2.m_invMass*e;this.m_body2.m_linearVelocity.y+=this.m_body2.m_invMass*c;this.m_body2.m_angularVelocity+=this.m_body2.m_invI*(i*c-h*e)},SolvePositionConstraints:function(){var k;k=this.m_body1.m_R;var m=k.col1.x*this.m_localAnchor1.x+k.col2.x*this.m_localAnchor1.y;var l=k.col1.y*this.m_localAnchor1.x+k.col2.y*this.m_localAnchor1.y;k=this.m_body2.m_R;var j=k.col1.x*this.m_localAnchor2.x+k.col2.x*this.m_localAnchor2.y;var i=k.col1.y*this.m_localAnchor2.x+k.col2.y*this.m_localAnchor2.y;var h=this.m_body2.m_position.x+j-this.m_body1.m_position.x-m;var g=this.m_body2.m_position.y+i-this.m_body1.m_position.y-l;var c=Math.sqrt(h*h+g*g);h/=c;g/=c;var a=c-this.m_length;a=b2Math.b2Clamp(a,-b2Settings.b2_maxLinearCorrection,b2Settings.b2_maxLinearCorrection);var b=-this.m_mass*a;this.m_u.Set(h,g);var f=b*this.m_u.x;var e=b*this.m_u.y;this.m_body1.m_position.x-=this.m_body1.m_invMass*f;this.m_body1.m_position.y-=this.m_body1.m_invMass*e;this.m_body1.m_rotation-=this.m_body1.m_invI*(m*e-l*f);this.m_body2.m_position.x+=this.m_body2.m_invMass*f;this.m_body2.m_position.y+=this.m_body2.m_invMass*e;this.m_body2.m_rotation+=this.m_body2.m_invI*(j*e-i*f);this.m_body1.m_R.Set(this.m_body1.m_rotation);this.m_body2.m_R.Set(this.m_body2.m_rotation);return b2Math.b2Abs(a)e.dt*this.m_maxForce){this.m_impulse.Multiply(e.dt*this.m_maxForce/b)}f=this.m_impulse.x-k;c=this.m_impulse.y-h;j.m_linearVelocity.x+=j.m_invMass*f;j.m_linearVelocity.y+=j.m_invMass*c;j.m_angularVelocity+=j.m_invI*(i*c-g*f)},SolvePositionConstraints:function(){return true},m_localAnchor:new b2Vec2(),m_target:new b2Vec2(),m_impulse:new b2Vec2(),m_ptpMass:new b2Mat22(),m_C:new b2Vec2(),m_maxForce:null,m_beta:null,m_gamma:null});var b2MouseJointDef=Class.create();Object.extend(b2MouseJointDef.prototype,b2JointDef.prototype);Object.extend(b2MouseJointDef.prototype,{initialize:function(){this.type=b2Joint.e_unknownJoint;this.userData=null;this.body1=null;this.body2=null;this.collideConnected=false;this.target=new b2Vec2();this.type=b2Joint.e_mouseJoint;this.maxForce=0;this.frequencyHz=5;this.dampingRatio=0.7;this.timeStep=1/60},target:new b2Vec2(),maxForce:null,frequencyHz:null,dampingRatio:null,timeStep:null});var b2PrismaticJoint=Class.create();Object.extend(b2PrismaticJoint.prototype,b2Joint.prototype);Object.extend(b2PrismaticJoint.prototype,{GetAnchor1:function(){var a=this.m_body1;var b=new b2Vec2();b.SetV(this.m_localAnchor1);b.MulM(a.m_R);b.Add(a.m_position);return b},GetAnchor2:function(){var a=this.m_body2;var b=new b2Vec2();b.SetV(this.m_localAnchor2);b.MulM(a.m_R);b.Add(a.m_position);return b},GetJointTranslation:function(){var m=this.m_body1;var l=this.m_body2;var k;k=m.m_R;var q=k.col1.x*this.m_localAnchor1.x+k.col2.x*this.m_localAnchor1.y;var o=k.col1.y*this.m_localAnchor1.x+k.col2.y*this.m_localAnchor1.y;k=l.m_R;var j=k.col1.x*this.m_localAnchor2.x+k.col2.x*this.m_localAnchor2.y;var i=k.col1.y*this.m_localAnchor2.x+k.col2.y*this.m_localAnchor2.y;var h=m.m_position.x+q;var g=m.m_position.y+o;var c=l.m_position.x+j;var b=l.m_position.y+i;var f=c-h;var e=b-g;k=m.m_R;var p=k.col1.x*this.m_localXAxis1.x+k.col2.x*this.m_localXAxis1.y;var n=k.col1.y*this.m_localXAxis1.x+k.col2.y*this.m_localXAxis1.y;var a=p*f+n*e;return a},GetJointSpeed:function(){var k=this.m_body1;var j=this.m_body2;var l;l=k.m_R;var u=l.col1.x*this.m_localAnchor1.x+l.col2.x*this.m_localAnchor1.y;var t=l.col1.y*this.m_localAnchor1.x+l.col2.y*this.m_localAnchor1.y;l=j.m_R;var i=l.col1.x*this.m_localAnchor2.x+l.col2.x*this.m_localAnchor2.y;var h=l.col1.y*this.m_localAnchor2.x+l.col2.y*this.m_localAnchor2.y;var s=k.m_position.x+u;var q=k.m_position.y+t;var c=j.m_position.x+i;var a=j.m_position.y+h;var g=c-s;var f=a-q;l=k.m_R;var p=l.col1.x*this.m_localXAxis1.x+l.col2.x*this.m_localXAxis1.y;var o=l.col1.y*this.m_localXAxis1.x+l.col2.y*this.m_localXAxis1.y;var e=k.m_linearVelocity;var b=j.m_linearVelocity;var n=k.m_angularVelocity;var m=j.m_angularVelocity;var r=(g*(-n*o)+f*(n*p))+(p*(((b.x+(-m*h))-e.x)-(-n*t))+o*(((b.y+(m*i))-e.y)-(n*u)));return r},GetMotorForce:function(a){return a*this.m_motorImpulse},SetMotorSpeed:function(a){this.m_motorSpeed=a},SetMotorForce:function(a){this.m_maxMotorForce=a},GetReactionForce:function(b){var f=b*this.m_limitImpulse;var e;e=this.m_body1.m_R;var h=f*(e.col1.x*this.m_localXAxis1.x+e.col2.x*this.m_localXAxis1.y);var g=f*(e.col1.y*this.m_localXAxis1.x+e.col2.y*this.m_localXAxis1.y);var c=f*(e.col1.x*this.m_localYAxis1.x+e.col2.x*this.m_localYAxis1.y);var a=f*(e.col1.y*this.m_localYAxis1.x+e.col2.y*this.m_localYAxis1.y);return new b2Vec2(h+c,g+a)},GetReactionTorque:function(a){return a*this.m_angularImpulse},initialize:function(c){this.m_node1=new b2JointNode();this.m_node2=new b2JointNode();this.m_type=c.type;this.m_prev=null;this.m_next=null;this.m_body1=c.body1;this.m_body2=c.body2;this.m_collideConnected=c.collideConnected;this.m_islandFlag=false;this.m_userData=c.userData;this.m_localAnchor1=new b2Vec2();this.m_localAnchor2=new b2Vec2();this.m_localXAxis1=new b2Vec2();this.m_localYAxis1=new b2Vec2();this.m_linearJacobian=new b2Jacobian();this.m_motorJacobian=new b2Jacobian();var b;var a;var e;b=this.m_body1.m_R;a=(c.anchorPoint.x-this.m_body1.m_position.x);e=(c.anchorPoint.y-this.m_body1.m_position.y);this.m_localAnchor1.Set((a*b.col1.x+e*b.col1.y),(a*b.col2.x+e*b.col2.y));b=this.m_body2.m_R;a=(c.anchorPoint.x-this.m_body2.m_position.x);e=(c.anchorPoint.y-this.m_body2.m_position.y);this.m_localAnchor2.Set((a*b.col1.x+e*b.col1.y),(a*b.col2.x+e*b.col2.y));b=this.m_body1.m_R;a=c.axis.x;e=c.axis.y;this.m_localXAxis1.Set((a*b.col1.x+e*b.col1.y),(a*b.col2.x+e*b.col2.y));this.m_localYAxis1.x=-this.m_localXAxis1.y;this.m_localYAxis1.y=this.m_localXAxis1.x;this.m_initialAngle=this.m_body2.m_rotation-this.m_body1.m_rotation;this.m_linearJacobian.SetZero();this.m_linearMass=0;this.m_linearImpulse=0;this.m_angularMass=0;this.m_angularImpulse=0;this.m_motorJacobian.SetZero();this.m_motorMass=0;this.m_motorImpulse=0;this.m_limitImpulse=0;this.m_limitPositionImpulse=0;this.m_lowerTranslation=c.lowerTranslation;this.m_upperTranslation=c.upperTranslation;this.m_maxMotorForce=c.motorForce;this.m_motorSpeed=c.motorSpeed;this.m_enableLimit=c.enableLimit;this.m_enableMotor=c.enableMotor},PrepareVelocitySolver:function(){var n=this.m_body1;var m=this.m_body2;var q;q=n.m_R;var B=q.col1.x*this.m_localAnchor1.x+q.col2.x*this.m_localAnchor1.y;var A=q.col1.y*this.m_localAnchor1.x+q.col2.y*this.m_localAnchor1.y;q=m.m_R;var j=q.col1.x*this.m_localAnchor2.x+q.col2.x*this.m_localAnchor2.y;var h=q.col1.y*this.m_localAnchor2.x+q.col2.y*this.m_localAnchor2.y;var t=n.m_invMass;var s=m.m_invMass;var l=n.m_invI;var k=m.m_invI;q=n.m_R;var i=q.col1.x*this.m_localYAxis1.x+q.col2.x*this.m_localYAxis1.y;var g=q.col1.y*this.m_localYAxis1.x+q.col2.y*this.m_localYAxis1.y;var u=m.m_position.x+j-n.m_position.x;var r=m.m_position.y+h-n.m_position.y;this.m_linearJacobian.linear1.x=-i;this.m_linearJacobian.linear1.y=-g;this.m_linearJacobian.linear2.x=i;this.m_linearJacobian.linear2.y=g;this.m_linearJacobian.angular1=-(u*g-r*i);this.m_linearJacobian.angular2=j*g-h*i;this.m_linearMass=t+l*this.m_linearJacobian.angular1*this.m_linearJacobian.angular1+s+k*this.m_linearJacobian.angular2*this.m_linearJacobian.angular2;this.m_linearMass=1/this.m_linearMass;this.m_angularMass=1/(l+k);if(this.m_enableLimit||this.m_enableMotor){q=n.m_R;var x=q.col1.x*this.m_localXAxis1.x+q.col2.x*this.m_localXAxis1.y;var v=q.col1.y*this.m_localXAxis1.x+q.col2.y*this.m_localXAxis1.y;this.m_motorJacobian.linear1.x=-x;this.m_motorJacobian.linear1.y=-v;this.m_motorJacobian.linear2.x=x;this.m_motorJacobian.linear2.y=v;this.m_motorJacobian.angular1=-(u*v-r*x);this.m_motorJacobian.angular2=j*v-h*x;this.m_motorMass=t+l*this.m_motorJacobian.angular1*this.m_motorJacobian.angular1+s+k*this.m_motorJacobian.angular2*this.m_motorJacobian.angular2;this.m_motorMass=1/this.m_motorMass;if(this.m_enableLimit){var f=u-B;var e=r-A;var c=x*f+v*e;if(b2Math.b2Abs(this.m_upperTranslation-this.m_lowerTranslation)<2*b2Settings.b2_linearSlop){this.m_limitState=b2Joint.e_equalLimits}else{if(c<=this.m_lowerTranslation){if(this.m_limitState!=b2Joint.e_atLowerLimit){this.m_limitImpulse=0}this.m_limitState=b2Joint.e_atLowerLimit}else{if(c>=this.m_upperTranslation){if(this.m_limitState!=b2Joint.e_atUpperLimit){this.m_limitImpulse=0}this.m_limitState=b2Joint.e_atUpperLimit}else{this.m_limitState=b2Joint.e_inactiveLimit;this.m_limitImpulse=0}}}}}if(this.m_enableMotor==false){this.m_motorImpulse=0}if(this.m_enableLimit==false){this.m_limitImpulse=0}if(b2World.s_enableWarmStarting){var b=this.m_linearImpulse*this.m_linearJacobian.linear1.x+(this.m_motorImpulse+this.m_limitImpulse)*this.m_motorJacobian.linear1.x;var a=this.m_linearImpulse*this.m_linearJacobian.linear1.y+(this.m_motorImpulse+this.m_limitImpulse)*this.m_motorJacobian.linear1.y;var p=this.m_linearImpulse*this.m_linearJacobian.linear2.x+(this.m_motorImpulse+this.m_limitImpulse)*this.m_motorJacobian.linear2.x;var o=this.m_linearImpulse*this.m_linearJacobian.linear2.y+(this.m_motorImpulse+this.m_limitImpulse)*this.m_motorJacobian.linear2.y;var z=this.m_linearImpulse*this.m_linearJacobian.angular1-this.m_angularImpulse+(this.m_motorImpulse+this.m_limitImpulse)*this.m_motorJacobian.angular1;var y=this.m_linearImpulse*this.m_linearJacobian.angular2+this.m_angularImpulse+(this.m_motorImpulse+this.m_limitImpulse)*this.m_motorJacobian.angular2;n.m_linearVelocity.x+=t*b;n.m_linearVelocity.y+=t*a;n.m_angularVelocity+=l*z;m.m_linearVelocity.x+=s*p;m.m_linearVelocity.y+=s*o;m.m_angularVelocity+=k*y}else{this.m_linearImpulse=0;this.m_angularImpulse=0;this.m_limitImpulse=0;this.m_motorImpulse=0}this.m_limitPositionImpulse=0},SolveVelocityConstraints:function(b){var m=this.m_body1;var l=this.m_body2;var r=m.m_invMass;var p=l.m_invMass;var e=m.m_invI;var c=l.m_invI;var q;var f=this.m_linearJacobian.Compute(m.m_linearVelocity,m.m_angularVelocity,l.m_linearVelocity,l.m_angularVelocity);var k=-this.m_linearMass*f;this.m_linearImpulse+=k;m.m_linearVelocity.x+=(r*k)*this.m_linearJacobian.linear1.x;m.m_linearVelocity.y+=(r*k)*this.m_linearJacobian.linear1.y;m.m_angularVelocity+=e*k*this.m_linearJacobian.angular1;l.m_linearVelocity.x+=(p*k)*this.m_linearJacobian.linear2.x;l.m_linearVelocity.y+=(p*k)*this.m_linearJacobian.linear2.y;l.m_angularVelocity+=c*k*this.m_linearJacobian.angular2;var i=l.m_angularVelocity-m.m_angularVelocity;var a=-this.m_angularMass*i;this.m_angularImpulse+=a;m.m_angularVelocity-=e*a;l.m_angularVelocity+=c*a;if(this.m_enableMotor&&this.m_limitState!=b2Joint.e_equalLimits){var n=this.m_motorJacobian.Compute(m.m_linearVelocity,m.m_angularVelocity,l.m_linearVelocity,l.m_angularVelocity)-this.m_motorSpeed;var g=-this.m_motorMass*n;var o=this.m_motorImpulse;this.m_motorImpulse=b2Math.b2Clamp(this.m_motorImpulse+g,-b.dt*this.m_maxMotorForce,b.dt*this.m_maxMotorForce);g=this.m_motorImpulse-o;m.m_linearVelocity.x+=(r*g)*this.m_motorJacobian.linear1.x;m.m_linearVelocity.y+=(r*g)*this.m_motorJacobian.linear1.y;m.m_angularVelocity+=e*g*this.m_motorJacobian.angular1;l.m_linearVelocity.x+=(p*g)*this.m_motorJacobian.linear2.x;l.m_linearVelocity.y+=(p*g)*this.m_motorJacobian.linear2.y;l.m_angularVelocity+=c*g*this.m_motorJacobian.angular2}if(this.m_enableLimit&&this.m_limitState!=b2Joint.e_inactiveLimit){var j=this.m_motorJacobian.Compute(m.m_linearVelocity,m.m_angularVelocity,l.m_linearVelocity,l.m_angularVelocity);var h=-this.m_motorMass*j;if(this.m_limitState==b2Joint.e_equalLimits){this.m_limitImpulse+=h}else{if(this.m_limitState==b2Joint.e_atLowerLimit){q=this.m_limitImpulse;this.m_limitImpulse=b2Math.b2Max(this.m_limitImpulse+h,0);h=this.m_limitImpulse-q}else{if(this.m_limitState==b2Joint.e_atUpperLimit){q=this.m_limitImpulse;this.m_limitImpulse=b2Math.b2Min(this.m_limitImpulse+h,0);h=this.m_limitImpulse-q}}}m.m_linearVelocity.x+=(r*h)*this.m_motorJacobian.linear1.x;m.m_linearVelocity.y+=(r*h)*this.m_motorJacobian.linear1.y;m.m_angularVelocity+=e*h*this.m_motorJacobian.angular1;l.m_linearVelocity.x+=(p*h)*this.m_motorJacobian.linear2.x;l.m_linearVelocity.y+=(p*h)*this.m_motorJacobian.linear2.y;l.m_angularVelocity+=c*h*this.m_motorJacobian.angular2}},SolvePositionConstraints:function(){var p;var A;var n=this.m_body1;var l=this.m_body2;var u=n.m_invMass;var t=l.m_invMass;var k=n.m_invI;var j=l.m_invI;var r;r=n.m_R;var G=r.col1.x*this.m_localAnchor1.x+r.col2.x*this.m_localAnchor1.y;var F=r.col1.y*this.m_localAnchor1.x+r.col2.y*this.m_localAnchor1.y;r=l.m_R;var i=r.col1.x*this.m_localAnchor2.x+r.col2.x*this.m_localAnchor2.y;var h=r.col1.y*this.m_localAnchor2.x+r.col2.y*this.m_localAnchor2.y;var D=n.m_position.x+G;var B=n.m_position.y+F;var b=l.m_position.x+i;var a=l.m_position.y+h;var f=b-D;var c=a-B;r=n.m_R;var g=r.col1.x*this.m_localYAxis1.x+r.col2.x*this.m_localYAxis1.y;var e=r.col1.y*this.m_localYAxis1.x+r.col2.y*this.m_localYAxis1.y;var m=g*f+e*c;m=b2Math.b2Clamp(m,-b2Settings.b2_maxLinearCorrection,b2Settings.b2_maxLinearCorrection);var z=-this.m_linearMass*m;n.m_position.x+=(u*z)*this.m_linearJacobian.linear1.x;n.m_position.y+=(u*z)*this.m_linearJacobian.linear1.y;n.m_rotation+=k*z*this.m_linearJacobian.angular1;l.m_position.x+=(t*z)*this.m_linearJacobian.linear2.x;l.m_position.y+=(t*z)*this.m_linearJacobian.linear2.y;l.m_rotation+=j*z*this.m_linearJacobian.angular2;var q=b2Math.b2Abs(m);var C=l.m_rotation-n.m_rotation-this.m_initialAngle;C=b2Math.b2Clamp(C,-b2Settings.b2_maxAngularCorrection,b2Settings.b2_maxAngularCorrection);var s=-this.m_angularMass*C;n.m_rotation-=n.m_invI*s;n.m_R.Set(n.m_rotation);l.m_rotation+=l.m_invI*s;l.m_R.Set(l.m_rotation);var E=b2Math.b2Abs(C);if(this.m_enableLimit&&this.m_limitState!=b2Joint.e_inactiveLimit){r=n.m_R;G=r.col1.x*this.m_localAnchor1.x+r.col2.x*this.m_localAnchor1.y;F=r.col1.y*this.m_localAnchor1.x+r.col2.y*this.m_localAnchor1.y;r=l.m_R;i=r.col1.x*this.m_localAnchor2.x+r.col2.x*this.m_localAnchor2.y;h=r.col1.y*this.m_localAnchor2.x+r.col2.y*this.m_localAnchor2.y;D=n.m_position.x+G;B=n.m_position.y+F;b=l.m_position.x+i;a=l.m_position.y+h;f=b-D;c=a-B;r=n.m_R;var x=r.col1.x*this.m_localXAxis1.x+r.col2.x*this.m_localXAxis1.y;var v=r.col1.y*this.m_localXAxis1.x+r.col2.y*this.m_localXAxis1.y;var o=(x*f+v*c);var y=0;if(this.m_limitState==b2Joint.e_equalLimits){p=b2Math.b2Clamp(o,-b2Settings.b2_maxLinearCorrection,b2Settings.b2_maxLinearCorrection);y=-this.m_motorMass*p;q=b2Math.b2Max(q,b2Math.b2Abs(C))}else{if(this.m_limitState==b2Joint.e_atLowerLimit){p=o-this.m_lowerTranslation;q=b2Math.b2Max(q,-p);p=b2Math.b2Clamp(p+b2Settings.b2_linearSlop,-b2Settings.b2_maxLinearCorrection,0);y=-this.m_motorMass*p;A=this.m_limitPositionImpulse;this.m_limitPositionImpulse=b2Math.b2Max(this.m_limitPositionImpulse+y,0);y=this.m_limitPositionImpulse-A}else{if(this.m_limitState==b2Joint.e_atUpperLimit){p=o-this.m_upperTranslation;q=b2Math.b2Max(q,p);p=b2Math.b2Clamp(p-b2Settings.b2_linearSlop,0,b2Settings.b2_maxLinearCorrection);y=-this.m_motorMass*p;A=this.m_limitPositionImpulse;this.m_limitPositionImpulse=b2Math.b2Min(this.m_limitPositionImpulse+y,0);y=this.m_limitPositionImpulse-A}}}n.m_position.x+=(u*y)*this.m_motorJacobian.linear1.x;n.m_position.y+=(u*y)*this.m_motorJacobian.linear1.y;n.m_rotation+=k*y*this.m_motorJacobian.angular1;n.m_R.Set(n.m_rotation);l.m_position.x+=(t*y)*this.m_motorJacobian.linear2.x;l.m_position.y+=(t*y)*this.m_motorJacobian.linear2.y;l.m_rotation+=j*y*this.m_motorJacobian.angular2;l.m_R.Set(l.m_rotation)}return q<=b2Settings.b2_linearSlop&&E<=b2Settings.b2_angularSlop},m_localAnchor1:new b2Vec2(),m_localAnchor2:new b2Vec2(),m_localXAxis1:new b2Vec2(),m_localYAxis1:new b2Vec2(),m_initialAngle:null,m_linearJacobian:new b2Jacobian(),m_linearMass:null,m_linearImpulse:null,m_angularMass:null,m_angularImpulse:null,m_motorJacobian:new b2Jacobian(),m_motorMass:null,m_motorImpulse:null,m_limitImpulse:null,m_limitPositionImpulse:null,m_lowerTranslation:null,m_upperTranslation:null,m_maxMotorForce:null,m_motorSpeed:null,m_enableLimit:null,m_enableMotor:null,m_limitState:0});var b2PrismaticJointDef=Class.create();Object.extend(b2PrismaticJointDef.prototype,b2JointDef.prototype);Object.extend(b2PrismaticJointDef.prototype,{initialize:function(){this.type=b2Joint.e_unknownJoint;this.userData=null;this.body1=null;this.body2=null;this.collideConnected=false;this.type=b2Joint.e_prismaticJoint;this.anchorPoint=new b2Vec2(0,0);this.axis=new b2Vec2(0,0);this.lowerTranslation=0;this.upperTranslation=0;this.motorForce=0;this.motorSpeed=0;this.enableLimit=false;this.enableMotor=false},anchorPoint:null,axis:null,lowerTranslation:null,upperTranslation:null,motorForce:null,motorSpeed:null,enableLimit:null,enableMotor:null});var b2PulleyJoint=Class.create();Object.extend(b2PulleyJoint.prototype,b2Joint.prototype);Object.extend(b2PulleyJoint.prototype,{GetAnchor1:function(){var a=this.m_body1.m_R;return new b2Vec2(this.m_body1.m_position.x+(a.col1.x*this.m_localAnchor1.x+a.col2.x*this.m_localAnchor1.y),this.m_body1.m_position.y+(a.col1.y*this.m_localAnchor1.x+a.col2.y*this.m_localAnchor1.y))},GetAnchor2:function(){var a=this.m_body2.m_R;return new b2Vec2(this.m_body2.m_position.x+(a.col1.x*this.m_localAnchor2.x+a.col2.x*this.m_localAnchor2.y),this.m_body2.m_position.y+(a.col1.y*this.m_localAnchor2.x+a.col2.y*this.m_localAnchor2.y))},GetGroundPoint1:function(){return new b2Vec2(this.m_ground.m_position.x+this.m_groundAnchor1.x,this.m_ground.m_position.y+this.m_groundAnchor1.y)},GetGroundPoint2:function(){return new b2Vec2(this.m_ground.m_position.x+this.m_groundAnchor2.x,this.m_ground.m_position.y+this.m_groundAnchor2.y)},GetReactionForce:function(a){return new b2Vec2()},GetReactionTorque:function(a){return 0},GetLength1:function(){var f;f=this.m_body1.m_R;var e=this.m_body1.m_position.x+(f.col1.x*this.m_localAnchor1.x+f.col2.x*this.m_localAnchor1.y);var c=this.m_body1.m_position.y+(f.col1.y*this.m_localAnchor1.x+f.col2.y*this.m_localAnchor1.y);var b=e-(this.m_ground.m_position.x+this.m_groundAnchor1.x);var a=c-(this.m_ground.m_position.y+this.m_groundAnchor1.y);return Math.sqrt(b*b+a*a)},GetLength2:function(){var f;f=this.m_body2.m_R;var e=this.m_body2.m_position.x+(f.col1.x*this.m_localAnchor2.x+f.col2.x*this.m_localAnchor2.y);var c=this.m_body2.m_position.y+(f.col1.y*this.m_localAnchor2.x+f.col2.y*this.m_localAnchor2.y);var b=e-(this.m_ground.m_position.x+this.m_groundAnchor2.x);var a=c-(this.m_ground.m_position.y+this.m_groundAnchor2.y);return Math.sqrt(b*b+a*a)},GetRatio:function(){return this.m_ratio},initialize:function(e){this.m_node1=new b2JointNode();this.m_node2=new b2JointNode();this.m_type=e.type;this.m_prev=null;this.m_next=null;this.m_body1=e.body1;this.m_body2=e.body2;this.m_collideConnected=e.collideConnected;this.m_islandFlag=false;this.m_userData=e.userData;this.m_groundAnchor1=new b2Vec2();this.m_groundAnchor2=new b2Vec2();this.m_localAnchor1=new b2Vec2();this.m_localAnchor2=new b2Vec2();this.m_u1=new b2Vec2();this.m_u2=new b2Vec2();var b;var a;var i;this.m_ground=this.m_body1.m_world.m_groundBody;this.m_groundAnchor1.x=e.groundPoint1.x-this.m_ground.m_position.x;this.m_groundAnchor1.y=e.groundPoint1.y-this.m_ground.m_position.y;this.m_groundAnchor2.x=e.groundPoint2.x-this.m_ground.m_position.x;this.m_groundAnchor2.y=e.groundPoint2.y-this.m_ground.m_position.y;b=this.m_body1.m_R;a=e.anchorPoint1.x-this.m_body1.m_position.x;i=e.anchorPoint1.y-this.m_body1.m_position.y;this.m_localAnchor1.x=a*b.col1.x+i*b.col1.y;this.m_localAnchor1.y=a*b.col2.x+i*b.col2.y;b=this.m_body2.m_R;a=e.anchorPoint2.x-this.m_body2.m_position.x;i=e.anchorPoint2.y-this.m_body2.m_position.y;this.m_localAnchor2.x=a*b.col1.x+i*b.col1.y;this.m_localAnchor2.y=a*b.col2.x+i*b.col2.y;this.m_ratio=e.ratio;a=e.groundPoint1.x-e.anchorPoint1.x;i=e.groundPoint1.y-e.anchorPoint1.y;var g=Math.sqrt(a*a+i*i);a=e.groundPoint2.x-e.anchorPoint2.x;i=e.groundPoint2.y-e.anchorPoint2.y;var c=Math.sqrt(a*a+i*i);var h=b2Math.b2Max(0.5*b2PulleyJoint.b2_minPulleyLength,g);var f=b2Math.b2Max(0.5*b2PulleyJoint.b2_minPulleyLength,c);this.m_constant=h+this.m_ratio*f;this.m_maxLength1=b2Math.b2Clamp(e.maxLength1,h,this.m_constant-this.m_ratio*b2PulleyJoint.b2_minPulleyLength);this.m_maxLength2=b2Math.b2Clamp(e.maxLength2,f,(this.m_constant-b2PulleyJoint.b2_minPulleyLength)/this.m_ratio);this.m_pulleyImpulse=0;this.m_limitImpulse1=0;this.m_limitImpulse2=0},PrepareVelocitySolver:function(){var i=this.m_body1;var h=this.m_body2;var m;m=i.m_R;var x=m.col1.x*this.m_localAnchor1.x+m.col2.x*this.m_localAnchor1.y;var v=m.col1.y*this.m_localAnchor1.x+m.col2.y*this.m_localAnchor1.y;m=h.m_R;var g=m.col1.x*this.m_localAnchor2.x+m.col2.x*this.m_localAnchor2.y;var f=m.col1.y*this.m_localAnchor2.x+m.col2.y*this.m_localAnchor2.y;var u=i.m_position.x+x;var s=i.m_position.y+v;var e=h.m_position.x+g;var c=h.m_position.y+f;var n=this.m_ground.m_position.x+this.m_groundAnchor1.x;var l=this.m_ground.m_position.y+this.m_groundAnchor1.y;var t=this.m_ground.m_position.x+this.m_groundAnchor2.x;var r=this.m_ground.m_position.y+this.m_groundAnchor2.y;this.m_u1.Set(u-n,s-l);this.m_u2.Set(e-t,c-r);var q=this.m_u1.Length();var p=this.m_u2.Length();if(q>b2Settings.b2_linearSlop){this.m_u1.Multiply(1/q)}else{this.m_u1.SetZero()}if(p>b2Settings.b2_linearSlop){this.m_u2.Multiply(1/p)}else{this.m_u2.SetZero()}if(qb2Settings.b2_linearSlop){this.m_u1.Multiply(1/o)}else{this.m_u1.SetZero()}if(n>b2Settings.b2_linearSlop){this.m_u2.Multiply(1/n)}else{this.m_u2.SetZero()}m=this.m_constant-o-this.m_ratio*n;f=b2Math.b2Max(f,Math.abs(m));m=b2Math.b2Clamp(m,-b2Settings.b2_maxLinearCorrection,b2Settings.b2_maxLinearCorrection);i=-this.m_pulleyMass*m;s=-i*this.m_u1.x;q=-i*this.m_u1.y;b=-this.m_ratio*i*this.m_u2.x;a=-this.m_ratio*i*this.m_u2.y;h.m_position.x+=h.m_invMass*s;h.m_position.y+=h.m_invMass*q;h.m_rotation+=h.m_invI*(v*q-u*s);g.m_position.x+=g.m_invMass*b;g.m_position.y+=g.m_invMass*a;g.m_rotation+=g.m_invI*(e*a-c*b);h.m_R.Set(h.m_rotation);g.m_R.Set(g.m_rotation);if(this.m_limitState1==b2Joint.e_atUpperLimit){k=h.m_R;v=k.col1.x*this.m_localAnchor1.x+k.col2.x*this.m_localAnchor1.y;u=k.col1.y*this.m_localAnchor1.x+k.col2.y*this.m_localAnchor1.y;s=h.m_position.x+v;q=h.m_position.y+u;this.m_u1.Set(s-l,q-j);o=this.m_u1.Length();if(o>b2Settings.b2_linearSlop){this.m_u1.x*=1/o;this.m_u1.y*=1/o}else{this.m_u1.SetZero()}m=this.m_maxLength1-o;f=b2Math.b2Max(f,-m);m=b2Math.b2Clamp(m+b2Settings.b2_linearSlop,-b2Settings.b2_maxLinearCorrection,0);i=-this.m_limitMass1*m;t=this.m_limitPositionImpulse1;this.m_limitPositionImpulse1=b2Math.b2Max(0,this.m_limitPositionImpulse1+i);i=this.m_limitPositionImpulse1-t;s=-i*this.m_u1.x;q=-i*this.m_u1.y;h.m_position.x+=h.m_invMass*s;h.m_position.y+=h.m_invMass*q;h.m_rotation+=h.m_invI*(v*q-u*s);h.m_R.Set(h.m_rotation)}if(this.m_limitState2==b2Joint.e_atUpperLimit){k=g.m_R;e=k.col1.x*this.m_localAnchor2.x+k.col2.x*this.m_localAnchor2.y;c=k.col1.y*this.m_localAnchor2.x+k.col2.y*this.m_localAnchor2.y;b=g.m_position.x+e;a=g.m_position.y+c;this.m_u2.Set(b-r,a-p);n=this.m_u2.Length();if(n>b2Settings.b2_linearSlop){this.m_u2.x*=1/n;this.m_u2.y*=1/n}else{this.m_u2.SetZero()}m=this.m_maxLength2-n;f=b2Math.b2Max(f,-m);m=b2Math.b2Clamp(m+b2Settings.b2_linearSlop,-b2Settings.b2_maxLinearCorrection,0);i=-this.m_limitMass2*m;t=this.m_limitPositionImpulse2;this.m_limitPositionImpulse2=b2Math.b2Max(0,this.m_limitPositionImpulse2+i);i=this.m_limitPositionImpulse2-t;b=-i*this.m_u2.x;a=-i*this.m_u2.y;g.m_position.x+=g.m_invMass*b;g.m_position.y+=g.m_invMass*a;g.m_rotation+=g.m_invI*(e*a-c*b);g.m_R.Set(g.m_rotation)}return f=this.m_upperAngle){if(this.m_limitState!=b2Joint.e_atUpperLimit){this.m_limitImpulse=0}this.m_limitState=b2Joint.e_atUpperLimit}else{this.m_limitState=b2Joint.e_inactiveLimit;this.m_limitImpulse=0}}}}else{this.m_limitImpulse=0}if(b2World.s_enableWarmStarting){i.m_linearVelocity.x-=m*this.m_ptpImpulse.x;i.m_linearVelocity.y-=m*this.m_ptpImpulse.y;i.m_angularVelocity-=c*((l*this.m_ptpImpulse.y-j*this.m_ptpImpulse.x)+this.m_motorImpulse+this.m_limitImpulse);h.m_linearVelocity.x+=k*this.m_ptpImpulse.x;h.m_linearVelocity.y+=k*this.m_ptpImpulse.y;h.m_angularVelocity+=b*((f*this.m_ptpImpulse.y-e*this.m_ptpImpulse.x)+this.m_motorImpulse+this.m_limitImpulse)}else{this.m_ptpImpulse.SetZero();this.m_motorImpulse=0;this.m_limitImpulse=0}this.m_limitPositionImpulse=0},SolveVelocityConstraints:function(g){var h=this.m_body1;var f=this.m_body2;var j;j=h.m_R;var p=j.col1.x*this.m_localAnchor1.x+j.col2.x*this.m_localAnchor1.y;var o=j.col1.y*this.m_localAnchor1.x+j.col2.y*this.m_localAnchor1.y;j=f.m_R;var b=j.col1.x*this.m_localAnchor2.x+j.col2.x*this.m_localAnchor2.y;var a=j.col1.y*this.m_localAnchor2.x+j.col2.y*this.m_localAnchor2.y;var l;var r=f.m_linearVelocity.x+(-f.m_angularVelocity*a)-h.m_linearVelocity.x-(-h.m_angularVelocity*o);var q=f.m_linearVelocity.y+(f.m_angularVelocity*b)-h.m_linearVelocity.y-(h.m_angularVelocity*p);var n=-(this.m_ptpMass.col1.x*r+this.m_ptpMass.col2.x*q);var m=-(this.m_ptpMass.col1.y*r+this.m_ptpMass.col2.y*q);this.m_ptpImpulse.x+=n;this.m_ptpImpulse.y+=m;h.m_linearVelocity.x-=h.m_invMass*n;h.m_linearVelocity.y-=h.m_invMass*m;h.m_angularVelocity-=h.m_invI*(p*m-o*n);f.m_linearVelocity.x+=f.m_invMass*n;f.m_linearVelocity.y+=f.m_invMass*m;f.m_angularVelocity+=f.m_invI*(b*m-a*n);if(this.m_enableMotor&&this.m_limitState!=b2Joint.e_equalLimits){var s=f.m_angularVelocity-h.m_angularVelocity-this.m_motorSpeed;var c=-this.m_motorMass*s;var e=this.m_motorImpulse;this.m_motorImpulse=b2Math.b2Clamp(this.m_motorImpulse+c,-g.dt*this.m_maxMotorTorque,g.dt*this.m_maxMotorTorque);c=this.m_motorImpulse-e;h.m_angularVelocity-=h.m_invI*c;f.m_angularVelocity+=f.m_invI*c}if(this.m_enableLimit&&this.m_limitState!=b2Joint.e_inactiveLimit){var i=f.m_angularVelocity-h.m_angularVelocity;var k=-this.m_motorMass*i;if(this.m_limitState==b2Joint.e_equalLimits){this.m_limitImpulse+=k}else{if(this.m_limitState==b2Joint.e_atLowerLimit){l=this.m_limitImpulse;this.m_limitImpulse=b2Math.b2Max(this.m_limitImpulse+k,0);k=this.m_limitImpulse-l}else{if(this.m_limitState==b2Joint.e_atUpperLimit){l=this.m_limitImpulse;this.m_limitImpulse=b2Math.b2Min(this.m_limitImpulse+k,0);k=this.m_limitImpulse-l}}}h.m_angularVelocity-=h.m_invI*k;f.m_angularVelocity+=f.m_invI*k}},SolvePositionConstraints:function(){var t;var n;var m=this.m_body1;var l=this.m_body2;var p=0;var o;o=m.m_R;var A=o.col1.x*this.m_localAnchor1.x+o.col2.x*this.m_localAnchor1.y;var z=o.col1.y*this.m_localAnchor1.x+o.col2.y*this.m_localAnchor1.y;o=l.m_R;var g=o.col1.x*this.m_localAnchor2.x+o.col2.x*this.m_localAnchor2.y;var f=o.col1.y*this.m_localAnchor2.x+o.col2.y*this.m_localAnchor2.y;var v=m.m_position.x+A;var u=m.m_position.y+z;var e=l.m_position.x+g;var c=l.m_position.y+f;var k=e-v;var j=c-u;p=Math.sqrt(k*k+j*j);var r=m.m_invMass;var q=l.m_invMass;var i=m.m_invI;var h=l.m_invI;this.K1.col1.x=r+q;this.K1.col2.x=0;this.K1.col1.y=0;this.K1.col2.y=r+q;this.K2.col1.x=i*z*z;this.K2.col2.x=-i*A*z;this.K2.col1.y=-i*A*z;this.K2.col2.y=i*A*A;this.K3.col1.x=h*f*f;this.K3.col2.x=-h*g*f;this.K3.col1.y=-h*g*f;this.K3.col2.y=h*g*g;this.K.SetM(this.K1);this.K.AddM(this.K2);this.K.AddM(this.K3);this.K.Solve(b2RevoluteJoint.tImpulse,-k,-j);var b=b2RevoluteJoint.tImpulse.x;var a=b2RevoluteJoint.tImpulse.y;m.m_position.x-=m.m_invMass*b;m.m_position.y-=m.m_invMass*a;m.m_rotation-=m.m_invI*(A*a-z*b);m.m_R.Set(m.m_rotation);l.m_position.x+=l.m_invMass*b;l.m_position.y+=l.m_invMass*a;l.m_rotation+=l.m_invI*(g*a-f*b);l.m_R.Set(l.m_rotation);var y=0;if(this.m_enableLimit&&this.m_limitState!=b2Joint.e_inactiveLimit){var x=l.m_rotation-m.m_rotation-this.m_intialAngle;var s=0;if(this.m_limitState==b2Joint.e_equalLimits){n=b2Math.b2Clamp(x,-b2Settings.b2_maxAngularCorrection,b2Settings.b2_maxAngularCorrection);s=-this.m_motorMass*n;y=b2Math.b2Abs(n)}else{if(this.m_limitState==b2Joint.e_atLowerLimit){n=x-this.m_lowerAngle;y=b2Math.b2Max(0,-n);n=b2Math.b2Clamp(n+b2Settings.b2_angularSlop,-b2Settings.b2_maxAngularCorrection,0);s=-this.m_motorMass*n;t=this.m_limitPositionImpulse;this.m_limitPositionImpulse=b2Math.b2Max(this.m_limitPositionImpulse+s,0);s=this.m_limitPositionImpulse-t}else{if(this.m_limitState==b2Joint.e_atUpperLimit){n=x-this.m_upperAngle;y=b2Math.b2Max(0,n);n=b2Math.b2Clamp(n-b2Settings.b2_angularSlop,0,b2Settings.b2_maxAngularCorrection);s=-this.m_motorMass*n;t=this.m_limitPositionImpulse;this.m_limitPositionImpulse=b2Math.b2Min(this.m_limitPositionImpulse+s,0);s=this.m_limitPositionImpulse-t}}}m.m_rotation-=m.m_invI*s;m.m_R.Set(m.m_rotation);l.m_rotation+=l.m_invI*s;l.m_R.Set(l.m_rotation)}return p<=b2Settings.b2_linearSlop&&y<=b2Settings.b2_angularSlop},m_localAnchor1:new b2Vec2(),m_localAnchor2:new b2Vec2(),m_ptpImpulse:new b2Vec2(),m_motorImpulse:null,m_limitImpulse:null,m_limitPositionImpulse:null,m_ptpMass:new b2Mat22(),m_motorMass:null,m_intialAngle:null,m_lowerAngle:null,m_upperAngle:null,m_maxMotorTorque:null,m_motorSpeed:null,m_enableLimit:null,m_enableMotor:null,m_limitState:0});b2RevoluteJoint.tImpulse=new b2Vec2();var b2RevoluteJointDef=Class.create();Object.extend(b2RevoluteJointDef.prototype,b2JointDef.prototype);Object.extend(b2RevoluteJointDef.prototype,{initialize:function(){this.type=b2Joint.e_unknownJoint;this.userData=null;this.body1=null;this.body2=null;this.collideConnected=false;this.type=b2Joint.e_revoluteJoint;this.anchorPoint=new b2Vec2(0,0);this.lowerAngle=0;this.upperAngle=0;this.motorTorque=0;this.motorSpeed=0;this.enableLimit=false;this.enableMotor=false},anchorPoint:null,lowerAngle:null,upperAngle:null,motorTorque:null,motorSpeed:null,enableLimit:null,enableMotor:null});