diff --git a/css/walkers.css b/css/walkers.css new file mode 100644 index 0000000..ddfca7f --- /dev/null +++ b/css/walkers.css @@ -0,0 +1,112 @@ +* { + margin: 0; + padding: 0; + border: 0; + box-sizing: border-box; + font-family: sans-serif; + font-size: 11px; +} + +body { + width: 100%; +} + +h1 { + text-align: center; + margin: 10px; + font-size: 18px; +} + +h2 { + text-align: center; + margin: 5px 0; +} + +h3 { + text-align: center; + font-style: italic; + font-size: 10px; + margin-bottom: 10px; + font-weight: normal; +} + +h4 { + font-size: 14px; + margin-top: 10px; + margin-bottom: 4px; +} + +h4:first-child { + margin-top: 0; +} + +select { + border: 1px solid #ddd; +} + +#main_holder { + width: 800px; + height: auto; + margin: 0 auto; + padding-bottom: 20px; +} + +#main_screen { + border: 1px solid #888; +} + +#info { + width: 100%; +} + +#info>div { + vertical-align: top; + margin-right: 15px; + display: inline-block; + width: 180px; +} + +.name_list_table { + border-collapse: collapse; + min-width: 180px; +} + +.name_list_table td, .name_list_table th { + border: 1px solid #888; + padding: 1px 3px; +} + +.name_list_table .name { + text-transform: capitalize; +} + + .name_list_table .elite_name { + color: #b40; + } + + .name_list_table .score { + text-align: right; + } + + .name_list_table .generation { + text-align: right; + } + +#hidden_ss { + height: 0; + width: 0; + display: none; +} + +#generation_timer { + width: 100%; + height: 10px; +} + + #generation_timer_bar { + background-color: #bbf; + height: 100%; + width: 0; + font-size: 0; + max-width: 100%; + } \ No newline at end of file diff --git a/index.htm b/index.htm new file mode 100644 index 0000000..1178079 --- /dev/null +++ b/index.htm @@ -0,0 +1,127 @@ + + + + HTML5 Genetic Algorithm Biped Walkers + + + + + + + + + + + +
+

Genetic Algorithm Walkers

+

"It's like watching other people QWOP"

+ +
 
+ +
+ +
+

Current Generation (0)

+ + + + + + + + + +
NameScore
+
+ +
+

Record History

+ + + + + + + + + + +
GenNameScore
+
+ +
+

Controls

+ Gene mutation probability +
+ Gene mutation amount +
+ Champions to copy +
+ Motor noise +
+ Round length +
+ Animation quality +
+ Simulation speed +
+
+ Lower the animation quality and simulation speed to save some CPU.

+ Zero frames per second and high simulation speed will give you the fastest results, but processor usage will go up as well. +
+ +
+ + diff --git a/js/draw.js b/js/draw.js new file mode 100644 index 0000000..d2f6805 --- /dev/null +++ b/js/draw.js @@ -0,0 +1,144 @@ +drawInit = function() { + globals.main_screen = document.getElementById("main_screen"); + globals.ctx = main_screen.getContext("2d"); + resetCamera(); +} + +resetCamera = function() { + globals.zoom = config.max_zoom_factor; + globals.translate_x = 0; + globals.translate_y = 280; +} + +setFps = function(fps) { + config.draw_fps = fps; + if(globals.draw_interval) + clearInterval(globals.draw_interval); + if(fps > 0 && config.simulation_fps > 0) { + globals.draw_interval = setInterval(drawFrame, Math.round(1000/config.draw_fps)); + } +} + +drawFrame = function() { + var minmax = getMinMaxDistance(); + globals.target_zoom = Math.min(config.max_zoom_factor, getZoom(minmax.min_x, minmax.max_x + 4, minmax.min_y + 2, minmax.max_y + 2.5)); + globals.zoom += 0.1*(globals.target_zoom - globals.zoom); + globals.translate_x += 0.1*(1.5-minmax.min_x - globals.translate_x); + globals.translate_y += 0.3*(minmax.min_y*globals.zoom + 280 - globals.translate_y); + //globals.translate_y = minmax.max_y*globals.zoom + 150; + globals.ctx.clearRect(0, 0, globals.main_screen.width, globals.main_screen.height); + globals.ctx.save(); + globals.ctx.translate(globals.translate_x*globals.zoom, globals.translate_y); + globals.ctx.scale(globals.zoom, -globals.zoom); + drawFloor(); + for(var k = config.population_size - 1; k >= 0 ; k--) { + if(globals.walkers[k].health > 0) { + drawWalker(globals.walkers[k]); + } + } + globals.ctx.restore(); +} + +drawFloor = function() { + globals.ctx.strokeStyle = "#444"; + globals.ctx.lineWidth = 1/globals.zoom; + globals.ctx.beginPath(); + var floor_fixture = globals.floor.GetFixtureList(); + globals.ctx.moveTo(floor_fixture.m_shape.m_vertices[0].x, floor_fixture.m_shape.m_vertices[0].y); + for(var k = 1; k < floor_fixture.m_shape.m_vertices.length; k++) { + globals.ctx.lineTo(floor_fixture.m_shape.m_vertices[k].x, floor_fixture.m_shape.m_vertices[k].y); + } + globals.ctx.stroke(); +} + +drawWalker = function(walker) { + if(walker.is_elite) { + //globals.ctx.strokeStyle = "hsl(22,"+100*walker.health/config.walker_health+"%,35%)"; +// globals.ctx.fillStyle = "hsl(20,"+45*walker.health/config.walker_health+"%,85%)"; + globals.ctx.strokeStyle = "hsl(22,100%,"+(90-55*walker.health/config.walker_health)+"%)"; + globals.ctx.fillStyle = "hsl(20,45%,"+(100-15*walker.health/config.walker_health)+"%)"; + } else { + //globals.ctx.strokeStyle = "hsl(240,"+100*walker.health/config.walker_health+"%,41%)"; +// globals.ctx.fillStyle = "hsl(240,"+17*walker.health/config.walker_health+"%,85%)"; + globals.ctx.strokeStyle = "hsl(240,100%,"+(90-49*walker.health/config.walker_health)+"%)"; + globals.ctx.fillStyle = "hsl(240,45%,"+(100-15*walker.health/config.walker_health)+"%)"; + } + globals.ctx.lineWidth = 1/globals.zoom; + + // left legs and arms first + drawRect(walker.left_arm.lower_arm); + drawRect(walker.left_arm.upper_arm); + drawRect(walker.left_leg.foot); + drawRect(walker.left_leg.lower_leg); + drawRect(walker.left_leg.upper_leg); + + // head + drawRect(walker.head.neck); + drawRect(walker.head.head); + + // torso + drawRect(walker.torso.lower_torso); + drawRect(walker.torso.upper_torso); + + // right legs and arms + drawRect(walker.right_leg.upper_leg); + drawRect(walker.right_leg.lower_leg); + drawRect(walker.right_leg.foot); + drawRect(walker.right_arm.upper_arm); + drawRect(walker.right_arm.lower_arm); +} + +drawRect = function(body) { + // set strokestyle and fillstyle before call + globals.ctx.beginPath(); + var fixture = body.GetFixtureList(); + var shape = fixture.GetShape(); + var p0 = body.GetWorldPoint(shape.m_vertices[0]); + globals.ctx.moveTo(p0.x, p0.y); + for(var k = 1; k < 4; k++) { + var p = body.GetWorldPoint(shape.m_vertices[k]); + globals.ctx.lineTo(p.x, p.y); + } + globals.ctx.lineTo(p0.x, p0.y); + + globals.ctx.fill(); + globals.ctx.stroke(); +} + +drawTest = function() { + globals.ctx.strokeStyle = "#000"; + globals.ctx.fillStyle = "#666"; + globals.ctx.lineWidth = 1; + globals.ctx.beginPath(); + globals.ctx.moveTo(0, 0); + globals.ctx.lineTo(0, 2); + globals.ctx.lineTo(2, 2); + + globals.ctx.fill(); + globals.ctx.stroke(); + +} + +getMinMaxDistance = function() { + var min_x = 9999; + var max_x = -1; + var min_y = 9999; + var max_y = -1; + for(var k = 0; k < globals.walkers.length; k++) { + if(globals.walkers[k].health > 0) { + var dist = globals.walkers[k].torso.upper_torso.GetPosition(); + min_x = Math.min(min_x, dist.x); + max_x = Math.max(max_x, dist.x); + min_y = Math.min(min_y, globals.walkers[k].low_foot_height, globals.walkers[k].head_height); + max_y = Math.max(max_y, dist.y); + } + } + return {min_x:min_x, max_x:max_x, min_y:min_y, max_y:max_y}; +} + +getZoom = function(min_x, max_x, min_y, max_y) { + var delta_x = Math.abs(max_x - min_x); + var delta_y = Math.abs(max_y - min_y); + var zoom = Math.min(globals.main_screen.width/delta_x,globals.main_screen.height/delta_y); + return zoom; +} \ No newline at end of file diff --git a/js/floor.js b/js/floor.js new file mode 100644 index 0000000..dfff2af --- /dev/null +++ b/js/floor.js @@ -0,0 +1,22 @@ +function createFloor() { + var body_def = new b2.BodyDef(); + var body = globals.world.CreateBody(body_def); + var fix_def = new b2.FixtureDef(); + fix_def.friction = 0.8; + fix_def.shape = new b2.ChainShape(); + + // start with flat floor + var edges = [ + new b2.Vec2(-3.5, -0.16), + new b2.Vec2(2.5, -0.16) + ]; + + for(var k = 2; k < config.max_floor_tiles; k++) { + var ratio = k/config.max_floor_tiles; + edges.push(new b2.Vec2(edges[edges.length-1].x + (1 + ratio * Math.random() - ratio/2), edges[edges.length-1].y + (ratio * Math.random() - ratio/2 ))); +// edges.push(new b2.Vec2(edges[edges.length-1].x + 1,-0.16)); + } + fix_def.shape.CreateChain(edges, edges.length); + body.CreateFixture(fix_def); + return body; +} diff --git a/js/game.js b/js/game.js new file mode 100644 index 0000000..ef6e1cc --- /dev/null +++ b/js/game.js @@ -0,0 +1,242 @@ +config = { + time_step: 60, + simulation_fps: 60, + draw_fps: 60, + velocity_iterations: 8, + position_iterations: 3, + max_zoom_factor: 130, + min_motor_speed: -2, + max_motor_speed: 2, + population_size: 20, + mutation_chance: 0.1, + mutation_amount: 0.5, + walker_health: 300, + fitness_criterium: 'score', + check_health: true, + elite_clones: 2, + max_floor_tiles: 50, + round_length: 1200, + min_body_delta: 1.4, + min_leg_delta: 0.4, + instadeath_delta: 0.4 +}; + +globals = {}; + +gameInit = function() { + interfaceSetup(); + + globals.world = new b2.World(new b2.Vec2(0, -10)); + globals.walkers = createPopulation(); + + globals.floor = createFloor(); + drawInit(); + + globals.step_counter = 0; + globals.simulation_interval = setInterval(simulationStep, Math.round(1000/config.simulation_fps)); + globals.draw_interval = setInterval(drawFrame, Math.round(1000/config.draw_fps)); +} + +simulationStep = function() { + globals.world.Step(1/config.time_step, config.velocity_iterations, config.position_iterations); + globals.world.ClearForces(); + populationSimulationStep(); + if(typeof globals.step_counter == 'undefined') { + globals.step_counter = 0; + } else { + globals.step_counter++; + } + document.getElementById("generation_timer_bar").style.width = (100*globals.step_counter/config.round_length)+"%"; + if(globals.step_counter > config.round_length) { + nextGeneration(); + } +} + +setSimulationFps = function(fps) { + config.simulation_fps = fps; + clearInterval(globals.simulation_interval); + if(fps > 0) { + globals.simulation_interval = setInterval(simulationStep, Math.round(1000/config.simulation_fps)); + if(globals.paused) { + globals.paused = false; + if(config.draw_fps > 0) { + globals.draw_interval = setInterval(drawFrame, Math.round(1000/config.draw_fps)); + } + } + } else { + // pause the drawing as well + clearInterval(globals.draw_interval); + globals.paused = true; + } +} + +createPopulation = function(genomes) { + setQuote(); + if(typeof globals.generation_count == 'undefined') { + globals.generation_count = 0; + } else { + globals.generation_count++; + } + updateGeneration(globals.generation_count); + var walkers = []; + for(var k = 0; k < config.population_size; k++) { + if(genomes && genomes[k]) { + walkers.push(new Walker(globals.world, genomes[k])); + } else { + walkers.push(new Walker(globals.world)); + } + if(globals.generation_count > 0 && k < config.elite_clones) { + walkers[walkers.length - 1].is_elite = true; + } else { + walkers[walkers.length - 1].is_elite = false; + } + } + return walkers; +} + +populationSimulationStep = function() { + var dead_dudes = 0; + for(var k = 0; k < config.population_size; k++) { + if(globals.walkers[k].health > 0) { + globals.walkers[k].simulationStep(); + } else { + if(!globals.walkers[k].is_dead) { + for(var l = 0; l < globals.walkers[k].bodies.length; l++) { + if(globals.walkers[k].bodies[l]) { + globals.world.DestroyBody(globals.walkers[k].bodies[l]); + globals.walkers[k].bodies[l] = null; + } + } + globals.walkers[k].is_dead = true; + } + dead_dudes++; + } + } + printNames(globals.walkers); + if(dead_dudes >= config.population_size) { + nextGeneration(); + } +} + +nextGeneration = function() { + if(globals.simulation_interval) + clearInterval(globals.simulation_interval); + if(globals.draw_interval) + clearInterval(globals.draw_interval); + getInterfaceValues(); + var genomes = createNewGenerationGenomes(); + killGeneration(); + globals.walkers = createPopulation(genomes); + resetCamera(); + globals.step_counter = 0; + globals.simulation_interval = setInterval(simulationStep, Math.round(1000/config.simulation_fps)); + if(config.draw_fps > 0) { + globals.draw_interval = setInterval(drawFrame, Math.round(1000/config.draw_fps)); + } +} + +killGeneration = function() { + for(var k = 0; k < globals.walkers.length; k++) { + for(var l = 0; l < globals.walkers[k].bodies.length; l++) { + if(globals.walkers[k].bodies[l]) + globals.world.DestroyBody(globals.walkers[k].bodies[l]); + } + } +} + +createNewGenerationGenomes = function() { + globals.walkers.sort(function(a,b) { + return b[config.fitness_criterium] - a[config.fitness_criterium]; + }); + if(typeof globals.last_record == 'undefined') { + globals.last_record = 0; + } + if(globals.walkers[0][config.fitness_criterium] > globals.last_record) { + printChampion(globals.walkers[0]); + globals.last_record = globals.walkers[0][config.fitness_criterium]; + } + + var genomes = []; + var parents = null; + // clones + for(var k = 0; k < config.elite_clones; k++) { + genomes.push(globals.walkers[k].genome); + } + for(var k = config.elite_clones; k < config.population_size; k++) { + if(parents = pickParents()) { + genomes.push(copulate(globals.walkers[parents[0]], globals.walkers[parents[1]])); + } + } + genomes = mutateClones(genomes); + return genomes; +} + +pickParents = function() { + var parents = []; + for(var k = 0; k < config.population_size; k++) { + if(Math.random() < (1/(k+2))) { + parents.push(k); + if(parents.length >= 2) { + break; + } + } + } + if(typeof parents[0] == 'undefined' || typeof parents[1] == 'undefined') { + return false; + } + return parents; +} + +copulate = function(walker_1, walker_2) { + var new_genome = []; + for(var k = 0; k < walker_1.genome.length; k++) { + if(Math.random() < 0.5) { + var parent = walker_1; + } else { + var parent = walker_2 + } + var new_gene = JSON.parse(JSON.stringify(parent.genome[k])); + for(var g in walker_1.genome[k]) { + if(walker_1.genome[k].hasOwnProperty(g)) { + if(Math.random() < config.mutation_chance) { + if(g.indexOf('target') >= 0) { + new_gene[g] = Math.floor(Math.random() * walker_1.bodies.length); + } else { + new_gene[g] = new_gene[g] * (1 + config.mutation_amount*(Math.random()*2 - 1)); + } + } + } + } + new_genome[k] = new_gene; + } + return new_genome; +} + +mutateClones = function(genomes) { + if(parseFloat(config.mutation_chance) == 0) { + return genomes; + } + + for(var k = 0; k < genomes.length; k++) { + var current = JSON.stringify(genomes[k]); + for(var l = k + 1; l < genomes.length; l++) { + if(current == JSON.stringify(genomes[l])) { + var to_mutate = Math.floor(Math.random() * genomes[l].length); + for(var g in genomes[l][to_mutate]) { + if(genomes[l][to_mutate].hasOwnProperty(g)) { + if(g.indexOf('target') < 0) { + genomes[l][to_mutate][g] = genomes[l][to_mutate][g] * (1 + config.mutation_amount*(Math.random()*2 - 1)); + } + } + } + } + } + } + return genomes; +} + +getInterfaceValues = function() { + config.elite_clones = document.getElementById("elite_clones").value; + config.mutation_chance = document.getElementById("mutation_chance").value + config.mutation_amount = document.getElementById("mutation_amount").value +} \ No newline at end of file diff --git a/js/interface.js b/js/interface.js new file mode 100644 index 0000000..1bf5f5b --- /dev/null +++ b/js/interface.js @@ -0,0 +1,131 @@ +quotes = [ + "The Ministry of Silly Walks on steroids", + "It's like watching other people QWOP", + "Keep tumbling", + "As seen on a negative comment on Reddit", + "The Walking Sad", + "The Walking Fad", + "Army of QWOP", + "Nice me-and-my-friends-leaving-the-bar-at-2am simulator!" +]; + +printNames = function(walkers) { + var name_list = document.getElementById("name_list"); + name_list.innerHTML = ""; + for(var k = 0; k < walkers.length; k++) { + var tr = document.createElement("TR"); + if(walkers[k].is_elite) { + tr.className = "elite_name"; + } + var td = document.createElement("TD"); + td.className = "name"; + td.appendChild(document.createTextNode(walkers[k].name)); + tr.appendChild(td); + + td = document.createElement("TD"); + td.className = "score"; + td.appendChild(document.createTextNode(walkers[k][config.fitness_criterium].toFixed(2))); + tr.appendChild(td); + name_list.appendChild(tr); + } +} + +printChampion = function(walker) { + var champ_list = document.getElementById("champ_list"); + var tr = document.createElement("TR"); + + var cur_rows = champ_list.getElementsByTagName("TR"); + if(cur_rows.length >= config.population_size) { + champ_list.removeChild(cur_rows[0]); + } + + var td = document.createElement("TD"); + td.className = "generation"; + td.appendChild(document.createTextNode(globals.generation_count)); + tr.appendChild(td); + + td = document.createElement("TD"); + td.className = "name"; + td.appendChild(document.createTextNode(walker.name)); + tr.appendChild(td); + + td = document.createElement("TD"); + td.className = "score"; + td.appendChild(document.createTextNode(walker[config.fitness_criterium].toFixed(2))); + tr.appendChild(td); + + champ_list.appendChild(tr); +} + +updateGeneration = function(number) { + document.getElementById("gen_number").innerHTML = number; +} + +setQuote = function() { + document.getElementById("page_quote").innerHTML = '"'+quotes[Math.floor(Math.random() * quotes.length)]+'"'; +} + +interfaceSetup = function() { + var mut_chance_sel = document.getElementById("mutation_chance"); + for(var k = 0; k < mut_chance_sel.options.length; k++) { + if(mut_chance_sel.options[k].value == config.mutation_chance) { + mut_chance_sel.options[k].selected = true; + break; + } + } + var mut_amount_sel = document.getElementById("mutation_amount"); + for(var k = 0; k < mut_amount_sel.options.length; k++) { + if(mut_amount_sel.options[k].value == config.mutation_amount) { + mut_amount_sel.options[k].selected = true; + break; + } + } + + var elite_clones_sel = document.getElementById("elite_clones"); + for(var k = 0; k <= config.population_size; k++) { + var option = document.createElement("OPTION"); + option.value = k; + option.label = k; + if(k == config.elite_clones) { + option.selected = true; + } + elite_clones_sel.appendChild(option); + } + + var round_length_sel = document.getElementById("round_length"); + for(var k = 0; k <= round_length_sel.options.length; k++) { + if(round_length_sel.options[k].value == config.round_length) { + round_length_sel.options[k].selected = true; + break; + } + } + + round_length_sel.onchange = function() { + config.round_length = round_length_sel.value; + } + + var fps_sel = document.getElementById("draw_fps"); + for(var k = 0; k < fps_sel.options.length; k++) { + if(fps_sel.options[k].value == config.draw_fps) { + fps_sel.options[k].selected = true; + break; + } + } + + fps_sel.onchange = function() { + setFps(fps_sel.value); + } + + var simulation_fps_sel = document.getElementById("simulation_fps"); + for(var k = 0; k < simulation_fps_sel.options.length; k++) { + if(simulation_fps_sel.options[k].value == config.simulation_fps) { + simulation_fps_sel.options[k].selected = true; + break; + } + } + + simulation_fps_sel.onchange = function() { + setSimulationFps(simulation_fps_sel.value); + } + +} \ No newline at end of file diff --git a/js/jsbox2d.js b/js/jsbox2d.js new file mode 100644 index 0000000..8157f7d --- /dev/null +++ b/js/jsbox2d.js @@ -0,0 +1 @@ +(function(){Function.prototype._extend=function(parent){this.prototype.parent=parent;for(var x in parent.prototype){if(!this.prototype[x]){this.prototype[x]=parent.prototype[x]}}};Function.prototype._implement=function(parent){return this._extend(parent)};var b2Profiler=(function(){if(typeof(performance)==="undefined"){window.performance={now:function(){return +new Date()}}}function profileStruct(name,parent){this.name=name;this.parent=parent;this.children={};this.startTime=0;this.elapsedTime=0;this.totalTime=0;this.running=false;this.childrenCount=0}profileStruct.prototype={start:function(){this.startTime=performance.now();this.running=true},stop:function(reset){if(!this.running){return}this.running=false;this.elapsedTime+=performance.now()-this.startTime;if(reset){this.start()}for(var x in this.children){this.children[x].stop()}},reset:function(dontRun){if(!dontRun){this.running=true;this.totalTime+=this.elapsedTime;this.start()}this.elapsedTime=0;for(var x in this.children){this.children[x].reset(true)}}};var profiles=[];var root=new profileStruct("root");function create(name,parent){if(!profiles){throw new Error("late profile creation not allowed")}var s=new profileStruct(name,parent||"root");profiles.push(s);return s}function destroy(profile){profile.childrenCount--;delete profile.children[profile.name]}function recursiveParentCheck(node,profile){if(node.name===profile.parent){return node}for(var x in node.children){var n;if(n=recursiveParentCheck(node.children[x],profile)){return n}}return null}function init(){while(profiles.length){var p=profiles.pop();if(!(p.parentNode=recursiveParentCheck(root,p))){profiles.unshift(p)}else{p.parentNode.children[p.name]=p;p.parentNode.childrenCount++}}profiles=null}function resetAll(){root.reset(true)}return{create:create,destroy:destroy,init:init,reset:resetAll,profileRoot:root}}());"use strict";var b2_maxFloat=Number.MAX_VALUE;var b2_epsilon=2.220446049250313e-16;var b2_pi=Math.PI;var b2_maxManifoldPoints=2;var b2_maxPolygonVertices=8;var b2_aabbExtension=0.1;var b2_aabbMultiplier=2;var b2_linearSlop=0.005;var b2_angularSlop=(2/180*b2_pi);var b2_polygonRadius=(2*b2_linearSlop);var b2_maxSubSteps=8;var b2_maxTOIContacts=32;var b2_velocityThreshold=1;var b2_maxLinearCorrection=0.2;var b2_maxAngularCorrection=(8/180*b2_pi);var b2_maxTranslation=2;var b2_maxTranslationSquared=(b2_maxTranslation*b2_maxTranslation);var b2_maxRotation=(0.5*b2_pi);var b2_maxRotationSquared=(b2_maxRotation*b2_maxRotation);var b2_baumgarte=0.2;var b2_toiBaugarte=0.75;var b2_timeToSleep=0.5;var b2_linearSleepTolerance=0.01;var b2_angularSleepTolerance=(2/180*b2_pi);function b2Version(ma,mi,re){this.major=ma;this.minor=mi;this.revision=re}b2Version.prototype={toString:function(){return this.major+"."+this.minor+"."+this.revision}};var b2_version=new b2Version(2,3,1);"use strict";function b2IsValid(x){return isFinite(x)&&!isNaN(x)}var sqrtf=Math.sqrt;var atan2f=Math.atan2;var sinf=Math.sin;var cosf=Math.cos;var floorf=Math.floor;var ceilf=Math.ceil;var b2Sqrt=sqrtf;var b2Atan2=atan2f;function b2InvSqrt(x){return 1/sqrtf(x)}function b2Vec2(x,y){if(typeof(x)!=="undefined"){this.x=x;this.y=y}else{this.x=this.y=0}}b2Vec2.prototype={Clone:function(){return new b2Vec2(this.x,this.y)},SetZero:function(){this.x=0;this.y=0;return this},Set:function(x_,y_){this.x=x_;this.y=y_;return this},Assign:function(l){this.x=l.x;this.y=l.y;return this},Negate:function(){var v=new b2Vec2();v.Set(-this.x,-this.y);return v},get_i:function(i){switch(i){case 0:return this.x;case 1:return this.y}},set_i:function(i,v){switch(i){case 0:return this.x=v;case 1:return this.y=v}},Add:function(v){this.x+=v.x;this.y+=v.y;return this},Subtract:function(v){this.x-=v.x;this.y-=v.y;return this},Multiply:function(a){this.x*=a;this.y*=a;return this},Length:function(){return b2Sqrt(this.x*this.x+this.y*this.y)},LengthSquared:function(){return this.x*this.x+this.y*this.y},Normalize:function(){var length=this.Length();if(length>1);x|=(x>>2);x|=(x>>4);x|=(x>>8);x|=(x>>16);return x+1}function b2IsPowerOfTwo(x){var result=x>0&&(x&(x-1))==0;return result}var RAND_LIMIT=32767;function b2RandomFloat(lo,hi){var r=Math.random();if(typeof(lo)!=="undefined"){r=(hi-lo)*r+lo}else{r=2*r-1}return r}"use strict";function b2Color(r,g,b){this.r=r||0;this.g=g||0;this.b=b||0}b2Color.prototype={Set:function(r,g,b){this.r=r;this.g=g;this.b=b}};function b2Draw(){}b2Draw.prototype={SetFlags:function(flags){this.m_drawFlags=flags},GetFlags:function(){return this.m_drawFlags},AppendFlags:function(flags){this.m_drawFlags|=flags},ClearFlags:function(flags){this.m_drawFlags&=~flags},ToggleFlags:function(flags){this.m_drawFlags^=flags},DrawPolygon:function(vertices,vertexCount,color){},DrawSolidPolygon:function(vertices,vertexCount,color){},DrawCircle:function(center,radius,color){},DrawSolidCircle:function(center,radius,axis,color){},DrawSegment:function(p1,p2,color){},DrawTransform:function(xf){},m_drawFlags:0};b2Draw.e_shapeBit=1;b2Draw.e_jointBit=2;b2Draw.e_aabbBit=4;b2Draw.e_centerOfMassBit=8;b2Draw.e_contactPoints=16;b2Draw.e_contactNormals=32;b2Draw.e_contactImpulses=64;b2Draw.e_frictionImpulses=128;b2Draw.e_statistics=256;b2Draw.e_profile=512;b2Draw.e_pairBit=1024;"use strict";if(typeof(performance)==="undefined"){window.performance={now:function(){return +new Date()}}}function b2Timer(){this.Reset()}b2Timer.prototype={Reset:function(){this.m_start=performance.now()},GetMilliseconds:function(){return performance.now()-this.m_start}};"use strict";function b2MassData(){this.mass=0;this.center=new b2Vec2();this.I=0}function b2Shape(){this.m_type=0;this.m_radius=0}b2Shape.prototype={Clone:function(){},GetType:function(){return this.m_type},GetChildCount:function(){},TestPoint:function(xf,p){},RayCast:function(output,input,transform,childIndex){},ComputeAABB:function(aabb,xf,childIndex){},ComputeMass:function(massData,density){},_serialize:function(out){var obj=out||{};obj.m_type=this.m_type;obj.m_radius=this.m_radius;return obj},_deserialize:function(data){this.m_radius=data.m_radius}};b2Shape.e_circle=0;b2Shape.e_edge=1;b2Shape.e_polygon=2;b2Shape.e_chain=3;b2Shape.e_typeCount=4;"use strict";function b2CircleShape(){this.parent.call(this);this.m_type=b2Shape.e_circle;this.m_radius=0;this.m_p=new b2Vec2();Object.seal(this)}b2CircleShape.prototype={Clone:function(){var shape=new b2CircleShape();shape.m_radius=this.m_radius;shape.m_p=this.m_p.Clone();return shape},GetChildCount:function(){return 1},TestPoint:function(transform,p){var center=b2Vec2.Add(transform.p,b2Mul_r_v2(transform.q,this.m_p));var d=b2Vec2.Subtract(p,center);return b2Dot_v2_v2(d,d)<=this.m_radius*this.m_radius},RayCast:function(output,input,transform,childIndex){var position=b2Vec2.Add(transform.p,b2Mul_r_v2(transform.q,this.m_p));var s=b2Vec2.Subtract(input.p1,position);var b=b2Dot_v2_v2(s,s)-this.m_radius*this.m_radius;var r=b2Vec2.Subtract(input.p2,input.p1);var c=b2Dot_v2_v2(s,r);var rr=b2Dot_v2_v2(r,r);var sigma=c*c-rr*b;if(sigma<0||rr0){output.normal=b2Mul_r_v2(xf.q,normal).Negate()}else{output.normal=b2Mul_r_v2(xf.q,normal)}return true},ComputeAABB:function(aabb,xf,childIndex){var v1x=(xf.q.c*this.m_vertex1.x-xf.q.s*this.m_vertex1.y)+xf.p.x;var v1y=(xf.q.s*this.m_vertex1.x+xf.q.c*this.m_vertex1.y)+xf.p.y;var v2x=(xf.q.c*this.m_vertex2.x-xf.q.s*this.m_vertex2.y)+xf.p.x;var v2y=(xf.q.s*this.m_vertex2.x+xf.q.c*this.m_vertex2.y)+xf.p.y;var lowerx=b2Min(v1x,v2x);var lowery=b2Min(v1y,v2y);var upperx=b2Max(v1x,v2x);var uppery=b2Max(v1y,v2y);aabb.lowerBound.x=lowerx-this.m_radius;aabb.lowerBound.y=lowery-this.m_radius;aabb.upperBound.x=upperx+this.m_radius;aabb.upperBound.y=uppery+this.m_radius},ComputeMass:function(massData,density){massData.mass=0;massData.center=b2Vec2.Multiply(0.5,b2Vec2.Add(this.m_vertex1,this.m_vertex2));massData.I=0},_serialize:function(out){var obj=out||{};this.parent.prototype._serialize.call(this,obj);obj.m_vertex1=this.m_vertex1._serialize();obj.m_vertex2=this.m_vertex2._serialize();obj.m_hasVertex0=this.m_hasVertex0;if(this.m_hasVertex0){obj.m_vertex0=this.m_vertex0._serialize()}obj.m_hasVertex3=this.m_hasVertex3;if(this.m_hasVertex3){obj.m_vertex3=this.m_vertex3._serialize()}return obj},_deserialize:function(data){this.parent.prototype._deserialize.call(this,data);this.m_vertex1._deserialize(data.m_vertex1);this.m_vertex2._deserialize(data.m_vertex2);this.m_hasVertex0=data.m_hasVertex0;if(this.m_hasVertex0){this.m_vertex0._deserialize(data.m_vertex0)}this.m_hasVertex3=data.m_hasVertex3;if(this.m_hasVertex3){this.m_vertex3._deserialize(data.m_vertex3)}}};b2EdgeShape._extend(b2Shape);"use strict";function b2ChainShape(){this.parent.call(this);this.m_type=b2Shape.e_chain;this.m_radius=b2_polygonRadius;this.m_vertices=null;this.m_count=0;this.m_prevVertex=new b2Vec2();this.m_nextVertex=new b2Vec2();this.m_hasPrevVertex=false;this.m_hasNextVertex=false;Object.seal(this)}b2ChainShape.prototype={CreateLoop:function(vertices,count){for(var i=1;i0){edge.m_vertex0=this.m_vertices[index-1];edge.m_hasVertex0=true}else{edge.m_vertex0=this.m_prevVertex;edge.m_hasVertex0=this.m_hasPrevVertex}if(indexx0||(x==x0&&ps[i].yr.LengthSquared()){ie=j}}++m;ih=ie;if(ie==i0){break}}this.m_count=m;for(i=0;i0){return false}}return true},RayCast:function(output,input,xf,childIndex){var p1=b2MulT_r_v2(xf.q,b2Vec2.Subtract(input.p1,xf.p));var p2=b2MulT_r_v2(xf.q,b2Vec2.Subtract(input.p2,xf.p));var d=b2Vec2.Subtract(p2,p1);var lower=0,upper=input.maxFraction;var index=-1;for(var i=0;i0&&numerator=0){output.fraction=lower;output.normal=b2Mul_r_v2(xf.q,this.m_normals[index]);return true}return false},ComputeAABB:function(aabb,xf,childIndex){var lowerx=(xf.q.c*this.m_vertices[0].x-xf.q.s*this.m_vertices[0].y)+xf.p.x;var lowery=(xf.q.s*this.m_vertices[0].x+xf.q.c*this.m_vertices[0].y)+xf.p.y;var upperx=lowerx;var uppery=lowery;for(var i=1;ibestValue){bestIndex=i;bestValue=value}}return bestIndex},GetSupportVertex:function(dx,dy){return this.m_vertices[this.GetSupport(dx,dy)]},GetVertexCount:function(){return this.m_count},GetVertex:function(index){return this.m_vertices[index]}};function b2SimplexCache(){this.metric=0;this.count=0;this.indexA=[0,0,0];this.indexB=[0,0,0]}function b2DistanceInput(){this.proxyA=new b2DistanceProxy();this.proxyB=new b2DistanceProxy();this.transformA=new b2Transform();this.transformB=new b2Transform();this.useRadii=false}function b2DistanceOutput(){this.pointA=new b2Vec2();this.pointB=new b2Vec2();this.distance=0;this.iterations=0}function b2SimplexVertex(){this.wA=new b2Vec2();this.wB=new b2Vec2();this.w=new b2Vec2();this.a=0;this.indexA=0;this.indexB=0}b2SimplexVertex.prototype={Assign:function(l){this.wA.x=l.wA.x;this.wA.y=l.wA.y;this.wB.x=l.wB.x;this.wB.y=l.wB.y;this.w.x=l.w.x;this.w.y=l.w.y;this.a=l.a;this.indexA=l.indexA;this.indexB=l.indexB}};function b2Simplex(){this.m_v=[new b2SimplexVertex(),new b2SimplexVertex(),new b2SimplexVertex()];this.m_count=0}b2Simplex.prototype={ReadCache:function(cache,proxyA,transformA,proxyB,transformB){this.m_count=cache.count;var vertices=this.m_v;for(var i=0;i1){var metric1=cache.metric;var metric2=this.GetMetric();if(metric2<0.5*metric1||2*metric10){p.x=-1*e12y;p.y=1*e12x}else{p.x=1*e12y;p.y=-1*e12x}break}},GetClosestPoint:function(p){switch(this.m_count){case 1:p.x=this.m_v[0].w.x;p.y=this.m_v[0].w.y;break;case 2:p.x=(this.m_v[0].a*this.m_v[0].w.x)+(this.m_v[1].a*this.m_v[1].w.x);p.y=(this.m_v[0].a*this.m_v[0].w.y)+(this.m_v[1].a*this.m_v[1].w.y);break;case 3:p.x=p.y=0;break}},GetWitnessPoints:function(pA,pB){switch(this.m_count){case 1:pA.x=this.m_v[0].wA.x;pA.y=this.m_v[0].wA.y;pB.x=this.m_v[0].wB.x;pB.y=this.m_v[0].wB.y;break;case 2:pA.x=(this.m_v[0].a*this.m_v[0].wA.x)+(this.m_v[1].a*this.m_v[1].wA.x);pA.y=(this.m_v[0].a*this.m_v[0].wA.y)+(this.m_v[1].a*this.m_v[1].wA.y);pB.x=(this.m_v[0].a*this.m_v[0].wB.x)+(this.m_v[1].a*this.m_v[1].wB.x);pB.y=(this.m_v[0].a*this.m_v[0].wB.y)+(this.m_v[1].a*this.m_v[1].wB.y);break;case 3:pA.x=(this.m_v[0].a,this.m_v[0].wA.x)+(this.m_v[1].a,this.m_v[1].wA.x)+(this.m_v[2].a,this.m_v[2].wA.x);pA.y=(this.m_v[0].a,this.m_v[0].wA.y)+(this.m_v[1].a,this.m_v[1].wA.y)+(this.m_v[2].a,this.m_v[2].wA.y);pB.x=pA.x;pB.y=pA.y;break}},GetMetric:function(){switch(this.m_count){case 1:return 0;case 2:return b2Distance(this.m_v[0].w,this.m_v[1].w);case 3:return(this.m_v[1].w.x-this.m_v[0].w.x)*(this.m_v[2].w.y-this.m_v[0].w.y)-(this.m_v[1].w.y-this.m_v[0].w.y)*(this.m_v[2].w.x-this.m_v[0].w.x)}},Solve2:function(){var w1=this.m_v[0].w;var w2=this.m_v[1].w;var e12x=w2.x-w1.x;var e12y=w2.y-w1.y;var d12_2=-(w1.x*e12x+w1.y*e12y);if(d12_2<=0){this.m_v[0].a=1;this.m_count=1;return}var d12_1=w2.x*e12x+w2.y*e12y;if(d12_1<=0){this.m_v[1].a=1;this.m_count=1;this.m_v[0].Assign(this.m_v[1]);return}var inv_d12=1/(d12_1+d12_2);this.m_v[0].a=d12_1*inv_d12;this.m_v[1].a=d12_2*inv_d12;this.m_count=2},Solve3:function(){var w1=this.m_v[0].w;var w2=this.m_v[1].w;var w3=this.m_v[2].w;var e12x=w2.x-w1.x;var e12y=w2.y-w1.y;var w1e12=w1.x*e12x+w1.y*e12y;var w2e12=w2.x*e12x+w2.y*e12y;var d12_1=w2e12;var d12_2=-w1e12;var e13x=w3.x-w1.x;var e13y=w3.y-w1.y;var w1e13=w1.x*e13x+w1.y*e13y;var w3e13=w3.x*e13x+w3.y*e13y;var d13_1=w3e13;var d13_2=-w1e13;var e23x=w3.x-w2.x;var e23y=w3.y-w2.y;var w2e23=w2.x*e23x+w2.y*e23y;var w3e23=w3.x*e23x+w3.y*e23y;var d23_1=w3e23;var d23_2=-w2e23;var n123=e12x*e13y-e12y*e13x;var d123_1=n123*(w2.x*w3.y-w2.y*w3.x);var d123_2=n123*(w3.x*w1.y-w3.y*w1.x);var d123_3=n123*(w1.x*w2.y-w1.y*w2.x);if(d12_2<=0&&d13_2<=0){this.m_v[0].a=1;this.m_count=1;return}if(d12_1>0&&d12_2>0&&d123_3<=0){var inv_d12=1/(d12_1+d12_2);this.m_v[0].a=d12_1*inv_d12;this.m_v[1].a=d12_2*inv_d12;this.m_count=2;return}if(d13_1>0&&d13_2>0&&d123_2<=0){var inv_d13=1/(d13_1+d13_2);this.m_v[0].a=d13_1*inv_d13;this.m_v[2].a=d13_2*inv_d13;this.m_count=2;this.m_v[1].Assign(this.m_v[2]);return}if(d12_1<=0&&d23_2<=0){this.m_v[1].a=1;this.m_count=1;this.m_v[0].Assign(this.m_v[1]);return}if(d13_1<=0&&d23_1<=0){this.m_v[2].a=1;this.m_count=1;this.m_v[0].Assign(this.m_v[2]);return}if(d23_1>0&&d23_2>0&&d123_1<=0){var inv_d23=1/(d23_1+d23_2);this.m_v[1].a=d23_1*inv_d23;this.m_v[2].a=d23_2*inv_d23;this.m_count=2;this.m_v[0].Assign(this.m_v[2]);return}var inv_d123=1/(d123_1+d123_2+d123_3);this.m_v[0].a=d123_1*inv_d123;this.m_v[1].a=d123_2*inv_d123;this.m_v[2].a=d123_3*inv_d123;this.m_count=3}};var _b2Distance_simplex=new b2Simplex();var _b2Distance_normal=new b2Vec2();var _b2Distance_p=new b2Vec2();function b2DistanceFunc(output,cache,input){++b2DistanceFunc.b2_gjkCalls;var proxyA=input.proxyA;var proxyB=input.proxyB;var transformA=input.transformA;var transformB=input.transformB;_b2Distance_simplex.ReadCache(cache,proxyA,transformA,proxyB,transformB);var vertices=_b2Distance_simplex.m_v;var k_maxIters=20;var saveA=[0,0,0],saveB=[0,0,0];var saveCount=0;var distanceSqr1=b2_maxFloat;var distanceSqr2=distanceSqr1;var iter=0;while(iter=distanceSqr1){}distanceSqr1=distanceSqr2;_b2Distance_simplex.GetSearchDirection(_b2Distance_p);if(_b2Distance_p.LengthSquared()rA+rB&&output.distance>b2_epsilon){output.distance-=rA+rB;_b2Distance_normal.x=output.pointB.x-output.pointA.x;_b2Distance_normal.y=output.pointB.y-output.pointA.y;_b2Distance_normal.Normalize();output.pointA.x+=(rA*_b2Distance_normal.x);output.pointA.y+=(rA*_b2Distance_normal.y);output.pointB.x-=(rB*_b2Distance_normal.x);output.pointB.y-=(rB*_b2Distance_normal.y)}else{var px=(0.5*(output.pointA.x+output.pointB.x));var py=(0.5*(output.pointA.y+output.pointB.y));output.pointA.x=px;output.pointA.y=py;output.pointB.x=px;output.pointB.y=py;output.distance=0}}}b2DistanceFunc.b2_gjkCalls=0;b2DistanceFunc.b2_gjkIters=0;b2DistanceFunc.b2_gjkMaxIters=0;"use strict";var b2_nullFeature=255;function b2ContactID(){}b2ContactID.prototype={indexA:0,indexB:0,typeA:0,typeB:0,Reset:function(){this.indexA=this.indexB=this.typeA=this.typeB=0},Get:function(){return this.indexA|(this.indexB<<8)|(this.typeA<<16)|(this.typeB<<24)},Assign:function(k){this.indexA=k.indexA;this.indexB=k.indexB;this.typeA=k.typeA;this.typeB=k.typeB}};b2ContactID.e_vertex=0;b2ContactID.e_face=1;function b2ManifoldPoint(){this.localPoint=new b2Vec2();this.normalImpulse=0;this.tangentImpulse=0;this.id=new b2ContactID()}b2ManifoldPoint.prototype={Clone:function(){var point=new b2ManifoldPoint();point.localPoint.x=this.localPoint.x;point.localPoint.y=this.localPoint.y;point.normalImpulse=this.normalImpulse;point.tangentImpulse=this.tangentImpulse;point.id.Assign(this.id);return point}};function b2Manifold(){this.points=new Array(b2_maxManifoldPoints);this.localNormal=new b2Vec2();this.localPoint=new b2Vec2();this.type=0;this.pointCount=0}b2Manifold.prototype={Clone:function(){var manifold=new b2Manifold();manifold.pointCount=this.pointCount;manifold.type=this.type;manifold.localPoint.x=this.localPoint.x;manifold.localPoint.y=this.localPoint.y;manifold.localNormal.x=this.localNormal.x;manifold.localNormal.y=this.localNormal.y;for(var i=0;ib2_epsilon*b2_epsilon){this.normal.x=pointBx-pointAx;this.normal.y=pointBy-pointAy;this.normal.Normalize()}var cAx=pointAx+(radiusA*this.normal.x);var cAy=pointAy+(radiusA*this.normal.y);var cBx=pointBx-(radiusB*this.normal.x);var cBy=pointBy-(radiusB*this.normal.y);this.points[0]=new b2Vec2(0.5*(cAx+cBx),0.5*(cAy+cBy));this.separations[0]=(cBx-cAx)*this.normal.x+(cBy-cAy)*this.normal.y;break;case b2Manifold.e_faceA:this.normal.x=xfA.q.c*manifold.localNormal.x-xfA.q.s*manifold.localNormal.y;this.normal.y=xfA.q.s*manifold.localNormal.x+xfA.q.c*manifold.localNormal.y;var planePointx=(xfA.q.c*manifold.localPoint.x-xfA.q.s*manifold.localPoint.y)+xfA.p.x;var planePointy=(xfA.q.s*manifold.localPoint.x+xfA.q.c*manifold.localPoint.y)+xfA.p.y;for(var i=0;i=0&&(this.upperBound.y-this.lowerBound.y)>=0&&this.lowerBound.IsValid()&&this.upperBound.IsValid()},GetCenter:function(){return new b2Vec2(0.5*(this.lowerBound.x+this.upperBound.x),0.5*(this.lowerBound.y+this.upperBound.y))},GetExtents:function(){return new b2Vec2(0.5*(this.upperBound.x-this.lowerBound.x),0.5*(this.upperBound.y-this.lowerBound.y))},GetPerimeter:function(){return 2*((this.upperBound.x-this.lowerBound.x)+(this.upperBound.y-this.lowerBound.y))},Combine:function(aabb1,aabb2){if(aabb2){this.lowerBound.x=b2Min(aabb1.lowerBound.x,aabb2.lowerBound.x);this.lowerBound.y=b2Min(aabb1.lowerBound.y,aabb2.lowerBound.y);this.upperBound.x=b2Max(aabb1.upperBound.x,aabb2.upperBound.x);this.upperBound.y=b2Max(aabb1.upperBound.y,aabb2.upperBound.y)}else{this.lowerBound.x=b2Min(this.lowerBound.x,aabb1.lowerBound.x);this.lowerBound.y=b2Min(this.lowerBound.y,aabb1.lowerBound.y);this.upperBound.x=b2Max(this.upperBound.x,aabb1.upperBound.x);this.upperBound.y=b2Max(this.upperBound.y,aabb1.upperBound.y)}},Contains:function(aabb){return this.lowerBound.x<=aabb.lowerBound.x&&this.lowerBound.y<=aabb.lowerBound.y&&aabb.upperBound.x<=this.upperBound.x&&aabb.upperBound.y<=this.upperBound.y},RayCast:function(output,input){var tmin=-b2_maxFloat;var tmax=b2_maxFloat;var p=input.p1;var d=b2Vec2.Subtract(input.p2,input.p1);var absD=b2Abs_v2(d);var normal=new b2Vec2();for(var i=0;i<2;++i){if(absD.get_i(i)t2){var temp=t2;t2=t1;t1=temp;s=1}if(t1>tmin){normal.x=normal.y=0;normal.set_i(i,s);tmin=t1}tmax=b2Min(tmax,t2);if(tmin>tmax){return false}}}if(tmin<0||input.maxFractionradius*radius){return}manifold.type=b2Manifold.e_circles;manifold.localPoint.x=circleA.m_p.x;manifold.localPoint.y=circleA.m_p.y;manifold.localNormal.x=manifold.localNormal.y=0;manifold.pointCount=1;manifold.points[0]=new b2ManifoldPoint();manifold.points[0].localPoint.x=circleB.m_p.x;manifold.points[0].localPoint.y=circleB.m_p.y;manifold.points[0].id.Reset()}function b2CollidePolygonAndCircle(manifold,polygonA,xfA,circleB,xfB){manifold.pointCount=0;var c=b2Mul_t_v2(xfB,circleB.m_p);var cLocal=b2MulT_t_v2(xfA,c);var normalIndex=0;var separation=-b2_maxFloat;var radius=polygonA.m_radius+circleB.m_radius;var vertexCount=polygonA.m_count;var vertices=polygonA.m_vertices;var normals=polygonA.m_normals;for(var i=0;iradius){return}if(s>separation){separation=s;normalIndex=i}}var vertIndex1=normalIndex;var vertIndex2=vertIndex1+1radius*radius){return}manifold.pointCount=1;manifold.type=b2Manifold.e_faceA;manifold.localNormal.x=cLocal.x-v1.x;manifold.localNormal.y=cLocal.y-v1.y;manifold.localNormal.Normalize();manifold.localPoint.x=v1.x;manifold.localPoint.y=v1.y;manifold.points[0]=new b2ManifoldPoint();manifold.points[0].localPoint.x=circleB.m_p.x;manifold.points[0].localPoint.y=circleB.m_p.y;manifold.points[0].id.Reset()}else{if(u2<=0){if(b2DistanceSquared(cLocal,v2)>radius*radius){return}manifold.pointCount=1;manifold.type=b2Manifold.e_faceA;manifold.localNormal.x=cLocal.x-v2.x;manifold.localNormal.y=cLocal.y-v2.y;manifold.localNormal.Normalize();manifold.localPoint.x=v2.x;manifold.localPoint.y=v2.y;manifold.points[0]=new b2ManifoldPoint();manifold.points[0].localPoint.x=circleB.m_p.x;manifold.points[0].localPoint.y=circleB.m_p.y;manifold.points[0].id.Reset()}else{var faceCenterx=0.5*(v1.x+v2.x);var faceCentery=0.5*(v1.y+v2.y);var separation=(cLocal.x-faceCenterx)*normals[vertIndex1].x+(cLocal.y-faceCentery)*normals[vertIndex1].y;if(separation>radius){return}manifold.pointCount=1;manifold.type=b2Manifold.e_faceA;manifold.localNormal.x=normals[vertIndex1].x;manifold.localNormal.y=normals[vertIndex1].y;manifold.localPoint.x=faceCenterx;manifold.localPoint.y=faceCentery;manifold.points[0]=new b2ManifoldPoint();manifold.points[0].localPoint.x=circleB.m_p.x;manifold.points[0].localPoint.y=circleB.m_p.y;manifold.points[0].id.Reset()}}}function b2FindMaxSeparation(edgeIndex,poly1,xf1,poly2,xf2){var count1=poly1.m_count;var count2=poly2.m_count;var n1s=poly1.m_normals;var v1s=poly1.m_vertices;var v2s=poly2.m_vertices;var xf=b2MulT_t_t(xf2,xf1);var bestIndex=0;var maxSeparation=-b2_maxFloat;for(var i=0;imaxSeparation){maxSeparation=si;bestIndex=i}}edgeIndex[0]=bestIndex;return maxSeparation}function b2FindIncidentEdge(c,poly1,xf1,edge1,poly2,xf2){var normals1=poly1.m_normals;var count2=poly2.m_count;var vertices2=poly2.m_vertices;var normals2=poly2.m_normals;var t1x=xf1.q.c*normals1[edge1].x-xf1.q.s*normals1[edge1].y;var t1y=xf1.q.s*normals1[edge1].x+xf1.q.c*normals1[edge1].y;var normal1x=xf2.q.c*t1x+xf2.q.s*t1y;var normal1y=-xf2.q.s*t1x+xf2.q.c*t1y;var index=0;var minDot=b2_maxFloat;for(var i=0;itotalRadius){return}var edgeB=[0];var separationB=b2FindMaxSeparation(edgeB,polyB,xfB,polyA,xfA);if(separationB>totalRadius){return}var poly1;var poly2;var xf1,xf2;var edge1=0;var flip=0;var k_tol=0.1*b2_linearSlop;if(separationB>separationA+k_tol){poly1=polyB;poly2=polyA;xf1=xfB;xf2=xfA;edge1=edgeB[0];manifold.type=b2Manifold.e_faceB;flip=1}else{poly1=polyA;poly2=polyB;xf1=xfA;xf2=xfB;edge1=edgeA[0];manifold.type=b2Manifold.e_faceA;flip=0}b2FindIncidentEdge(b2CollidePolygons._local_incidentEdges,poly1,xf1,edge1,poly2,xf2);var count1=poly1.m_count;var vertices1=poly1.m_vertices;var iv1=edge1;var iv2=edge1+1radius*radius){return}if(edgeA.m_hasVertex0){var A1=edgeA.m_vertex0;var B1=A;var e1x=B1.x-A1.x;var e1y=B1.y-A1.y;var u1=e1x*(B1.x-Q.x)+e1y*(B1.y-Q.y);if(u1>0){return}}cf.indexA=0;cf.typeA=b2ContactID.e_vertex;manifold.pointCount=1;manifold.type=b2Manifold.e_circles;manifold.localNormal.x=manifold.localNormal.y=0;manifold.localPoint.x=P.x;manifold.localPoint.y=P.y;manifold.points[0]=new b2ManifoldPoint();manifold.points[0].id.Assign(cf);manifold.points[0].localPoint.x=circleB.m_p.x;manifold.points[0].localPoint.y=circleB.m_p.y;return}if(u<=0){var P=B;var dx=Q.x-P.x;var dy=Q.y-P.y;var dd=dx*dx+dy*dy;if(dd>radius*radius){return}if(edgeA.m_hasVertex3){var B2=edgeA.m_vertex3;var A2=B;var e2x=B2.x-A2.x;var e2y=B2.y-A2.y;var v2=e2x*(Q.x-A2.x)+e2y*(Q.y-A2.y);if(v2>0){return}}cf.indexA=1;cf.typeA=b2ContactID.e_vertex;manifold.pointCount=1;manifold.type=b2Manifold.e_circles;manifold.localNormal.x=manifold.localNormal.y=0;manifold.localPoint.x=P.x;manifold.localPoint.y=P.y;manifold.points[0]=new b2ManifoldPoint();manifold.points[0].id.Assign(cf);manifold.points[0].localPoint.x=circleB.m_p.x;manifold.points[0].localPoint.y=circleB.m_p.y;return}var den=ex*ex+ey*ey;var Px=(1/den)*((u*A.x)+(v*B.x));var Py=(1/den)*((u*A.y)+(v*B.y));var dx=Q.x-Px;var dy=Q.y-Py;var dd=dx*dx+dy*dy;if(dd>radius*radius){return}var nx=-ey;var ny=ex;if(nx*(Q.x-A.x)+ny*(Q.y-A.y)<0){nx=-nx;ny=-ny}cf.indexA=0;cf.typeA=b2ContactID.e_face;manifold.pointCount=1;manifold.type=b2Manifold.e_faceA;manifold.localNormal.x=nx;manifold.localNormal.y=ny;manifold.localNormal.Normalize();manifold.localPoint.x=A.x;manifold.localPoint.y=A.y;manifold.points[0]=new b2ManifoldPoint();manifold.points[0].id.Assign(cf);manifold.points[0].localPoint.x=circleB.m_p.x;manifold.points[0].localPoint.y=circleB.m_p.y}function b2EPAxis(){this.type=0;this.index=0;this.separation=0}b2EPAxis.e_unknown=0;b2EPAxis.e_edgeA=1;b2EPAxis.e_edgeB=2;function b2TempPolygon(){this.vertices=new Array(b2_maxPolygonVertices);this.normals=new Array(b2_maxPolygonVertices);this.count=0}function b2ReferenceFace(){this.i1=0,this.i2=0;this.v1=new b2Vec2(),this.v2=new b2Vec2();this.normal=new b2Vec2();this.sideNormal1=new b2Vec2();this.sideOffset1=0;this.sideNormal2=new b2Vec2();this.sideOffset2=0}function b2EPCollider(){this.m_polygonB=new b2TempPolygon();this.m_xf=new b2Transform();this.m_centroidB=new b2Vec2();this.m_v0=new b2Vec2(),this.m_v1=new b2Vec2(),this.m_v2=new b2Vec2(),this.m_v3=new b2Vec2();this.m_normal0=new b2Vec2(),this.m_normal1=new b2Vec2(),this.m_normal2=new b2Vec2();this.m_normal=new b2Vec2();this.m_type1=0,this.m_type2=0;this.m_lowerLimit=new b2Vec2(),this.m_upperLimit=new b2Vec2();this.m_radius=0;this.m_front=false}b2EPCollider._temp_edge=new b2Vec2();b2EPCollider._temp_edge0=new b2Vec2();b2EPCollider._temp_edge2=new b2Vec2();b2EPCollider.prototype={Collide:function(manifold,edgeA,xfA,polygonB,xfB){this.m_xf.Assign(b2MulT_t_t(xfA,xfB));this.m_centroidB.x=(this.m_xf.q.c*polygonB.m_centroid.x-this.m_xf.q.s*polygonB.m_centroid.y)+this.m_xf.p.x;this.m_centroidB.y=(this.m_xf.q.s*polygonB.m_centroid.x+this.m_xf.q.c*polygonB.m_centroid.y)+this.m_xf.p.y;this.m_v0.x=edgeA.m_vertex0.x;this.m_v0.y=edgeA.m_vertex0.y;this.m_v1.x=edgeA.m_vertex1.x;this.m_v1.y=edgeA.m_vertex1.y;this.m_v2.x=edgeA.m_vertex2.x;this.m_v2.y=edgeA.m_vertex2.y;this.m_v3.x=edgeA.m_vertex3.x;this.m_v3.y=edgeA.m_vertex3.y;var hasVertex0=edgeA.m_hasVertex0;var hasVertex3=edgeA.m_hasVertex3;b2EPCollider._temp_edge.x=this.m_v2.x-this.m_v1.x;b2EPCollider._temp_edge.y=this.m_v2.y-this.m_v1.y;b2EPCollider._temp_edge.Normalize();this.m_normal1.x=b2EPCollider._temp_edge.y;this.m_normal1.y=-b2EPCollider._temp_edge.x;var offset1=this.m_normal1.x*(this.m_centroidB.x-this.m_v1.x)+this.m_normal1.y*(this.m_centroidB.y-this.m_v1.y);var offset0=0,offset2=0;var convex1=false,convex2=false;if(hasVertex0){b2EPCollider._temp_edge0.x=this.m_v1.x-this.m_v0.x;b2EPCollider._temp_edge0.y=this.m_v1.y-this.m_v0.y;b2EPCollider._temp_edge0.Normalize();this.m_normal0.x=b2EPCollider._temp_edge0.y;this.m_normal0.y=-b2EPCollider._temp_edge0.x;convex1=(b2EPCollider._temp_edge0.x*b2EPCollider._temp_edge.y-b2EPCollider._temp_edge0.y*b2EPCollider._temp_edge.x)>=0;offset0=this.m_normal0.x*(this.m_centroidB.x-this.m_v0.x)+this.m_normal0.y*(this.m_centroidB.y-this.m_v0.y)}if(hasVertex3){b2EPCollider._temp_edge2.x=this.m_v3.x-this.m_v2.x;b2EPCollider._temp_edge2.y=this.m_v3.y-this.m_v2.y;b2EPCollider._temp_edge2.Normalize();this.m_normal2.x=b2EPCollider._temp_edge2.y;this.m_normal2.y=-b2EPCollider._temp_edge2.x;convex2=(b2EPCollider._temp_edge.x*b2EPCollider._temp_edge2.y-b2EPCollider._temp_edge.y*b2EPCollider._temp_edge2.x)>0;offset2=this.m_normal2.x*(this.m_centroidB.x-this.m_v2.x)+this.m_normal2.y*(this.m_centroidB.y-this.m_v2.y)}if(hasVertex0&&hasVertex3){if(convex1&&convex2){this.m_front=offset0>=0||offset1>=0||offset2>=0;if(this.m_front){this.m_normal.x=this.m_normal1.x;this.m_normal.y=this.m_normal1.y;this.m_lowerLimit.x=this.m_normal0.x;this.m_lowerLimit.y=this.m_normal0.y;this.m_upperLimit.x=this.m_normal2.x;this.m_upperLimit.y=this.m_normal2.y}else{this.m_normal.x=-this.m_normal1.x;this.m_normal.y=-this.m_normal1.y;this.m_lowerLimit.x=-this.m_normal1.x;this.m_lowerLimit.y=-this.m_normal1.y;this.m_upperLimit.x=-this.m_normal1.x;this.m_upperLimit.y=-this.m_normal1.y}}else{if(convex1){this.m_front=offset0>=0||(offset1>=0&&offset2>=0);if(this.m_front){this.m_normal.x=this.m_normal1.x;this.m_normal.y=this.m_normal1.y;this.m_lowerLimit.x=this.m_normal0.x;this.m_lowerLimit.y=this.m_normal0.y;this.m_upperLimit.x=this.m_normal1.x;this.m_upperLimit.y=this.m_normal1.y}else{this.m_normal.x=-this.m_normal1.x;this.m_normal.y=-this.m_normal1.y;this.m_lowerLimit.x=-this.m_normal2.x;this.m_lowerLimit.y=-this.m_normal2.y;this.m_upperLimit.x=-this.m_normal1.x;this.m_upperLimit.y=-this.m_normal1.y}}else{if(convex2){this.m_front=offset2>=0||(offset0>=0&&offset1>=0);if(this.m_front){this.m_normal.x=this.m_normal1.x;this.m_normal.y=this.m_normal1.y;this.m_lowerLimit.x=this.m_normal1.x;this.m_lowerLimit.y=this.m_normal1.y;this.m_upperLimit.x=this.m_normal2.x;this.m_upperLimit.y=this.m_normal2.y}else{this.m_normal.x=-this.m_normal1.x;this.m_normal.y=-this.m_normal1.y;this.m_lowerLimit.x=-this.m_normal1.x;this.m_lowerLimit.y=-this.m_normal1.y;this.m_upperLimit.x=-this.m_normal0.x;this.m_upperLimit.y=-this.m_normal0.y}}else{this.m_front=offset0>=0&&offset1>=0&&offset2>=0;if(this.m_front){this.m_normal.x=this.m_normal1.x;this.m_normal.y=this.m_normal1.y;this.m_lowerLimit.x=this.m_normal1.x;this.m_lowerLimit.y=this.m_normal1.y;this.m_upperLimit.x=this.m_normal1.x;this.m_upperLimit.y=this.m_normal1.y}else{this.m_normal.x=-this.m_normal1.x;this.m_normal.y=-this.m_normal1.y;this.m_lowerLimit.x=-this.m_normal2.x;this.m_lowerLimit.y=-this.m_normal2.y;this.m_upperLimit.x=-this.m_normal0.x;this.m_upperLimit.y=-this.m_normal0.y}}}}}else{if(hasVertex0){if(convex1){this.m_front=offset0>=0||offset1>=0;if(this.m_front){this.m_normal.x=this.m_normal1.x;this.m_normal.y=this.m_normal1.y;this.m_lowerLimit.x=this.m_normal0.x;this.m_lowerLimit.y=this.m_normal0.y;this.m_upperLimit.x=-this.m_normal1.x;this.m_upperLimit.y=-this.m_normal1.y}else{this.m_normal.x=-this.m_normal1.x;this.m_normal.y=-this.m_normal1.y;this.m_lowerLimit.x=this.m_normal1.x;this.m_lowerLimit.y=this.m_normal1.y;this.m_upperLimit.x=-this.m_normal1.x;this.m_upperLimit.y=-this.m_normal1.y}}else{this.m_front=offset0>=0&&offset1>=0;if(this.m_front){this.m_normal.x=this.m_normal1.x;this.m_normal.y=this.m_normal1.y;this.m_lowerLimit.x=this.m_normal1.x;this.m_lowerLimit.y=this.m_normal1.y;this.m_upperLimit.x=-this.m_normal1.x;this.m_upperLimit.y=-this.m_normal1.y}else{this.m_normal.x=-this.m_normal1.x;this.m_normal.y=-this.m_normal1.y;this.m_lowerLimit.x=this.m_normal1.x;this.m_lowerLimit.y=this.m_normal1.y;this.m_upperLimit.x=-this.m_normal0.x;this.m_upperLimit.y=-this.m_normal0.y}}}else{if(hasVertex3){if(convex2){this.m_front=offset1>=0||offset2>=0;if(this.m_front){this.m_normal.x=this.m_normal1.x;this.m_normal.y=this.m_normal1.y;this.m_lowerLimit.x=-this.m_normal1.x;this.m_lowerLimit.y=-this.m_normal1.y;this.m_upperLimit.x=this.m_normal2.x;this.m_upperLimit.y=this.m_normal2.y}else{this.m_normal.x=-this.m_normal1.x;this.m_normal.y=-this.m_normal1.y;this.m_lowerLimit.x=-this.m_normal1.x;this.m_lowerLimit.y=-this.m_normal1.y;this.m_upperLimit.x=this.m_normal1.x;this.m_upperLimit.y=this.m_normal1.y}}else{this.m_front=offset1>=0&&offset2>=0;if(this.m_front){this.m_normal.x=this.m_normal1.x;this.m_normal.y=this.m_normal1.y;this.m_lowerLimit.x=-this.m_normal1.x;this.m_lowerLimit.y=-this.m_normal1.y;this.m_upperLimit.x=this.m_normal1.x;this.m_upperLimit.y=this.m_normal1.y}else{this.m_normal.x=-this.m_normal1.x;this.m_normal.y=-this.m_normal1.y;this.m_lowerLimit.x=-this.m_normal2.x;this.m_lowerLimit.y=-this.m_normal2.y;this.m_upperLimit.x=this.m_normal1.x;this.m_upperLimit.y=this.m_normal1.y}}}else{this.m_front=offset1>=0;if(this.m_front){this.m_normal.x=this.m_normal1.x;this.m_normal.y=this.m_normal1.y;this.m_lowerLimit.x=-this.m_normal1.x;this.m_lowerLimit.y=-this.m_normal1.y;this.m_upperLimit.x=-this.m_normal1.x;this.m_upperLimit.y=-this.m_normal1.y}else{this.m_normal.x=-this.m_normal1.x;this.m_normal.y=-this.m_normal1.y;this.m_lowerLimit.x=this.m_normal1.x;this.m_lowerLimit.y=this.m_normal1.y;this.m_upperLimit.x=this.m_normal1.x;this.m_upperLimit.y=this.m_normal1.y}}}}this.m_polygonB.count=polygonB.m_count;for(var i=0;ithis.m_radius){return}var polygonAxis=this.ComputePolygonSeparation();if(polygonAxis.type!=b2EPAxis.e_unknown&&polygonAxis.separation>this.m_radius){return}var k_relativeTol=0.98;var k_absoluteTol=0.001;var primaryAxis=new b2EPAxis();if(polygonAxis.type==b2EPAxis.e_unknown){primaryAxis=edgeAxis}else{if(polygonAxis.separation>k_relativeTol*edgeAxis.separation+k_absoluteTol){primaryAxis=polygonAxis}else{primaryAxis=edgeAxis}}var ie=new Array(2);var rf=new b2ReferenceFace();if(primaryAxis.type==b2EPAxis.e_edgeA){manifold.type=b2Manifold.e_faceA;var bestIndex=0;var bestValue=this.m_normal.x*this.m_polygonB.normals[0].x+this.m_normal.y*this.m_polygonB.normals[0].y;for(var i=1;ithis.m_radius){axis.type=b2EPAxis.e_edgeB;axis.index=i;axis.separation=s;return axis}if(nx*perpx+ny*perpy>=0){if((nx-this.m_upperLimit.x)*this.m_normal.x+(ny-this.m_upperLimit.y)*this.m_normal.y<-b2_angularSlop){continue}}else{if((nx-this.m_lowerLimit.x)*this.m_normal.x+(ny-this.m_lowerLimit.y)*this.m_normal.y<-b2_angularSlop){continue}}if(s>axis.separation){axis.type=b2EPAxis.e_edgeB;axis.index=i;axis.separation=s}}return axis}};b2EPCollider.e_isolated=0;b2EPCollider.e_concave=1;b2EPCollider.e_convex=2;function b2CollideEdgeAndPolygon(manifold,edgeA,xfA,polygonB,xfB){b2CollideEdgeAndPolygon.collider.Collide(manifold,edgeA,xfA,polygonB,xfB)}b2CollideEdgeAndPolygon.collider=new b2EPCollider();function b2ClipSegmentToLine(vOut,vIn,normalx,normaly,offset,vertexIndexA){var numOut=0;var distance0=(normalx*vIn[0].v.x+normaly*vIn[0].v.y)-offset;var distance1=(normalx*vIn[1].v.x+normaly*vIn[1].v.y)-offset;if(distance0<=0){vOut[numOut++]=vIn[0]}if(distance1<=0){vOut[numOut++]=vIn[1]}if(distance0*distance1<0){var interp=distance0/(distance0-distance1);vOut[numOut]=new b2ClipVertex();vOut[numOut].v.x=vIn[0].v.x+(interp*(vIn[1].v.x-vIn[0].v.x));vOut[numOut].v.y=vIn[0].v.y+(interp*(vIn[1].v.y-vIn[0].v.y));vOut[numOut].id.indexA=vertexIndexA;vOut[numOut].id.indexB=vIn[0].id.indexB;vOut[numOut].id.typeA=b2ContactID.e_vertex;vOut[numOut].id.typeB=b2ContactID.e_face;++numOut}return numOut}function b2TestShapeOverlap(shapeA,indexA,shapeB,indexB,xfA,xfB){b2TestShapeOverlap.input.proxyA.Set(shapeA,indexA);b2TestShapeOverlap.input.proxyB.Set(shapeB,indexB);b2TestShapeOverlap.input.transformA=xfA;b2TestShapeOverlap.input.transformB=xfB;b2TestShapeOverlap.input.useRadii=true;b2TestShapeOverlap.cache.count=0;b2DistanceFunc(b2TestShapeOverlap.output,b2TestShapeOverlap.cache,b2TestShapeOverlap.input);return b2TestShapeOverlap.output.distance<10*b2_epsilon}b2TestShapeOverlap.input=new b2DistanceInput();b2TestShapeOverlap.cache=new b2SimplexCache();b2TestShapeOverlap.output=new b2DistanceOutput();function b2TestOverlap(a,b){return !((b.lowerBound.x-a.upperBound.x)>0||(b.lowerBound.y-a.upperBound.y)>0||(a.lowerBound.x-b.upperBound.x)>0||(a.lowerBound.y-b.upperBound.y)>0)}"use strict";var b2_nullNode=-1;function b2TreeNode(){this.aabb=new b2AABB();this.userData=null;this.parent=0;this.child1=this.child2=this.height=0}b2TreeNode.prototype={IsLeaf:function(){return this.child1==b2_nullNode}};function b2DynamicTree(){this.m_root=b2_nullNode;this.m_nodeCapacity=16;this.m_nodeCount=0;this.m_nodes=new Array(this.m_nodeCapacity);for(var i=0;i0){var nodeId=stack.pop();if(nodeId==b2_nullNode){continue}var node=this.m_nodes[nodeId];if(b2TestOverlap(node.aabb,aabb)){if(node.IsLeaf()){var proceed=callback.QueryCallback(nodeId);if(proceed==false){return}}else{stack.push(node.child1);stack.push(node.child2)}}}},RayCast:function(callback,input){var p1=input.p1;var p2=input.p2;var r=b2Vec2.Subtract(p2,p1);r.Normalize();var v=b2Cross_f_v2(1,r);var abs_v=b2Abs_v2(v);var maxFraction=input.maxFraction;var segmentAABB=new b2AABB();var t=b2Vec2.Add(p1,b2Vec2.Multiply(maxFraction,b2Vec2.Subtract(p2,p1)));segmentAABB.lowerBound.Assign(b2Min_v2(p1,t));segmentAABB.upperBound.Assign(b2Max_v2(p1,t));var stack=[];stack.push(this.m_root);while(stack.length>0){var nodeId=stack.pop();if(nodeId==b2_nullNode){continue}var node=this.m_nodes[nodeId];if(b2TestOverlap(node.aabb,segmentAABB)==false){continue}var c=node.aabb.GetCenter();var h=node.aabb.GetExtents();var separation=b2Abs(b2Dot_v2_v2(v,b2Vec2.Subtract(p1,c)))-b2Dot_v2_v2(abs_v,h);if(separation>0){continue}if(node.IsLeaf()){var subInput=new b2RayCastInput();subInput.p1.Assign(input.p1);subInput.p2.Assign(input.p2);subInput.maxFraction=maxFraction;var value=callback.RayCastCallback(subInput,nodeId);if(value==0){return}if(value>0){maxFraction=value;var t=b2Vec2.Add(p1,b2Vec2.Multiply(maxFraction,b2Vec2.Subtract(p2,p1)));segmentAABB.lowerBound.Assign(b2Min_v2(p1,t));segmentAABB.upperBound.Assign(b2Max_v2(p1,t))}}else{stack.push(node.child1);stack.push(node.child2)}}},Validate:function(){this.ValidateStructure(this.m_root);this.ValidateMetrics(this.m_root);var freeCount=0;var freeIndex=this.m_freeList;while(freeIndex!=b2_nullNode){freeIndex=this.m_nodes[freeIndex].parent;++freeCount}},GetHeight:function(){if(this.m_root==b2_nullNode){return 0}return this.m_nodes[this.m_root].height},GetMaxBalance:function(){var maxBalance=0;for(var i=0;i1){var minCost=b2_maxFloat;var iMin=-1,jMin=-1;for(i=0;i1){var iF=C.child1;var iG=C.child2;var F=this.m_nodes[iF];var G=this.m_nodes[iG];C.child1=iA;C.parent=A.parent;A.parent=iC;if(C.parent!=b2_nullNode){if(this.m_nodes[C.parent].child1==iA){this.m_nodes[C.parent].child1=iC}else{this.m_nodes[C.parent].child2=iC}}else{this.m_root=iC}if(F.height>G.height){C.child2=iF;A.child2=iG;G.parent=iA;A.aabb.Combine(B.aabb,G.aabb);C.aabb.Combine(A.aabb,F.aabb);A.height=1+b2Max(B.height,G.height);C.height=1+b2Max(A.height,F.height)}else{C.child2=iG;A.child2=iF;F.parent=iA;A.aabb.Combine(B.aabb,F.aabb);C.aabb.Combine(A.aabb,G.aabb);A.height=1+b2Max(B.height,F.height);C.height=1+b2Max(A.height,G.height)}return iC}if(balance<-1){var iD=B.child1;var iE=B.child2;var D=this.m_nodes[iD];var E=this.m_nodes[iE];B.child1=iA;B.parent=A.parent;A.parent=iB;if(B.parent!=b2_nullNode){if(this.m_nodes[B.parent].child1==iA){this.m_nodes[B.parent].child1=iB}else{this.m_nodes[B.parent].child2=iB}}else{this.m_root=iB}if(D.height>E.height){B.child2=iD;A.child1=iE;E.parent=iA;A.aabb.Combine(C.aabb,E.aabb);B.aabb.Combine(A.aabb,D.aabb);A.height=1+b2Max(C.height,E.height);B.height=1+b2Max(A.height,D.height)}else{B.child2=iE;A.child1=iD;D.parent=iA;A.aabb.Combine(C.aabb,D.aabb);B.aabb.Combine(A.aabb,E.aabb);A.height=1+b2Max(C.height,D.height);B.height=1+b2Max(A.height,E.height)}return iB}return iA},ComputeHeight:function(nodeId){if(typeof(nodeId)==="undefined"){nodeId=this.m_root}var node=this.m_nodes[nodeId];if(node.IsLeaf()){return 0}var height1=this.ComputeHeight(node.child1);var height2=this.ComputeHeight(node.child2);return 1+b2Max(height1,height2)},ValidateStructure:function(index){if(index==b2_nullNode){return}var node=this.m_nodes[index];var child1=node.child1;var child2=node.child2;if(node.IsLeaf()){return}this.ValidateStructure(child1);this.ValidateStructure(child2)},ValidateMetrics:function(index){if(index==b2_nullNode){return}var node=this.m_nodes[index];var child1=node.child1;var child2=node.child2;if(node.IsLeaf()){return}var height1=this.m_nodes[child1].height;var height2=this.m_nodes[child2].height;var height;height=1+b2Max(height1,height2);var aabb=new b2AABB();aabb.Combine(this.m_nodes[child1].aabb,this.m_nodes[child2].aabb);this.ValidateMetrics(child1);this.ValidateMetrics(child2)}};"use strict";function b2TOIInput(){this.proxyA=new b2DistanceProxy();this.proxyB=new b2DistanceProxy();this.sweepA=new b2Sweep();this.sweepB=new b2Sweep();this.tMax=0}function b2TOIOutput(){this.state=0;this.t=0}b2TOIOutput.e_unknown=0;b2TOIOutput.e_failed=1;b2TOIOutput.e_overlapped=2;b2TOIOutput.e_touching=3;b2TOIOutput.e_separated=4;function b2SeparationFunction(){this.m_proxyA=null;this.m_proxyB=null;this.m_sweepA=null;this.m_sweepB=null;this.m_type=0;this.m_localPoint=new b2Vec2();this.m_axis=new b2Vec2()}var _local_xfA=new b2Transform();var _local_xfB=new b2Transform();b2SeparationFunction.prototype={Initialize:function(cache,proxyA,sweepA,proxyB,sweepB,t1){this.m_proxyA=proxyA;this.m_proxyB=proxyB;var count=cache.count;this.m_sweepA=sweepA;this.m_sweepB=sweepB;this.m_sweepA.GetTransform(_local_xfA,t1);this.m_sweepB.GetTransform(_local_xfB,t1);if(count==1){this.m_type=b2SeparationFunction.e_points;var localPointA=this.m_proxyA.GetVertex(cache.indexA[0]);var localPointB=this.m_proxyB.GetVertex(cache.indexB[0]);var pointAx=(_local_xfA.q.c*localPointA.x-_local_xfA.q.s*localPointA.y)+_local_xfA.p.x;var pointAy=(_local_xfA.q.s*localPointA.x+_local_xfA.q.c*localPointA.y)+_local_xfA.p.y;var pointBx=(_local_xfB.q.c*localPointB.x-_local_xfB.q.s*localPointB.y)+_local_xfB.p.x;var pointBy=(_local_xfB.q.s*localPointB.x+_local_xfB.q.c*localPointB.y)+_local_xfB.p.y;this.m_axis.x=pointBx-pointAx;this.m_axis.y=pointBy-pointAy;var s=this.m_axis.Normalize();return s}else{if(cache.indexA[0]==cache.indexA[1]){this.m_type=b2SeparationFunction.e_faceB;var localPointB1=proxyB.GetVertex(cache.indexB[0]);var localPointB2=proxyB.GetVertex(cache.indexB[1]);this.m_axis.x=1*(localPointB2.y-localPointB1.y);this.m_axis.y=-1*(localPointB2.x-localPointB1.x);this.m_axis.Normalize();var normalx=_local_xfB.q.c*this.m_axis.x-_local_xfB.q.s*this.m_axis.y;var normaly=_local_xfB.q.s*this.m_axis.x+_local_xfB.q.c*this.m_axis.y;this.m_localPoint.x=0.5*(localPointB1.x+localPointB2.x);this.m_localPoint.y=0.5*(localPointB1.y+localPointB2.y);var pointBx=(_local_xfB.q.c*this.m_localPoint.x-_local_xfB.q.s*this.m_localPoint.y)+_local_xfB.p.x;var pointBy=(_local_xfB.q.s*this.m_localPoint.x+_local_xfB.q.c*this.m_localPoint.y)+_local_xfB.p.y;var localPointA=proxyA.GetVertex(cache.indexA[0]);var pointAx=(_local_xfA.q.c*localPointA.x-_local_xfA.q.s*localPointA.y)+_local_xfA.p.x;var pointAy=(_local_xfA.q.s*localPointA.x+_local_xfA.q.c*localPointA.y)+_local_xfA.p.y;var s=(pointAx-pointBx)*normalx+(pointAy-pointBy)*normaly;if(s<0){this.m_axis.x=-this.m_axis.x;this.m_axis.y=-this.m_axis.y;s=-s}return s}else{this.m_type=b2SeparationFunction.e_faceA;var localPointA1=this.m_proxyA.GetVertex(cache.indexA[0]);var localPointA2=this.m_proxyA.GetVertex(cache.indexA[1]);this.m_axis.x=1*(localPointA2.y-localPointA1.y);this.m_axis.y=-1*(localPointA2.x-localPointA1.x);this.m_axis.Normalize();var normalx=_local_xfA.q.c*this.m_axis.x-_local_xfA.q.s*this.m_axis.y;var normaly=_local_xfA.q.s*this.m_axis.x+_local_xfA.q.c*this.m_axis.y;this.m_localPoint.x=0.5*(localPointA1.x+localPointA2.x);this.m_localPoint.y=0.5*(localPointA1.y+localPointA2.y);var pointAx=(_local_xfA.q.c*this.m_localPoint.x-_local_xfA.q.s*this.m_localPoint.y)+_local_xfA.p.x;var pointAy=(_local_xfA.q.s*this.m_localPoint.x+_local_xfA.q.c*this.m_localPoint.y)+_local_xfA.p.y;var localPointB=this.m_proxyB.GetVertex(cache.indexB[0]);var pointBx=(_local_xfB.q.c*localPointB.x-_local_xfB.q.s*localPointB.y)+_local_xfB.p.x;var pointBy=(_local_xfB.q.s*localPointB.x+_local_xfB.q.c*localPointB.y)+_local_xfB.p.y;var s=(pointBx-pointAx)*normalx+(pointBy-pointAy)*normaly;if(s<0){this.m_axis.x=-this.m_axis.x;this.m_axis.y=-this.m_axis.y;s=-s}return s}}},FindMinSeparation:function(indices,t){this.m_sweepA.GetTransform(_local_xfA,t);this.m_sweepB.GetTransform(_local_xfB,t);switch(this.m_type){case b2SeparationFunction.e_points:var axisAx=_local_xfA.q.c*this.m_axis.x+_local_xfA.q.s*this.m_axis.y;var axisAy=-_local_xfA.q.s*this.m_axis.x+_local_xfA.q.c*this.m_axis.y;var axisBx=_local_xfB.q.c*-this.m_axis.x+_local_xfB.q.s*-this.m_axis.y;var axisBy=-_local_xfB.q.s*-this.m_axis.x+_local_xfB.q.c*-this.m_axis.y;indices[0]=this.m_proxyA.GetSupport(axisAx,axisAy);indices[1]=this.m_proxyB.GetSupport(axisBx,axisBy);var localPointA=this.m_proxyA.GetVertex(indices[0]);var localPointB=this.m_proxyB.GetVertex(indices[1]);var pointAx=(_local_xfA.q.c*localPointA.x-_local_xfA.q.s*localPointA.y)+_local_xfA.p.x;var pointAy=(_local_xfA.q.s*localPointA.x+_local_xfA.q.c*localPointA.y)+_local_xfA.p.y;var pointBx=(_local_xfB.q.c*localPointB.x-_local_xfB.q.s*localPointB.y)+_local_xfB.p.x;var pointBy=(_local_xfB.q.s*localPointB.x+_local_xfB.q.c*localPointB.y)+_local_xfB.p.y;return(pointBx-pointAx)*this.m_axis.x+(pointBy-pointAy)*this.m_axis.y;case b2SeparationFunction.e_faceA:var normalx=_local_xfA.q.c*this.m_axis.x-_local_xfA.q.s*this.m_axis.y;var normaly=_local_xfA.q.s*this.m_axis.x+_local_xfA.q.c*this.m_axis.y;var pointAx=(_local_xfA.q.c*this.m_localPoint.x-_local_xfA.q.s*this.m_localPoint.y)+_local_xfA.p.x;var pointAy=(_local_xfA.q.s*this.m_localPoint.x+_local_xfA.q.c*this.m_localPoint.y)+_local_xfA.p.y;var axisBx=_local_xfB.q.c*-normalx+_local_xfB.q.s*-normaly;var axisBy=-_local_xfB.q.s*-normalx+_local_xfB.q.c*-normaly;indices[0]=-1;indices[1]=this.m_proxyB.GetSupport(axisBx,axisBy);var localPointB=this.m_proxyB.GetVertex(indices[1]);var pointBx=(_local_xfB.q.c*localPointB.x-_local_xfB.q.s*localPointB.y)+_local_xfB.p.x;var pointBy=(_local_xfB.q.s*localPointB.x+_local_xfB.q.c*localPointB.y)+_local_xfB.p.y;return(pointBx-pointAx)*normalx+(pointBy-pointAy)*normaly;case b2SeparationFunction.e_faceB:var normalx=_local_xfB.q.c*this.m_axis.x-_local_xfB.q.s*this.m_axis.y;var normaly=_local_xfB.q.s*this.m_axis.x+_local_xfB.q.c*this.m_axis.y;var pointBx=(_local_xfB.q.c*this.m_localPoint.x-_local_xfB.q.s*this.m_localPoint.y)+_local_xfB.p.x;var pointBy=(_local_xfB.q.s*this.m_localPoint.x+_local_xfB.q.c*this.m_localPoint.y)+_local_xfB.p.y;var axisAx=_local_xfA.q.c*-normalx+_local_xfA.q.s*-normaly;var axisBy=-_local_xfA.q.s*-normalx+_local_xfA.q.c*-normaly;indices[1]=-1;indices[0]=this.m_proxyA.GetSupport(axisAx,axisBy);var localPointA=this.m_proxyA.GetVertex(indices[0]);var pointAx=(_local_xfA.q.c*localPointA.x-_local_xfA.q.s*localPointA.y)+_local_xfA.p.x;var pointAy=(_local_xfA.q.s*localPointA.x+_local_xfA.q.c*localPointA.y)+_local_xfA.p.y;return(pointAx-pointBx)*normalx+(pointAy-pointBy)*normaly}},Evaluate:function(indexA,indexB,t){this.m_sweepA.GetTransform(_local_xfA,t);this.m_sweepB.GetTransform(_local_xfB,t);switch(this.m_type){case b2SeparationFunction.e_points:var localPointA=this.m_proxyA.GetVertex(indexA);var localPointB=this.m_proxyB.GetVertex(indexB);var pointAx=(_local_xfA.q.c*localPointA.x-_local_xfA.q.s*localPointA.y)+_local_xfA.p.x;var pointAy=(_local_xfA.q.s*localPointA.x+_local_xfA.q.c*localPointA.y)+_local_xfA.p.y;var pointBx=(_local_xfB.q.c*localPointB.x-_local_xfB.q.s*localPointB.y)+_local_xfB.p.x;var pointBy=(_local_xfB.q.s*localPointB.x+_local_xfB.q.c*localPointB.y)+_local_xfB.p.y;var separation=(pointBx-pointAx)*this.m_axis.x+(pointBy-pointAy)*this.m_axis.y;return separation;case b2SeparationFunction.e_faceA:var normalx=_local_xfA.q.c*this.m_axis.x-_local_xfA.q.s*this.m_axis.y;var normaly=_local_xfA.q.s*this.m_axis.x+_local_xfA.q.c*this.m_axis.y;var pointAx=(_local_xfA.q.c*this.m_localPoint.x-_local_xfA.q.s*this.m_localPoint.y)+_local_xfA.p.x;var pointAy=(_local_xfA.q.s*this.m_localPoint.x+_local_xfA.q.c*this.m_localPoint.y)+_local_xfA.p.y;var localPointB=this.m_proxyB.GetVertex(indexB);var pointBx=(_local_xfB.q.c*localPointB.x-_local_xfB.q.s*localPointB.y)+_local_xfB.p.x;var pointBy=(_local_xfB.q.s*localPointB.x+_local_xfB.q.c*localPointB.y)+_local_xfB.p.y;var separation=(pointBx-pointAx)*normalx+(pointBy-pointAy)*normaly;return separation;case b2SeparationFunction.e_faceB:var normalx=_local_xfB.q.c*this.m_axis.x-_local_xfB.q.s*this.m_axis.y;var normaly=_local_xfB.q.s*this.m_axis.x+_local_xfB.q.c*this.m_axis.y;var pointBx=(_local_xfB.q.c*this.m_localPoint.x-_local_xfB.q.s*this.m_localPoint.y)+_local_xfB.p.x;var pointBy=(_local_xfB.q.s*this.m_localPoint.x+_local_xfB.q.c*this.m_localPoint.y)+_local_xfB.p.y;var localPointA=this.m_proxyA.GetVertex(indexA);var pointAx=(_local_xfA.q.c*localPointA.x-_local_xfA.q.s*localPointA.y)+_local_xfA.p.x;var pointAy=(_local_xfA.q.s*localPointA.x+_local_xfA.q.c*localPointA.y)+_local_xfA.p.y;var separation=(pointAx-pointBx)*normalx+(pointAy-pointBy)*normaly;return separation}}};b2SeparationFunction.e_points=0;b2SeparationFunction.e_faceA=1;b2SeparationFunction.e_faceB=2;var profile_toi=b2Profiler.create("toi","solveTOI");function b2TimeOfImpact(output,input){profile_toi.start();++b2TimeOfImpact.b2_toiCalls;output.state=b2TOIOutput.e_unknown;output.t=input.tMax;var proxyA=input.proxyA;var proxyB=input.proxyB;b2TimeOfImpact._temp_sweepA.Assign(input.sweepA);b2TimeOfImpact._temp_sweepB.Assign(input.sweepB);b2TimeOfImpact._temp_sweepA.Normalize();b2TimeOfImpact._temp_sweepB.Normalize();var tMax=input.tMax;var totalRadius=proxyA.m_radius+proxyB.m_radius;var target=b2Max(b2_linearSlop,totalRadius-3*b2_linearSlop);var tolerance=0.25*b2_linearSlop;var t1=0;var k_maxIterations=20;var iter=0;var cache=new b2SimplexCache();cache.count=0;var distanceInput=new b2DistanceInput();distanceInput.proxyA.Assign(input.proxyA);distanceInput.proxyB.Assign(input.proxyB);distanceInput.useRadii=false;for(;;){b2TimeOfImpact._temp_sweepA.GetTransform(distanceInput.transformA,t1);b2TimeOfImpact._temp_sweepB.GetTransform(distanceInput.transformB,t1);var distanceOutput=new b2DistanceOutput();b2DistanceFunc(distanceOutput,cache,distanceInput);if(distanceOutput.distance<=0){output.state=b2TOIOutput.e_overlapped;output.t=0;break}if(distanceOutput.distancetarget+tolerance){output.state=b2TOIOutput.e_separated;output.t=tMax;done=true;break}if(s2>target-tolerance){t1=t2;break}var s1=fcn.Evaluate(indices[0],indices[1],t1);if(s1target){a1=t;s1=s}else{a2=t;s2=s}if(rootIterCount==50){break}}b2TimeOfImpact.b2_toiMaxRootIters=b2Max(b2TimeOfImpact.b2_toiMaxRootIters,rootIterCount);++pushBackIter;if(pushBackIter==b2_maxPolygonVertices){break}}++iter;++b2TimeOfImpact.b2_toiIters;if(done){break}if(iter==k_maxIterations){output.state=b2TOIOutput.e_failed;output.t=t1;break}}b2TimeOfImpact.b2_toiMaxIters=b2Max(b2TimeOfImpact.b2_toiMaxIters,iter);profile_toi.stop();b2TimeOfImpact.b2_toiMaxTime=b2Max(b2TimeOfImpact.b2_toiMaxTime,profile_toi.elapsedTime);b2TimeOfImpact.b2_toiTime+=profile_toi.elapsedTime}b2TimeOfImpact._temp_sweepA=new b2Sweep();b2TimeOfImpact._temp_sweepB=new b2Sweep();b2TimeOfImpact.b2_toiTime=0;b2TimeOfImpact.b2_toiMaxTime=0;b2TimeOfImpact.b2_toiCalls=0;b2TimeOfImpact.b2_toiIters=0;b2TimeOfImpact.b2_toiMaxIters=0;b2TimeOfImpact.b2_toiRootIters=0;b2TimeOfImpact.b2_toiMaxRootIters=0;"use strict";function b2BodyDef(){this.type=b2Body.b2_staticBody;this.position=new b2Vec2(0,0);this.angle=0;this.linearVelocity=new b2Vec2(0,0);this.angularVelocity=0;this.linearDamping=0;this.angularDamping=0;this.allowSleep=true;this.awake=true;this.fixedRotation=false;this.bullet=false;this.active=true;this.userData=null;this.gravityScale=1;Object.seal(this)}b2BodyDef.prototype={_deserialize:function(data){this.type=data.type;this.position._deserialize(data.position);this.angle=data.angle;this.linearVelocity._deserialize(data.linearVelocity);this.angularVelocity=data.angularVelocity;this.linearDamping=data.linearDamping;this.angularDamping=data.angularDamping;this.allowSleep=data.allowSleep;this.awake=data.awake;this.fixedRotation=data.fixedRotation;this.bullet=data.bullet;this.active=data.active;this.gravityScale=data.gravityScale}};function b2Body(bd,world){this.m_islandIndex=0;this.m_flags=0;if(bd.bullet){this.m_flags|=b2Body.e_bulletFlag}if(bd.fixedRotation){this.m_flags|=b2Body.e_fixedRotationFlag}if(bd.allowSleep){this.m_flags|=b2Body.e_autoSleepFlag}if(bd.awake){this.m_flags|=b2Body.e_awakeFlag}if(bd.active){this.m_flags|=b2Body.e_activeFlag}this.m_world=world;this.m_xf=new b2Transform();this.m_xf.p.Assign(bd.position);this.m_xf.q.Set(bd.angle);this.m_sweep=new b2Sweep();this.m_sweep.localCenter.SetZero();this.m_sweep.c0.Assign(this.m_xf.p);this.m_sweep.c.Assign(this.m_xf.p);this.m_sweep.a0=bd.angle;this.m_sweep.a=bd.angle;this.m_sweep.alpha0=0;this.m_jointList=null;this.m_contactList=null;this.m_prev=null;this.m_next=null;this.m_linearVelocity=bd.linearVelocity.Clone();this.m_angularVelocity=bd.angularVelocity;this.m_linearDamping=bd.linearDamping;this.m_angularDamping=bd.angularDamping;this.m_gravityScale=bd.gravityScale;this.m_force=new b2Vec2();this.m_torque=0;this.m_sleepTime=0;this.m_type=bd.type;if(this.m_type==b2Body.b2_dynamicBody){this.m_mass=1;this.m_invMass=1}else{this.m_mass=0;this.m_invMass=0}this.m_I=0;this.m_invI=0;this.m_userData=bd.userData;this.m_fixtureList=null;this.m_fixtureCount=0}b2Body.b2_staticBody=0;b2Body.b2_kinematicBody=1;b2Body.b2_dynamicBody=2;b2Body.e_islandFlag=1;b2Body.e_awakeFlag=2;b2Body.e_autoSleepFlag=4;b2Body.e_bulletFlag=8;b2Body.e_fixedRotationFlag=16;b2Body.e_activeFlag=32;b2Body.e_toiFlag=64;b2Body.m_local_oldCenter=new b2Vec2();b2Body.m_local_xf1=new b2Transform();b2Body.prototype={CreateFixture:function(def,density){if(typeof(density)!=="undefined"){var ndef=new b2FixtureDef();ndef.shape=def;ndef.density=density;return this.CreateFixture(ndef)}if(this.m_world.IsLocked()==true){return null}var fixture=new b2Fixture();fixture.Create(this,def);if(this.m_flags&b2Body.e_activeFlag){var broadPhase=this.m_world.m_contactManager.m_broadPhase;fixture.CreateProxies(broadPhase,this.m_xf)}fixture.m_next=this.m_fixtureList;this.m_fixtureList=fixture;++this.m_fixtureCount;fixture.m_body=this;if(fixture.m_density>0){this.ResetMassData()}this.m_world.m_flags|=b2World.e_newFixture;return fixture},DestroyFixture:function(fixture){if(this.m_world.IsLocked()==true){return}var node=this.m_fixtureList;var found=false;while(node!=null){if(node==fixture){this.m_fixtureList=node=fixture.m_next;found=true;break}node=node.m_next}var edge=this.m_contactList;while(edge){var c=edge.contact;edge=edge.next;var fixtureA=c.GetFixtureA();var fixtureB=c.GetFixtureB();if(fixture==fixtureA||fixture==fixtureB){this.m_world.m_contactManager.Destroy(c)}}if(this.m_flags&b2Body.e_activeFlag){var broadPhase=this.m_world.m_contactManager.m_broadPhase;fixture.DestroyProxies(broadPhase)}fixture.Destroy();fixture.m_body=null;fixture.m_next=null;--this.m_fixtureCount;this.ResetMassData()},SetTransform:function(position,angle){if(this.m_world.IsLocked()==true){return}this.m_xf.q.Set(angle);this.m_xf.p.Assign(position);this.m_sweep.c.Assign(b2Mul_t_v2(this.m_xf,this.m_sweep.localCenter));this.m_sweep.a=angle;this.m_sweep.c0.Assign(this.m_sweep.c);this.m_sweep.a0=angle;var broadPhase=this.m_world.m_contactManager.m_broadPhase;for(var f=this.m_fixtureList;f;f=f.m_next){f.Synchronize(broadPhase,this.m_xf,this.m_xf)}},GetTransform:function(){return this.m_xf},GetPosition:function(){return this.m_xf.p},GetAngle:function(){return this.m_sweep.a},GetWorldCenter:function(){return this.m_sweep.c},GetLocalCenter:function(){return this.m_sweep.localCenter},SetLinearVelocity:function(v){if(this.m_type==b2Body.b2_staticBody){return}if(b2Dot_v2_v2(v,v)>0){this.SetAwake(true)}this.m_linearVelocity=v},GetLinearVelocity:function(){return this.m_linearVelocity},SetAngularVelocity:function(w){if(this.m_type==b2Body.b2_staticBody){return}if(w*w>0){this.SetAwake(true)}this.m_angularVelocity=w},GetAngularVelocity:function(){return this.m_angularVelocity},ApplyForce:function(force,point,wake){if(this.m_type!=b2Body.b2_dynamicBody){return}if(wake&&(this.m_flags&b2Body.e_awakeFlag)==0){this.SetAwake(true)}if(this.m_flags&b2Body.e_awakeFlag){this.m_force.Add(force);this.m_torque+=b2Cross_v2_v2(b2Vec2.Subtract(point,this.m_sweep.c),force)}},ApplyForceToCenter:function(force,wake){if(this.m_type!=b2Body.b2_dynamicBody){return}if(wake&&(this.m_flags&b2Body.e_awakeFlag)==0){this.SetAwake(true)}if(this.m_flags&b2Body.e_awakeFlag){this.m_force.Add(force)}},ApplyTorque:function(torque,wake){if(this.m_type!=b2Body.b2_dynamicBody){return}if(wake&&(this.m_flags&b2Body.e_awakeFlag)==0){this.SetAwake(true)}if(this.m_flags&b2Body.e_awakeFlag){this.m_torque+=torque}},ApplyLinearImpulse:function(impulse,point,wake){if(this.m_type!=b2Body.b2_dynamicBody){return}if(wake&&(this.m_flags&b2Body.e_awakeFlag)==0){this.SetAwake(true)}if(this.m_flags&b2Body.e_awakeFlag){this.m_linearVelocity.Add(b2Vec2.Multiply(this.m_invMass,impulse));this.m_angularVelocity+=this.m_invI*b2Cross_v2_v2(b2Vec2.Subtract(point,this.m_sweep.c),impulse)}},ApplyAngularImpulse:function(impulse,wake){if(this.m_type!=b2Body.b2_dynamicBody){return}if(wake&&(this.m_flags&b2Body.e_awakeFlag)==0){this.SetAwake(true)}if(this.m_flags&b2Body.e_awakeFlag){this.m_angularVelocity+=this.m_invI*impulse}},GetMass:function(){return this.m_mass},GetInertia:function(){return this.m_I+this.m_mass*b2Dot_v2_v2(this.m_sweep.localCenter,this.m_sweep.localCenter)},GetMassData:function(data){data.mass=this.m_mass;data.I=this.m_I+this.m_mass*b2Dot_v2_v2(this.m_sweep.localCenter,this.m_sweep.localCenter);data.center=this.m_sweep.localCenter},SetMassData:function(massData){if(this.m_world.IsLocked()==true){return}if(this.m_type!=b2Body.b2_dynamicBody){return}this.m_invMass=0;this.m_I=0;this.m_invI=0;this.m_mass=massData.mass;if(this.m_mass<=0){this.m_mass=1}this.m_invMass=1/this.m_mass;if(massData.I>0&&(this.m_flags&b2Body.e_fixedRotationFlag)==0){this.m_I=massData.I-this.m_mass*b2Dot_v2_v2(massData.center,massData.center);this.m_invI=1/this.m_I}b2Body.m_local_oldCenter.Assign(this.m_sweep.c);this.m_sweep.localCenter.Assign(massData.center);this.m_sweep.c0.Assign(b2Mul_t_v2(this.m_xf,this.m_sweep.localCenter));this.m_sweep.c.Assign(this.m_sweep.c0);this.m_linearVelocity.Add(b2Cross_f_v2(this.m_angularVelocity,b2Vec2.Subtract(this.m_sweep.c,b2Body.m_local_oldCenter)))},ResetMassData:function(){this.m_mass=0;this.m_invMass=0;this.m_I=0;this.m_invI=0;this.m_sweep.localCenter.SetZero();if(this.m_type==b2Body.b2_staticBody||this.m_type==b2Body.b2_kinematicBody){this.m_sweep.c0.Assign(this.m_xf.p);this.m_sweep.c.Assign(this.m_xf.p);this.m_sweep.a0=this.m_sweep.a;return}var localCenter=new b2Vec2(0,0);for(var f=this.m_fixtureList;f;f=f.m_next){if(f.m_density==0){continue}var massData=new b2MassData();f.GetMassData(massData);this.m_mass+=massData.mass;localCenter.Add(b2Vec2.Multiply(massData.mass,massData.center));this.m_I+=massData.I}if(this.m_mass>0){this.m_invMass=1/this.m_mass;localCenter.Multiply(this.m_invMass)}else{this.m_mass=1;this.m_invMass=1}if(this.m_I>0&&(this.m_flags&b2Body.e_fixedRotationFlag)==0){this.m_I-=this.m_mass*b2Dot_v2_v2(localCenter,localCenter);this.m_invI=1/this.m_I}else{this.m_I=0;this.m_invI=0}b2Body.m_local_oldCenter.Assign(this.m_sweep.c);this.m_sweep.localCenter.Assign(localCenter);this.m_sweep.c0.Assign(b2Mul_t_v2(this.m_xf,this.m_sweep.localCenter));this.m_sweep.c.Assign(this.m_sweep.c0);this.m_linearVelocity.Add(b2Cross_f_v2(this.m_angularVelocity,b2Vec2.Subtract(this.m_sweep.c,b2Body.m_local_oldCenter)))},GetWorldPoint:function(localPoint){return b2Mul_t_v2(this.m_xf,localPoint)},GetWorldVector:function(localVector){return b2Mul_r_v2(this.m_xf.q,localVector)},GetLocalPoint:function(worldPoint){return b2MulT_t_v2(this.m_xf,worldPoint)},GetLocalVector:function(worldVector){return b2MulT_r_v2(this.m_xf.q,worldVector)},GetLinearVelocityFromWorldPoint:function(worldPoint){return b2Vec2.Add(this.m_linearVelocity,b2Cross_f_v2(this.m_angularVelocity,b2Vec2.Subtract(worldPoint,this.m_sweep.c)))},GetLinearVelocityFromLocalPoint:function(localPoint){return this.GetLinearVelocityFromWorldPoint(this.GetWorldPoint(localPoint))},GetLinearDamping:function(){return this.m_linearDamping},SetLinearDamping:function(linearDamping){this.m_linearDamping=linearDamping},GetAngularDamping:function(){return this.m_angularDamping},SetAngularDamping:function(angularDamping){this.m_angularDamping=angularDamping},GetGravityScale:function(){return this.m_gravityScale},SetGravityScale:function(scale){this.m_gravityScale=scale},SetType:function(type){if(this.m_world.IsLocked()==true){return}if(this.m_type==type){return}this.m_type=type;this.ResetMassData();if(this.m_type==b2Body.b2_staticBody){this.m_linearVelocity.SetZero();this.m_angularVelocity=0;this.m_sweep.a0=this.m_sweep.a;this.m_sweep.c0.Assign(this.m_sweep.c);this.SynchronizeFixtures()}this.SetAwake(true);this.m_force.SetZero();this.m_torque=0;var ce=this.m_contactList;while(ce){var ce0=ce;ce=ce.next;this.m_world.m_contactManager.Destroy(ce0.contact)}this.m_contactList=null;var broadPhase=this.m_world.m_contactManager.m_broadPhase;for(var f=this.m_fixtureList;f;f=f.m_next){var proxyCount=f.m_proxyCount;for(var i=0;i0}var collide=(filterA.maskBits&filterB.categoryBits)!=0&&(filterA.categoryBits&filterB.maskBits)!=0;return collide}};function b2ContactImpulse(){this.normalImpulses=new Array(b2_maxManifoldPoints);this.tangentImpulses=new Array(b2_maxManifoldPoints);this.count=0}function b2ContactListener(){}b2ContactListener.prototype={BeginContact:function(contact){},EndContact:function(contact){},PreSolve:function(contact,oldManifold){},PostSolve:function(contact,impulse){}};function b2QueryCallback(){}b2QueryCallback.prototype={ReportFixture:function(fixture){}};function b2RayCastCallback(){}b2RayCastCallback.prototype={ReportFixture:function(fixture,point,normal,fraction){}};"use strict";function b2TimeStep(){this.dt=0;this.inv_dt=0;this.dtRatio=0;this.velocityIterations=0;this.positionIterations=0;this.warmStarting=false}function b2Position(){this.c=new b2Vec2();this.a=0}function b2Velocity(){this.v=new b2Vec2();this.w=0}function b2SolverData(){this.step=new b2TimeStep();this.positions=null;this.velocities=null}"use strict";var profile_world_step=b2Profiler.create("step");var profile_world_collide=b2Profiler.create("collide","step");var profile_world_solve=b2Profiler.create("solve","step");var profile_world_solveTOI=b2Profiler.create("solveTOI","step");var profile_world_broadphase=b2Profiler.create("broadphase","step");function b2World(gravity){this.m_contactManager=new b2ContactManager();this.m_destructionListener=null;this.g_debugDraw=null;this.m_bodyList=null;this.m_jointList=null;this.m_bodyCount=0;this.m_jointCount=0;this.m_warmStarting=true;this.m_continuousPhysics=true;this.m_subStepping=false;this.m_stepComplete=true;this.m_allowSleep=true;this.m_gravity=gravity;this.m_flags=b2World.e_clearForces;this.m_inv_dt0=0;this.p_step=new b2TimeStep();this.p_island=new b2Island()}function b2WorldQueryWrapper(){this.broadPhase=null;this.callback=null}b2WorldQueryWrapper.prototype={QueryCallback:function(proxyId){var proxy=this.broadPhase.GetUserData(proxyId);return this.callback.ReportFixture(proxy.fixture)}};function b2WorldRayCastWrapper(){this.broadPhase=null;this.callback=null}b2WorldRayCastWrapper.prototype={RayCastCallback:function(input,proxyId){var userData=this.broadPhase.GetUserData(proxyId);var proxy=userData;var fixture=proxy.fixture;var index=proxy.childIndex;var output=new b2RayCastOutput();var hit=fixture.RayCast(output,input,index);if(hit){var fraction=output.fraction;var point=b2Vec2.Add(b2Vec2.Multiply((1-fraction),input.p1),b2Vec2.Multiply(fraction,input.p2));return this.callback.ReportFixture(fixture,point,output.normal,fraction)}return input.maxFraction}};b2World.m_local_sweep_backupA=new b2Sweep();b2World.m_local_sweep_backupB=new b2Sweep();b2World.m_local_sweep_backupC=new b2Sweep();b2World.prototype={Destroy:function(){var b=this.m_bodyList;while(b){var bNext=b.m_next;var f=b.m_fixtureList;while(f){var fNext=f.m_next;f.m_proxyCount=0;f.Destroy();f=fNext}b=bNext}},SetDestructionListener:function(listener){this.m_destructionListener=listener},SetContactFilter:function(filter){this.m_contactManager.m_contactFilter=filter},SetContactListener:function(listener){this.m_contactManager.m_contactListener=listener},SetDebugDraw:function(debugDraw){this.g_debugDraw=debugDraw},CreateBody:function(def){if(this.IsLocked()){return null}var b=new b2Body(def,this);b.m_prev=null;b.m_next=this.m_bodyList;if(this.m_bodyList){this.m_bodyList.m_prev=b}this.m_bodyList=b;++this.m_bodyCount;return b},DestroyBody:function(b){if(this.IsLocked()){return}var je=b.m_jointList;while(je){var je0=je;je=je.next;if(this.m_destructionListener){this.m_destructionListener.SayGoodbyeJoint(je0.joint)}this.DestroyJoint(je0.joint);b.m_jointList=je}b.m_jointList=null;var ce=b.m_contactList;while(ce){var ce0=ce;ce=ce.next;this.m_contactManager.Destroy(ce0.contact)}b.m_contactList=null;var f=b.m_fixtureList;while(f){var f0=f;f=f.m_next;if(this.m_destructionListener){this.m_destructionListener.SayGoodbyeFixture(f0)}f0.DestroyProxies(this.m_contactManager.m_broadPhase);f0.Destroy();b.m_fixtureList=f;b.m_fixtureCount-=1}b.m_fixtureList=null;b.m_fixtureCount=0;if(b.m_prev){b.m_prev.m_next=b.m_next}if(b.m_next){b.m_next.m_prev=b.m_prev}if(b==this.m_bodyList){this.m_bodyList=b.m_next}b.m_destroyed=true;--this.m_bodyCount},CreateJoint:function(def){if(this.IsLocked()){return null}var j=b2Joint.Create(def);j.m_prev=null;j.m_next=this.m_jointList;if(this.m_jointList){this.m_jointList.m_prev=j}this.m_jointList=j;++this.m_jointCount;j.m_edgeA.joint=j;j.m_edgeA.other=j.m_bodyB;j.m_edgeA.prev=null;j.m_edgeA.next=j.m_bodyA.m_jointList;if(j.m_bodyA.m_jointList){j.m_bodyA.m_jointList.prev=j.m_edgeA}j.m_bodyA.m_jointList=j.m_edgeA;j.m_edgeB.joint=j;j.m_edgeB.other=j.m_bodyA;j.m_edgeB.prev=null;j.m_edgeB.next=j.m_bodyB.m_jointList;if(j.m_bodyB.m_jointList){j.m_bodyB.m_jointList.prev=j.m_edgeB}j.m_bodyB.m_jointList=j.m_edgeB;var bodyA=def.bodyA;var bodyB=def.bodyB;if(def.collideConnected==false){var edge=bodyB.GetContactList();while(edge){if(edge.other==bodyA){edge.contact.FlagForFiltering()}edge=edge.next}}return j},DestroyJoint:function(j){if(this.IsLocked()){return}var collideConnected=j.m_collideConnected;if(j.m_prev){j.m_prev.m_next=j.m_next}if(j.m_next){j.m_next.m_prev=j.m_prev}if(j==this.m_jointList){this.m_jointList=j.m_next}var bodyA=j.m_bodyA;var bodyB=j.m_bodyB;bodyA.SetAwake(true);bodyB.SetAwake(true);if(j.m_edgeA.prev){j.m_edgeA.prev.next=j.m_edgeA.next}if(j.m_edgeA.next){j.m_edgeA.next.prev=j.m_edgeA.prev}if(j.m_edgeA==bodyA.m_jointList){bodyA.m_jointList=j.m_edgeA.next}j.m_edgeA.prev=null;j.m_edgeA.next=null;if(j.m_edgeB.prev){j.m_edgeB.prev.next=j.m_edgeB.next}if(j.m_edgeB.next){j.m_edgeB.next.prev=j.m_edgeB.prev}if(j.m_edgeB==bodyB.m_jointList){bodyB.m_jointList=j.m_edgeB.next}j.m_edgeB.prev=null;j.m_edgeB.next=null;b2Joint.Destroy(j);--this.m_jointCount;if(collideConnected==false){var edge=bodyB.GetContactList();while(edge){if(edge.other==bodyA){edge.contact.FlagForFiltering()}edge=edge.next}}},Step:function(dt,velocityIterations,positionIterations){profile_world_step.start();if(this.m_flags&b2World.e_newFixture){this.m_contactManager.FindNewContacts();this.m_flags&=~b2World.e_newFixture}this.m_flags|=b2World.e_locked;this.p_step.dt=dt;this.p_step.velocityIterations=velocityIterations;this.p_step.positionIterations=positionIterations;if(dt>0){this.p_step.inv_dt=1/dt}else{this.p_step.inv_dt=0}this.p_step.dtRatio=this.m_inv_dt0*dt;this.p_step.warmStarting=this.m_warmStarting;profile_world_collide.start();this.m_contactManager.Collide();profile_world_collide.stop();if(this.m_stepComplete&&this.p_step.dt>0){profile_world_solve.start();this.Solve(this.p_step);profile_world_solve.stop()}if(this.m_continuousPhysics&&this.p_step.dt>0){profile_world_solveTOI.start();this.SolveTOI(this.p_step);profile_world_solveTOI.stop()}if(this.p_step.dt>0){this.m_inv_dt0=this.p_step.inv_dt}if(this.m_flags&b2World.e_clearForces){this.ClearForces()}this.m_flags&=~b2World.e_locked;profile_world_step.stop()},ClearForces:function(){for(var body=this.m_bodyList;body;body=body.GetNext()){body.m_force.x=body.m_force.y=0;body.m_torque=0}},DrawDebugData:function(){if(this.g_debugDraw==null){return}var flags=this.g_debugDraw.GetFlags();if(flags&b2Draw.e_shapeBit){for(var b=this.m_bodyList;b;b=b.GetNext()){var xf=b.GetTransform();for(var f=b.GetFixtureList();f;f=f.GetNext()){if(b.IsActive()==false){this.DrawShape(f,xf,new b2Color(0.5,0.5,0.3))}else{if(b.GetType()==b2Body.b2_staticBody){this.DrawShape(f,xf,new b2Color(0.5,0.9,0.5))}else{if(b.GetType()==b2Body.b2_kinematicBody){this.DrawShape(f,xf,new b2Color(0.5,0.5,0.9))}else{if(b.IsAwake()==false){this.DrawShape(f,xf,new b2Color(0.6,0.6,0.6))}else{this.DrawShape(f,xf,new b2Color(0.9,0.7,0.7))}}}}}}}if(flags&b2Draw.e_jointBit){for(var j=this.m_jointList;j;j=j.GetNext()){this.DrawJoint(j)}}if(flags&b2Draw.e_pairBit){var color=new b2Color(0.3,0.9,0.9);for(var c=this.m_contactManager.m_contactList;c;c=c.GetNext()){var fixtureA=c.GetFixtureA();var fixtureB=c.GetFixtureB();var cA=fixtureA.GetAABB(c.GetChildIndexA()).GetCenter();var cB=fixtureB.GetAABB(c.GetChildIndexB()).GetCenter();this.g_debugDraw.DrawSegment(cA,cB,color)}}if(flags&b2Draw.e_aabbBit){var color=new b2Color(0.9,0.3,0.9);var bp=this.m_contactManager.m_broadPhase;for(var b=this.m_bodyList;b;b=b.GetNext()){if(b.IsActive()==false){continue}for(var f=b.GetFixtureList();f;f=f.GetNext()){for(var i=0;i0){var b=stack[--stackCount];this.p_island.AddBody(b);b.SetAwake(true);if(b.GetType()==b2Body.b2_staticBody){continue}for(var ce=b.m_contactList;ce;ce=ce.next){var contact=ce.contact;if(contact.m_flags&b2Contact.e_islandFlag){continue}if(contact.IsEnabled()==false||contact.IsTouching()==false){continue}var sensorA=contact.m_fixtureA.m_isSensor;var sensorB=contact.m_fixtureB.m_isSensor;if(sensorA||sensorB){continue}this.p_island.AddContact(contact);contact.m_flags|=b2Contact.e_islandFlag;var other=ce.other;if(other.m_flags&b2Body.e_islandFlag){continue}stack[stackCount++]=other;other.m_flags|=b2Body.e_islandFlag}for(var je=b.m_jointList;je;je=je.next){if(je.joint.m_islandFlag==true){continue}var other=je.other;if(other.IsActive()==false){continue}this.p_island.AddJoint(je.joint);je.joint.m_islandFlag=true;if(other.m_flags&b2Body.e_islandFlag){continue}stack[stackCount++]=other;other.m_flags|=b2Body.e_islandFlag}}this.p_island.Solve(step,this.m_gravity,this.m_allowSleep);for(var i=0;ib2_maxSubSteps){continue}var alpha=1;if(c.m_flags&b2Contact.e_toiFlag){alpha=c.m_toi}else{var fA=c.GetFixtureA();var fB=c.GetFixtureB();if(fA.IsSensor()||fB.IsSensor()){continue}var bA=fA.GetBody();var bB=fB.GetBody();var typeA=bA.m_type;var typeB=bB.m_type;var activeA=bA.IsAwake()&&typeA!=b2Body.b2_staticBody;var activeB=bB.IsAwake()&&typeB!=b2Body.b2_staticBody;if(activeA==false&&activeB==false){continue}var collideA=bA.IsBullet()||typeA!=b2Body.b2_dynamicBody;var collideB=bB.IsBullet()||typeB!=b2Body.b2_dynamicBody;if(collideA==false&&collideB==false){continue}var alpha0=bA.m_sweep.alpha0;if(bA.m_sweep.alpha0restitution2?restitution1:restitution2}function b2ContactRegister(){this.fcn=null;this.primary=false}function b2ContactEdge(){this.other=null;this.contact=null;this.prev=null;this.next=null}function b2Contact(){this.m_nodeA=new b2ContactEdge();this.m_nodeB=new b2ContactEdge();this.m_manifold=new b2Manifold()}b2Contact.m_local_tempManifold=new b2Manifold();b2Contact.prototype={Create:function(fA,indexA,fB,indexB){this.m_toi=0;this.m_flags=b2Contact.e_enabledFlag;this.m_fixtureA=fA||null;this.m_fixtureB=fB||null;this.m_indexA=indexA||0;this.m_indexB=indexB||0;this.m_manifold.pointCount=0;this.m_prev=null;this.m_next=null;this.m_nodeA.contact=null;this.m_nodeA.prev=null;this.m_nodeA.next=null;this.m_nodeA.other=null;this.m_nodeB.contact=null;this.m_nodeB.prev=null;this.m_nodeB.next=null;this.m_nodeB.other=null;this.m_toiCount=0;if(fA){this.m_friction=b2MixFriction(this.m_fixtureA.m_friction,this.m_fixtureB.m_friction);this.m_restitution=b2MixRestitution(this.m_fixtureA.m_restitution,this.m_fixtureB.m_restitution)}else{this.m_friction=0;this.m_restitution=0}this.m_tangentSpeed=0},GetManifold:function(){return this.m_manifold},GetWorldManifold:function(worldManifold){var bodyA=this.m_fixtureA.GetBody();var bodyB=this.m_fixtureB.GetBody();var shapeA=this.m_fixtureA.GetShape();var shapeB=this.m_fixtureB.GetShape();worldManifold.Initialize(this.m_manifold,bodyA.GetTransform(),shapeA.m_radius,bodyB.GetTransform(),shapeB.m_radius)},IsTouching:function(){return(this.m_flags&b2Contact.e_touchingFlag)==b2Contact.e_touchingFlag},SetEnabled:function(flag){if(flag){this.m_flags|=b2Contact.e_enabledFlag}else{this.m_flags&=~b2Contact.e_enabledFlag}},IsEnabled:function(){return(this.m_flags&b2Contact.e_enabledFlag)==b2Contact.e_enabledFlag},GetNext:function(){return this.m_next},GetFixtureA:function(){return this.m_fixtureA},GetChildIndexA:function(){return this.m_indexA},GetFixtureB:function(){return this.m_fixtureB},GetChildIndexB:function(){return this.m_indexB},SetFriction:function(friction){this.m_friction=friction},GetFriction:function(){return this.m_friction},ResetFriction:function(){this.m_friction=b2MixFriction(this.m_fixtureA.m_friction,this.m_fixtureB.m_friction)},SetRestitution:function(restitution){this.m_restitution=restitution},GetRestitution:function(){return this.m_restitution},ResetRestitution:function(){this.m_restitution=b2MixRestitution(this.m_fixtureA.m_restitution,this.m_fixtureB.m_restitution)},SetTangentSpeed:function(speed){this.m_tangentSpeed=speed},GetTangentSpeed:function(){return this.m_tangentSpeed},Evaluate:function(manifold,xfA,xfB){},FlagForFiltering:function(){this.m_flags|=b2Contact.e_filterFlag},m_oldManifold:null,Update:function(listener){b2Contact.m_local_tempManifold.Assign(this.m_manifold);this.m_flags|=b2Contact.e_enabledFlag;var touching=false;var wasTouching=(this.m_flags&b2Contact.e_touchingFlag)==b2Contact.e_touchingFlag;var sensorA=this.m_fixtureA.IsSensor();var sensorB=this.m_fixtureB.IsSensor();var sensor=sensorA||sensorB;var bodyA=this.m_fixtureA.GetBody();var bodyB=this.m_fixtureB.GetBody();var xfA=bodyA.GetTransform();var xfB=bodyB.GetTransform();if(sensor){var shapeA=this.m_fixtureA.GetShape();var shapeB=this.m_fixtureB.GetShape();touching=b2TestShapeOverlap(shapeA,this.m_indexA,shapeB,this.m_indexB,xfA,xfB);this.m_manifold.pointCount=0}else{this.Evaluate(this.m_manifold,xfA,xfB);touching=this.m_manifold.pointCount>0;for(var i=0;i0&&fixtureA.IsSensor()==false&&fixtureB.IsSensor()==false){fixtureA.GetBody().SetAwake(true);fixtureB.GetBody().SetAwake(true)}var typeA=fixtureA.GetType();var typeB=fixtureB.GetType();b2Contact.s_registers[typeA][typeB].fcn.garbage.push(contact)};b2Contact.s_registers=[];b2Contact.s_initialized=false;"use strict";var b2_defaultFilter=new b2ContactFilter();var b2_defaultListener=new b2ContactListener();function b2ContactManager(){this.m_broadPhase=new b2BroadPhase();this.m_contactList=null;this.m_contactCount=0;this.m_contactFilter=b2_defaultFilter;this.m_contactListener=b2_defaultListener}b2ContactManager.prototype={AddPair:function(proxyUserDataA,proxyUserDataB){var proxyA=proxyUserDataA;var proxyB=proxyUserDataB;var fixtureA=proxyA.fixture;var fixtureB=proxyB.fixture;var indexA=proxyA.childIndex;var indexB=proxyB.childIndex;var bodyA=fixtureA.GetBody();var bodyB=fixtureB.GetBody();if(bodyA==bodyB){return}var edge=bodyB.GetContactList();while(edge){if(edge.other==bodyA){var fA=edge.contact.GetFixtureA();var fB=edge.contact.GetFixtureB();var iA=edge.contact.GetChildIndexA();var iB=edge.contact.GetChildIndexB();if(fA==fixtureA&&fB==fixtureB&&iA==indexA&&iB==indexB){return}if(fA==fixtureB&&fB==fixtureA&&iA==indexB&&iB==indexA){return}}edge=edge.next}if(bodyB.ShouldCollide(bodyA)==false){return}if(this.m_contactFilter&&this.m_contactFilter.ShouldCollide(fixtureA,fixtureB)==false){return}var c=b2Contact.Create(fixtureA,indexA,fixtureB,indexB);if(c==null){return}fixtureA=c.GetFixtureA();fixtureB=c.GetFixtureB();indexA=c.GetChildIndexA();indexB=c.GetChildIndexB();bodyA=fixtureA.GetBody();bodyB=fixtureB.GetBody();c.m_prev=null;c.m_next=this.m_contactList;if(this.m_contactList!=null){this.m_contactList.m_prev=c}this.m_contactList=c;c.m_nodeA.contact=c;c.m_nodeA.other=bodyB;c.m_nodeA.prev=null;c.m_nodeA.next=bodyA.m_contactList;if(bodyA.m_contactList!=null){bodyA.m_contactList.prev=c.m_nodeA}bodyA.m_contactList=c.m_nodeA;c.m_nodeB.contact=c;c.m_nodeB.other=bodyA;c.m_nodeB.prev=null;c.m_nodeB.next=bodyB.m_contactList;if(bodyB.m_contactList!=null){bodyB.m_contactList.prev=c.m_nodeB}bodyB.m_contactList=c.m_nodeB;if(fixtureA.IsSensor()==false&&fixtureB.IsSensor()==false){bodyA.SetAwake(true);bodyB.SetAwake(true)}++this.m_contactCount},FindNewContacts:function(){this.m_broadPhase.UpdatePairs(this)},Destroy:function(c){var fixtureA=c.GetFixtureA();var fixtureB=c.GetFixtureB();var bodyA=fixtureA.GetBody();var bodyB=fixtureB.GetBody();if(this.m_contactListener&&c.IsTouching()){this.m_contactListener.EndContact(c)}if(c.m_prev){c.m_prev.m_next=c.m_next}if(c.m_next){c.m_next.m_prev=c.m_prev}if(c==this.m_contactList){this.m_contactList=c.m_next}if(c.m_nodeA.prev){c.m_nodeA.prev.next=c.m_nodeA.next}if(c.m_nodeA.next){c.m_nodeA.next.prev=c.m_nodeA.prev}if(c.m_nodeA==bodyA.m_contactList){bodyA.m_contactList=c.m_nodeA.next}if(c.m_nodeB.prev){c.m_nodeB.prev.next=c.m_nodeB.next}if(c.m_nodeB.next){c.m_nodeB.next.prev=c.m_nodeB.prev}if(c.m_nodeB==bodyB.m_contactList){bodyB.m_contactList=c.m_nodeB.next}b2Contact.Destroy(c);--this.m_contactCount},Collide:function(){var c=this.m_contactList;while(c){var fixtureA=c.GetFixtureA();var fixtureB=c.GetFixtureB();var indexA=c.GetChildIndexA();var indexB=c.GetChildIndexB();var bodyA=fixtureA.GetBody();var bodyB=fixtureB.GetBody();if(c.m_flags&b2Contact.e_filterFlag){if(bodyB.ShouldCollide(bodyA)==false){var cNuke=c;c=cNuke.GetNext();this.Destroy(cNuke);continue}if(this.m_contactFilter&&this.m_contactFilter.ShouldCollide(fixtureA,fixtureB)==false){var cNuke=c;c=cNuke.GetNext();this.Destroy(cNuke);continue}c.m_flags&=~b2Contact.e_filterFlag}var activeA=bodyA.IsAwake()&&bodyA.m_type!=b2Body.b2_staticBody;var activeB=bodyB.IsAwake()&&bodyB.m_type!=b2Body.b2_staticBody;if(activeA==false&&activeB==false){c=c.GetNext();continue}var proxyIdA=fixtureA.m_proxies[indexA].proxyId;var proxyIdB=fixtureB.m_proxies[indexB].proxyId;var overlap=this.m_broadPhase.TestOverlap(proxyIdA,proxyIdB);if(overlap==false){var cNuke=c;c=cNuke.GetNext();this.Destroy(cNuke);continue}c.Update(this.m_contactListener);c=c.GetNext()}}};function b2VelocityConstraintPoint(){this.rA=new b2Vec2();this.rB=new b2Vec2();this.normalImpulse=0;this.tangentImpulse=0;this.normalMass=0;this.tangentMass=0;this.velocityBias=0}function b2ContactPositionConstraint(){this.localPoints=new Array(b2_maxManifoldPoints);this.localNormal=new b2Vec2();this.localPoint=new b2Vec2();this.indexA=0;this.indexB=0;this.invMassA=0,this.invMassB=0;this.localCenterA=new b2Vec2(),this.localCenterB=new b2Vec2();this.invIA=0,this.invIB=0;this.type=0;this.radiusA=0,this.radiusB=0;this.pointCount=0}function b2ContactVelocityConstraint(){this.points=new Array(b2_maxManifoldPoints);for(var i=0;i0?1/kNormal:0;var tangentx=1*vc.normal.y;var tangenty=-1*vc.normal.x;var rtA=vcp.rA.x*tangenty-vcp.rA.y*tangentx;var rtB=vcp.rB.x*tangenty-vcp.rB.y*tangentx;var kTangent=mA+mB+iA*rtA*rtA+iB*rtB*rtB;vcp.tangentMass=kTangent>0?1/kTangent:0;vcp.velocityBias=0;var vRel=vc.normal.x*(((vB.x+(-wB*vcp.rB.y))-vA.x)-(-wA*vcp.rA.y))+vc.normal.y*(((vB.y+(wB*vcp.rB.x))-vA.y)-(wA*vcp.rA.x));if(vRel<-b2_velocityThreshold){vcp.velocityBias=-vc.restitution*vRel}}if(vc.pointCount==2){var vcp1=vc.points[0];var vcp2=vc.points[1];var rn1A=vcp1.rA.x*vc.normal.y-vcp1.rA.y*vc.normal.x;var rn1B=vcp1.rB.x*vc.normal.y-vcp1.rB.y*vc.normal.x;var rn2A=vcp2.rA.x*vc.normal.y-vcp2.rA.y*vc.normal.x;var rn2B=vcp2.rB.x*vc.normal.y-vcp2.rB.y*vc.normal.x;var k11=mA+mB+iA*rn1A*rn1A+iB*rn1B*rn1B;var k22=mA+mB+iA*rn2A*rn2A+iB*rn2B*rn2B;var k12=mA+mB+iA*rn1A*rn2A+iB*rn1B*rn2B;var k_maxConditionNumber=1000;if(k11*k11=0&&xy>=0){var dx=xx-ax;var dy=xy-ay;var P1x=dx*normal.x;var P1y=dx*normal.y;var P2x=dy*normal.x;var P2y=dy*normal.y;vA.x-=mA*(P1x+P2x);vA.y-=mA*(P1y+P2y);wA-=iA*((cp1.rA.x*P1y-cp1.rA.y*P1x)+(cp2.rA.x*P2y-cp2.rA.y*P2x));vB.x+=mB*(P1x+P2x);vB.y+=mB*(P1y+P2y);wB+=iB*((cp1.rB.x*P1y-cp1.rB.y*P1x)+(cp2.rB.x*P2y-cp2.rB.y*P2x));cp1.normalImpulse=xx;cp2.normalImpulse=xy;break}xx=-cp1.normalMass*bx;xy=0;vn1=0;vn2=vc.K.ex.y*xx+by;if(xx>=0&&vn2>=0){dx=xx-ax;dy=xy-ay;P1x=dx*normal.x;P1y=dx*normal.y;P2x=dy*normal.x;P2y=dy*normal.y;vA.x-=mA*(P1x+P2x);vA.y-=mA*(P1y+P2y);wA-=iA*((cp1.rA.x*P1y-cp1.rA.y*P1x)+(cp2.rA.x*P2y-cp2.rA.y*P2x));vB.x+=mB*(P1x+P2x);vB.y+=mB*(P1y+P2y);wB+=iB*((cp1.rB.x*P1y-cp1.rB.y*P1x)+(cp2.rB.x*P2y-cp2.rB.y*P2x));cp1.normalImpulse=xx;cp2.normalImpulse=xy;break}xx=0;xy=-cp2.normalMass*by;vn1=vc.K.ey.x*xy+bx;vn2=0;if(xy>=0&&vn1>=0){dx=xx-ax;dy=xy-ay;P1x=dx*normal.x;P1y=dx*normal.y;P2x=dy*normal.x;P2y=dy*normal.y;vA.x-=mA*(P1x+P2x);vA.y-=mA*(P1y+P2y);wA-=iA*((cp1.rA.x*P1y-cp1.rA.y*P1x)+(cp2.rA.x*P2y-cp2.rA.y*P2x));vB.x+=mB*(P1x+P2x);vB.y+=mB*(P1y+P2y);wB+=iB*((cp1.rB.x*P1y-cp1.rB.y*P1x)+(cp2.rB.x*P2y-cp2.rB.y*P2x));cp1.normalImpulse=xx;cp2.normalImpulse=xy;break}xx=0;xy=0;vn1=bx;vn2=by;if(vn1>=0&&vn2>=0){dx=xx-ax;dy=xy-ay;P1x=dx*normal.x;P1y=dx*normal.y;P2x=dy*normal.x;P2y=dy*normal.y;vA.x-=mA*(P1x+P2x);vA.y-=mA*(P1y+P2y);wA-=iA*((cp1.rA.x*P1y-cp1.rA.y*P1x)+(cp2.rA.x*P2y-cp2.rA.y*P2x));vB.x+=mB*(P1x+P2x);vB.y+=mB*(P1y+P2y);wB+=iB*((cp1.rB.x*P1y-cp1.rB.y*P1x)+(cp2.rB.x*P2y-cp2.rB.y*P2x));cp1.normalImpulse=xx;cp2.normalImpulse=xy;break}break}}this.m_velocities[indexA].w=wA;this.m_velocities[indexB].w=wB}},StoreImpulses:function(){for(var i=0;i0?-C/K:0;var Px=impulse*normal.x;var Py=impulse*normal.y;cA.x-=mA*Px;cA.y-=mA*Py;aA-=iA*(rAx*Py-rAy*Px);cB.x+=mB*Px;cB.y+=mB*Py;aB+=iB*(rBx*Py-rBy*Px)}this.m_positions[indexA].a=aA;this.m_positions[indexB].a=aB}return minSeparation>=-3*b2_linearSlop},SolveTOIPositionConstraints:function(toiIndexA,toiIndexB){var minSeparation=0;for(var i=0;i0?-C/K:0;var P=b2Vec2.Multiply(impulse,normal);cA.Subtract(b2Vec2.Multiply(mA,P));aA-=iA*b2Cross_v2_v2(rA,P);cB.Add(b2Vec2.Multiply(mB,P));aB+=iB*b2Cross_v2_v2(rB,P)}this.m_positions[indexA].a=aA;this.m_positions[indexB].a=aB}return minSeparation>=-1.5*b2_linearSlop}};"use strict";function b2Island(){this.m_bodies=[];this.m_contacts=[];this.m_joints=[];this.m_velocities=[];this.m_positions=[]}var profile_solve_init=b2Profiler.create("solve initialization","solve");var profile_solve_init_warmStarting=b2Profiler.create("warm starting","solve initialization");var profile_solve_velocity=b2Profiler.create("solve velocities","solve");var profile_solve_position=b2Profiler.create("solve positions","solve");b2Island._solverData=new b2SolverData();b2Island._solverDef=new b2ContactSolverDef();b2Island._solver=new b2ContactSolver();b2Island.prototype={Clear:function(){this.m_bodyCount=0;this.m_contactCount=0;this.m_jointCount=0},Initialize:function(bodyCapacity,contactCapacity,jointCapacity,listener){this.m_listener=listener;this.m_bodyCapacity=bodyCapacity;this.m_contactCapacity=contactCapacity;this.m_jointCapacity=jointCapacity;this.m_bodyCount=0;this.m_contactCount=0;this.m_jointCount=0;this.m_bodies.length=bodyCapacity;this.m_contacts.length=contactCapacity;this.m_joints.length=jointCapacity;this.m_velocities.length=bodyCapacity;this.m_positions.length=bodyCapacity},Solve:function(step,gravity,allowSleep){profile_solve_init.start();var h=step.dt;for(var i=0;ib2_maxTranslationSquared){var ratio=b2_maxTranslation/b2Sqrt(translationl);v.x*=ratio;v.y*=ratio}var rotation=h*w;if(rotation*rotation>b2_maxRotationSquared){var ratio=b2_maxRotation/b2Abs(rotation);w*=ratio}c.x+=h*v.x;c.y+=h*v.y;a+=h*w;this.m_positions[i].a=a;this.m_velocities[i].w=w}var positionSolved=false;for(var i=0;iangTolSqr||b2Dot_v2_v2(b.m_linearVelocity,b.m_linearVelocity)>linTolSqr){b.m_sleepTime=0;minSleepTime=0}else{b.m_sleepTime+=h;minSleepTime=b2Min(minSleepTime,b.m_sleepTime)}}if(minSleepTime>=b2_timeToSleep&&positionSolved){for(var i=0;ib2_maxTranslationSquared){var ratio=b2_maxTranslation/translation.Length();v.Multiply(ratio)}var rotation=h*w;if(rotation*rotation>b2_maxRotationSquared){var ratio=b2_maxRotation/b2Abs(rotation);w*=ratio}c.Add(b2Vec2.Multiply(h,v));a+=h*w;this.m_positions[i].a=a;this.m_velocities[i].w=w;var body=this.m_bodies[i];body.m_sweep.c.Assign(c);body.m_sweep.a=a;body.m_linearVelocity.Assign(v);body.m_angularVelocity=w;body.SynchronizeTransform()}this.Report(b2Island._solver.m_velocityConstraints)},AddBody:function(body){body.m_islandIndex=this.m_bodyCount;this.m_bodies[this.m_bodyCount]=body;if(!this.m_positions[this.m_bodyCount]){this.m_positions[this.m_bodyCount]=new b2Position();this.m_velocities[this.m_bodyCount]=new b2Velocity()}++this.m_bodyCount},AddContact:function(contact){this.m_contacts[this.m_contactCount++]=contact},AddJoint:function(joint){this.m_joints[this.m_jointCount++]=joint},Report:function(constraints){if(this.m_listener==null){return}for(var i=0;i0){this.m_motorMass=1/this.m_motorMass}if(this.m_enableMotor==false||fixedRotation){this.m_motorImpulse=0}if(this.m_enableLimit&&fixedRotation==false){var jointAngle=aB-aA-this.m_referenceAngle;if(b2Abs(this.m_upperAngle-this.m_lowerAngle)<2*b2_angularSlop){this.m_limitState=b2Joint.e_equalLimits}else{if(jointAngle<=this.m_lowerAngle){if(this.m_limitState!=b2Joint.e_atLowerLimit){this.m_impulse.z=0}this.m_limitState=b2Joint.e_atLowerLimit}else{if(jointAngle>=this.m_upperAngle){if(this.m_limitState!=b2Joint.e_atUpperLimit){this.m_impulse.z=0}this.m_limitState=b2Joint.e_atUpperLimit}else{this.m_limitState=b2Joint.e_inactiveLimit;this.m_impulse.z=0}}}}else{this.m_limitState=b2Joint.e_inactiveLimit}if(data.step.warmStarting){this.m_impulse.Multiply(data.step.dtRatio);this.m_motorImpulse*=data.step.dtRatio;var P=new b2Vec2(this.m_impulse.x,this.m_impulse.y);vA.Subtract(b2Vec2.Multiply(mA,P));wA-=iA*(b2Cross_v2_v2(this.m_rA,P)+this.m_motorImpulse+this.m_impulse.z);vB.Add(b2Vec2.Multiply(mB,P));wB+=iB*(b2Cross_v2_v2(this.m_rB,P)+this.m_motorImpulse+this.m_impulse.z)}else{this.m_impulse.SetZero();this.m_motorImpulse=0}data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolveVelocityConstraints:function(data){var vA=data.velocities[this.m_indexA].v.Clone();var wA=data.velocities[this.m_indexA].w;var vB=data.velocities[this.m_indexB].v.Clone();var wB=data.velocities[this.m_indexB].w;var mA=this.m_invMassA,mB=this.m_invMassB;var iA=this.m_invIA,iB=this.m_invIB;var fixedRotation=(iA+iB==0);if(this.m_enableMotor&&this.m_limitState!=b2Joint.e_equalLimits&&fixedRotation==false){var Cdot=wB-wA-this.m_motorSpeed;var impulse=-this.m_motorMass*Cdot;var oldImpulse=this.m_motorImpulse;var maxImpulse=data.step.dt*this.m_maxMotorTorque;this.m_motorImpulse=b2Clamp(this.m_motorImpulse+impulse,-maxImpulse,maxImpulse);impulse=this.m_motorImpulse-oldImpulse;wA-=iA*impulse;wB+=iB*impulse}if(this.m_enableLimit&&this.m_limitState!=b2Joint.e_inactiveLimit&&fixedRotation==false){var Cdot1=b2Vec2.Subtract(b2Vec2.Subtract(b2Vec2.Add(vB,b2Cross_f_v2(wB,this.m_rB)),vA),b2Cross_f_v2(wA,this.m_rA));var Cdot2=wB-wA;var Cdot=new b2Vec3(Cdot1.x,Cdot1.y,Cdot2);var impulse=this.m_mass.Solve33(Cdot).Negate();if(this.m_limitState==b2Joint.e_equalLimits){this.m_impulse.Add(impulse)}else{if(this.m_limitState==b2Joint.e_atLowerLimit){var newImpulse=this.m_impulse.z+impulse.z;if(newImpulse<0){var rhs=b2Vec2.Add(Cdot1.Negate(),b2Vec2.Multiply(this.m_impulse.z,new b2Vec2(this.m_mass.ez.x,this.m_mass.ez.y)));var reduced=this.m_mass.Solve22(rhs);impulse.x=reduced.x;impulse.y=reduced.y;impulse.z=-this.m_impulse.z;this.m_impulse.x+=reduced.x;this.m_impulse.y+=reduced.y;this.m_impulse.z=0}else{this.m_impulse.Add(impulse)}}else{if(this.m_limitState==b2Joint.e_atUpperLimit){var newImpulse=this.m_impulse.z+impulse.z;if(newImpulse>0){var rhs=b2Vec2.Add(Cdot1.Negate(),b2Vec2.Multiply(this.m_impulse.z,new b2Vec2(this.m_mass.ez.x,this.m_mass.ez.y)));var reduced=this.m_mass.Solve22(rhs);impulse.x=reduced.x;impulse.y=reduced.y;impulse.z=-this.m_impulse.z;this.m_impulse.x+=reduced.x;this.m_impulse.y+=reduced.y;this.m_impulse.z=0}else{this.m_impulse.Add(impulse)}}}}var P=new b2Vec2(impulse.x,impulse.y);vA.Subtract(b2Vec2.Multiply(mA,P));wA-=iA*(b2Cross_v2_v2(this.m_rA,P)+impulse.z);vB.Add(b2Vec2.Multiply(mB,P));wB+=iB*(b2Cross_v2_v2(this.m_rB,P)+impulse.z)}else{var Cdot=b2Vec2.Subtract(b2Vec2.Subtract(b2Vec2.Add(vB,b2Cross_f_v2(wB,this.m_rB)),vA),b2Cross_f_v2(wA,this.m_rA));var impulse=this.m_mass.Solve22(Cdot.Negate());this.m_impulse.x+=impulse.x;this.m_impulse.y+=impulse.y;vA.Subtract(b2Vec2.Multiply(mA,impulse));wA-=iA*b2Cross_v2_v2(this.m_rA,impulse);vB.Add(b2Vec2.Multiply(mB,impulse));wB+=iB*b2Cross_v2_v2(this.m_rB,impulse)}data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolvePositionConstraints:function(data){var cA=data.positions[this.m_indexA].c.Clone();var aA=data.positions[this.m_indexA].a;var cB=data.positions[this.m_indexB].c.Clone();var aB=data.positions[this.m_indexB].a;var qA=new b2Rot(aA),qB=new b2Rot(aB);var angularError=0;var positionError=0;var fixedRotation=(this.m_invIA+this.m_invIB==0);if(this.m_enableLimit&&this.m_limitState!=b2Joint.e_inactiveLimit&&fixedRotation==false){var angle=aB-aA-this.m_referenceAngle;var limitImpulse=0;if(this.m_limitState==b2Joint.e_equalLimits){var C=b2Clamp(angle-this.m_lowerAngle,-b2_maxAngularCorrection,b2_maxAngularCorrection);limitImpulse=-this.m_motorMass*C;angularError=b2Abs(C)}else{if(this.m_limitState==b2Joint.e_atLowerLimit){var C=angle-this.m_lowerAngle;angularError=-C;C=b2Clamp(C+b2_angularSlop,-b2_maxAngularCorrection,0);limitImpulse=-this.m_motorMass*C}else{if(this.m_limitState==b2Joint.e_atUpperLimit){var C=angle-this.m_upperAngle;angularError=C;C=b2Clamp(C-b2_angularSlop,0,b2_maxAngularCorrection);limitImpulse=-this.m_motorMass*C}}}aA-=this.m_invIA*limitImpulse;aB+=this.m_invIB*limitImpulse}qA.Set(aA);qB.Set(aB);var rA=b2Mul_r_v2(qA,b2Vec2.Subtract(this.m_localAnchorA,this.m_localCenterA));var rB=b2Mul_r_v2(qB,b2Vec2.Subtract(this.m_localAnchorB,this.m_localCenterB));var C=b2Vec2.Subtract(b2Vec2.Subtract(b2Vec2.Add(cB,rB),cA),rA);positionError=C.Length();var mA=this.m_invMassA,mB=this.m_invMassB;var iA=this.m_invIA,iB=this.m_invIB;var K=new b2Mat22();K.ex.x=mA+mB+iA*rA.y*rA.y+iB*rB.y*rB.y;K.ex.y=-iA*rA.x*rA.y-iB*rB.x*rB.y;K.ey.x=K.ex.y;K.ey.y=mA+mB+iA*rA.x*rA.x+iB*rB.x*rB.x;var impulse=K.Solve(C).Negate();cA.Subtract(b2Vec2.Multiply(mA,impulse));aA-=iA*b2Cross_v2_v2(rA,impulse);cB.Add(b2Vec2.Multiply(mB,impulse));aB+=iB*b2Cross_v2_v2(rB,impulse);data.positions[this.m_indexA].c.Assign(cA);data.positions[this.m_indexA].a=aA;data.positions[this.m_indexB].c.Assign(cB);data.positions[this.m_indexB].a=aB;return positionError<=b2_linearSlop&&angularError<=b2_angularSlop},_serialize:function(out){var obj=out||{};this.parent.prototype._serialize.call(this,obj);obj.localAnchorA=this.m_localAnchorA._serialize();obj.localAnchorB=this.m_localAnchorB._serialize();obj.referenceAngle=this.m_referenceAngle;obj.lowerAngle=this.m_lowerAngle;obj.upperAngle=this.m_upperAngle;obj.maxMotorTorque=this.m_maxMotorTorque;obj.motorSpeed=this.m_motorSpeed;obj.enableLimit=this.m_enableLimit;obj.enableMotor=this.m_enableMotor;return obj}};b2RevoluteJoint._extend(b2Joint);function b2MouseJointDef(){this.parent.call(this);this.type=b2Joint.e_mouseJoint;this.target=new b2Vec2(0,0);this.maxForce=0;this.frequencyHz=5;this.dampingRatio=0.7;Object.seal(this)}b2MouseJointDef._extend(b2JointDef);function b2MouseJoint(def){this.parent.call(this,def);this.m_targetA=def.target.Clone();this.m_localAnchorB=b2MulT_t_v2(this.m_bodyB.GetTransform(),this.m_targetA);this.m_maxForce=def.maxForce;this.m_impulse=new b2Vec2();this.m_frequencyHz=def.frequencyHz;this.m_dampingRatio=def.dampingRatio;this.m_beta=0;this.m_gamma=0;this.m_indexA=0;this.m_indexB=0;this.m_rB=new b2Vec2();this.m_localCenterB=new b2Vec2();this.m_invMassB=0;this.m_invIB=0;this.m_mass=new b2Mat22();this.m_C=new b2Vec2()}b2MouseJoint.prototype={GetAnchorA:function(){return this.m_targetA},GetAnchorB:function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchorB)},GetReactionForce:function(inv_dt){return b2Vec2.Multiply(inv_dt,this.m_impulse)},GetReactionTorque:function(inv_dt){return inv_dt*0},SetTarget:function(target){if(this.m_bodyB.IsAwake()==false){this.m_bodyB.SetAwake(true)}this.m_targetA.Assign(target)},GetTarget:function(){return this.m_targetA},SetMaxForce:function(force){this.m_maxForce=force},GetMaxForce:function(){return this.m_maxForce},SetFrequency:function(hz){this.m_frequencyHz=hz},GetFrequency:function(){return this.m_frequencyHz},SetDampingRatio:function(ratio){this.m_dampingRatio=ratio},GetDampingRatio:function(){return this.m_dampingRatio},ShiftOrigin:function(newOrigin){this.m_targetA.Subtract(newOrigin)},InitVelocityConstraints:function(data){this.m_indexB=this.m_bodyB.m_islandIndex;this.m_localCenterB.Assign(this.m_bodyB.m_sweep.localCenter);this.m_invMassB=this.m_bodyB.m_invMass;this.m_invIB=this.m_bodyB.m_invI;var cB=data.positions[this.m_indexB].c.Clone();var aB=data.positions[this.m_indexB].a;var vB=data.velocities[this.m_indexB].v.Clone();var wB=data.velocities[this.m_indexB].w;var qB=new b2Rot(aB);var mass=this.m_bodyB.GetMass();var omega=2*b2_pi*this.m_frequencyHz;var d=2*mass*this.m_dampingRatio*omega;var k=mass*(omega*omega);var h=data.step.dt;this.m_gamma=h*(d+h*k);if(this.m_gamma!=0){this.m_gamma=1/this.m_gamma}this.m_beta=h*k*this.m_gamma;this.m_rB.Assign(b2Mul_r_v2(qB,b2Vec2.Subtract(this.m_localAnchorB,this.m_localCenterB)));var K=new b2Mat22();K.ex.x=this.m_invMassB+this.m_invIB*this.m_rB.y*this.m_rB.y+this.m_gamma;K.ex.y=-this.m_invIB*this.m_rB.x*this.m_rB.y;K.ey.x=K.ex.y;K.ey.y=this.m_invMassB+this.m_invIB*this.m_rB.x*this.m_rB.x+this.m_gamma;this.m_mass.Assign(K.GetInverse());this.m_C.Assign(b2Vec2.Subtract(b2Vec2.Add(cB,this.m_rB),this.m_targetA));this.m_C.Multiply(this.m_beta);wB*=0.98;if(data.step.warmStarting){this.m_impulse.Multiply(data.step.dtRatio);vB.Add(b2Vec2.Multiply(this.m_invMassB,this.m_impulse));wB+=this.m_invIB*b2Cross_v2_v2(this.m_rB,this.m_impulse)}else{this.m_impulse.SetZero()}data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolveVelocityConstraints:function(data){var vB=data.velocities[this.m_indexB].v.Clone();var wB=data.velocities[this.m_indexB].w;var Cdot=b2Vec2.Add(vB,b2Cross_f_v2(wB,this.m_rB));var impulse=b2Mul_m22_v2(this.m_mass,(b2Vec2.Add(b2Vec2.Add(Cdot,this.m_C),b2Vec2.Multiply(this.m_gamma,this.m_impulse))).Negate());var oldImpulse=this.m_impulse.Clone();this.m_impulse.Add(impulse);var maxImpulse=data.step.dt*this.m_maxForce;if(this.m_impulse.LengthSquared()>maxImpulse*maxImpulse){this.m_impulse.Multiply(maxImpulse/this.m_impulse.Length())}impulse.Assign(b2Vec2.Subtract(this.m_impulse,oldImpulse));vB.Add(b2Vec2.Multiply(this.m_invMassB,impulse));wB+=this.m_invIB*b2Cross_v2_v2(this.m_rB,impulse);data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolvePositionConstraints:function(data){return true}};b2MouseJoint._extend(b2Joint);function b2DistanceJointDef(){this.parent.call(this);this.type=b2Joint.e_distanceJoint;this.localAnchorA=new b2Vec2(0,0);this.localAnchorB=new b2Vec2(0,0);this.length=1;this.frequencyHz=0;this.dampingRatio=0;Object.seal(this)}b2DistanceJointDef.prototype={Initialize:function(b1,b2,anchor1,anchor2){this.bodyA=b1;this.bodyB=b2;this.localAnchorA=this.bodyA.GetLocalPoint(anchor1);this.localAnchorB=this.bodyB.GetLocalPoint(anchor2);var d=b2Vec2.Subtract(anchor2,anchor1);this.length=d.Length()},_deserialize:function(data,bodies,joints){this.parent.prototype._deserialize.call(this,data,bodies,joints);this.localAnchorA._deserialize(data.localAnchorA);this.localAnchorB._deserialize(data.localAnchorB);this.length=data.length;this.frequencyHz=data.frequencyHz;this.dampingRatio=data.dampingRatio}};b2DistanceJointDef._extend(b2JointDef);function b2DistanceJoint(def){this.parent.call(this,def);this.m_localAnchorA=def.localAnchorA.Clone();this.m_localAnchorB=def.localAnchorB.Clone();this.m_length=def.length;this.m_frequencyHz=def.frequencyHz;this.m_dampingRatio=def.dampingRatio;this.m_impulse=0;this.m_gamma=0;this.m_bias=0;this.m_indexA=0;this.m_indexB=0;this.m_u=new b2Vec2();this.m_rA=new b2Vec2();this.m_rB=new b2Vec2();this.m_localCenterA=new b2Vec2();this.m_localCenterB=new b2Vec2();this.m_invMassA=0;this.m_invMassB=0;this.m_invIA=0;this.m_invIB=0;this.m_mass=0}b2DistanceJoint.prototype={GetAnchorA:function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchorA)},GetAnchorB:function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchorB)},GetReactionForce:function(inv_dt){var F=b2Vec2.Multiply((inv_dt*this.m_impulse),this.m_u);return F},GetReactionTorque:function(inv_dt){return 0},GetLocalAnchorA:function(){return this.m_localAnchorA},GetLocalAnchorB:function(){return this.m_localAnchorB},SetLength:function(length){this.m_length=length},GetLength:function(){return this.m_length},SetFrequency:function(hz){this.m_frequencyHz=hz},GetFrequency:function(){return this.m_frequencyHz},SetDampingRatio:function(ratio){this.m_dampingRatio=ratio},GetDampingRatio:function(){return this.m_dampingRatio},InitVelocityConstraints:function(data){this.m_indexA=this.m_bodyA.m_islandIndex;this.m_indexB=this.m_bodyB.m_islandIndex;this.m_localCenterA.Assign(this.m_bodyA.m_sweep.localCenter);this.m_localCenterB.Assign(this.m_bodyB.m_sweep.localCenter);this.m_invMassA=this.m_bodyA.m_invMass;this.m_invMassB=this.m_bodyB.m_invMass;this.m_invIA=this.m_bodyA.m_invI;this.m_invIB=this.m_bodyB.m_invI;var cA=data.positions[this.m_indexA].c.Clone();var aA=data.positions[this.m_indexA].a;var vA=data.velocities[this.m_indexA].v.Clone();var wA=data.velocities[this.m_indexA].w;var cB=data.positions[this.m_indexB].c.Clone();var aB=data.positions[this.m_indexB].a;var vB=data.velocities[this.m_indexB].v.Clone();var wB=data.velocities[this.m_indexB].w;var qA=new b2Rot(aA),qB=new b2Rot(aB);this.m_rA=b2Mul_r_v2(qA,b2Vec2.Subtract(this.m_localAnchorA,this.m_localCenterA));this.m_rB=b2Mul_r_v2(qB,b2Vec2.Subtract(this.m_localAnchorB,this.m_localCenterB));this.m_u=b2Vec2.Subtract(b2Vec2.Subtract(b2Vec2.Add(cB,this.m_rB),cA),this.m_rA);var length=this.m_u.Length();if(length>b2_linearSlop){this.m_u.Multiply(1/length)}else{this.m_u.Set(0,0)}var crAu=b2Cross_v2_v2(this.m_rA,this.m_u);var crBu=b2Cross_v2_v2(this.m_rB,this.m_u);var invMass=this.m_invMassA+this.m_invIA*crAu*crAu+this.m_invMassB+this.m_invIB*crBu*crBu;this.m_mass=invMass!=0?1/invMass:0;if(this.m_frequencyHz>0){var C=length-this.m_length;var omega=2*b2_pi*this.m_frequencyHz;var d=2*this.m_mass*this.m_dampingRatio*omega;var k=this.m_mass*omega*omega;var h=data.step.dt;this.m_gamma=h*(d+h*k);this.m_gamma=this.m_gamma!=0?1/this.m_gamma:0;this.m_bias=C*h*k*this.m_gamma;invMass+=this.m_gamma;this.m_mass=invMass!=0?1/invMass:0}else{this.m_gamma=0;this.m_bias=0}if(data.step.warmStarting){this.m_impulse*=data.step.dtRatio;var P=b2Vec2.Multiply(this.m_impulse,this.m_u);vA.Subtract(b2Vec2.Multiply(this.m_invMassA,P));wA-=this.m_invIA*b2Cross_v2_v2(this.m_rA,P);vB.Add(b2Vec2.Multiply(this.m_invMassB,P));wB+=this.m_invIB*b2Cross_v2_v2(this.m_rB,P)}else{this.m_impulse=0}data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolveVelocityConstraints:function(data){var vA=data.velocities[this.m_indexA].v.Clone();var wA=data.velocities[this.m_indexA].w;var vB=data.velocities[this.m_indexB].v.Clone();var wB=data.velocities[this.m_indexB].w;var vpA=b2Vec2.Add(vA,b2Cross_f_v2(wA,this.m_rA));var vpB=b2Vec2.Add(vB,b2Cross_f_v2(wB,this.m_rB));var Cdot=b2Dot_v2_v2(this.m_u,b2Vec2.Subtract(vpB,vpA));var impulse=-this.m_mass*(Cdot+this.m_bias+this.m_gamma*this.m_impulse);this.m_impulse+=impulse;var P=b2Vec2.Multiply(impulse,this.m_u);vA.Subtract(b2Vec2.Multiply(this.m_invMassA,P));wA-=this.m_invIA*b2Cross_v2_v2(this.m_rA,P);vB.Add(b2Vec2.Multiply(this.m_invMassB,P));wB+=this.m_invIB*b2Cross_v2_v2(this.m_rB,P);data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolvePositionConstraints:function(data){if(this.m_frequencyHz>0){return true}var cA=data.positions[this.m_indexA].c.Clone();var aA=data.positions[this.m_indexA].a;var cB=data.positions[this.m_indexB].c.Clone();var aB=data.positions[this.m_indexB].a;var qA=new b2Rot(aA),qB=new b2Rot(aB);var rA=b2Mul_r_v2(qA,b2Vec2.Subtract(this.m_localAnchorA,this.m_localCenterA));var rB=b2Mul_r_v2(qB,b2Vec2.Subtract(this.m_localAnchorB,this.m_localCenterB));var u=b2Vec2.Subtract(b2Vec2.Subtract(b2Vec2.Add(cB,rB),cA),rA);var length=u.Normalize();var C=length-this.m_length;C=b2Clamp(C,-b2_maxLinearCorrection,b2_maxLinearCorrection);var impulse=-this.m_mass*C;var P=b2Vec2.Multiply(impulse,u);cA.Subtract(b2Vec2.Multiply(this.m_invMassA,P));aA-=this.m_invIA*b2Cross_v2_v2(rA,P);cB.Add(b2Vec2.Multiply(this.m_invMassB,P));aB+=this.m_invIB*b2Cross_v2_v2(rB,P);data.positions[this.m_indexA].c.Assign(cA);data.positions[this.m_indexA].a=aA;data.positions[this.m_indexB].c.Assign(cB);data.positions[this.m_indexB].a=aB;return b2Abs(C)0){this.m_motorMass=1/this.m_motorMass}this.m_perp=b2Mul_r_v2(qA,this.m_localYAxisA);this.m_s1=b2Cross_v2_v2(b2Vec2.Add(d,rA),this.m_perp);this.m_s2=b2Cross_v2_v2(rB,this.m_perp);var k11=mA+mB+iA*this.m_s1*this.m_s1+iB*this.m_s2*this.m_s2;var k12=iA*this.m_s1+iB*this.m_s2;var k13=iA*this.m_s1*this.m_a1+iB*this.m_s2*this.m_a2;var k22=iA+iB;if(k22==0){k22=1}var k23=iA*this.m_a1+iB*this.m_a2;var k33=mA+mB+iA*this.m_a1*this.m_a1+iB*this.m_a2*this.m_a2;this.m_K.ex.Set(k11,k12,k13);this.m_K.ey.Set(k12,k22,k23);this.m_K.ez.Set(k13,k23,k33);if(this.m_enableLimit){var jointTranslation=b2Dot_v2_v2(this.m_axis,d);if(b2Abs(this.m_upperTranslation-this.m_lowerTranslation)<2*b2_linearSlop){this.m_limitState=b2Joint.e_equalLimits}else{if(jointTranslation<=this.m_lowerTranslation){if(this.m_limitState!=b2Joint.e_atLowerLimit){this.m_limitState=b2Joint.e_atLowerLimit;this.m_impulse.z=0}}else{if(jointTranslation>=this.m_upperTranslation){if(this.m_limitState!=b2Joint.e_atUpperLimit){this.m_limitState=b2Joint.e_atUpperLimit;this.m_impulse.z=0}}else{this.m_limitState=b2Joint.e_inactiveLimit;this.m_impulse.z=0}}}}else{this.m_limitState=b2Joint.e_inactiveLimit;this.m_impulse.z=0}if(this.m_enableMotor==false){this.m_motorImpulse=0}if(data.step.warmStarting){this.m_impulse.Multiply(data.step.dtRatio);this.m_motorImpulse*=data.step.dtRatio;var P=b2Vec2.Add(b2Vec2.Multiply(this.m_impulse.x,this.m_perp),b2Vec2.Multiply((this.m_motorImpulse+this.m_impulse.z),this.m_axis));var LA=this.m_impulse.x*this.m_s1+this.m_impulse.y+(this.m_motorImpulse+this.m_impulse.z)*this.m_a1;var LB=this.m_impulse.x*this.m_s2+this.m_impulse.y+(this.m_motorImpulse+this.m_impulse.z)*this.m_a2;vA.Subtract(b2Vec2.Multiply(mA,P));wA-=iA*LA;vB.Add(b2Vec2.Multiply(mB,P));wB+=iB*LB}else{this.m_impulse.SetZero();this.m_motorImpulse=0}data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolveVelocityConstraints:function(data){var vA=data.velocities[this.m_indexA].v.Clone();var wA=data.velocities[this.m_indexA].w;var vB=data.velocities[this.m_indexB].v.Clone();var wB=data.velocities[this.m_indexB].w;var mA=this.m_invMassA,mB=this.m_invMassB;var iA=this.m_invIA,iB=this.m_invIB;if(this.m_enableMotor&&this.m_limitState!=b2Joint.e_equalLimits){var Cdot=b2Dot_v2_v2(this.m_axis,b2Vec2.Subtract(vB,vA))+this.m_a2*wB-this.m_a1*wA;var impulse=this.m_motorMass*(this.m_motorSpeed-Cdot);var oldImpulse=this.m_motorImpulse;var maxImpulse=data.step.dt*this.m_maxMotorForce;this.m_motorImpulse=b2Clamp(this.m_motorImpulse+impulse,-maxImpulse,maxImpulse);impulse=this.m_motorImpulse-oldImpulse;var P=b2Vec2.Multiply(impulse,this.m_axis);var LA=impulse*this.m_a1;var LB=impulse*this.m_a2;vA.Subtract(b2Vec2.Multiply(mA,P));wA-=iA*LA;vB.Add(b2Vec2.Multiply(mB,P));wB+=iB*LB}var Cdot1=new b2Vec2();Cdot1.x=b2Dot_v2_v2(this.m_perp,b2Vec2.Subtract(vB,vA))+this.m_s2*wB-this.m_s1*wA;Cdot1.y=wB-wA;if(this.m_enableLimit&&this.m_limitState!=b2Joint.e_inactiveLimit){var Cdot2;Cdot2=b2Dot_v2_v2(this.m_axis,b2Vec2.Subtract(vB,vA))+this.m_a2*wB-this.m_a1*wA;var Cdot=new b2Vec3(Cdot1.x,Cdot1.y,Cdot2);var f1=this.m_impulse.Clone();var df=this.m_K.Solve33(Cdot.Negate());this.m_impulse.Add(df);if(this.m_limitState==b2Joint.e_atLowerLimit){this.m_impulse.z=b2Max(this.m_impulse.z,0)}else{if(this.m_limitState==b2Joint.e_atUpperLimit){this.m_impulse.z=b2Min(this.m_impulse.z,0)}}var b=b2Vec2.Subtract(Cdot1.Negate(),b2Vec2.Multiply((this.m_impulse.z-f1.z),new b2Vec2(this.m_K.ez.x,this.m_K.ez.y)));var f2r=b2Vec2.Add(this.m_K.Solve22(b),new b2Vec2(f1.x,f1.y));this.m_impulse.x=f2r.x;this.m_impulse.y=f2r.y;df=b2Vec3.Subtract(this.m_impulse,f1);var P=b2Vec2.Add(b2Vec2.Multiply(df.x,this.m_perp),b2Vec2.Multiply(df.z,this.m_axis));var LA=df.x*this.m_s1+df.y+df.z*this.m_a1;var LB=df.x*this.m_s2+df.y+df.z*this.m_a2;vA.Subtract(b2Vec2.Multiply(mA,P));wA-=iA*LA;vB.Add(b2Vec2.Multiply(mB,P));wB+=iB*LB}else{var df=this.m_K.Solve22(Cdot1.Negate());this.m_impulse.x+=df.x;this.m_impulse.y+=df.y;var P=b2Vec2.Multiply(df.x,this.m_perp);var LA=df.x*this.m_s1+df.y;var LB=df.x*this.m_s2+df.y;vA.Subtract(b2Vec2.Multiply(mA,P));wA-=iA*LA;vB.Add(b2Vec2.Multiply(mB,P));wB+=iB*LB}data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolvePositionConstraints:function(data){var cA=data.positions[this.m_indexA].c.Clone();var aA=data.positions[this.m_indexA].a;var cB=data.positions[this.m_indexB].c.Clone();var aB=data.positions[this.m_indexB].a;var qA=new b2Rot(aA),qB=new b2Rot(aB);var mA=this.m_invMassA,mB=this.m_invMassB;var iA=this.m_invIA,iB=this.m_invIB;var rA=b2Mul_r_v2(qA,b2Vec2.Subtract(this.m_localAnchorA,this.m_localCenterA));var rB=b2Mul_r_v2(qB,b2Vec2.Subtract(this.m_localAnchorB,this.m_localCenterB));var d=b2Vec2.Subtract(b2Vec2.Subtract(b2Vec2.Add(cB,rB),cA),rA);var axis=b2Mul_r_v2(qA,this.m_localXAxisA);var a1=b2Cross_v2_v2(b2Vec2.Add(d,rA),axis);var a2=b2Cross_v2_v2(rB,axis);var perp=b2Mul_r_v2(qA,this.m_localYAxisA);var s1=b2Cross_v2_v2(b2Vec2.Add(d,rA),perp);var s2=b2Cross_v2_v2(rB,perp);var impulse=new b2Vec3();var C1=new b2Vec2();C1.x=b2Dot_v2_v2(perp,d);C1.y=aB-aA-this.m_referenceAngle;var linearError=b2Abs(C1.x);var angularError=b2Abs(C1.y);var active=false;var C2=0;if(this.m_enableLimit){var translation=b2Dot_v2_v2(axis,d);if(b2Abs(this.m_upperTranslation-this.m_lowerTranslation)<2*b2_linearSlop){C2=b2Clamp(translation,-b2_maxLinearCorrection,b2_maxLinearCorrection);linearError=b2Max(linearError,b2Abs(translation));active=true}else{if(translation<=this.m_lowerTranslation){C2=b2Clamp(translation-this.m_lowerTranslation+b2_linearSlop,-b2_maxLinearCorrection,0);linearError=b2Max(linearError,this.m_lowerTranslation-translation);active=true}else{if(translation>=this.m_upperTranslation){C2=b2Clamp(translation-this.m_upperTranslation-b2_linearSlop,0,b2_maxLinearCorrection);linearError=b2Max(linearError,translation-this.m_upperTranslation);active=true}}}}if(active){var k11=mA+mB+iA*s1*s1+iB*s2*s2;var k12=iA*s1+iB*s2;var k13=iA*s1*a1+iB*s2*a2;var k22=iA+iB;if(k22==0){k22=1}var k23=iA*a1+iB*a2;var k33=mA+mB+iA*a1*a1+iB*a2*a2;var K=new b2Mat33();K.ex.Set(k11,k12,k13);K.ey.Set(k12,k22,k23);K.ez.Set(k13,k23,k33);var C=new b2Vec3();C.x=C1.x;C.y=C1.y;C.z=C2;impulse=K.Solve33(C.Negate())}else{var k11=mA+mB+iA*s1*s1+iB*s2*s2;var k12=iA*s1+iB*s2;var k22=iA+iB;if(k22==0){k22=1}var K=new b2Mat22();K.ex.Set(k11,k12);K.ey.Set(k12,k22);var impulse1=K.Solve(C1.Negate());impulse.x=impulse1.x;impulse.y=impulse1.y;impulse.z=0}var P=b2Vec2.Add(b2Vec2.Multiply(impulse.x,perp),b2Vec2.Multiply(impulse.z,axis));var LA=impulse.x*s1+impulse.y+impulse.z*a1;var LB=impulse.x*s2+impulse.y+impulse.z*a2;cA.Subtract(b2Vec2.Multiply(mA,P));aA-=iA*LA;cB.Add(b2Vec2.Multiply(mB,P));aB+=iB*LB;data.positions[this.m_indexA].c.Assign(cA);data.positions[this.m_indexA].a=aA;data.positions[this.m_indexB].c.Assign(cB);data.positions[this.m_indexB].a=aB;return linearError<=b2_linearSlop&&angularError<=b2_angularSlop},_serialize:function(out){var obj=out||{};this.parent.prototype._serialize.call(this,obj);obj.localAnchorA=this.m_localAnchorA._serialize();obj.localAnchorB=this.m_localAnchorB._serialize();obj.localAxisA=this.m_localXAxisA._serialize();obj.referenceAngle=this.m_referenceAngle;obj.enableLimit=this.m_enableLimit;obj.lowerTranslation=this.m_lowerTranslation;obj.upperTranslation=this.m_upperTranslation;obj.enableMotor=this.m_enableMotor;obj.maxMotorForce=this.m_maxMotorForce;obj.motorSpeed=this.m_motorSpeed;return obj}};b2PrismaticJoint._extend(b2Joint);function b2FrictionJointDef(){this.parent.call(this);this.type=b2Joint.e_frictionJoint;this.localAnchorA=new b2Vec2();this.localAnchorB=new b2Vec2();this.maxForce=0;this.maxTorque=0;Object.seal(this)}b2FrictionJointDef.prototype={Initialize:function(bA,bB,anchor){this.bodyA=bA;this.bodyB=bB;this.localAnchorA.Assign(this.bodyA.GetLocalPoint(anchor));this.localAnchorB.Assign(this.bodyB.GetLocalPoint(anchor))},_deserialize:function(data,bodies,joints){this.parent.prototype._deserialize.call(this,data,bodies,joints);this.localAnchorA._deserialize(data.localAnchorA);this.localAnchorB._deserialize(data.localAnchorB);this.maxForce=data.maxForce;this.maxTorque=data.maxTorque}};b2FrictionJointDef._extend(b2JointDef);function b2FrictionJoint(def){this.parent.call(this,def);this.m_localAnchorA=def.localAnchorA.Clone();this.m_localAnchorB=def.localAnchorB.Clone();this.m_linearImpulse=new b2Vec2();this.m_angularImpulse=0;this.m_maxForce=def.maxForce;this.m_maxTorque=def.maxTorque;this.m_indexA=0;this.m_indexB=0;this.m_rA=new b2Vec2();this.m_rB=new b2Vec2();this.m_localCenterA=new b2Vec2();this.m_localCenterB=new b2Vec2();this.m_invMassA=0;this.m_invMassB=0;this.m_invIA=0;this.m_invIB=0;this.m_linearMass=new b2Mat22();this.m_angularMass=0}b2FrictionJoint.prototype={GetAnchorA:function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchorA)},GetAnchorB:function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchorB)},GetReactionForce:function(inv_dt){return b2Vec2.Multiply(inv_dt,this.m_linearImpulse)},GetReactionTorque:function(inv_dt){return inv_dt*this.m_angularImpulse},GetLocalAnchorA:function(){return this.m_localAnchorA},GetLocalAnchorB:function(){return this.m_localAnchorB},SetMaxForce:function(force){this.m_maxForce=force},GetMaxForce:function(){return this.m_maxForce},SetMaxTorque:function(torque){this.m_maxTorque=torque},GetMaxTorque:function(){return this.m_maxTorque},InitVelocityConstraints:function(data){this.m_indexA=this.m_bodyA.m_islandIndex;this.m_indexB=this.m_bodyB.m_islandIndex;this.m_localCenterA.Assign(this.m_bodyA.m_sweep.localCenter);this.m_localCenterB.Assign(this.m_bodyB.m_sweep.localCenter);this.m_invMassA=this.m_bodyA.m_invMass;this.m_invMassB=this.m_bodyB.m_invMass;this.m_invIA=this.m_bodyA.m_invI;this.m_invIB=this.m_bodyB.m_invI;var aA=data.positions[this.m_indexA].a;var vA=data.velocities[this.m_indexA].v.Clone();var wA=data.velocities[this.m_indexA].w;var aB=data.positions[this.m_indexB].a;var vB=data.velocities[this.m_indexB].v.Clone();var wB=data.velocities[this.m_indexB].w;var qA=new b2Rot(aA),qB=new b2Rot(aB);this.m_rA=b2Mul_r_v2(qA,b2Vec2.Subtract(this.m_localAnchorA,this.m_localCenterA));this.m_rB=b2Mul_r_v2(qB,b2Vec2.Subtract(this.m_localAnchorB,this.m_localCenterB));var mA=this.m_invMassA,mB=this.m_invMassB;var iA=this.m_invIA,iB=this.m_invIB;var K=new b2Mat22();K.ex.x=mA+mB+iA*this.m_rA.y*this.m_rA.y+iB*this.m_rB.y*this.m_rB.y;K.ex.y=-iA*this.m_rA.x*this.m_rA.y-iB*this.m_rB.x*this.m_rB.y;K.ey.x=K.ex.y;K.ey.y=mA+mB+iA*this.m_rA.x*this.m_rA.x+iB*this.m_rB.x*this.m_rB.x;this.m_linearMass=K.GetInverse();this.m_angularMass=iA+iB;if(this.m_angularMass>0){this.m_angularMass=1/this.m_angularMass}if(data.step.warmStarting){this.m_linearImpulse.Multiply(data.step.dtRatio);this.m_angularImpulse*=data.step.dtRatio;var P=new b2Vec2(this.m_linearImpulse.x,this.m_linearImpulse.y);vA.Subtract(b2Vec2.Multiply(mA,P));wA-=iA*(b2Cross_v2_v2(this.m_rA,P)+this.m_angularImpulse);vB.Add(b2Vec2.Multiply(mB,P));wB+=iB*(b2Cross_v2_v2(this.m_rB,P)+this.m_angularImpulse)}else{this.m_linearImpulse.SetZero();this.m_angularImpulse=0}data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolveVelocityConstraints:function(data){var vA=data.velocities[this.m_indexA].v.Clone();var wA=data.velocities[this.m_indexA].w;var vB=data.velocities[this.m_indexB].v.Clone();var wB=data.velocities[this.m_indexB].w;var mA=this.m_invMassA,mB=this.m_invMassB;var iA=this.m_invIA,iB=this.m_invIB;var h=data.step.dt;var Cdot=wB-wA;var impulse=-this.m_angularMass*Cdot;var oldImpulse=this.m_angularImpulse;var maxImpulse=h*this.m_maxTorque;this.m_angularImpulse=b2Clamp(this.m_angularImpulse+impulse,-maxImpulse,maxImpulse);impulse=this.m_angularImpulse-oldImpulse;wA-=iA*impulse;wB+=iB*impulse;var Cdot=b2Vec2.Add(vB,b2Vec2.Subtract(b2Cross_f_v2(wB,this.m_rB),b2Vec2.Subtract(vA,b2Cross_f_v2(wA,this.m_rA))));var impulse=b2Mul_m22_v2(this.m_linearMass,Cdot).Negate();var oldImpulse=this.m_linearImpulse.Clone();this.m_linearImpulse.Add(impulse);var maxImpulse=h*this.m_maxForce;if(this.m_linearImpulse.LengthSquared()>maxImpulse*maxImpulse){this.m_linearImpulse.Normalize();this.m_linearImpulse.Multiply(maxImpulse)}impulse=b2Vec2.Subtract(this.m_linearImpulse,oldImpulse);vA.Subtract(b2Vec2.Multiply(mA,impulse));wA-=iA*b2Cross_v2_v2(this.m_rA,impulse);vB.Add(b2Vec2.Multiply(mB,impulse));wB+=iB*b2Cross_v2_v2(this.m_rB,impulse);data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolvePositionConstraints:function(data){return true},_serialize:function(out){var obj=out||{};this.parent.prototype._serialize.call(this,obj);obj.localAnchorA=this.m_localAnchorA._serialize();obj.localAnchorB=this.m_localAnchorB._serialize();obj.maxForce=this.m_maxForce;obj.maxTorque=this.m_maxTorque;return obj}};b2FrictionJoint._extend(b2Joint);function b2WeldJointDef(){this.parent.call(this);this.type=b2Joint.e_weldJoint;this.localAnchorA=new b2Vec2(0,0);this.localAnchorB=new b2Vec2(0,0);this.referenceAngle=0;this.frequencyHz=0;this.dampingRatio=0;Object.seal(this)}b2WeldJointDef.prototype={Initialize:function(bA,bB,anchor){this.bodyA=bA;this.bodyB=bB;this.localAnchorA.Assign(this.bodyA.GetLocalPoint(anchor));this.localAnchorB.Assign(this.bodyB.GetLocalPoint(anchor));this.referenceAngle=this.bodyB.GetAngle()-this.bodyA.GetAngle()},_deserialize:function(data,bodies,joints){this.parent.prototype._deserialize.call(this,data,bodies,joints);this.localAnchorA._deserialize(data.localAnchorA);this.localAnchorB._deserialize(data.localAnchorB);this.referenceAngle=data.referenceAngle;this.frequencyHz=data.frequencyHz;this.dampingRatio=data.dampingRatio}};b2WeldJointDef._extend(b2JointDef);function b2WeldJoint(def){this.parent.call(this,def);this.m_bias=0;this.m_gamma=0;this.m_indexA=0;this.m_indexB=0;this.m_rA=new b2Vec2();this.m_rB=new b2Vec2();this.m_localCenterA=new b2Vec2();this.m_localCenterB=new b2Vec2();this.m_invMassA=0;this.m_invMassB=0;this.m_invIA=0;this.m_invIB=0;this.m_mass=new b2Mat33();this.m_localAnchorA=def.localAnchorA.Clone();this.m_localAnchorB=def.localAnchorB.Clone();this.m_referenceAngle=def.referenceAngle;this.m_frequencyHz=def.frequencyHz;this.m_dampingRatio=def.dampingRatio;this.m_impulse=new b2Vec3()}b2WeldJoint.prototype={GetAnchorA:function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchorA)},GetAnchorB:function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchorB)},GetReactionForce:function(inv_dt){var P=new b2Vec2(this.m_impulse.x,this.m_impulse.y);return b2Vec2.Multiply(inv_dt,P)},GetReactionTorque:function(inv_dt){return inv_dt*this.m_impulse.z},GetLocalAnchorA:function(){return this.m_localAnchorA},GetLocalAnchorB:function(){return this.m_localAnchorB},GetReferenceAngle:function(){return this.m_referenceAngle},SetFrequency:function(hz){this.m_frequencyHz=hz},GetFrequency:function(){return this.m_frequencyHz},SetDampingRatio:function(ratio){this.m_dampingRatio=ratio},GetDampingRatio:function(){return this.m_dampingRatio},InitVelocityConstraints:function(data){this.m_indexA=this.m_bodyA.m_islandIndex;this.m_indexB=this.m_bodyB.m_islandIndex;this.m_localCenterA.Assign(this.m_bodyA.m_sweep.localCenter);this.m_localCenterB.Assign(this.m_bodyB.m_sweep.localCenter);this.m_invMassA=this.m_bodyA.m_invMass;this.m_invMassB=this.m_bodyB.m_invMass;this.m_invIA=this.m_bodyA.m_invI;this.m_invIB=this.m_bodyB.m_invI;var aA=data.positions[this.m_indexA].a;var vA=data.velocities[this.m_indexA].v.Clone();var wA=data.velocities[this.m_indexA].w;var aB=data.positions[this.m_indexB].a;var vB=data.velocities[this.m_indexB].v.Clone();var wB=data.velocities[this.m_indexB].w;var qA=new b2Rot(aA),qB=new b2Rot(aB);this.m_rA.Assign(b2Mul_r_v2(qA,b2Vec2.Subtract(this.m_localAnchorA,this.m_localCenterA)));this.m_rB.Assign(b2Mul_r_v2(qB,b2Vec2.Subtract(this.m_localAnchorB,this.m_localCenterB)));var mA=this.m_invMassA,mB=this.m_invMassB;var iA=this.m_invIA,iB=this.m_invIB;var K=new b2Mat33();K.ex.x=mA+mB+this.m_rA.y*this.m_rA.y*iA+this.m_rB.y*this.m_rB.y*iB;K.ey.x=-this.m_rA.y*this.m_rA.x*iA-this.m_rB.y*this.m_rB.x*iB;K.ez.x=-this.m_rA.y*iA-this.m_rB.y*iB;K.ex.y=K.ey.x;K.ey.y=mA+mB+this.m_rA.x*this.m_rA.x*iA+this.m_rB.x*this.m_rB.x*iB;K.ez.y=this.m_rA.x*iA+this.m_rB.x*iB;K.ex.z=K.ez.x;K.ey.z=K.ez.y;K.ez.z=iA+iB;if(this.m_frequencyHz>0){K.GetInverse22(this.m_mass);var invM=iA+iB;var m=invM>0?1/invM:0;var C=aB-aA-this.m_referenceAngle;var omega=2*b2_pi*this.m_frequencyHz;var d=2*m*this.m_dampingRatio*omega;var k=m*omega*omega;var h=data.step.dt;this.m_gamma=h*(d+h*k);this.m_gamma=this.m_gamma!=0?1/this.m_gamma:0;this.m_bias=C*h*k*this.m_gamma;invM+=this.m_gamma;this.m_mass.ez.z=invM!=0?1/invM:0}else{K.GetSymInverse33(this.m_mass);this.m_gamma=0;this.m_bias=0}if(data.step.warmStarting){this.m_impulse.Multiply(data.step.dtRatio);var P=new b2Vec2(this.m_impulse.x,this.m_impulse.y);vA.Subtract(b2Vec2.Multiply(mA,P));wA-=iA*(b2Cross_v2_v2(this.m_rA,P)+this.m_impulse.z);vB.Add(b2Vec2.Multiply(mB,P));wB+=iB*(b2Cross_v2_v2(this.m_rB,P)+this.m_impulse.z)}else{this.m_impulse.SetZero()}data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolveVelocityConstraints:function(data){var vA=data.velocities[this.m_indexA].v.Clone();var wA=data.velocities[this.m_indexA].w;var vB=data.velocities[this.m_indexB].v.Clone();var wB=data.velocities[this.m_indexB].w;var mA=this.m_invMassA,mB=this.m_invMassB;var iA=this.m_invIA,iB=this.m_invIB;if(this.m_frequencyHz>0){var Cdot2=wB-wA;var impulse2=-this.m_mass.ez.z*(Cdot2+this.m_bias+this.m_gamma*this.m_impulse.z);this.m_impulse.z+=impulse2;wA-=iA*impulse2;wB+=iB*impulse2;var Cdot1=b2Vec2.Subtract(b2Vec2.Subtract(b2Vec2.Add(vB,b2Cross_f_v2(wB,this.m_rB)),vA),b2Cross_f_v2(wA,this.m_rA));var impulse1=b2Mul22_m33_v2(this.m_mass,Cdot1).Negate();this.m_impulse.x+=impulse1.x;this.m_impulse.y+=impulse1.y;var P=impulse1.Clone();vA.Subtract(b2Vec2.Multiply(mA,P));wA-=iA*b2Cross_v2_v2(this.m_rA,P);vB.Add(b2Vec2.Multiply(mB,P));wB+=iB*b2Cross_v2_v2(this.m_rB,P)}else{var Cdot1=b2Vec2.Subtract(b2Vec2.Subtract(b2Vec2.Add(vB,b2Cross_f_v2(wB,this.m_rB)),vA),b2Cross_f_v2(wA,this.m_rA));var Cdot2=wB-wA;var Cdot=new b2Vec3(Cdot1.x,Cdot1.y,Cdot2);var impulse=b2Mul_m33_v3(this.m_mass,Cdot).Negate();this.m_impulse.Add(impulse);var P=new b2Vec2(impulse.x,impulse.y);vA.Subtract(b2Vec2.Multiply(mA,P));wA-=iA*(b2Cross_v2_v2(this.m_rA,P)+impulse.z);vB.Add(b2Vec2.Multiply(mB,P));wB+=iB*(b2Cross_v2_v2(this.m_rB,P)+impulse.z)}data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolvePositionConstraints:function(data){var cA=data.positions[this.m_indexA].c.Clone();var aA=data.positions[this.m_indexA].a;var cB=data.positions[this.m_indexB].c.Clone();var aB=data.positions[this.m_indexB].a;var qA=new b2Rot(aA),qB=new b2Rot(aB);var mA=this.m_invMassA,mB=this.m_invMassB;var iA=this.m_invIA,iB=this.m_invIB;var rA=b2Mul_r_v2(qA,b2Vec2.Subtract(this.m_localAnchorA,this.m_localCenterA));var rB=b2Mul_r_v2(qB,b2Vec2.Subtract(this.m_localAnchorB,this.m_localCenterB));var positionError,angularError;var K=new b2Mat33();K.ex.x=mA+mB+rA.y*rA.y*iA+rB.y*rB.y*iB;K.ey.x=-rA.y*rA.x*iA-rB.y*rB.x*iB;K.ez.x=-rA.y*iA-rB.y*iB;K.ex.y=K.ey.x;K.ey.y=mA+mB+rA.x*rA.x*iA+rB.x*rB.x*iB;K.ez.y=rA.x*iA+rB.x*iB;K.ex.z=K.ez.x;K.ey.z=K.ez.y;K.ez.z=iA+iB;if(this.m_frequencyHz>0){var C1=b2Vec2.Subtract(b2Vec2.Subtract(b2Vec2.Add(cB,rB),cA),rA);positionError=C1.Length();angularError=0;var P=K.Solve22(C1).Negate();cA.Subtract(b2Vec2.Multiply(mA,P));aA-=iA*b2Cross_v2_v2(rA,P);cB.Add(b2Vec2.Multiply(mB,P));aB+=iB*b2Cross_v2_v2(rB,P)}else{var C1=b2Vec2.Subtract(b2Vec2.Subtract(b2Vec2.Add(cB,rB),cA),rA);var C2=aB-aA-this.m_referenceAngle;positionError=C1.Length();angularError=b2Abs(C2);var C=new b2Vec3(C1.x,C1.y,C2);var impulse=K.Solve33(C).Negate();var P=new b2Vec2(impulse.x,impulse.y);cA.Subtract(b2Vec2.Multiply(mA,P));aA-=iA*(b2Cross_v2_v2(rA,P)+impulse.z);cB.Add(b2Vec2.Multiply(mB,P));aB+=iB*(b2Cross_v2_v2(rB,P)+impulse.z)}data.positions[this.m_indexA].c.Assign(cA);data.positions[this.m_indexA].a=aA;data.positions[this.m_indexB].c.Assign(cB);data.positions[this.m_indexB].a=aB;return positionError<=b2_linearSlop&&angularError<=b2_angularSlop},_serialize:function(out){var obj=out||{};this.parent.prototype._serialize.call(this,obj);obj.localAnchorA=this.m_localAnchorA._serialize();obj.localAnchorB=this.m_localAnchorB._serialize();obj.referenceAngle=this.m_referenceAngle;obj.frequencyHz=this.m_frequencyHz;obj.dampingRatio=this.m_dampingRatio;return obj}};b2WeldJoint._extend(b2Joint);function b2WheelJointDef(){this.parent.call(this);this.type=b2Joint.e_wheelJoint;this.localAnchorA=new b2Vec2();this.localAnchorB=new b2Vec2();this.localAxisA=new b2Vec2(1,0);this.enableMotor=false;this.maxMotorTorque=0;this.motorSpeed=0;this.frequencyHz=2;this.dampingRatio=0.7;Object.seal(this)}b2WheelJointDef.prototype={Initialize:function(bA,bB,anchor,axis){this.bodyA=bA;this.bodyB=bB;this.localAnchorA.Assign(this.bodyA.GetLocalPoint(anchor));this.localAnchorB.Assign(this.bodyB.GetLocalPoint(anchor));this.localAxisA.Assign(this.bodyA.GetLocalVector(axis))},_deserialize:function(data,bodies,joints){this.parent.prototype._deserialize.call(this,data,bodies,joints);this.localAnchorA._deserialize(data.localAnchorA);this.localAnchorB._deserialize(data.localAnchorB);this.localAxisA._deserialize(data.localAxisA);this.enableMotor=data.enableMotor;this.maxMotorTorque=data.maxMotorTorque;this.motorSpeed=data.motorSpeed;this.frequencyHz=data.frequencyHz;this.dampingRatio=data.dampingRatio}};b2WheelJointDef._extend(b2JointDef);function b2WheelJoint(def){this.parent.call(this,def);this.m_indexA=0;this.m_indexB=0;this.m_localCenterA=new b2Vec2();this.m_localCenterB=new b2Vec2();this.m_invMassA=0;this.m_invMassB=0;this.m_invIA=0;this.m_invIB=0;this.m_localAnchorA=def.localAnchorA.Clone();this.m_localAnchorB=def.localAnchorB.Clone();this.m_localXAxisA=def.localAxisA.Clone();this.m_localYAxisA=b2Cross_f_v2(1,this.m_localXAxisA);this.m_mass=0;this.m_impulse=0;this.m_motorMass=0;this.m_motorImpulse=0;this.m_springMass=0;this.m_springImpulse=0;this.m_maxMotorTorque=def.maxMotorTorque;this.m_motorSpeed=def.motorSpeed;this.m_enableMotor=def.enableMotor;this.m_frequencyHz=def.frequencyHz;this.m_dampingRatio=def.dampingRatio;this.m_bias=0;this.m_gamma=0;this.m_ax=new b2Vec2();this.m_ay=new b2Vec2();this.m_sAx=this.m_sBx=0;this.m_sAy=this.m_sBy=0}b2WheelJoint.prototype={GetAnchorA:function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchorA)},GetAnchorB:function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchorB)},GetReactionForce:function(inv_dt){return b2Vec2.Multiply(inv_dt,b2Vec2.Add(b2Vec2.Multiply(this.m_impulse,this.m_ay),b2Vec2.Multiply(this.m_springImpulse,this.m_ax)))},GetReactionTorque:function(inv_dt){return inv_dt*this.m_motorImpulse},GetLocalAnchorA:function(){return this.m_localAnchorA},GetLocalAnchorB:function(){return this.m_localAnchorB},GetLocalAxisA:function(){return this.m_localXAxisA},GetJointTranslation:function(){var bA=this.m_bodyA;var bB=this.m_bodyB;var pA=bA.GetWorldPoint(this.m_localAnchorA);var pB=bB.GetWorldPoint(this.m_localAnchorB);var d=b2Vec2.Subtract(pB,pA);var axis=bA.GetWorldVector(this.m_localXAxisA);var translation=b2Dot_v2_v2(d,axis);return translation},GetJointSpeed:function(){var wA=this.m_bodyA.m_angularVelocity;var wB=this.m_bodyB.m_angularVelocity;return wB-wA},IsMotorEnabled:function(){return this.m_enableMotor},EnableMotor:function(flag){this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_enableMotor=flag},SetMotorSpeed:function(speed){this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_motorSpeed=speed},GetMotorSpeed:function(){return this.m_motorSpeed},SetMaxMotorTorque:function(torque){this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_maxMotorTorque=torque},GetMaxMotorTorque:function(){return this.m_maxMotorTorque},GetMotorTorque:function(inv_dt){return inv_dt*this.m_motorImpulse},SetSpringFrequencyHz:function(hz){this.m_frequencyHz=hz},GetSpringFrequencyHz:function(){return this.m_frequencyHz},SetSpringDampingRatio:function(ratio){this.m_dampingRatio=ratio},GetSpringDampingRatio:function(){return this.m_dampingRatio},InitVelocityConstraints:function(data){this.m_indexA=this.m_bodyA.m_islandIndex;this.m_indexB=this.m_bodyB.m_islandIndex;this.m_localCenterA.Assign(this.m_bodyA.m_sweep.localCenter);this.m_localCenterB.Assign(this.m_bodyB.m_sweep.localCenter);this.m_invMassA=this.m_bodyA.m_invMass;this.m_invMassB=this.m_bodyB.m_invMass;this.m_invIA=this.m_bodyA.m_invI;this.m_invIB=this.m_bodyB.m_invI;var mA=this.m_invMassA,mB=this.m_invMassB;var iA=this.m_invIA,iB=this.m_invIB;var cA=data.positions[this.m_indexA].c.Clone();var aA=data.positions[this.m_indexA].a;var vA=data.velocities[this.m_indexA].v.Clone();var wA=data.velocities[this.m_indexA].w;var cB=data.positions[this.m_indexB].c.Clone();var aB=data.positions[this.m_indexB].a;var vB=data.velocities[this.m_indexB].v.Clone();var wB=data.velocities[this.m_indexB].w;var qA=new b2Rot(aA),qB=new b2Rot(aB);var rA=b2Mul_r_v2(qA,b2Vec2.Subtract(this.m_localAnchorA,this.m_localCenterA));var rB=b2Mul_r_v2(qB,b2Vec2.Subtract(this.m_localAnchorB,this.m_localCenterB));var d=b2Vec2.Subtract(b2Vec2.Subtract(b2Vec2.Add(cB,rB),cA),rA);this.m_ay.Assign(b2Mul_r_v2(qA,this.m_localYAxisA));this.m_sAy=b2Cross_v2_v2(b2Vec2.Add(d,rA),this.m_ay);this.m_sBy=b2Cross_v2_v2(rB,this.m_ay);this.m_mass=mA+mB+iA*this.m_sAy*this.m_sAy+iB*this.m_sBy*this.m_sBy;if(this.m_mass>0){this.m_mass=1/this.m_mass}this.m_springMass=0;this.m_bias=0;this.m_gamma=0;if(this.m_frequencyHz>0){this.m_ax.Assign(b2Mul_r_v2(qA,this.m_localXAxisA));this.m_sAx=b2Cross_v2_v2(b2Vec2.Add(d,rA),this.m_ax);this.m_sBx=b2Cross_v2_v2(rB,this.m_ax);var invMass=mA+mB+iA*this.m_sAx*this.m_sAx+iB*this.m_sBx*this.m_sBx;if(invMass>0){this.m_springMass=1/invMass;var C=b2Dot_v2_v2(d,this.m_ax);var omega=2*b2_pi*this.m_frequencyHz;var d=2*this.m_springMass*this.m_dampingRatio*omega;var k=this.m_springMass*omega*omega;var h=data.step.dt;this.m_gamma=h*(d+h*k);if(this.m_gamma>0){this.m_gamma=1/this.m_gamma}this.m_bias=C*h*k*this.m_gamma;this.m_springMass=invMass+this.m_gamma;if(this.m_springMass>0){this.m_springMass=1/this.m_springMass}}}else{this.m_springImpulse=0}if(this.m_enableMotor){this.m_motorMass=iA+iB;if(this.m_motorMass>0){this.m_motorMass=1/this.m_motorMass}}else{this.m_motorMass=0;this.m_motorImpulse=0}if(data.step.warmStarting){this.m_impulse*=data.step.dtRatio;this.m_springImpulse*=data.step.dtRatio;this.m_motorImpulse*=data.step.dtRatio;var P=b2Vec2.Add(b2Vec2.Multiply(this.m_impulse,this.m_ay),b2Vec2.Multiply(this.m_springImpulse,this.m_ax));var LA=this.m_impulse*this.m_sAy+this.m_springImpulse*this.m_sAx+this.m_motorImpulse;var LB=this.m_impulse*this.m_sBy+this.m_springImpulse*this.m_sBx+this.m_motorImpulse;vA.Subtract(b2Vec2.Multiply(this.m_invMassA,P));wA-=this.m_invIA*LA;vB.Add(b2Vec2.Multiply(this.m_invMassB,P));wB+=this.m_invIB*LB}else{this.m_impulse=0;this.m_springImpulse=0;this.m_motorImpulse=0}data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolveVelocityConstraints:function(data){var mA=this.m_invMassA,mB=this.m_invMassB;var iA=this.m_invIA,iB=this.m_invIB;var vA=data.velocities[this.m_indexA].v.Clone();var wA=data.velocities[this.m_indexA].w;var vB=data.velocities[this.m_indexB].v.Clone();var wB=data.velocities[this.m_indexB].w;var Cdot=b2Dot_v2_v2(this.m_ax,b2Vec2.Subtract(vB,vA))+this.m_sBx*wB-this.m_sAx*wA;var impulse=-this.m_springMass*(Cdot+this.m_bias+this.m_gamma*this.m_springImpulse);this.m_springImpulse+=impulse;var P=b2Vec2.Multiply(impulse,this.m_ax);var LA=impulse*this.m_sAx;var LB=impulse*this.m_sBx;vA.Subtract(b2Vec2.Multiply(mA,P));wA-=iA*LA;vB.Add(b2Vec2.Multiply(mB,P));wB+=iB*LB;var Cdot=wB-wA-this.m_motorSpeed;var impulse=-this.m_motorMass*Cdot;var oldImpulse=this.m_motorImpulse;var maxImpulse=data.step.dt*this.m_maxMotorTorque;this.m_motorImpulse=b2Clamp(this.m_motorImpulse+impulse,-maxImpulse,maxImpulse);impulse=this.m_motorImpulse-oldImpulse;wA-=iA*impulse;wB+=iB*impulse;var Cdot=b2Dot_v2_v2(this.m_ay,b2Vec2.Subtract(vB,vA))+this.m_sBy*wB-this.m_sAy*wA;var impulse=-this.m_mass*Cdot;this.m_impulse+=impulse;var P=b2Vec2.Multiply(impulse,this.m_ay);var LA=impulse*this.m_sAy;var LB=impulse*this.m_sBy;vA.Subtract(b2Vec2.Multiply(mA,P));wA-=iA*LA;vB.Add(b2Vec2.Multiply(mB,P));wB+=iB*LB;data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolvePositionConstraints:function(data){var cA=data.positions[this.m_indexA].c.Clone();var aA=data.positions[this.m_indexA].a;var cB=data.positions[this.m_indexB].c.Clone();var aB=data.positions[this.m_indexB].a;var qA=new b2Rot(aA),qB=new b2Rot(aB);var rA=b2Mul_r_v2(qA,b2Vec2.Subtract(this.m_localAnchorA,this.m_localCenterA));var rB=b2Mul_r_v2(qB,b2Vec2.Subtract(this.m_localAnchorB,this.m_localCenterB));var d=b2Vec2.Add(b2Vec2.Subtract(cB,cA),b2Vec2.Subtract(rB,rA));var ay=b2Mul_r_v2(qA,this.m_localYAxisA);var sAy=b2Cross_v2_v2(b2Vec2.Add(d,rA),ay);var sBy=b2Cross_v2_v2(rB,ay);var C=b2Dot_v2_v2(d,ay);var k=this.m_invMassA+this.m_invMassB+this.m_invIA*this.m_sAy*this.m_sAy+this.m_invIB*this.m_sBy*this.m_sBy;var impulse;if(k!=0){impulse=-C/k}else{impulse=0}var P=b2Vec2.Multiply(impulse,ay);var LA=impulse*sAy;var LB=impulse*sBy;cA.Subtract(b2Vec2.Multiply(this.m_invMassA,P));aA-=this.m_invIA*LA;cB.Add(b2Vec2.Multiply(this.m_invMassB,P));aB+=this.m_invIB*LB;data.positions[this.m_indexA].c.Assign(cA);data.positions[this.m_indexA].a=aA;data.positions[this.m_indexB].c.Assign(cB);data.positions[this.m_indexB].a=aB;return b2Abs(C)<=b2_linearSlop},_serialize:function(out){var obj=out||{};this.parent.prototype._serialize.call(this,obj);obj.localAnchorA=this.m_localAnchorA._serialize();obj.localAnchorB=this.m_localAnchorB._serialize();obj.localAxisA=this.m_localAxisA._serialize();obj.enableMotor=this.m_enableMotor;obj.maxMotorTorque=this.m_maxMotorTorque;obj.motorSpeed=this.m_motorSpeed;obj.frequencyHz=this.m_frequencyHz;obj.dampingRatio=this.m_dampingRatio;return obj}};b2WheelJoint._extend(b2Joint);function b2GearJointDef(){this.parent.call(this);this.type=b2Joint.e_gearJoint;this.joint1=null;this.joint2=null;this.ratio=1;Object.seal(this)}b2GearJointDef.prototype={_deserialize:function(data,bodies,joints){this.parent.prototype._deserialize.call(this,data,bodies,joints);this.joint1=data.joint1;this.joint2=data.joint2;this.ratio=data.ratio}};b2GearJointDef._extend(b2JointDef);function b2GearJoint(def){this.parent.call(this,def);this.m_joint1=def.joint1;this.m_joint2=def.joint2;this.m_typeA=this.m_joint1.GetType();this.m_typeB=this.m_joint2.GetType();var coordinateA,coordinateB;this.m_bodyC=this.m_joint1.GetBodyA();this.m_bodyA=this.m_joint1.GetBodyB();var xfA=this.m_bodyA.m_xf;var aA=this.m_bodyA.m_sweep.a;var xfC=this.m_bodyC.m_xf;var aC=this.m_bodyC.m_sweep.a;this.m_localAnchorA=new b2Vec2();this.m_localAnchorB=new b2Vec2();this.m_localAnchorC=new b2Vec2();this.m_localAnchorD=new b2Vec2();this.m_localAxisC=new b2Vec2();this.m_localAxisD=new b2Vec2();if(this.m_typeA==b2Joint.e_revoluteJoint){var revolute=def.joint1;this.m_localAnchorC.Assign(revolute.m_localAnchorA);this.m_localAnchorA.Assign(revolute.m_localAnchorB);this.m_referenceAngleA=revolute.m_referenceAngle;this.m_localAxisC.SetZero();coordinateA=aA-aC-this.m_referenceAngleA}else{var prismatic=def.joint1;this.m_localAnchorC.Assign(prismatic.m_localAnchorA);this.m_localAnchorA.Assign(prismatic.m_localAnchorB);this.m_referenceAngleA=prismatic.m_referenceAngle;this.m_localAxisC.Assign(prismatic.m_localXAxisA);var pC=this.m_localAnchorC;var pA=b2MulT_r_v2(xfC.q,b2Vec2.Add(b2Mul_r_v2(xfA.q,this.m_localAnchorA),b2Vec2.Subtract(xfA.p,xfC.p)));coordinateA=b2Dot_v2_v2(b2Vec2.Subtract(pA,pC),this.m_localAxisC)}this.m_bodyD=this.m_joint2.GetBodyA();this.m_bodyB=this.m_joint2.GetBodyB();var xfB=this.m_bodyB.m_xf;var aB=this.m_bodyB.m_sweep.a;var xfD=this.m_bodyD.m_xf;var aD=this.m_bodyD.m_sweep.a;if(this.m_typeB==b2Joint.e_revoluteJoint){var revolute=def.joint2;this.m_localAnchorD.Assign(revolute.m_localAnchorA);this.m_localAnchorB.Assign(revolute.m_localAnchorB);this.m_referenceAngleB=revolute.m_referenceAngle;this.m_localAxisD.SetZero();coordinateB=aB-aD-this.m_referenceAngleB}else{var prismatic=def.joint2;this.m_localAnchorD.Assign(prismatic.m_localAnchorA);this.m_localAnchorB.Assign(prismatic.m_localAnchorB);this.m_referenceAngleB=prismatic.m_referenceAngle;this.m_localAxisD.Assign(prismatic.m_localXAxisA);var pD=this.m_localAnchorD;var pB=b2MulT_r_v2(xfD.q,b2Vec2.Add(b2Mul_r_v2(xfB.q,this.m_localAnchorB),b2Vec2.Subtract(xfB.p,xfD.p)));coordinateB=b2Dot_v2_v2(b2Vec2.Subtract(pB,pD),this.m_localAxisD)}this.m_ratio=def.ratio;this.m_constant=coordinateA+this.m_ratio*coordinateB;this.m_impulse=0;this.m_indexA=this.m_indexB=this.m_indexC=this.m_indexD=0;this.m_lcA=new b2Vec2();this.m_lcB=new b2Vec2();this.m_lcC=new b2Vec2();this.m_lcD=new b2Vec2();this.m_mA=this.m_mB=this.m_mC=this.m_mD=0;this.m_iA=this.m_iB=this.m_iC=this.m_iD=0;this.m_JvAC=new b2Vec2(),this.m_JvBD=new b2Vec2();this.m_JwA=this.m_JwB=this.m_JwC=this.m_JwD=0;this.m_mass=0}b2GearJoint.prototype={GetAnchorA:function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchorA)},GetAnchorB:function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchorB)},GetReactionForce:function(inv_dt){var P=b2Vec2.Multiply(this.m_impulse,this.m_JvAC);return b2Vec2.Multiply(inv_dt,P)},GetReactionTorque:function(inv_dt){var L=this.m_impulse*this.m_JwA;return inv_dt*L},GetJoint1:function(){return this.m_joint1},GetJoint2:function(){return this.m_joint2},SetRatio:function(ratio){this.m_ratio=ratio},GetRatio:function(){return this.m_ratio},InitVelocityConstraints:function(data){this.m_indexA=this.m_bodyA.m_islandIndex;this.m_indexB=this.m_bodyB.m_islandIndex;this.m_indexC=this.m_bodyC.m_islandIndex;this.m_indexD=this.m_bodyD.m_islandIndex;this.m_lcA.Assign(this.m_bodyA.m_sweep.localCenter);this.m_lcB.Assign(this.m_bodyB.m_sweep.localCenter);this.m_lcC.Assign(this.m_bodyC.m_sweep.localCenter);this.m_lcD.Assign(this.m_bodyD.m_sweep.localCenter);this.m_mA=this.m_bodyA.m_invMass;this.m_mB=this.m_bodyB.m_invMass;this.m_mC=this.m_bodyC.m_invMass;this.m_mD=this.m_bodyD.m_invMass;this.m_iA=this.m_bodyA.m_invI;this.m_iB=this.m_bodyB.m_invI;this.m_iC=this.m_bodyC.m_invI;this.m_iD=this.m_bodyD.m_invI;var aA=data.positions[this.m_indexA].a;var vA=data.velocities[this.m_indexA].v.Clone();var wA=data.velocities[this.m_indexA].w;var aB=data.positions[this.m_indexB].a;var vB=data.velocities[this.m_indexB].v.Clone();var wB=data.velocities[this.m_indexB].w;var aC=data.positions[this.m_indexC].a;var vC=data.velocities[this.m_indexC].v.Clone();var wC=data.velocities[this.m_indexC].w;var aD=data.positions[this.m_indexD].a;var vD=data.velocities[this.m_indexD].v.Clone();var wD=data.velocities[this.m_indexD].w;var qA=new b2Rot(aA),qB=new b2Rot(aB),qC=new b2Rot(aC),qD=new b2Rot(aD);this.m_mass=0;if(this.m_typeA==b2Joint.e_revoluteJoint){this.m_JvAC.SetZero();this.m_JwA=1;this.m_JwC=1;this.m_mass+=this.m_iA+this.m_iC}else{var u=b2Mul_r_v2(qC,this.m_localAxisC);var rC=b2Mul_r_v2(qC,b2Vec2.Subtract(this.m_localAnchorC,this.m_lcC));var rA=b2Mul_r_v2(qA,b2Vec2.Subtract(this.m_localAnchorA,this.m_lcA));this.m_JvAC.Assign(u);this.m_JwC=b2Cross_v2_v2(rC,u);this.m_JwA=b2Cross_v2_v2(rA,u);this.m_mass+=this.m_mC+this.m_mA+this.m_iC*this.m_JwC*this.m_JwC+this.m_iA*this.m_JwA*this.m_JwA}if(this.m_typeB==b2Joint.e_revoluteJoint){this.m_JvBD.SetZero();this.m_JwB=this.m_ratio;this.m_JwD=this.m_ratio;this.m_mass+=this.m_ratio*this.m_ratio*(this.m_iB+this.m_iD)}else{var u=b2Mul_r_v2(qD,this.m_localAxisD);var rD=b2Mul_r_v2(qD,b2Vec2.Subtract(this.m_localAnchorD,this.m_lcD));var rB=b2Mul_r_v2(qB,b2Vec2.Subtract(this.m_localAnchorB,this.m_lcB));this.m_JvBD.Assign(b2Vec2.Multiply(this.m_ratio,u));this.m_JwD=this.m_ratio*b2Cross_v2_v2(rD,u);this.m_JwB=this.m_ratio*b2Cross_v2_v2(rB,u);this.m_mass+=this.m_ratio*this.m_ratio*(this.m_mD+this.m_mB)+this.m_iD*this.m_JwD*this.m_JwD+this.m_iB*this.m_JwB*this.m_JwB}this.m_mass=this.m_mass>0?1/this.m_mass:0;if(data.step.warmStarting){vA.Add(b2Vec2.Multiply((this.m_mA*this.m_impulse),this.m_JvAC));wA+=this.m_iA*this.m_impulse*this.m_JwA;vB.Add(b2Vec2.Multiply((this.m_mB*this.m_impulse),this.m_JvBD));wB+=this.m_iB*this.m_impulse*this.m_JwB;vC.Subtract(b2Vec2.Multiply((this.m_mC*this.m_impulse),this.m_JvAC));wC-=this.m_iC*this.m_impulse*this.m_JwC;vD.Subtract(b2Vec2.Multiply((this.m_mD*this.m_impulse),this.m_JvBD));wD-=this.m_iD*this.m_impulse*this.m_JwD}else{this.m_impulse=0}data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB;data.velocities[this.m_indexC].v.Assign(vC);data.velocities[this.m_indexC].w=wC;data.velocities[this.m_indexD].v.Assign(vD);data.velocities[this.m_indexD].w=wD},SolveVelocityConstraints:function(data){var vA=data.velocities[this.m_indexA].v.Clone();var wA=data.velocities[this.m_indexA].w;var vB=data.velocities[this.m_indexB].v.Clone();var wB=data.velocities[this.m_indexB].w;var vC=data.velocities[this.m_indexC].v.Clone();var wC=data.velocities[this.m_indexC].w;var vD=data.velocities[this.m_indexD].v.Clone();var wD=data.velocities[this.m_indexD].w;var Cdot=b2Dot_v2_v2(this.m_JvAC,b2Vec2.Subtract(vA,vC))+b2Dot_v2_v2(this.m_JvBD,b2Vec2.Subtract(vB,vD));Cdot+=(this.m_JwA*wA-this.m_JwC*wC)+(this.m_JwB*wB-this.m_JwD*wD);var impulse=-this.m_mass*Cdot;this.m_impulse+=impulse;vA.Add(b2Vec2.Multiply((this.m_mA*impulse),this.m_JvAC));wA+=this.m_iA*impulse*this.m_JwA;vB.Add(b2Vec2.Multiply((this.m_mB*impulse),this.m_JvBD));wB+=this.m_iB*impulse*this.m_JwB;vC.Subtract(b2Vec2.Multiply((this.m_mC*impulse),this.m_JvAC));wC-=this.m_iC*impulse*this.m_JwC;vD.Subtract(b2Vec2.Multiply((this.m_mD*impulse),this.m_JvBD));wD-=this.m_iD*impulse*this.m_JwD;data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB;data.velocities[this.m_indexC].v.Assign(vC);data.velocities[this.m_indexC].w=wC;data.velocities[this.m_indexD].v.Assign(vD);data.velocities[this.m_indexD].w=wD},SolvePositionConstraints:function(data){var cA=data.positions[this.m_indexA].c.Clone();var aA=data.positions[this.m_indexA].a;var cB=data.positions[this.m_indexB].c.Clone();var aB=data.positions[this.m_indexB].a;var cC=data.positions[this.m_indexC].c.Clone();var aC=data.positions[this.m_indexC].a;var cD=data.positions[this.m_indexD].c.Clone();var aD=data.positions[this.m_indexD].a;var qA=new b2Rot(aA),qB=new b2Rot(aB),qC=new b2Rot(aC),qD=new b2Rot(aD);var linearError=0;var coordinateA,coordinateB;var JvAC=new b2Vec2(),JvBD=new b2Vec2();var JwA,JwB,JwC,JwD;var mass=0;if(this.m_typeA==b2Joint.e_revoluteJoint){JvAC.SetZero();JwA=1;JwC=1;mass+=this.m_iA+this.m_iC;coordinateA=aA-aC-this.m_referenceAngleA}else{var u=b2Mul_r_v2(qC,this.m_localAxisC);var rC=b2Mul_r_v2(qC,b2Vec2.Subtract(this.m_localAnchorC,this.m_lcC));var rA=b2Mul_r_v2(qA,b2Vec2.Subtract(this.m_localAnchorA,this.m_lcA));JvAC.Assign(u);JwC=b2Cross_v2_v2(rC,u);JwA=b2Cross_v2_v2(rA,u);mass+=this.m_mC+this.m_mA+this.m_iC*JwC*JwC+this.m_iA*JwA*JwA;var pC=b2Vec2.Subtract(this.m_localAnchorC,this.m_lcC);var pA=b2MulT_r_v2(qC,b2Vec2.Add(rA,b2Vec2.Subtract(cA,cC)));coordinateA=b2Dot_v2_v2(b2Vec2.Subtract(pA,pC),this.m_localAxisC)}if(this.m_typeB==b2Joint.e_revoluteJoint){JvBD.SetZero();JwB=this.m_ratio;JwD=this.m_ratio;mass+=this.m_ratio*this.m_ratio*(this.m_iB+this.m_iD);coordinateB=aB-aD-this.m_referenceAngleB}else{var u=b2Mul_r_v2(qD,this.m_localAxisD);var rD=b2Mul_r_v2(qD,b2Vec2.Subtract(this.m_localAnchorD,this.m_lcD));var rB=b2Mul_r_v2(qB,b2Vec2.Subtract(this.m_localAnchorB,this.m_lcB));JvBD.Assign(b2Vec2.Multiply(this.m_ratio,u));JwD=this.m_ratio*b2Cross_v2_v2(rD,u);JwB=this.m_ratio*b2Cross_v2_v2(rB,u);mass+=this.m_ratio*this.m_ratio*(this.m_mD+this.m_mB)+this.m_iD*JwD*JwD+this.m_iB*JwB*JwB;var pD=b2Vec2.Subtract(this.m_localAnchorD,this.m_lcD);var pB=b2MulT_r_v2(qD,b2Vec2.Add(rB,b2Vec2.Subtract(cB,cD)));coordinateB=b2Dot_v2_v2(b2Vec2.Subtract(pB,pD),this.m_localAxisD)}var C=(coordinateA+this.m_ratio*coordinateB)-this.m_constant;var impulse=0;if(mass>0){impulse=-C/mass}cA.Add(b2Vec2.Multiply(this.m_mA,b2Vec2.Multiply(impulse,JvAC)));aA+=this.m_iA*impulse*JwA;cB.Add(b2Vec2.Multiply(this.m_mB,b2Vec2.Multiply(impulse,JvBD)));aB+=this.m_iB*impulse*JwB;cC.Subtract(b2Vec2.Multiply(this.m_mC,b2Vec2.Multiply(impulse,JvAC)));aC-=this.m_iC*impulse*JwC;cD.Subtract(b2Vec2.Multiply(this.m_mD,b2Vec2.Multiply(impulse,JvBD)));aD-=this.m_iD*impulse*JwD;data.positions[this.m_indexA].c.Assign(cA);data.positions[this.m_indexA].a=aA;data.positions[this.m_indexB].c.Assign(cB);data.positions[this.m_indexB].a=aB;data.positions[this.m_indexC].c.Assign(cC);data.positions[this.m_indexC].a=aC;data.positions[this.m_indexD].c.Assign(cD);data.positions[this.m_indexD].a=aD;return linearError0){this.m_angularMass=1/this.m_angularMass}this.m_linearError.Assign(b2Vec2.Subtract(b2Vec2.Subtract(b2Vec2.Subtract(b2Vec2.Add(cB,this.m_rB),cA),this.m_rA),b2Mul_r_v2(qA,this.m_linearOffset)));this.m_angularError=aB-aA-this.m_angularOffset;if(data.step.warmStarting){this.m_linearImpulse.Multiply(data.step.dtRatio);this.m_angularImpulse*=data.step.dtRatio;var P=new b2Vec2(this.m_linearImpulse.x,this.m_linearImpulse.y);vA.Subtract(b2Vec2.Multiply(mA,P));wA-=iA*(b2Cross_v2_v2(this.m_rA,P)+this.m_angularImpulse);vB.Add(b2Vec2.Multiply(mB,P));wB+=iB*(b2Cross_v2_v2(this.m_rB,P)+this.m_angularImpulse)}else{this.m_linearImpulse.SetZero();this.m_angularImpulse=0}data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolveVelocityConstraints:function(data){var vA=data.velocities[this.m_indexA].v.Clone();var wA=data.velocities[this.m_indexA].w;var vB=data.velocities[this.m_indexB].v.Clone();var wB=data.velocities[this.m_indexB].w;var mA=this.m_invMassA,mB=this.m_invMassB;var iA=this.m_invIA,iB=this.m_invIB;var h=data.step.dt;var inv_h=data.step.inv_dt;var Cdot=wB-wA+inv_h*this.m_correctionFactor*this.m_angularError;var impulse=-this.m_angularMass*Cdot;var oldImpulse=this.m_angularImpulse;var maxImpulse=h*this.m_maxTorque;this.m_angularImpulse=b2Clamp(this.m_angularImpulse+impulse,-maxImpulse,maxImpulse);impulse=this.m_angularImpulse-oldImpulse;wA-=iA*impulse;wB+=iB*impulse;var Cdot=b2Vec2.Add(b2Vec2.Subtract(b2Vec2.Subtract(b2Vec2.Add(vB,b2Cross_f_v2(wB,this.m_rB)),vA),b2Cross_f_v2(wA,this.m_rA)),b2Vec2.Multiply(inv_h,b2Vec2.Multiply(this.m_correctionFactor,this.m_linearError)));var impulse=b2Mul_m22_v2(this.m_linearMass,Cdot).Negate();var oldImpulse=this.m_linearImpulse;this.m_linearImpulse.Add(impulse);var maxImpulse=h*this.m_maxForce;if(this.m_linearImpulse.LengthSquared()>maxImpulse*maxImpulse){this.m_linearImpulse.Normalize();this.m_linearImpulse.Multiply(maxImpulse)}impulse.Assign(b2Vec2.Subtract(this.m_linearImpulse,oldImpulse));vA.Subtract(b2Vec2.Multiply(mA,impulse));wA-=iA*b2Cross_v2_v2(this.m_rA,impulse);vB.Add(b2Vec2.Multiply(mB,impulse));wB+=iB*b2Cross_v2_v2(this.m_rB,impulse);data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolvePositionConstraints:function(data){return true},_serialize:function(out){var obj=out||{};this.parent.prototype._serialize.call(this,obj);obj.linearOffset=this.m_linearOffset._serialize();obj.angularOffset=this.m_angularOffset;obj.maxForce=this.m_maxForce;obj.maxTorque=this.m_maxTorque;obj.correctionFactor=this.m_correctionFactor;return obj}};b2MotorJoint._extend(b2Joint);var b2_minPulleyLength=2;function b2PulleyJointDef(){this.parent.call(this);this.type=b2Joint.e_pulleyJoint;this.groundAnchorA=new b2Vec2(-1,1);this.groundAnchorB=new b2Vec2(1,1);this.localAnchorA=new b2Vec2(-1,0);this.localAnchorB=new b2Vec2(1,0);this.lengthA=0;this.lengthB=0;this.ratio=1;this.collideConnected=true;Object.seal(this)}b2PulleyJointDef.prototype={Initialize:function(bA,bB,groundA,groundB,anchorA,anchorB,r){this.bodyA=bA;this.bodyB=bB;this.groundAnchorA.Assign(groundA);this.groundAnchorB.Assign(groundB);this.localAnchorA.Assign(this.bodyA.GetLocalPoint(anchorA));this.localAnchorB.Assign(this.bodyB.GetLocalPoint(anchorB));var dA=b2Vec2.Subtract(anchorA,groundA);this.lengthA=dA.Length();var dB=b2Vec2.Subtract(anchorB,groundB);this.lengthB=dB.Length();this.ratio=r},_deserialize:function(data,bodies,joints){this.parent.prototype._deserialize.call(this,data,bodies,joints);this.groundAnchorA._deserialize(data.groundAnchorA);this.groundAnchorB._deserialize(data.groundAnchorB);this.localAnchorA._deserialize(data.localAnchorA);this.localAnchorB._deserialize(data.localAnchorB);this.lengthA=data.lengthA;this.lengthB=data.lengthB;this.ratio=data.ratio}};b2PulleyJointDef._extend(b2JointDef);function b2PulleyJoint(def){this.parent.call(this,def);this.m_indexA=0;this.m_indexB=0;this.m_uA=new b2Vec2();this.m_uB=new b2Vec2();this.m_rA=new b2Vec2();this.m_rB=new b2Vec2();this.m_localCenterA=new b2Vec2();this.m_localCenterB=new b2Vec2();this.m_invMassA=0;this.m_invMassB=0;this.m_invIA=0;this.m_invIB=0;this.m_mass=0;this.m_groundAnchorA=def.groundAnchorA.Clone();this.m_groundAnchorB=def.groundAnchorB.Clone();this.m_localAnchorA=def.localAnchorA.Clone();this.m_localAnchorB=def.localAnchorB.Clone();this.m_lengthA=def.lengthA;this.m_lengthB=def.lengthB;this.m_ratio=def.ratio;this.m_constant=def.lengthA+this.m_ratio*def.lengthB;this.m_impulse=0}b2PulleyJoint.prototype={GetAnchorA:function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchorA)},GetAnchorB:function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchorB)},GetReactionForce:function(inv_dt){var P=b2Vec2.Multiply(this.m_impulse,this.m_uB);return b2Vec2.Multiply(inv_dt,P)},GetReactionTorque:function(inv_dt){return 0},GetGroundAnchorA:function(){return this.m_groundAnchorA},GetGroundAnchorB:function(){return this.m_groundAnchorB},GetLengthA:function(){return this.m_lengthA},GetLengthB:function(){return this.m_lengthB},GetRatio:function(){return this.m_ratio},GetCurrentLengthA:function(){var p=this.m_bodyA.GetWorldPoint(this.m_localAnchorA);var s=this.m_groundAnchorA;var d=b2Vec2.Subtract(p,s);return d.Length()},GetCurrentLengthB:function(){var p=this.m_bodyB.GetWorldPoint(this.m_localAnchorB);var s=this.m_groundAnchorB;var d=b2Vec2.Subtract(p,s);return d.Length()},ShiftOrigin:function(newOrigin){this.m_groundAnchorA.Subtract(newOrigin);this.m_groundAnchorB.Subtract(newOrigin)},InitVelocityConstraints:function(data){this.m_indexA=this.m_bodyA.m_islandIndex;this.m_indexB=this.m_bodyB.m_islandIndex;this.m_localCenterA.Assign(this.m_bodyA.m_sweep.localCenter);this.m_localCenterB.Assign(this.m_bodyB.m_sweep.localCenter);this.m_invMassA=this.m_bodyA.m_invMass;this.m_invMassB=this.m_bodyB.m_invMass;this.m_invIA=this.m_bodyA.m_invI;this.m_invIB=this.m_bodyB.m_invI;var cA=data.positions[this.m_indexA].c.Clone();var aA=data.positions[this.m_indexA].a;var vA=data.velocities[this.m_indexA].v.Clone();var wA=data.velocities[this.m_indexA].w;var cB=data.positions[this.m_indexB].c.Clone();var aB=data.positions[this.m_indexB].a;var vB=data.velocities[this.m_indexB].v.Clone();var wB=data.velocities[this.m_indexB].w;var qA=new b2Rot(aA),qB=new b2Rot(aB);this.m_rA.Assign(b2Mul_r_v2(qA,b2Vec2.Subtract(this.m_localAnchorA,this.m_localCenterA)));this.m_rB.Assign(b2Mul_r_v2(qB,b2Vec2.Subtract(this.m_localAnchorB,this.m_localCenterB)));this.m_uA.Assign(b2Vec2.Add(cA,b2Vec2.Subtract(this.m_rA,this.m_groundAnchorA)));this.m_uB.Assign(b2Vec2.Add(cB,b2Vec2.Subtract(this.m_rB,this.m_groundAnchorB)));var lengthA=this.m_uA.Length();var lengthB=this.m_uB.Length();if(lengthA>10*b2_linearSlop){this.m_uA.Multiply(1/lengthA)}else{this.m_uA.SetZero()}if(lengthB>10*b2_linearSlop){this.m_uB.Multiply(1/lengthB)}else{this.m_uB.SetZero()}var ruA=b2Cross_v2_v2(this.m_rA,this.m_uA);var ruB=b2Cross_v2_v2(this.m_rB,this.m_uB);var mA=this.m_invMassA+this.m_invIA*ruA*ruA;var mB=this.m_invMassB+this.m_invIB*ruB*ruB;this.m_mass=mA+this.m_ratio*this.m_ratio*mB;if(this.m_mass>0){this.m_mass=1/this.m_mass}if(data.step.warmStarting){this.m_impulse*=data.step.dtRatio;var PA=b2Vec2.Multiply(-(this.m_impulse),this.m_uA);var PB=b2Vec2.Multiply((-this.m_ratio*this.m_impulse),this.m_uB);vA.Add(b2Vec2.Multiply(this.m_invMassA,PA));wA+=this.m_invIA*b2Cross_v2_v2(this.m_rA,PA);vB.Add(b2Vec2.Multiply(this.m_invMassB,PB));wB+=this.m_invIB*b2Cross_v2_v2(this.m_rB,PB)}else{this.m_impulse=0}data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolveVelocityConstraints:function(data){var vA=data.velocities[this.m_indexA].v.Clone();var wA=data.velocities[this.m_indexA].w;var vB=data.velocities[this.m_indexB].v.Clone();var wB=data.velocities[this.m_indexB].w;var vpA=b2Vec2.Add(vA,b2Cross_f_v2(wA,this.m_rA));var vpB=b2Vec2.Add(vB,b2Cross_f_v2(wB,this.m_rB));var Cdot=-b2Dot_v2_v2(this.m_uA,vpA)-this.m_ratio*b2Dot_v2_v2(this.m_uB,vpB);var impulse=-this.m_mass*Cdot;this.m_impulse+=impulse;var PA=b2Vec2.Multiply(-impulse,this.m_uA);var PB=b2Vec2.Multiply(-this.m_ratio,b2Vec2.Multiply(impulse,this.m_uB));vA.Add(b2Vec2.Multiply(this.m_invMassA,PA));wA+=this.m_invIA*b2Cross_v2_v2(this.m_rA,PA);vB.Add(b2Vec2.Multiply(this.m_invMassB,PB));wB+=this.m_invIB*b2Cross_v2_v2(this.m_rB,PB);data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolvePositionConstraints:function(data){var cA=data.positions[this.m_indexA].c.Clone();var aA=data.positions[this.m_indexA].a;var cB=data.positions[this.m_indexB].c.Clone();var aB=data.positions[this.m_indexB].a;var qA=new b2Rot(aA),qB=new b2Rot(aB);var rA=b2Mul_r_v2(qA,b2Vec2.Subtract(this.m_localAnchorA,this.m_localCenterA));var rB=b2Mul_r_v2(qB,b2Vec2.Subtract(this.m_localAnchorB,this.m_localCenterB));var uA=b2Vec2.Add(cA,b2Vec2.Subtract(rA,this.m_groundAnchorA));var uB=b2Vec2.Add(cB,b2Vec2.Subtract(rB,this.m_groundAnchorB));var lengthA=uA.Length();var lengthB=uB.Length();if(lengthA>10*b2_linearSlop){uA.Multiply(1/lengthA)}else{uA.SetZero()}if(lengthB>10*b2_linearSlop){uB.Multiply(1/lengthB)}else{uB.SetZero()}var ruA=b2Cross_v2_v2(rA,uA);var ruB=b2Cross_v2_v2(rB,uB);var mA=this.m_invMassA+this.m_invIA*ruA*ruA;var mB=this.m_invMassB+this.m_invIB*ruB*ruB;var mass=mA+this.m_ratio*this.m_ratio*mB;if(mass>0){mass=1/mass}var C=this.m_constant-lengthA-this.m_ratio*lengthB;var linearError=b2Abs(C);var impulse=-mass*C;var PA=b2Vec2.Multiply(-impulse,uA);var PB=b2Vec2.Multiply(-this.m_ratio,b2Vec2.Multiply(impulse,uB));cA.Add(b2Vec2.Multiply(this.m_invMassA,PA));aA+=this.m_invIA*b2Cross_v2_v2(rA,PA);cB.Add(b2Vec2.Multiply(this.m_invMassB,PB));aB+=this.m_invIB*b2Cross_v2_v2(rB,PB);data.positions[this.m_indexA].c.Assign(cA);data.positions[this.m_indexA].a=aA;data.positions[this.m_indexB].c.Assign(cB);data.positions[this.m_indexB].a=aB;return linearError0){this.m_state=b2Joint.e_atUpperLimit}else{this.m_state=b2Joint.e_inactiveLimit}if(this.m_length>b2_linearSlop){this.m_u.Multiply(1/this.m_length)}else{this.m_u.SetZero();this.m_mass=0;this.m_impulse=0;return}var crA=b2Cross_v2_v2(this.m_rA,this.m_u);var crB=b2Cross_v2_v2(this.m_rB,this.m_u);var invMass=this.m_invMassA+this.m_invIA*crA*crA+this.m_invMassB+this.m_invIB*crB*crB;this.m_mass=invMass!=0?1/invMass:0;if(data.step.warmStarting){this.m_impulse*=data.step.dtRatio;var P=b2Vec2.Multiply(this.m_impulse,this.m_u);vA.Subtract(b2Vec2.Multiply(this.m_invMassA,P));wA-=this.m_invIA*b2Cross_v2_v2(this.m_rA,P);vB.Add(b2Vec2.Multiply(this.m_invMassB,P));wB+=this.m_invIB*b2Cross_v2_v2(this.m_rB,P)}else{this.m_impulse=0}data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolveVelocityConstraints:function(data){var vA=data.velocities[this.m_indexA].v.Clone();var wA=data.velocities[this.m_indexA].w;var vB=data.velocities[this.m_indexB].v.Clone();var wB=data.velocities[this.m_indexB].w;var vpA=b2Vec2.Add(vA,b2Cross_f_v2(wA,this.m_rA));var vpB=b2Vec2.Add(vB,b2Cross_f_v2(wB,this.m_rB));var C=this.m_length-this.m_maxLength;var Cdot=b2Dot_v2_v2(this.m_u,b2Vec2.Subtract(vpB,vpA));if(C<0){Cdot+=data.step.inv_dt*C}var impulse=-this.m_mass*Cdot;var oldImpulse=this.m_impulse;this.m_impulse=b2Min(0,this.m_impulse+impulse);impulse=this.m_impulse-oldImpulse;var P=b2Vec2.Multiply(impulse,this.m_u);vA.Subtract(b2Vec2.Multiply(this.m_invMassA,P));wA-=this.m_invIA*b2Cross_v2_v2(this.m_rA,P);vB.Add(b2Vec2.Multiply(this.m_invMassB,P));wB+=this.m_invIB*b2Cross_v2_v2(this.m_rB,P);data.velocities[this.m_indexA].v.Assign(vA);data.velocities[this.m_indexA].w=wA;data.velocities[this.m_indexB].v.Assign(vB);data.velocities[this.m_indexB].w=wB},SolvePositionConstraints:function(data){var cA=data.positions[this.m_indexA].c.Clone();var aA=data.positions[this.m_indexA].a;var cB=data.positions[this.m_indexB].c.Clone();var aB=data.positions[this.m_indexB].a;var qA=new b2Rot(aA),qB=new b2Rot(aB);var rA=b2Mul_r_v2(qA,b2Vec2.Subtract(this.m_localAnchorA,this.m_localCenterA));var rB=b2Mul_r_v2(qB,b2Vec2.Subtract(this.m_localAnchorB,this.m_localCenterB));var u=b2Vec2.Subtract(b2Vec2.Subtract(b2Vec2.Add(cB,rB),cA),rA);var length=u.Normalize();var C=length-this.m_maxLength;C=b2Clamp(C,0,b2_maxLinearCorrection);var impulse=-this.m_mass*C;var P=b2Vec2.Multiply(impulse,u);cA.Subtract(b2Vec2.Multiply(this.m_invMassA,P));aA-=this.m_invIA*b2Cross_v2_v2(rA,P);cB.Add(b2Vec2.Multiply(this.m_invMassB,P));aB+=this.m_invIB*b2Cross_v2_v2(rB,P);data.positions[this.m_indexA].c.Assign(cA);data.positions[this.m_indexA].a=aA;data.positions[this.m_indexB].c.Assign(cB);data.positions[this.m_indexB].a=aB;return length-this.m_maxLength0){this.m_ims[i]=1/m}else{this.m_ims[i]=0}}var count2=this.m_count-1;var count3=this.m_count-2;this.m_Ls=new Array(count2);this.m_as=new Array(count3);for(var i=0;i0){this.m_vs[i].Add(b2Vec2.Multiply(h,this.m_gravity))}this.m_vs[i].Multiply(d);this.m_ps[i].Add(b2Vec2.Multiply(h,this.m_vs[i]))}for(var i=0;ib2_pi){angle-=2*b2_pi;C=angle-this.m_as[i]}while(C<-b2_pi){angle+=2*b2_pi;C=angle-this.m_as[i]}var impulse=-this.m_k3*mass*C;p1.Add(b2Vec2.Multiply((m1*impulse),J1));p2.Add(b2Vec2.Multiply((m2*impulse),J2));p3.Add(b2Vec2.Multiply((m3*impulse),J3))}}};var b2JsonSerializer={serialize:function(world){var shapes=[];var i;var serialized;var b;var f;var shape;for(b=world.GetBodyList();b;b=b.GetNext()){for(f=b.GetFixtureList();f;f=f.GetNext()){shape=f.GetShape();f.__temp_shape_id=shapes.length;shapes.push(shape._serialize())}}var fixtures=[];for(b=world.GetBodyList();b;b=b.GetNext()){b.__temp_fixture_ids=[];for(f=b.GetFixtureList();f;f=f.GetNext()){serialized=f._serialize();serialized.shape=f.__temp_shape_id;delete f.__temp_shape_id;b.__temp_fixture_ids.push(fixtures.length);fixtures.push(serialized)}}var bodies=[];for(b=world.GetBodyList();b;b=b.GetNext()){serialized=b._serialize();serialized.fixtures=[];for(i=0;i config.min_body_delta) { + this.score += body_delta/50; + if(this.max_distance > oldmax) { + if(Math.abs(leg_delta) > config.min_leg_delta && this.head.head.m_linearVelocity.y > -2) { + if(typeof this.leg_delta_sign == 'undefined') { + this.leg_delta_sign = leg_delta/Math.abs(leg_delta); + } else if(this.leg_delta_sign * leg_delta < 0) { + this.leg_delta_sign = leg_delta/Math.abs(leg_delta); + this.steps++; + this.score += 100; + this.score += this.max_distance; + this.health = config.walker_health; + } + } + } + } + + if(config.check_health) { + if(body_delta < config.instadeath_delta) { + this.health = 0; + } else { + this.health--; + } + } + + return; +} + +Walker.prototype.makeName = function(genome) { + var name = ''; + var vowels = ['a','e','i','o','u']; + var space_position = Math.floor(genome.length/2); + for(var k = 0; k < genome.length; k++) { + var sum = 0; + for(var l in genome[k]) { + if(genome[k].hasOwnProperty(l)) { + sum += (genome[k][l]*10); + } + sum = Math.abs(Math.floor(sum)); + } + if(k == space_position) { + name += ' '; + } + if(k%2) { + name += vowels[sum%5]; + } else { + name += String.fromCharCode(97+sum%26); + } + } + return name; +} \ No newline at end of file