From 5b2b06046f6393d646614343271c73d04571cc88 Mon Sep 17 00:00:00 2001 From: liabru Date: Mon, 29 Jun 2015 20:58:24 +0100 Subject: [PATCH] updated edge build --- build/matter.js | 125 ++++++++++++++++++++++++++++++++------------ build/matter.min.js | 8 +-- 2 files changed, 97 insertions(+), 36 deletions(-) diff --git a/build/matter.js b/build/matter.js index 6c10a89..8de1e86 100644 --- a/build/matter.js +++ b/build/matter.js @@ -1,5 +1,5 @@ /** -* matter.js edge-master 2015-05-22 +* matter.js edge-master 2015-06-29 * http://brm.io/matter-js/ * License: MIT */ @@ -64,7 +64,7 @@ var Body = {}; /** * Creates a new rigid body model. The options parameter is an object that specifies any properties you wish to override the defaults. * All properties have default values, and many are pre-calculated automatically based on other properties. - * See the properites section below for detailed information on what you can pass via the `options` object. + * See the properties section below for detailed information on what you can pass via the `options` object. * @method create * @param {} options * @return {body} body @@ -557,7 +557,7 @@ var Body = {}; velocityPrevX = body.position.x - body.positionPrev.x, velocityPrevY = body.position.y - body.positionPrev.y; - // update velocity with verlet integration + // update velocity with Verlet integration body.velocity.x = (velocityPrevX * frictionAir * correction) + (body.force.x / body.mass) * deltaTimeSquared; body.velocity.y = (velocityPrevY * frictionAir * correction) + (body.force.y / body.mass) * deltaTimeSquared; @@ -566,7 +566,7 @@ var Body = {}; body.position.x += body.velocity.x; body.position.y += body.velocity.y; - // update angular velocity with verlet integration + // update angular velocity with Verlet integration body.angularVelocity = ((body.angle - body.anglePrev) * frictionAir * correction) + (body.torque / body.inertia) * deltaTimeSquared; body.anglePrev = body.angle; body.angle += body.angularVelocity; @@ -646,6 +646,32 @@ var Body = {}; return properties; }; + /* + * + * Events Documentation + * + */ + + /** + * Fired when a body starts sleeping (where `this` is the body). + * + * @event sleepStart + * @this {body} The body that has started sleeping + * @param {} event An event object + * @param {} event.source The source object of the event + * @param {} event.name The name of the event + */ + + /** + * Fired when a body ends sleeping (where `this` is the body). + * + * @event sleepEnd + * @this {body} The body that has ended sleeping + * @param {} event An event object + * @param {} event.source The source object of the event + * @param {} event.name The name of the event + */ + /* * * Properties Documentation @@ -710,7 +736,7 @@ var Body = {}; * * [{ x: 0, y: 0 }, { x: 25, y: 50 }, { x: 50, y: 0 }] * - * When passed via `Body.create`, the verticies are translated relative to `body.position` (i.e. world-space, and constantly updated by `Body.update` during simulation). + * When passed via `Body.create`, the vertices are translated relative to `body.position` (i.e. world-space, and constantly updated by `Body.update` during simulation). * The `Vector` objects are also augmented with additional properties required for efficient collision detection. * * Other properties such as `inertia` and `bounds` are automatically calculated from the passed vertices (unless provided via `options`). @@ -1401,7 +1427,7 @@ var Composite = {}; * Removes all bodies, constraints and composites from the given composite * Optionally clearing its children recursively * @method clear - * @param {world} world + * @param {composite} composite * @param {boolean} keepStatic * @param {boolean} [deep=false] */ @@ -1744,6 +1770,7 @@ var Composite = {}; })(); + ; // End src/body/Composite.js @@ -1769,7 +1796,7 @@ var World = {}; /** * Creates a new world composite. The options parameter is an object that specifies any properties you wish to override the defaults. - * See the properites section below for detailed information on what you can pass via the `options` object. + * See the properties section below for detailed information on what you can pass via the `options` object. * @method create * @constructor * @param {} options @@ -1826,6 +1853,7 @@ var World = {}; })(); + ; // End src/body/World.js @@ -2328,6 +2356,7 @@ var Pair = {}; * Description * @method create * @param {collision} collision + * @param {number} timestamp * @return {pair} A new pair */ Pair.create = function(collision, timestamp) { @@ -2363,6 +2392,7 @@ var Pair = {}; * @method update * @param {pair} pair * @param {collision} collision + * @param {number} timestamp */ Pair.update = function(pair, collision, timestamp) { var contacts = pair.contacts, @@ -2405,6 +2435,7 @@ var Pair = {}; * @method setActive * @param {pair} pair * @param {bool} isActive + * @param {number} timestamp */ Pair.setActive = function(pair, isActive, timestamp) { if (isActive) { @@ -2472,6 +2503,7 @@ var Pairs = {}; * @method update * @param {object} pairs * @param {collision[]} collisions + * @param {number} timestamp */ Pairs.update = function(pairs, collisions, timestamp) { var pairsList = pairs.list, @@ -2537,6 +2569,7 @@ var Pairs = {}; * Description * @method removeOld * @param {object} pairs + * @param {number} timestamp */ Pairs.removeOld = function(pairs, timestamp) { var pairsList = pairs.list, @@ -2574,9 +2607,9 @@ var Pairs = {}; /** * Clears the given pairs structure - * @method create - * @param {object} options + * @method clear * @param {pairs} pairs + * @return {pairs} pairs */ Pairs.clear = function(pairs) { pairs.table = {}; @@ -2589,6 +2622,7 @@ var Pairs = {}; })(); + ; // End src/collision/Pairs.js @@ -2920,6 +2954,7 @@ var Resolver = {}; * Description * @method solveVelocity * @param {pair[]} pairs + * @param {number} timeScale */ Resolver.solveVelocity = function(pairs, timeScale) { var timeScaleSquared = timeScale * timeScale, @@ -3029,6 +3064,7 @@ var Resolver = {}; })(); + ; // End src/collision/Resolver.js @@ -3312,10 +3348,10 @@ var SAT = {}; * @class Constraint */ -// TODO: fix instabillity issues with torque +// TODO: fix instability issues with torque // TODO: linked constraints // TODO: breakable constraints -// TODO: collidable constraints +// TODO: collision constraints // TODO: allow constrained bodies to sleep // TODO: handle 0 length constraints properly // TODO: impulse caching and warming @@ -3330,7 +3366,7 @@ var Constraint = {}; /** * Creates a new constraint. * All properties have default values, and many are pre-calculated automatically based on other properties. - * See the properites section below for detailed information on what you can pass via the `options` object. + * See the properties section below for detailed information on what you can pass via the `options` object. * @method create * @param {} options * @return {constraint} constraint @@ -3503,8 +3539,8 @@ var Constraint = {}; Sleeping.set(bodyA, false); - // clamp to prevent instabillity - // TODO: solve this properlly + // clamp to prevent instability + // TODO: solve this properly torque = Common.clamp(torque, -0.01, 0.01); // keep track of applied impulses for post solving @@ -3523,8 +3559,8 @@ var Constraint = {}; Sleeping.set(bodyB, false); - // clamp to prevent instabillity - // TODO: solve this properlly + // clamp to prevent instability + // TODO: solve this properly torque = Common.clamp(torque, -0.01, 0.01); // keep track of applied impulses for post solving @@ -3685,7 +3721,7 @@ var Constraint = {}; /** * A `Number` that specifies the target resting length of the constraint. - * It is calculated automatically in `Constraint.create` from intial positions of the `constraint.bodyA` and `constraint.bodyB`. + * It is calculated automatically in `Constraint.create` from initial positions of the `constraint.bodyA` and `constraint.bodyB`. * * @property length * @type number @@ -3693,6 +3729,7 @@ var Constraint = {}; })(); + ; // End src/constraint/Constraint.js @@ -3715,7 +3752,7 @@ var MouseConstraint = {}; /** * Creates a new mouse constraint. * All properties have default values, and many are pre-calculated automatically based on other properties. - * See the properites section below for detailed information on what you can pass via the `options` object. + * See the properties section below for detailed information on what you can pass via the `options` object. * @method create * @param {engine} engine * @param {} options @@ -3818,7 +3855,7 @@ var MouseConstraint = {}; * Triggers mouse constraint events * @method _triggerEvents * @private - * @param {mouse} mouse + * @param {mouse} mouseConstraint */ var _triggerEvents = function(mouseConstraint) { var mouse = mouseConstraint.mouse, @@ -4159,7 +4196,7 @@ var Common = {}; /** * Description * @method now - * @return {number} the current timestamp (high-res if avaliable) + * @return {number} the current timestamp (high-res if available) */ Common.now = function() { // http://stackoverflow.com/questions/221294/how-do-you-get-a-timestamp-in-javascript @@ -4268,6 +4305,7 @@ var Common = {}; })(); + ; // End src/core/Common.js @@ -4294,7 +4332,7 @@ var Engine = {}; /** * Creates a new engine. The options parameter is an object that specifies any properties you wish to override the defaults. * All properties have default values, and many are pre-calculated automatically based on other properties. - * See the properites section below for detailed information on what you can pass via the `options` object. + * See the properties section below for detailed information on what you can pass via the `options` object. * @method create * @param {HTMLElement} element * @param {object} [options] @@ -4324,10 +4362,6 @@ var Engine = {}; isFixed: false, frameRequestId: 0 }, - render: { - element: element, - controller: Render - }, broadphase: { controller: Grid } @@ -4335,7 +4369,17 @@ var Engine = {}; var engine = Common.extend(defaults, options); - engine.render = engine.render.controller.create(engine.render); + if (element && !engine.render) { + engine.render = { + element: element, + controller: Render + }; + } + + if (engine.render && engine.render.controller) { + engine.render = engine.render.controller.create(engine.render); + } + engine.world = World.create(engine.world); engine.pairs = Pairs.create(); engine.broadphase = engine.broadphase.controller.create(engine.broadphase); @@ -4461,8 +4505,7 @@ var Engine = {}; /** * Renders the world by calling its defined renderer `engine.render.controller`. Triggers `beforeRender` and `afterRender` events. * @method render - * @param {engine} engineA - * @param {engine} engineB + * @param {engine} engine */ Engine.render = function(engine) { // create an event object @@ -4772,8 +4815,8 @@ var Engine = {}; /** * A `Boolean` that specifies if the `Engine.run` game loop should use a fixed timestep (otherwise it is variable). - * If timing is fixed, then the apparant simulation speed will change depending on the frame rate (but behaviour will be deterministic). - * If the timing is variable, then the apparant simulation speed will be constant (approximately, but at the cost of determininism). + * If timing is fixed, then the apparent simulation speed will change depending on the frame rate (but behaviour will be deterministic). + * If the timing is variable, then the apparent simulation speed will be constant (approximately, but at the cost of determininism). * * @property timing.isFixed * @type boolean @@ -4783,7 +4826,7 @@ var Engine = {}; /** * A `Number` that specifies the time step between updates in milliseconds. * If `engine.timing.isFixed` is set to `true`, then `delta` is fixed. - * If it is `false`, then `delta` can dynamically change to maintain the correct apparant simulation speed. + * If it is `false`, then `delta` can dynamically change to maintain the correct apparent simulation speed. * * @property timing.delta * @type number @@ -4833,6 +4876,7 @@ var Engine = {}; })(); + ; // End src/core/Engine.js @@ -5097,6 +5141,7 @@ var Mouse = {}; * Sets the offset * @method setOffset * @param {mouse} mouse + * @param {vector} offset */ Mouse.setOffset = function(mouse, offset) { mouse.offset.x = offset.x; @@ -5109,6 +5154,7 @@ var Mouse = {}; * Sets the scale * @method setScale * @param {mouse} mouse + * @param {vector} scale */ Mouse.setScale = function(mouse, scale) { mouse.scale.x = scale.x; @@ -5171,6 +5217,11 @@ var Runner = {}; (function() { + if (typeof window === 'undefined') { + // TODO: support Runner on non-browser environments. + return; + } + var _fps = 60, _deltaSampleSize = _fps, _delta = 1000 / _fps; @@ -5383,6 +5434,8 @@ var Sleeping = {}; * @param {boolean} isSleeping */ Sleeping.set = function(body, isSleeping) { + var wasSleeping = body.isSleeping; + if (isSleeping) { body.isSleeping = true; body.sleepCounter = body.sleepThreshold; @@ -5397,9 +5450,17 @@ var Sleeping = {}; body.speed = 0; body.angularSpeed = 0; body.motion = 0; + + if (!wasSleeping) { + Events.trigger(body, 'sleepStart'); + } } else { body.isSleeping = false; body.sleepCounter = 0; + + if (wasSleeping) { + Events.trigger(body, 'sleepEnd'); + } } }; @@ -7171,7 +7232,7 @@ var Render = {}; /** * Creates a new renderer. The options parameter is an object that specifies any properties you wish to override the defaults. * All properties have default values, and many are pre-calculated automatically based on other properties. - * See the properites section below for detailed information on what you can pass via the `options` object. + * See the properties section below for detailed information on what you can pass via the `options` object. * @method create * @param {object} [options] * @return {render} A new renderer diff --git a/build/matter.min.js b/build/matter.min.js index 869b1a1..9e430d5 100644 --- a/build/matter.min.js +++ b/build/matter.min.js @@ -1,9 +1,9 @@ /** -* matter.min.js edge-master 2015-05-22 +* matter.min.js edge-master 2015-06-29 * http://brm.io/matter-js/ * License: MIT */ -!function(){var a={},b={};!function(){b._inertiaScale=4;var a=1,c=-1,d=1;b.create=function(a){var b={id:p.nextId(),type:"body",label:"Body",parts:[],angle:0,vertices:B.fromPath("L 0 0 L 40 0 L 40 40 L 0 40"),position:{x:0,y:0},force:{x:0,y:0},torque:0,positionImpulse:{x:0,y:0},constraintImpulse:{x:0,y:0,angle:0},totalContacts:0,speed:0,angularSpeed:0,velocity:{x:0,y:0},angularVelocity:0,isStatic:!1,isSleeping:!1,motion:0,sleepThreshold:60,density:.001,restitution:0,friction:.1,frictionStatic:.5,frictionAir:.01,collisionFilter:{category:1,mask:4294967295,group:0},slop:.05,timeScale:1,render:{visible:!0,sprite:{xScale:1,yScale:1},lineWidth:1.5}},c=p.extend(b,a);return e(c,a),c},b.nextGroup=function(b){return b?c--:a++},b.nextCategory=function(){return d<<=1};var e=function(a,c){b.set(a,{bounds:a.bounds||y.create(a.vertices),positionPrev:a.positionPrev||A.clone(a.position),anglePrev:a.anglePrev||a.angle,vertices:a.vertices,parts:a.parts||[a],isStatic:a.isStatic,isSleeping:a.isSleeping,parent:a.parent||a}),B.rotate(a.vertices,a.angle,a.position),x.rotate(a.axes,a.angle),y.update(a.bounds,a.vertices,a.velocity),b.set(a,{axes:c.axes||a.axes,area:c.area||a.area,mass:c.mass||a.mass,inertia:c.inertia||a.inertia});var d=a.isStatic?"#eeeeee":p.choose(["#556270","#4ECDC4","#C7F464","#FF6B6B","#C44D58"]),e=p.shadeColor(d,-20);a.render.fillStyle=a.render.fillStyle||d,a.render.strokeStyle=a.render.strokeStyle||e};b.set=function(a,c,d){var e;"string"==typeof c&&(e=c,c={},c[e]=d);for(e in c)if(d=c[e],c.hasOwnProperty(e))switch(e){case"isStatic":b.setStatic(a,d);break;case"isSleeping":u.set(a,d);break;case"mass":b.setMass(a,d);break;case"density":b.setDensity(a,d);break;case"inertia":b.setInertia(a,d);break;case"vertices":b.setVertices(a,d);break;case"position":b.setPosition(a,d);break;case"angle":b.setAngle(a,d);break;case"velocity":b.setVelocity(a,d);break;case"angularVelocity":b.setAngularVelocity(a,d);break;case"parts":b.setParts(a,d);break;default:a[e]=d}},b.setStatic=function(a,b){for(var c=0;c0&&A.rotateAbout(e.position,c,a.position,e.position)}},b.setVelocity=function(a,b){a.positionPrev.x=a.position.x-b.x,a.positionPrev.y=a.position.y-b.y,a.velocity.x=b.x,a.velocity.y=b.y,a.speed=A.magnitude(a.velocity)},b.setAngularVelocity=function(a,b){a.anglePrev=a.angle-b,a.angularVelocity=b,a.angularSpeed=Math.abs(a.angularVelocity)},b.translate=function(a,c){b.setPosition(a,A.add(a.position,c))},b.rotate=function(a,c){b.setAngle(a,a.angle+c)},b.scale=function(a,c,d){for(var e=0;e0&&(j.position.x+=a.velocity.x,j.position.y+=a.velocity.y),0!==a.angularVelocity&&(B.rotate(j.vertices,a.angularVelocity,a.position),x.rotate(j.axes,a.angularVelocity),i>0&&A.rotateAbout(j.position,a.angularVelocity,a.position,j.position)),y.update(j.bounds,j.vertices,a.velocity)}},b.applyForce=function(a,b,c){a.force.x+=c.x,a.force.y+=c.y;var d={x:b.x-a.position.x,y:b.y-a.position.y};a.torque+=(d.x*c.y-d.y*c.x)*a.inverseInertia};var f=function(a){for(var b={mass:0,area:0,inertia:0,centre:{x:0,y:0}},c=1===a.parts.length?0:1;c1?1:0;j1?1:0;l0:0!==(a.mask&b.category)&&0!==(b.mask&a.category)}}();var g={};!function(){g.create=function(a){var b={controller:g,detector:f.collisions,buckets:{},pairs:{},pairsList:[],bucketWidth:48,bucketHeight:48};return p.extend(b,a)},g.update=function(c,f,g,h){var l,m,n,o,p,q=g.world,r=c.buckets,s=!1;for(l=0;lq.bounds.width||t.bounds.max.y<0||t.bounds.min.y>q.bounds.height)){var u=b(c,t);if(!t.region||u.id!==t.region.id||h){(!t.region||h)&&(t.region=u);var v=a(u,t.region);for(m=v.startCol;m<=v.endCol;m++)for(n=v.startRow;n<=v.endRow;n++){p=d(m,n),o=r[p];var w=m>=u.startCol&&m<=u.endCol&&n>=u.startRow&&n<=u.endRow,x=m>=t.region.startCol&&m<=t.region.endCol&&n>=t.region.startRow&&n<=t.region.endRow;!w&&x&&x&&o&&j(c,o,t),(t.region===u||w&&!x||h)&&(o||(o=e(r,p)),i(c,o,t))}t.region=u,s=!0}}}s&&(c.pairsList=k(c))},g.clear=function(a){a.buckets={},a.pairs={},a.pairsList=[]};var a=function(a,b){var d=Math.min(a.startCol,b.startCol),e=Math.max(a.endCol,b.endCol),f=Math.min(a.startRow,b.startRow),g=Math.max(a.endRow,b.endRow);return c(d,e,f,g)},b=function(a,b){var d=b.bounds,e=Math.floor(d.min.x/a.bucketWidth),f=Math.floor(d.max.x/a.bucketWidth),g=Math.floor(d.min.y/a.bucketHeight),h=Math.floor(d.max.y/a.bucketHeight);return c(e,f,g,h)},c=function(a,b,c,d){return{id:a+","+b+","+c+","+d,startCol:a,endCol:b,startRow:c,endRow:d}},d=function(a,b){return a+","+b},e=function(a,b){var c=a[b]=[];return c},i=function(a,b,c){for(var d=0;d0?d.push(c):delete a.pairs[b[e]];return d}}();var h={};!function(){h.create=function(a,b){var c=a.bodyA,d=a.bodyB,e=a.parentA,f=a.parentB,g={id:h.id(c,d),bodyA:c,bodyB:d,contacts:{},activeContacts:[],separation:0,isActive:!0,timeCreated:b,timeUpdated:b,inverseMass:e.inverseMass+f.inverseMass,friction:Math.min(e.friction,f.friction),frictionStatic:Math.max(e.frictionStatic,f.frictionStatic),restitution:Math.max(e.restitution,f.restitution),slop:Math.max(e.slop,f.slop)};return h.update(g,a,b),g},h.update=function(a,b,c){var d=a.contacts,f=b.supports,g=a.activeContacts,i=b.parentA,j=b.parentB;if(a.collision=b,a.inverseMass=i.inverseMass+j.inverseMass,a.friction=Math.min(i.friction,j.friction),a.frictionStatic=Math.max(i.frictionStatic,j.frictionStatic),a.restitution=Math.max(i.restitution,j.restitution),a.slop=Math.max(i.slop,j.slop),g.length=0,b.collided){for(var k=0;ka&&j.push(g);for(g=0;gk.friction*k.frictionStatic*I*c&&(J=k.friction*G*c,K=F);var L=A.cross(x,q),M=A.cross(y,q),N=n.inverseMass+o.inverseMass+n.inverseInertia*L*L+o.inverseInertia*M*M;if(H*=t/N,J*=t/(1+N),0>D&&D*D>l._restingThresh*c)v.normalImpulse=0,v.tangentImpulse=0;else{var O=v.normalImpulse;v.normalImpulse=Math.min(v.normalImpulse+H,0),H=v.normalImpulse-O;var P=v.tangentImpulse;v.tangentImpulse=p.clamp(v.tangentImpulse+J,-K,K),J=v.tangentImpulse-P}d.x=q.x*H+r.x*J,d.y=q.y*H+r.y*J,n.isStatic||n.isSleeping||(n.positionPrev.x+=d.x*n.inverseMass,n.positionPrev.y+=d.y*n.inverseMass,n.anglePrev+=A.cross(x,d)*n.inverseInertia),o.isStatic||o.isSleeping||(o.positionPrev.x-=d.x*o.inverseMass,o.positionPrev.y-=d.y*o.inverseMass,o.anglePrev-=A.cross(y,d)*o.inverseInertia)}}}}}();var m={};!function(){m.collides=function(b,d,e){var f,g,h,i,j=e,k=!1;if(j){var l=b.parent,m=d.parent,n=l.speed*l.speed+l.angularSpeed*l.angularSpeed+m.speed*m.speed+m.angularSpeed*m.angularSpeed;k=j&&j.collided&&.2>n,i=j}else i={collided:!1,bodyA:b,bodyB:d};if(j&&k){var o=i.axisBody,p=o===b?d:b,q=[o.axes[j.axisNumber]];if(h=a(o.vertices,p.vertices,q),i.reused=!0,h.overlap<=0)return i.collided=!1,i}else{if(f=a(b.vertices,d.vertices,b.axes),f.overlap<=0)return i.collided=!1,i;if(g=a(d.vertices,b.vertices,d.axes),g.overlap<=0)return i.collided=!1,i;f.overlap0&&(i.normal=A.neg(i.normal)),i.tangent=A.perp(i.normal),i.penetration={x:i.normal.x*i.depth,y:i.normal.y*i.depth};var r=c(b,d,i.normal),s=i.supports||[];if(s.length=0,B.contains(b.vertices,r[0])&&s.push(r[0]),B.contains(b.vertices,r[1])&&s.push(r[1]),s.length<2){var t=c(d,b,A.neg(i.normal));B.contains(d.vertices,t[0])&&s.push(t[0]),s.length<2&&B.contains(d.vertices,t[1])&&s.push(t[1])}return s.length<1&&(s=[r[0]]),i.supports=s,i};var a=function(a,c,d){for(var e,f,g=A._temp[0],h=A._temp[1],i={overlap:Number.MAX_VALUE},j=0;j=e)return i.overlap=e,i;ee?e=g:d>g&&(d=g)}a.min=d,a.max=e},c=function(a,b,c){for(var d,e,f,g,h=Number.MAX_VALUE,i=A._temp[0],j=b.vertices,k=a.position,l=0;ld&&(h=d,f=e);var m=f.index-1>=0?f.index-1:j.length-1;e=j[m],i.x=e.x-k.x,i.y=e.y-k.y,h=-A.dot(c,i),g=e;var n=(f.index+1)%j.length;return e=j[n],i.x=e.x-k.x,i.y=e.y-k.y,d=-A.dot(c,i),h>d&&(g=e),[f,g]}}();var n={};!function(){var a=1e-6,b=.001;n.create=function(b){var c=b;c.bodyA&&!c.pointA&&(c.pointA={x:0,y:0}),c.bodyB&&!c.pointB&&(c.pointB={x:0,y:0});var d=c.bodyA?A.add(c.bodyA.position,c.pointA):c.pointA,e=c.bodyB?A.add(c.bodyB.position,c.pointB):c.pointB,f=A.magnitude(A.sub(d,e));c.length=c.length||f||a;var g={visible:!0,lineWidth:2,strokeStyle:"#666"};return c.render=p.extend(g,c.render),c.id=c.id||p.nextId(),c.label=c.label||"Constraint",c.type="constraint",c.stiffness=c.stiffness||1,c.angularStiffness=c.angularStiffness||0,c.angleA=c.bodyA?c.bodyA.angle:c.angleA,c.angleB=c.bodyB?c.bodyB.angle:c.angleB,c},n.solveAll=function(a,b){for(var c=0;c0&&(B=0);var C,D={x:n.x*B,y:n.y*B};e&&!e.isStatic&&(C=A.cross(s,D)*e.inverseInertia*(1-c.angularStiffness),u.set(e,!1),C=p.clamp(C,-.01,.01),e.constraintImpulse.x-=o.x,e.constraintImpulse.y-=o.y,e.constraintImpulse.angle+=C,e.position.x-=o.x,e.position.y-=o.y,e.angle+=C),f&&!f.isStatic&&(C=A.cross(t,D)*f.inverseInertia*(1-c.angularStiffness),u.set(f,!1),C=p.clamp(C,-.01,.01),f.constraintImpulse.x+=o.x,f.constraintImpulse.y+=o.y,f.constraintImpulse.angle-=C,f.position.x+=o.x,f.position.y+=o.y,f.angle-=C)}}},n.postSolveAll=function(a){for(var b=0;b0&&(f.position.x+=d.x,f.position.y+=d.y),0!==d.angle&&(B.rotate(f.vertices,d.angle,c.position),x.rotate(f.axes,d.angle),e>0&&A.rotateAbout(f.position,d.angle,c.position,f.position)),y.update(f.bounds,f.vertices)}d.angle=0,d.x=0,d.y=0}}}();var o={};!function(){o.create=function(b,d){var e=(b?b.mouse:null)||(d?d.mouse:null);!e&&b&&b.render&&b.render.canvas?e=s.create(b.render.canvas):(e=s.create(),p.log("MouseConstraint.create: options.mouse was undefined, engine.render.canvas was undefined, may not function as expected","warn"));var f=n.create({label:"Mouse Constraint",pointA:e.position,pointB:{x:0,y:0},length:.01,stiffness:.1,angularStiffness:1,render:{strokeStyle:"#90EE90",lineWidth:3}}),g={type:"mouseConstraint",mouse:e,body:null,constraint:f,collisionFilter:{category:1,mask:4294967295,group:0}},h=p.extend(g,d);return r.on(b,"tick",function(){var d=c.allBodies(b.world);o.update(h,d),a(h)}),h},o.update=function(a,b){var c=a.mouse,d=a.constraint,e=a.body;if(0===c.button){if(d.bodyB)u.set(d.bodyB,!1),d.pointA=c.position;else for(var g=0;g1?1:0;h>16)+d,f=(c>>8&255)+d,g=(255&c)+d;return"#"+(16777216+65536*(255>e?1>e?0:e:255)+256*(255>f?1>f?0:f:255)+(255>g?1>g?0:g:255)).toString(16).slice(1)},p.shuffle=function(a){for(var b=a.length-1;b>0;b--){var c=Math.floor(p.random()*(b+1)),d=a[b];a[b]=a[c],a[c]=d}return a},p.choose=function(a){return a[Math.floor(p.random()*a.length)]},p.isElement=function(a){try{return a instanceof HTMLElement}catch(b){return"object"==typeof a&&1===a.nodeType&&"object"==typeof a.style&&"object"==typeof a.ownerDocument}},p.isArray=function(a){return"[object Array]"===Object.prototype.toString.call(a)},p.clamp=function(a,b,c){return b>a?b:a>c?c:a},p.sign=function(a){return 0>a?-1:1},p.now=function(){var a=window.performance||{};return a.now=function(){return a.now||a.webkitNow||a.msNow||a.oNow||a.mozNow||function(){return+new Date}}(),a.now()},p.random=function(b,c){return b="undefined"!=typeof b?b:0,c="undefined"!=typeof c?c:1,b+a()*(c-b)},p.colorToNumber=function(a){return a=a.replace("#",""),3==a.length&&(a=a.charAt(0)+a.charAt(0)+a.charAt(1)+a.charAt(1)+a.charAt(2)+a.charAt(2)),parseInt(a,16)},p.log=function(a,b){if(console&&console.log&&console.warn)switch(b){case"warn":console.warn("Matter.js:",a);break;case"error":console.log("Matter.js:",a)}},p.nextId=function(){return p._nextId++},p.indexOf=function(a,b){if(a.indexOf)return a.indexOf(b);for(var c=0;c0&&r.trigger(a,"collisionStart",{pairs:v.collisionStart}),l.preSolvePosition(v.list),e=0;e0&&r.trigger(a,"collisionActive",{pairs:v.collisionActive}),v.collisionEnd.length>0&&r.trigger(a,"collisionEnd",{pairs:v.collisionEnd}),f(q),g.isModified&&c.setModified(g,!1,!1,!0),r.trigger(a,"afterUpdate",p),a},q.render=function(a){var b={timestamp:a.timing.timestamp};r.trigger(a,"beforeRender",b),a.render.controller.world(a),r.trigger(a,"afterRender",b)},q.merge=function(a,b){if(p.extend(a,b),b.world){a.world=b.world,q.clear(a);for(var d=c.allBodies(a.world),e=0;el.deltaMax?l.deltaMax:k,m=k/l.delta,l.delta=k),0!==h&&(m*=l.timeScale/h),0===l.timeScale&&(m=0),h=l.timeScale,f+=1,j-e>=1e3&&(l.fps=f*((j-e)/1e3),e=j,f=0),r.trigger(a,"tick",n),a.world.isModified&&a.render.controller.clear&&a.render.controller.clear(a.render),q.update(a,k,m),q.render(a),r.trigger(a,"afterTick",n)}}()},t.stop=function(a){e(a.timing.frameRequestId)}}();var u={};!function(){u._motionWakeThreshold=.18,u._motionSleepThreshold=.08,u._minBias=.9,u.update=function(a,b){for(var c=b*b*b,d=0;d0&&e.motion=e.sleepThreshold&&u.set(e,!0)):e.sleepCounter>0&&(e.sleepCounter-=1)}else u.set(e,!1)}},u.afterCollisions=function(a,b){for(var c=b*b*b,d=0;du._motionWakeThreshold*c&&u.set(i,!1)}}}},u.set=function(a,b){b?(a.isSleeping=!0,a.sleepCounter=a.sleepThreshold,a.positionImpulse.x=0,a.positionImpulse.y=0,a.positionPrev.x=a.position.x,a.positionPrev.y=a.position.y,a.anglePrev=a.angle,a.speed=0,a.angularSpeed=0,a.motion=0):(a.isSleeping=!1,a.sleepCounter=0)}}();var v={};!function(){v.rectangle=function(a,c,d,e,f){f=f||{};var g={label:"Rectangle Body",position:{x:a,y:c},vertices:B.fromPath("L 0 0 L "+d+" 0 L "+d+" "+e+" L 0 "+e)};if(f.chamfer){var h=f.chamfer;g.vertices=B.chamfer(g.vertices,h.radius,h.quality,h.qualityMin,h.qualityMax),delete f.chamfer}return b.create(p.extend({},g,f))},v.trapezoid=function(a,c,d,e,f,g){g=g||{},f*=.5;var h=(1-2*f)*d,i=d*f,j=i+h,k=j+i,l={label:"Trapezoid Body",position:{x:a,y:c},vertices:B.fromPath("L 0 0 L "+i+" "+-e+" L "+j+" "+-e+" L "+k+" 0")};if(g.chamfer){var m=g.chamfer;l.vertices=B.chamfer(l.vertices,m.radius,m.quality,m.qualityMin,m.qualityMax),delete g.chamfer}return b.create(p.extend({},l,g))},v.circle=function(a,b,c,d,e){d=d||{},d.label="Circle Body",e=e||25;var f=Math.ceil(Math.max(10,Math.min(e,c)));return f%2===1&&(f+=1),d.circleRadius=c,v.polygon(a,b,f,c,d)},v.polygon=function(a,c,d,e,f){if(f=f||{},3>d)return v.circle(a,c,e,f);for(var g=2*Math.PI/d,h="",i=.5*g,j=0;d>j;j+=1){var k=i+j*g,l=Math.cos(k)*e,m=Math.sin(k)*e;h+="L "+l.toFixed(3)+" "+m.toFixed(3)+" "}var n={label:"Polygon Body",position:{x:a,y:c},vertices:B.fromPath(h)};if(f.chamfer){var o=f.chamfer;n.vertices=B.chamfer(n.vertices,o.radius,o.quality,o.qualityMin,o.qualityMax),delete f.chamfer}return b.create(p.extend({},n,f))},v.fromVertices=function(a,c,d,e,f,g,h){var i,j,k,l,m,n,o,q,r;for(e=e||{},j=[],f="undefined"!=typeof f?f:!1,g="undefined"!=typeof g?g:.01,h="undefined"!=typeof h?h:10,window.decomp||p.log("Bodies.fromVertices: poly-decomp.js required. Could not decompose vertices. Fallback to convex hull.","warn"),p.isArray(d[0])||(d=[d]),q=0;q0&&B.area(v)E&&w>F&&(C[o].isInternal=!0,D[r].isInternal=!0)}}}}}return j.length>1?(i=b.create(p.extend({parts:j.slice(0)},e)),b.setPosition(i,{x:a,y:c}),i):j[0]}}();var w={};!function(){w.stack=function(a,d,e,f,g,h,i){for(var j,k=c.create({label:"Stack"}),l=a,m=d,n=0,o=0;f>o;o++){for(var p=0,q=0;e>q;q++){var r=i(l,m,q,o,j,n);if(r){var s=r.bounds.max.y-r.bounds.min.y,t=r.bounds.max.x-r.bounds.min.x;s>p&&(p=s),b.translate(r,{x:.5*t,y:.5*s}),l=r.bounds.max.x+g,c.addBody(k,r),j=r,n+=1}else l+=g}m+=p+h,l=a}return k},w.chain=function(a,b,d,e,f,g){for(var h=a.bodies,i=1;ig;g++){for(h=1;b>h;h++)i=l[h-1+g*b],j=l[h+g*b],c.addConstraint(a,n.create(p.extend({bodyA:i,bodyB:j},f)));if(g>0)for(h=0;b>h;h++)i=l[h+(g-1)*b],j=l[h+g*b],c.addConstraint(a,n.create(p.extend({bodyA:i,bodyB:j},f))),e&&h>0&&(k=l[h-1+(g-1)*b],c.addConstraint(a,n.create(p.extend({bodyA:k,bodyB:j},f)))),e&&b-1>h&&(k=l[h+1+(g-1)*b],c.addConstraint(a,n.create(p.extend({bodyA:k,bodyB:j},f))))}return a.label+=" Mesh",a},w.pyramid=function(a,c,d,e,f,g,h){return w.stack(a,c,d,e,f,g,function(c,g,i,j,k,l){var m=Math.min(e,Math.ceil(d/2)),n=k?k.bounds.max.x-k.bounds.min.x:0;if(!(j>m)){j=m-j;var o=j,p=d-1-j;if(!(o>i||i>p)){1===l&&b.translate(k,{x:(i+(d%2===1?1:-1))*n,y:0});var q=k?i*n:0;return h(a+q+i*f,g,i,j,k,l)}}})},w.newtonsCradle=function(a,b,d,e,f){for(var g=c.create({label:"Newtons Cradle"}),h=0;d>h;h++){var i=1.9,j=v.circle(a+h*e*i,b+f,e,{inertia:99999,restitution:1,friction:0,frictionAir:1e-4,slop:.01}),k=n.create({pointA:{x:a+h*e*i,y:b},bodyB:j});c.addBody(g,j),c.addConstraint(g,k)}return g},w.car=function(a,d,e,f,g){var h=b.nextGroup(!0),i=-20,j=.5*-e+i,k=.5*e-i,l=0,m=c.create({label:"Car"}),o=v.trapezoid(a,d,e,f,.3,{collisionFilter:{group:h},friction:.01,chamfer:{radius:10}}),p=v.circle(a+j,d+l,g,{collisionFilter:{group:h},restitution:.5,friction:.9,frictionStatic:10,slop:.5,density:.01}),q=v.circle(a+k,d+l,g,{collisionFilter:{group:h},restitution:.5,friction:.9,frictionStatic:10,slop:.5,density:.01}),r=n.create({bodyA:o,pointA:{x:j,y:l},bodyB:p,stiffness:.5}),s=n.create({bodyA:o,pointA:{x:k,y:l},bodyB:q,stiffness:.5});return c.addBody(m,o),c.addBody(m,p),c.addBody(m,q),c.addConstraint(m,r),c.addConstraint(m,s),m},w.softBody=function(a,b,c,d,e,f,g,h,i,j){i=p.extend({inertia:1/0},i),j=p.extend({stiffness:.4},j);var k=w.stack(a,b,c,d,e,f,function(a,b){return v.circle(a,b,h,i)});return w.mesh(k,c,d,g,j),k.label="Soft Body",k}}();var x={};!function(){x.fromVertices=function(a){for(var b={},c=0;ca.max.x&&(a.max.x=e.x),e.xa.max.y&&(a.max.y=e.y),e.y0?a.max.x+=c.x:a.min.x+=c.x,c.y>0?a.max.y+=c.y:a.min.y+=c.y)},y.contains=function(a,b){return b.x>=a.min.x&&b.x<=a.max.x&&b.y>=a.min.y&&b.y<=a.max.y},y.overlaps=function(a,b){return a.min.x<=b.max.x&&a.max.x>=b.min.x&&a.max.y>=b.min.y&&a.min.y<=b.max.y},y.translate=function(a,b){a.min.x+=b.x,a.max.x+=b.x,a.min.y+=b.y,a.max.y+=b.y},y.shift=function(a,b){var c=a.max.x-a.min.x,d=a.max.y-a.min.y;a.min.x=b.x,a.max.x=b.x+c,a.min.y=b.y,a.max.y=b.y+d}}();var z={};!function(){z.pathToVertices=function(b,c){var d,e,f,g,h,i,j,k,l,m,n=[],o=0,p=0,q=0;c=c||15;var r=function(a,b,c){var d=c%2===1&&c>1;if(!l||a!=l.x||b!=l.y){l&&d?(lx=l.x,ly=l.y):(lx=0,ly=0);var e={x:lx+a,y:ly+b};(d||!l)&&(l=e),n.push(e),p=lx+a,q=ly+b}},s=function(a){var b=a.pathSegTypeAsLetter.toUpperCase();if("Z"!==b){switch(b){case"M":case"L":case"T":case"C":case"S":case"Q":p=a.x,q=a.y;break;case"H":p=a.x;break;case"V":q=a.y}r(p,q,a.pathSegType)}};for(a(b),f=b.getTotalLength(),i=[],d=0;do;){if(m=b.getPathSegAtLength(o),h=i[m],h!=k){for(;j.length&&j[0]!=h;)s(j.shift());k=h}switch(h.pathSegTypeAsLetter.toUpperCase()){case"C":case"T":case"S":case"Q":case"A":g=b.getPointAtLength(o),r(g.x,g.y,0)}o+=c}for(d=0,e=j.length;e>d;++d)s(j[d]);return n};var a=function(a){for(var b,c,d,e,f,g,h=a.pathSegList,i=0,j=0,k=h.numberOfItems,l=0;k>l;++l){var m=h.getItem(l),n=m.pathSegTypeAsLetter;if(/[MLHVCSQTA]/.test(n))"x"in m&&(i=m.x),"y"in m&&(j=m.y);else switch("x1"in m&&(d=i+m.x1),"x2"in m&&(f=i+m.x2),"y1"in m&&(e=j+m.y1),"y2"in m&&(g=j+m.y2),"x"in m&&(i+=m.x),"y"in m&&(j+=m.y),n){case"m":h.replaceItem(a.createSVGPathSegMovetoAbs(i,j),l);break;case"l":h.replaceItem(a.createSVGPathSegLinetoAbs(i,j),l);break;case"h":h.replaceItem(a.createSVGPathSegLinetoHorizontalAbs(i),l);break;case"v":h.replaceItem(a.createSVGPathSegLinetoVerticalAbs(j),l);break;case"c":h.replaceItem(a.createSVGPathSegCurvetoCubicAbs(i,j,d,e,f,g),l);break;case"s":h.replaceItem(a.createSVGPathSegCurvetoCubicSmoothAbs(i,j,f,g),l);break;case"q":h.replaceItem(a.createSVGPathSegCurvetoQuadraticAbs(i,j,d,e),l);break;case"t":h.replaceItem(a.createSVGPathSegCurvetoQuadraticSmoothAbs(i,j),l);break;case"a":h.replaceItem(a.createSVGPathSegArcAbs(i,j,m.r1,m.r2,m.angle,m.largeArcFlag,m.sweepFlag),l);break;case"z":case"Z":i=b,j=c}("M"==n||"m"==n)&&(b=i,c=j)}}}();var A={};!function(){A.create=function(a,b){return{x:a||0,y:b||0}},A.clone=function(a){return{x:a.x,y:a.y}},A.magnitude=function(a){return Math.sqrt(a.x*a.x+a.y*a.y)},A.magnitudeSquared=function(a){return a.x*a.x+a.y*a.y},A.rotate=function(a,b){var c=Math.cos(b),d=Math.sin(b);return{x:a.x*c-a.y*d,y:a.x*d+a.y*c}},A.rotateAbout=function(a,b,c,d){var e=Math.cos(b),f=Math.sin(b);d||(d={});var g=c.x+((a.x-c.x)*e-(a.y-c.y)*f);return d.y=c.y+((a.x-c.x)*f+(a.y-c.y)*e),d.x=g,d},A.normalise=function(a){var b=A.magnitude(a);return 0===b?{x:0,y:0}:{x:a.x/b,y:a.y/b}},A.dot=function(a,b){return a.x*b.x+a.y*b.y},A.cross=function(a,b){return a.x*b.y-a.y*b.x},A.cross3=function(a,b,c){return(b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x)},A.add=function(a,b,c){return c||(c={}),c.x=a.x+b.x,c.y=a.y+b.y,c},A.sub=function(a,b,c){return c||(c={}),c.x=a.x-b.x,c.y=a.y-b.y,c},A.mult=function(a,b){return{x:a.x*b,y:a.y*b}},A.div=function(a,b){return{x:a.x/b,y:a.y/b}},A.perp=function(a,b){return b=b===!0?-1:1,{x:b*-a.y,y:b*a.x}},A.neg=function(a){return{x:-a.x,y:-a.y}},A.angle=function(a,b){return Math.atan2(b.y-a.y,b.x-a.x)},A._temp=[A.create(),A.create(),A.create(),A.create(),A.create(),A.create()]}();var B={};!function(){B.create=function(a,b){for(var c=[],d=0;d0)return!1}return!0},B.scale=function(a,b,c,d){if(1===b&&1===c)return a;d=d||B.centre(a);for(var e,f,g=0;g=0?g-1:a.length-1],i=a[g],j=a[(g+1)%a.length],k=b[gv;v++)f.push(A.add(A.rotate(o,u*v),r))}else f.push(i)}return f},B.clockwiseSort=function(a){var b=B.mean(a);return a.sort(function(a,c){return A.angle(b,a)-A.angle(b,c)}),a},B.isConvex=function(a){var b,c,d,e,f=0,g=a.length;if(3>g)return null;for(b=0;g>b;b++)if(c=(b+1)%g,d=(b+2)%g,e=(a[c].x-a[b].x)*(a[d].y-a[c].y),e-=(a[c].y-a[b].y)*(a[d].x-a[c].x),0>e?f|=1:e>0&&(f|=2),3===f)return!1;return 0!==f?!0:null},B.hull=function(a){var b,c,d=[],e=[];for(a=a.slice(0),a.sort(function(a,b){var c=a.x-b.x;return 0!==c?c:a.y-b.y}),c=0;c=2&&A.cross3(e[e.length-2],e[e.length-1],b)<=0;)e.pop();e.push(b)}for(c=a.length-1;c>=0;c--){for(b=a[c];d.length>=2&&A.cross3(d[d.length-2],d[d.length-1],b)<=0;)d.pop();d.push(b)}return d.pop(),e.pop(),d.concat(e)}}();var C={};!function(){C.create=function(b){var c={controller:C,element:null,canvas:null,options:{width:800,height:600,pixelRatio:1,background:"#fafafa",wireframeBackground:"#222",hasBounds:!1,enabled:!0,wireframes:!0,showSleeping:!0,showDebug:!1,showBroadphase:!1,showBounds:!1,showVelocity:!1,showCollisions:!1,showSeparations:!1,showAxes:!1,showPositions:!1,showAngleIndicator:!1,showIds:!1,showShadows:!1,showVertexNumbers:!1,showConvexHulls:!1,showInternalEdges:!1}},d=p.extend(c,b);return d.canvas=d.canvas||a(d.options.width,d.options.height),d.context=d.canvas.getContext("2d"),d.textures={},d.bounds=d.bounds||{min:{x:0,y:0},max:{x:d.options.width,y:d.options.height}},1!==d.options.pixelRatio&&C.setPixelRatio(d,d.options.pixelRatio),p.isElement(d.element)?d.element.appendChild(d.canvas):p.log("Render.create: options.element was undefined, render.canvas was created but not appended","warn"),d},C.setPixelRatio=function(a,c){var d=a.options,e=a.canvas;"auto"===c&&(c=b(e)),d.pixelRatio=c,e.setAttribute("data-pixel-ratio",c),e.width=d.width*c,e.height=d.height*c,e.style.width=d.width+"px",e.style.height=d.height+"px",a.context.scale(c,c)},C.world=function(a){var b,d=a.render,f=a.world,h=d.canvas,i=d.context,j=d.options,k=c.allBodies(f),l=c.allConstraints(f),m=j.wireframes?j.wireframeBackground:j.background,n=[],o=[];if(d.currentBackground!==m&&e(d,m),i.globalCompositeOperation="source-in",i.fillStyle="transparent",i.fillRect(0,0,h.width,h.height),i.globalCompositeOperation="source-over",j.hasBounds){var p=d.bounds.max.x-d.bounds.min.x,q=d.bounds.max.y-d.bounds.min.y,r=p/j.width,s=q/j.height;for(b=0;b=500){var i="";i+="fps: "+Math.round(a.timing.fps)+h,f.debugString=i,f.debugTimestamp=a.timing.timestamp}if(f.debugString){d.font="12px Arial",d.fillStyle=g.wireframes?"rgba(255,255,255,0.5)":"rgba(0,0,0,0.5)";for(var j=f.debugString.split("\n"),k=0;k1?1:0;k1?1:0;h1?1:0;f1?1:0;j1?1:0;f1?1:0;f1?1:0;e0)){var l=d.activeContacts[0].vertex.x,m=d.activeContacts[0].vertex.y;2===d.activeContacts.length&&(l=(d.activeContacts[0].vertex.x+d.activeContacts[1].vertex.x)/2,m=(d.activeContacts[0].vertex.y+d.activeContacts[1].vertex.y)/2),e.bodyB===e.supports[0].body||e.bodyA.isStatic===!0?h.moveTo(l-8*e.normal.x,m-8*e.normal.y):h.moveTo(l+8*e.normal.x,m+8*e.normal.y),h.lineTo(l,m)}h.strokeStyle=i.wireframes?"rgba(255,165,0,0.7)":"orange",h.lineWidth=1,h.stroke()},C.separations=function(a,b,c){var d,e,f,g,h,i=c,j=a.render.options;for(i.beginPath(),h=0;h1?1:0;l0&&A.rotateAbout(e.position,c,a.position,e.position)}},b.setVelocity=function(a,b){a.positionPrev.x=a.position.x-b.x,a.positionPrev.y=a.position.y-b.y,a.velocity.x=b.x,a.velocity.y=b.y,a.speed=A.magnitude(a.velocity)},b.setAngularVelocity=function(a,b){a.anglePrev=a.angle-b,a.angularVelocity=b,a.angularSpeed=Math.abs(a.angularVelocity)},b.translate=function(a,c){b.setPosition(a,A.add(a.position,c))},b.rotate=function(a,c){b.setAngle(a,a.angle+c)},b.scale=function(a,c,d){for(var e=0;e0&&(j.position.x+=a.velocity.x,j.position.y+=a.velocity.y),0!==a.angularVelocity&&(B.rotate(j.vertices,a.angularVelocity,a.position),x.rotate(j.axes,a.angularVelocity),i>0&&A.rotateAbout(j.position,a.angularVelocity,a.position,j.position)),y.update(j.bounds,j.vertices,a.velocity)}},b.applyForce=function(a,b,c){a.force.x+=c.x,a.force.y+=c.y;var d={x:b.x-a.position.x,y:b.y-a.position.y};a.torque+=(d.x*c.y-d.y*c.x)*a.inverseInertia};var f=function(a){for(var b={mass:0,area:0,inertia:0,centre:{x:0,y:0}},c=1===a.parts.length?0:1;c1?1:0;j1?1:0;l0:0!==(a.mask&b.category)&&0!==(b.mask&a.category)}}();var g={};!function(){g.create=function(a){var b={controller:g,detector:f.collisions,buckets:{},pairs:{},pairsList:[],bucketWidth:48,bucketHeight:48};return p.extend(b,a)},g.update=function(c,f,g,h){var l,m,n,o,p,q=g.world,r=c.buckets,s=!1;for(l=0;lq.bounds.width||t.bounds.max.y<0||t.bounds.min.y>q.bounds.height)){var u=b(c,t);if(!t.region||u.id!==t.region.id||h){(!t.region||h)&&(t.region=u);var v=a(u,t.region);for(m=v.startCol;m<=v.endCol;m++)for(n=v.startRow;n<=v.endRow;n++){p=d(m,n),o=r[p];var w=m>=u.startCol&&m<=u.endCol&&n>=u.startRow&&n<=u.endRow,x=m>=t.region.startCol&&m<=t.region.endCol&&n>=t.region.startRow&&n<=t.region.endRow;!w&&x&&x&&o&&j(c,o,t),(t.region===u||w&&!x||h)&&(o||(o=e(r,p)),i(c,o,t))}t.region=u,s=!0}}}s&&(c.pairsList=k(c))},g.clear=function(a){a.buckets={},a.pairs={},a.pairsList=[]};var a=function(a,b){var d=Math.min(a.startCol,b.startCol),e=Math.max(a.endCol,b.endCol),f=Math.min(a.startRow,b.startRow),g=Math.max(a.endRow,b.endRow);return c(d,e,f,g)},b=function(a,b){var d=b.bounds,e=Math.floor(d.min.x/a.bucketWidth),f=Math.floor(d.max.x/a.bucketWidth),g=Math.floor(d.min.y/a.bucketHeight),h=Math.floor(d.max.y/a.bucketHeight);return c(e,f,g,h)},c=function(a,b,c,d){return{id:a+","+b+","+c+","+d,startCol:a,endCol:b,startRow:c,endRow:d}},d=function(a,b){return a+","+b},e=function(a,b){var c=a[b]=[];return c},i=function(a,b,c){for(var d=0;d0?d.push(c):delete a.pairs[b[e]];return d}}();var h={};!function(){h.create=function(a,b){var c=a.bodyA,d=a.bodyB,e=a.parentA,f=a.parentB,g={id:h.id(c,d),bodyA:c,bodyB:d,contacts:{},activeContacts:[],separation:0,isActive:!0,timeCreated:b,timeUpdated:b,inverseMass:e.inverseMass+f.inverseMass,friction:Math.min(e.friction,f.friction),frictionStatic:Math.max(e.frictionStatic,f.frictionStatic),restitution:Math.max(e.restitution,f.restitution),slop:Math.max(e.slop,f.slop)};return h.update(g,a,b),g},h.update=function(a,b,c){var d=a.contacts,f=b.supports,g=a.activeContacts,i=b.parentA,j=b.parentB;if(a.collision=b,a.inverseMass=i.inverseMass+j.inverseMass,a.friction=Math.min(i.friction,j.friction),a.frictionStatic=Math.max(i.frictionStatic,j.frictionStatic),a.restitution=Math.max(i.restitution,j.restitution),a.slop=Math.max(i.slop,j.slop),g.length=0,b.collided){for(var k=0;ka&&j.push(g);for(g=0;gk.friction*k.frictionStatic*I*c&&(J=k.friction*G*c,K=F);var L=A.cross(x,q),M=A.cross(y,q),N=n.inverseMass+o.inverseMass+n.inverseInertia*L*L+o.inverseInertia*M*M;if(H*=t/N,J*=t/(1+N),0>D&&D*D>l._restingThresh*c)v.normalImpulse=0,v.tangentImpulse=0;else{var O=v.normalImpulse;v.normalImpulse=Math.min(v.normalImpulse+H,0),H=v.normalImpulse-O;var P=v.tangentImpulse;v.tangentImpulse=p.clamp(v.tangentImpulse+J,-K,K),J=v.tangentImpulse-P}d.x=q.x*H+r.x*J,d.y=q.y*H+r.y*J,n.isStatic||n.isSleeping||(n.positionPrev.x+=d.x*n.inverseMass,n.positionPrev.y+=d.y*n.inverseMass,n.anglePrev+=A.cross(x,d)*n.inverseInertia),o.isStatic||o.isSleeping||(o.positionPrev.x-=d.x*o.inverseMass,o.positionPrev.y-=d.y*o.inverseMass,o.anglePrev-=A.cross(y,d)*o.inverseInertia)}}}}}();var m={};!function(){m.collides=function(b,d,e){var f,g,h,i,j=e,k=!1;if(j){var l=b.parent,m=d.parent,n=l.speed*l.speed+l.angularSpeed*l.angularSpeed+m.speed*m.speed+m.angularSpeed*m.angularSpeed;k=j&&j.collided&&.2>n,i=j}else i={collided:!1,bodyA:b,bodyB:d};if(j&&k){var o=i.axisBody,p=o===b?d:b,q=[o.axes[j.axisNumber]];if(h=a(o.vertices,p.vertices,q),i.reused=!0,h.overlap<=0)return i.collided=!1,i}else{if(f=a(b.vertices,d.vertices,b.axes),f.overlap<=0)return i.collided=!1,i;if(g=a(d.vertices,b.vertices,d.axes),g.overlap<=0)return i.collided=!1,i;f.overlap0&&(i.normal=A.neg(i.normal)),i.tangent=A.perp(i.normal),i.penetration={x:i.normal.x*i.depth,y:i.normal.y*i.depth};var r=c(b,d,i.normal),s=i.supports||[];if(s.length=0,B.contains(b.vertices,r[0])&&s.push(r[0]),B.contains(b.vertices,r[1])&&s.push(r[1]),s.length<2){var t=c(d,b,A.neg(i.normal));B.contains(d.vertices,t[0])&&s.push(t[0]),s.length<2&&B.contains(d.vertices,t[1])&&s.push(t[1])}return s.length<1&&(s=[r[0]]),i.supports=s,i};var a=function(a,c,d){for(var e,f,g=A._temp[0],h=A._temp[1],i={overlap:Number.MAX_VALUE},j=0;j=e)return i.overlap=e,i;ee?e=g:d>g&&(d=g)}a.min=d,a.max=e},c=function(a,b,c){for(var d,e,f,g,h=Number.MAX_VALUE,i=A._temp[0],j=b.vertices,k=a.position,l=0;ld&&(h=d,f=e);var m=f.index-1>=0?f.index-1:j.length-1;e=j[m],i.x=e.x-k.x,i.y=e.y-k.y,h=-A.dot(c,i),g=e;var n=(f.index+1)%j.length;return e=j[n],i.x=e.x-k.x,i.y=e.y-k.y,d=-A.dot(c,i),h>d&&(g=e),[f,g]}}();var n={};!function(){var a=1e-6,b=.001;n.create=function(b){var c=b;c.bodyA&&!c.pointA&&(c.pointA={x:0,y:0}),c.bodyB&&!c.pointB&&(c.pointB={x:0,y:0});var d=c.bodyA?A.add(c.bodyA.position,c.pointA):c.pointA,e=c.bodyB?A.add(c.bodyB.position,c.pointB):c.pointB,f=A.magnitude(A.sub(d,e));c.length=c.length||f||a;var g={visible:!0,lineWidth:2,strokeStyle:"#666"};return c.render=p.extend(g,c.render),c.id=c.id||p.nextId(),c.label=c.label||"Constraint",c.type="constraint",c.stiffness=c.stiffness||1,c.angularStiffness=c.angularStiffness||0,c.angleA=c.bodyA?c.bodyA.angle:c.angleA,c.angleB=c.bodyB?c.bodyB.angle:c.angleB,c},n.solveAll=function(a,b){for(var c=0;c0&&(B=0);var C,D={x:n.x*B,y:n.y*B};e&&!e.isStatic&&(C=A.cross(s,D)*e.inverseInertia*(1-c.angularStiffness),u.set(e,!1),C=p.clamp(C,-.01,.01),e.constraintImpulse.x-=o.x,e.constraintImpulse.y-=o.y,e.constraintImpulse.angle+=C,e.position.x-=o.x,e.position.y-=o.y,e.angle+=C),f&&!f.isStatic&&(C=A.cross(t,D)*f.inverseInertia*(1-c.angularStiffness),u.set(f,!1),C=p.clamp(C,-.01,.01),f.constraintImpulse.x+=o.x,f.constraintImpulse.y+=o.y,f.constraintImpulse.angle-=C,f.position.x+=o.x,f.position.y+=o.y,f.angle-=C)}}},n.postSolveAll=function(a){for(var b=0;b0&&(f.position.x+=d.x,f.position.y+=d.y),0!==d.angle&&(B.rotate(f.vertices,d.angle,c.position),x.rotate(f.axes,d.angle),e>0&&A.rotateAbout(f.position,d.angle,c.position,f.position)),y.update(f.bounds,f.vertices)}d.angle=0,d.x=0,d.y=0}}}();var o={};!function(){o.create=function(b,d){var e=(b?b.mouse:null)||(d?d.mouse:null);!e&&b&&b.render&&b.render.canvas?e=s.create(b.render.canvas):(e=s.create(),p.log("MouseConstraint.create: options.mouse was undefined, engine.render.canvas was undefined, may not function as expected","warn"));var f=n.create({label:"Mouse Constraint",pointA:e.position,pointB:{x:0,y:0},length:.01,stiffness:.1,angularStiffness:1,render:{strokeStyle:"#90EE90",lineWidth:3}}),g={type:"mouseConstraint",mouse:e,body:null,constraint:f,collisionFilter:{category:1,mask:4294967295,group:0}},h=p.extend(g,d);return r.on(b,"tick",function(){var d=c.allBodies(b.world);o.update(h,d),a(h)}),h},o.update=function(a,b){var c=a.mouse,d=a.constraint,e=a.body;if(0===c.button){if(d.bodyB)u.set(d.bodyB,!1),d.pointA=c.position;else for(var g=0;g1?1:0;h>16)+d,f=(c>>8&255)+d,g=(255&c)+d;return"#"+(16777216+65536*(255>e?1>e?0:e:255)+256*(255>f?1>f?0:f:255)+(255>g?1>g?0:g:255)).toString(16).slice(1)},p.shuffle=function(a){for(var b=a.length-1;b>0;b--){var c=Math.floor(p.random()*(b+1)),d=a[b];a[b]=a[c],a[c]=d}return a},p.choose=function(a){return a[Math.floor(p.random()*a.length)]},p.isElement=function(a){try{return a instanceof HTMLElement}catch(b){return"object"==typeof a&&1===a.nodeType&&"object"==typeof a.style&&"object"==typeof a.ownerDocument}},p.isArray=function(a){return"[object Array]"===Object.prototype.toString.call(a)},p.clamp=function(a,b,c){return b>a?b:a>c?c:a},p.sign=function(a){return 0>a?-1:1},p.now=function(){var a=window.performance||{};return a.now=function(){return a.now||a.webkitNow||a.msNow||a.oNow||a.mozNow||function(){return+new Date}}(),a.now()},p.random=function(b,c){return b="undefined"!=typeof b?b:0,c="undefined"!=typeof c?c:1,b+a()*(c-b)},p.colorToNumber=function(a){return a=a.replace("#",""),3==a.length&&(a=a.charAt(0)+a.charAt(0)+a.charAt(1)+a.charAt(1)+a.charAt(2)+a.charAt(2)),parseInt(a,16)},p.log=function(a,b){if(console&&console.log&&console.warn)switch(b){case"warn":console.warn("Matter.js:",a);break;case"error":console.log("Matter.js:",a)}},p.nextId=function(){return p._nextId++},p.indexOf=function(a,b){if(a.indexOf)return a.indexOf(b);for(var c=0;c0&&r.trigger(a,"collisionStart",{pairs:v.collisionStart}),l.preSolvePosition(v.list),e=0;e0&&r.trigger(a,"collisionActive",{pairs:v.collisionActive}),v.collisionEnd.length>0&&r.trigger(a,"collisionEnd",{pairs:v.collisionEnd}),f(q),g.isModified&&c.setModified(g,!1,!1,!0),r.trigger(a,"afterUpdate",p),a},q.render=function(a){var b={timestamp:a.timing.timestamp};r.trigger(a,"beforeRender",b),a.render.controller.world(a),r.trigger(a,"afterRender",b)},q.merge=function(a,b){if(p.extend(a,b),b.world){a.world=b.world,q.clear(a);for(var d=c.allBodies(a.world),e=0;el.deltaMax?l.deltaMax:k,m=k/l.delta,l.delta=k),0!==h&&(m*=l.timeScale/h),0===l.timeScale&&(m=0),h=l.timeScale,f+=1,j-e>=1e3&&(l.fps=f*((j-e)/1e3),e=j,f=0),r.trigger(a,"tick",n),a.world.isModified&&a.render.controller.clear&&a.render.controller.clear(a.render),q.update(a,k,m),q.render(a),r.trigger(a,"afterTick",n)}}()},t.stop=function(a){e(a.timing.frameRequestId)}}}();var u={};!function(){u._motionWakeThreshold=.18,u._motionSleepThreshold=.08,u._minBias=.9,u.update=function(a,b){for(var c=b*b*b,d=0;d0&&e.motion=e.sleepThreshold&&u.set(e,!0)):e.sleepCounter>0&&(e.sleepCounter-=1)}else u.set(e,!1)}},u.afterCollisions=function(a,b){for(var c=b*b*b,d=0;du._motionWakeThreshold*c&&u.set(i,!1)}}}},u.set=function(a,b){var c=a.isSleeping;b?(a.isSleeping=!0,a.sleepCounter=a.sleepThreshold,a.positionImpulse.x=0,a.positionImpulse.y=0,a.positionPrev.x=a.position.x,a.positionPrev.y=a.position.y,a.anglePrev=a.angle,a.speed=0,a.angularSpeed=0,a.motion=0,c||r.trigger(a,"sleepStart")):(a.isSleeping=!1,a.sleepCounter=0,c&&r.trigger(a,"sleepEnd"))}}();var v={};!function(){v.rectangle=function(a,c,d,e,f){f=f||{};var g={label:"Rectangle Body",position:{x:a,y:c},vertices:B.fromPath("L 0 0 L "+d+" 0 L "+d+" "+e+" L 0 "+e)};if(f.chamfer){var h=f.chamfer;g.vertices=B.chamfer(g.vertices,h.radius,h.quality,h.qualityMin,h.qualityMax),delete f.chamfer}return b.create(p.extend({},g,f))},v.trapezoid=function(a,c,d,e,f,g){g=g||{},f*=.5;var h=(1-2*f)*d,i=d*f,j=i+h,k=j+i,l={label:"Trapezoid Body",position:{x:a,y:c},vertices:B.fromPath("L 0 0 L "+i+" "+-e+" L "+j+" "+-e+" L "+k+" 0")};if(g.chamfer){var m=g.chamfer;l.vertices=B.chamfer(l.vertices,m.radius,m.quality,m.qualityMin,m.qualityMax),delete g.chamfer}return b.create(p.extend({},l,g))},v.circle=function(a,b,c,d,e){d=d||{},d.label="Circle Body",e=e||25;var f=Math.ceil(Math.max(10,Math.min(e,c)));return f%2===1&&(f+=1),d.circleRadius=c,v.polygon(a,b,f,c,d)},v.polygon=function(a,c,d,e,f){if(f=f||{},3>d)return v.circle(a,c,e,f);for(var g=2*Math.PI/d,h="",i=.5*g,j=0;d>j;j+=1){var k=i+j*g,l=Math.cos(k)*e,m=Math.sin(k)*e;h+="L "+l.toFixed(3)+" "+m.toFixed(3)+" "}var n={label:"Polygon Body",position:{x:a,y:c},vertices:B.fromPath(h)};if(f.chamfer){var o=f.chamfer;n.vertices=B.chamfer(n.vertices,o.radius,o.quality,o.qualityMin,o.qualityMax),delete f.chamfer}return b.create(p.extend({},n,f))},v.fromVertices=function(a,c,d,e,f,g,h){var i,j,k,l,m,n,o,q,r;for(e=e||{},j=[],f="undefined"!=typeof f?f:!1,g="undefined"!=typeof g?g:.01,h="undefined"!=typeof h?h:10,window.decomp||p.log("Bodies.fromVertices: poly-decomp.js required. Could not decompose vertices. Fallback to convex hull.","warn"),p.isArray(d[0])||(d=[d]),q=0;q0&&B.area(v)E&&w>F&&(C[o].isInternal=!0,D[r].isInternal=!0)}}}}}return j.length>1?(i=b.create(p.extend({parts:j.slice(0)},e)),b.setPosition(i,{x:a,y:c}),i):j[0]}}();var w={};!function(){w.stack=function(a,d,e,f,g,h,i){for(var j,k=c.create({label:"Stack"}),l=a,m=d,n=0,o=0;f>o;o++){for(var p=0,q=0;e>q;q++){var r=i(l,m,q,o,j,n);if(r){var s=r.bounds.max.y-r.bounds.min.y,t=r.bounds.max.x-r.bounds.min.x;s>p&&(p=s),b.translate(r,{x:.5*t,y:.5*s}),l=r.bounds.max.x+g,c.addBody(k,r),j=r,n+=1}else l+=g}m+=p+h,l=a}return k},w.chain=function(a,b,d,e,f,g){for(var h=a.bodies,i=1;ig;g++){for(h=1;b>h;h++)i=l[h-1+g*b],j=l[h+g*b],c.addConstraint(a,n.create(p.extend({bodyA:i,bodyB:j},f)));if(g>0)for(h=0;b>h;h++)i=l[h+(g-1)*b],j=l[h+g*b],c.addConstraint(a,n.create(p.extend({bodyA:i,bodyB:j},f))),e&&h>0&&(k=l[h-1+(g-1)*b],c.addConstraint(a,n.create(p.extend({bodyA:k,bodyB:j},f)))),e&&b-1>h&&(k=l[h+1+(g-1)*b],c.addConstraint(a,n.create(p.extend({bodyA:k,bodyB:j},f))))}return a.label+=" Mesh",a},w.pyramid=function(a,c,d,e,f,g,h){return w.stack(a,c,d,e,f,g,function(c,g,i,j,k,l){var m=Math.min(e,Math.ceil(d/2)),n=k?k.bounds.max.x-k.bounds.min.x:0;if(!(j>m)){j=m-j;var o=j,p=d-1-j;if(!(o>i||i>p)){1===l&&b.translate(k,{x:(i+(d%2===1?1:-1))*n,y:0});var q=k?i*n:0;return h(a+q+i*f,g,i,j,k,l)}}})},w.newtonsCradle=function(a,b,d,e,f){for(var g=c.create({label:"Newtons Cradle"}),h=0;d>h;h++){var i=1.9,j=v.circle(a+h*e*i,b+f,e,{inertia:99999,restitution:1,friction:0,frictionAir:1e-4,slop:.01}),k=n.create({pointA:{x:a+h*e*i,y:b},bodyB:j});c.addBody(g,j),c.addConstraint(g,k)}return g},w.car=function(a,d,e,f,g){var h=b.nextGroup(!0),i=-20,j=.5*-e+i,k=.5*e-i,l=0,m=c.create({label:"Car"}),o=v.trapezoid(a,d,e,f,.3,{collisionFilter:{group:h},friction:.01,chamfer:{radius:10}}),p=v.circle(a+j,d+l,g,{collisionFilter:{group:h},restitution:.5,friction:.9,frictionStatic:10,slop:.5,density:.01}),q=v.circle(a+k,d+l,g,{collisionFilter:{group:h},restitution:.5,friction:.9,frictionStatic:10,slop:.5,density:.01}),r=n.create({bodyA:o,pointA:{x:j,y:l},bodyB:p,stiffness:.5}),s=n.create({bodyA:o,pointA:{x:k,y:l},bodyB:q,stiffness:.5});return c.addBody(m,o),c.addBody(m,p),c.addBody(m,q),c.addConstraint(m,r),c.addConstraint(m,s),m},w.softBody=function(a,b,c,d,e,f,g,h,i,j){i=p.extend({inertia:1/0},i),j=p.extend({stiffness:.4},j);var k=w.stack(a,b,c,d,e,f,function(a,b){return v.circle(a,b,h,i)});return w.mesh(k,c,d,g,j),k.label="Soft Body",k}}();var x={};!function(){x.fromVertices=function(a){for(var b={},c=0;ca.max.x&&(a.max.x=e.x),e.xa.max.y&&(a.max.y=e.y),e.y0?a.max.x+=c.x:a.min.x+=c.x,c.y>0?a.max.y+=c.y:a.min.y+=c.y)},y.contains=function(a,b){return b.x>=a.min.x&&b.x<=a.max.x&&b.y>=a.min.y&&b.y<=a.max.y},y.overlaps=function(a,b){return a.min.x<=b.max.x&&a.max.x>=b.min.x&&a.max.y>=b.min.y&&a.min.y<=b.max.y},y.translate=function(a,b){a.min.x+=b.x,a.max.x+=b.x,a.min.y+=b.y,a.max.y+=b.y},y.shift=function(a,b){var c=a.max.x-a.min.x,d=a.max.y-a.min.y;a.min.x=b.x,a.max.x=b.x+c,a.min.y=b.y,a.max.y=b.y+d}}();var z={};!function(){z.pathToVertices=function(b,c){var d,e,f,g,h,i,j,k,l,m,n=[],o=0,p=0,q=0;c=c||15;var r=function(a,b,c){var d=c%2===1&&c>1;if(!l||a!=l.x||b!=l.y){l&&d?(lx=l.x,ly=l.y):(lx=0,ly=0);var e={x:lx+a,y:ly+b};(d||!l)&&(l=e),n.push(e),p=lx+a,q=ly+b}},s=function(a){var b=a.pathSegTypeAsLetter.toUpperCase();if("Z"!==b){switch(b){case"M":case"L":case"T":case"C":case"S":case"Q":p=a.x,q=a.y;break;case"H":p=a.x;break;case"V":q=a.y}r(p,q,a.pathSegType)}};for(a(b),f=b.getTotalLength(),i=[],d=0;do;){if(m=b.getPathSegAtLength(o),h=i[m],h!=k){for(;j.length&&j[0]!=h;)s(j.shift());k=h}switch(h.pathSegTypeAsLetter.toUpperCase()){case"C":case"T":case"S":case"Q":case"A":g=b.getPointAtLength(o),r(g.x,g.y,0)}o+=c}for(d=0,e=j.length;e>d;++d)s(j[d]);return n};var a=function(a){for(var b,c,d,e,f,g,h=a.pathSegList,i=0,j=0,k=h.numberOfItems,l=0;k>l;++l){var m=h.getItem(l),n=m.pathSegTypeAsLetter;if(/[MLHVCSQTA]/.test(n))"x"in m&&(i=m.x),"y"in m&&(j=m.y);else switch("x1"in m&&(d=i+m.x1),"x2"in m&&(f=i+m.x2),"y1"in m&&(e=j+m.y1),"y2"in m&&(g=j+m.y2),"x"in m&&(i+=m.x),"y"in m&&(j+=m.y),n){case"m":h.replaceItem(a.createSVGPathSegMovetoAbs(i,j),l);break;case"l":h.replaceItem(a.createSVGPathSegLinetoAbs(i,j),l);break;case"h":h.replaceItem(a.createSVGPathSegLinetoHorizontalAbs(i),l);break;case"v":h.replaceItem(a.createSVGPathSegLinetoVerticalAbs(j),l);break;case"c":h.replaceItem(a.createSVGPathSegCurvetoCubicAbs(i,j,d,e,f,g),l);break;case"s":h.replaceItem(a.createSVGPathSegCurvetoCubicSmoothAbs(i,j,f,g),l);break;case"q":h.replaceItem(a.createSVGPathSegCurvetoQuadraticAbs(i,j,d,e),l);break;case"t":h.replaceItem(a.createSVGPathSegCurvetoQuadraticSmoothAbs(i,j),l);break;case"a":h.replaceItem(a.createSVGPathSegArcAbs(i,j,m.r1,m.r2,m.angle,m.largeArcFlag,m.sweepFlag),l);break;case"z":case"Z":i=b,j=c}("M"==n||"m"==n)&&(b=i,c=j)}}}();var A={};!function(){A.create=function(a,b){return{x:a||0,y:b||0}},A.clone=function(a){return{x:a.x,y:a.y}},A.magnitude=function(a){return Math.sqrt(a.x*a.x+a.y*a.y)},A.magnitudeSquared=function(a){return a.x*a.x+a.y*a.y},A.rotate=function(a,b){var c=Math.cos(b),d=Math.sin(b);return{x:a.x*c-a.y*d,y:a.x*d+a.y*c}},A.rotateAbout=function(a,b,c,d){var e=Math.cos(b),f=Math.sin(b);d||(d={});var g=c.x+((a.x-c.x)*e-(a.y-c.y)*f);return d.y=c.y+((a.x-c.x)*f+(a.y-c.y)*e),d.x=g,d},A.normalise=function(a){var b=A.magnitude(a);return 0===b?{x:0,y:0}:{x:a.x/b,y:a.y/b}},A.dot=function(a,b){return a.x*b.x+a.y*b.y},A.cross=function(a,b){return a.x*b.y-a.y*b.x},A.cross3=function(a,b,c){return(b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x)},A.add=function(a,b,c){return c||(c={}),c.x=a.x+b.x,c.y=a.y+b.y,c},A.sub=function(a,b,c){return c||(c={}),c.x=a.x-b.x,c.y=a.y-b.y,c},A.mult=function(a,b){return{x:a.x*b,y:a.y*b}},A.div=function(a,b){return{x:a.x/b,y:a.y/b}},A.perp=function(a,b){return b=b===!0?-1:1,{x:b*-a.y,y:b*a.x}},A.neg=function(a){return{x:-a.x,y:-a.y}},A.angle=function(a,b){return Math.atan2(b.y-a.y,b.x-a.x)},A._temp=[A.create(),A.create(),A.create(),A.create(),A.create(),A.create()]}();var B={};!function(){B.create=function(a,b){for(var c=[],d=0;d0)return!1}return!0},B.scale=function(a,b,c,d){if(1===b&&1===c)return a;d=d||B.centre(a);for(var e,f,g=0;g=0?g-1:a.length-1],i=a[g],j=a[(g+1)%a.length],k=b[gv;v++)f.push(A.add(A.rotate(o,u*v),r))}else f.push(i)}return f},B.clockwiseSort=function(a){var b=B.mean(a);return a.sort(function(a,c){return A.angle(b,a)-A.angle(b,c)}),a},B.isConvex=function(a){var b,c,d,e,f=0,g=a.length;if(3>g)return null;for(b=0;g>b;b++)if(c=(b+1)%g,d=(b+2)%g,e=(a[c].x-a[b].x)*(a[d].y-a[c].y),e-=(a[c].y-a[b].y)*(a[d].x-a[c].x),0>e?f|=1:e>0&&(f|=2),3===f)return!1;return 0!==f?!0:null},B.hull=function(a){var b,c,d=[],e=[];for(a=a.slice(0),a.sort(function(a,b){var c=a.x-b.x;return 0!==c?c:a.y-b.y}),c=0;c=2&&A.cross3(e[e.length-2],e[e.length-1],b)<=0;)e.pop();e.push(b)}for(c=a.length-1;c>=0;c--){for(b=a[c];d.length>=2&&A.cross3(d[d.length-2],d[d.length-1],b)<=0;)d.pop();d.push(b)}return d.pop(),e.pop(),d.concat(e)}}();var C={};!function(){C.create=function(b){var c={controller:C,element:null,canvas:null,options:{width:800,height:600,pixelRatio:1,background:"#fafafa",wireframeBackground:"#222",hasBounds:!1,enabled:!0,wireframes:!0,showSleeping:!0,showDebug:!1,showBroadphase:!1,showBounds:!1,showVelocity:!1,showCollisions:!1,showSeparations:!1,showAxes:!1,showPositions:!1,showAngleIndicator:!1,showIds:!1,showShadows:!1,showVertexNumbers:!1,showConvexHulls:!1,showInternalEdges:!1}},d=p.extend(c,b);return d.canvas=d.canvas||a(d.options.width,d.options.height),d.context=d.canvas.getContext("2d"),d.textures={},d.bounds=d.bounds||{min:{x:0,y:0},max:{x:d.options.width,y:d.options.height}},1!==d.options.pixelRatio&&C.setPixelRatio(d,d.options.pixelRatio),p.isElement(d.element)?d.element.appendChild(d.canvas):p.log("Render.create: options.element was undefined, render.canvas was created but not appended","warn"),d},C.setPixelRatio=function(a,c){var d=a.options,e=a.canvas;"auto"===c&&(c=b(e)),d.pixelRatio=c,e.setAttribute("data-pixel-ratio",c),e.width=d.width*c,e.height=d.height*c,e.style.width=d.width+"px",e.style.height=d.height+"px",a.context.scale(c,c)},C.world=function(a){var b,d=a.render,f=a.world,h=d.canvas,i=d.context,j=d.options,k=c.allBodies(f),l=c.allConstraints(f),m=j.wireframes?j.wireframeBackground:j.background,n=[],o=[];if(d.currentBackground!==m&&e(d,m),i.globalCompositeOperation="source-in",i.fillStyle="transparent",i.fillRect(0,0,h.width,h.height),i.globalCompositeOperation="source-over",j.hasBounds){var p=d.bounds.max.x-d.bounds.min.x,q=d.bounds.max.y-d.bounds.min.y,r=p/j.width,s=q/j.height;for(b=0;b=500){var i="";i+="fps: "+Math.round(a.timing.fps)+h,f.debugString=i,f.debugTimestamp=a.timing.timestamp}if(f.debugString){d.font="12px Arial",d.fillStyle=g.wireframes?"rgba(255,255,255,0.5)":"rgba(0,0,0,0.5)";for(var j=f.debugString.split("\n"),k=0;k1?1:0;k1?1:0;h1?1:0;f1?1:0;j1?1:0;f1?1:0;f1?1:0;e0)){var l=d.activeContacts[0].vertex.x,m=d.activeContacts[0].vertex.y;2===d.activeContacts.length&&(l=(d.activeContacts[0].vertex.x+d.activeContacts[1].vertex.x)/2,m=(d.activeContacts[0].vertex.y+d.activeContacts[1].vertex.y)/2),e.bodyB===e.supports[0].body||e.bodyA.isStatic===!0?h.moveTo(l-8*e.normal.x,m-8*e.normal.y):h.moveTo(l+8*e.normal.x,m+8*e.normal.y),h.lineTo(l,m)}h.strokeStyle=i.wireframes?"rgba(255,165,0,0.7)":"orange",h.lineWidth=1,h.stroke()},C.separations=function(a,b,c){var d,e,f,g,h,i=c,j=a.render.options;for(i.beginPath(),h=0;h1?1:0;l