From 0100eb1301a3e09479c9203c7fbec29eab6a90ac Mon Sep 17 00:00:00 2001 From: wassname Date: Sun, 25 Nov 2018 19:20:02 +0800 Subject: [PATCH] rename and strip index --- index.htm | 127 - index.html | 36 + js/agent.js | 86 + js/draw.js | 18 +- js/game.js | 248 +- js/interface.js | 131 - js/walker.js | 115 +- package.json | 21 + {js => vendor}/jsbox2d.js | 3 +- vendor/neurojs-v2.js | 4908 +++++++++++++++++++++++++++++++++++++ 10 files changed, 5158 insertions(+), 535 deletions(-) delete mode 100644 index.htm create mode 100644 index.html create mode 100644 js/agent.js delete mode 100644 js/interface.js create mode 100644 package.json rename {js => vendor}/jsbox2d.js (99%) create mode 100644 vendor/neurojs-v2.js diff --git a/index.htm b/index.htm deleted file mode 100644 index 1178079..0000000 --- a/index.htm +++ /dev/null @@ -1,127 +0,0 @@ - - - - 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/index.html b/index.html new file mode 100644 index 0000000..d59798b --- /dev/null +++ b/index.html @@ -0,0 +1,36 @@ + + + + HTML5 Genetic Algorithm Biped Walkers + + + + + + + + + + + + +
+

Genetic Algorithm Walkers

+

"It's like watching other people QWOP"

+ +
 
+ +
+ +
+ + + diff --git a/js/agent.js b/js/agent.js new file mode 100644 index 0000000..74e67c2 --- /dev/null +++ b/js/agent.js @@ -0,0 +1,86 @@ + +function Agent(opt, world) { + this.walker = new Walker(world.world) + this.options = opt + + this.world = world + this.frequency = 20 + this.reward = 0 + this.loaded = false + + this.loss = 0 + this.timer = 0 + this.timerFrequency = 60 / this.frequency + this.resetFrequency = 30 / this.frequency + + if (this.options.dynamicallyLoaded !== true) { + this.init(world.brains.actor.newConfiguration(), null) + } + +}; + +Agent.prototype.init = function (actor, critic) { + var actions = this.walker.joints.length + var temporal = 1 + var states = this.walker.bodies.length * 2 + + var input = window.neurojs.Agent.getInputDimension(states, actions, temporal) + + this.brain = new window.neurojs.Agent({ + + actor: actor, + critic: critic, + + states: states, + actions: actions, + + algorithm: 'ddpg', + + temporalWindow: temporal, + + discount: 0.97, + + experience: 75e3, + // buffer: window.neurojs.Buffers.UniformReplayBuffer, + + learningPerTick: 40, + startLearningAt: 900, + + theta: 0.05, // progressive copy + + alpha: 0.1 // advantage learning + + }) + + // this.world.brains.shared.add('actor', this.brain.algorithm.actor) + this.world.brains.shared.add('critic', this.brain.algorithm.critic) + + this.actions = actions + this.loaded = true +}; + +Agent.prototype.step = function () { + if (!this.loaded) { + return + } + + this.timer++ + + if (this.timer % this.timerFrequency === 0) { + + // reward from last step + this.reward = this.walker.score * 1 + // console.log(this.reward) + this.walker.score = 0 + + // train + this.loss = this.brain.learn(this.reward) + this.action = this.brain.policy(this.walker.getState()) + } + + if (this.action) { + this.walker.simulationStep(this.action) + } + + return this.timer % this.timerFrequency === 0 +}; diff --git a/js/draw.js b/js/draw.js index d2f6805..9aff55c 100644 --- a/js/draw.js +++ b/js/draw.js @@ -51,18 +51,10 @@ drawFloor = function() { 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)+"%)"; - } +drawWalker = function (walker) { + var hue = walker.hue || 240 + globals.ctx.strokeStyle = "hsl("+hue+",100%,"+(90-49*walker.health/config.walker_health)+"%)"; + globals.ctx.fillStyle = "hsl("+hue+",45%,"+(100-15*walker.health/config.walker_health)+"%)"; globals.ctx.lineWidth = 1/globals.zoom; // left legs and arms first @@ -141,4 +133,4 @@ getZoom = function(min_x, max_x, min_y, max_y) { 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/game.js b/js/game.js index ef6e1cc..6e35278 100644 --- a/js/game.js +++ b/js/game.js @@ -7,7 +7,7 @@ config = { max_zoom_factor: 130, min_motor_speed: -2, max_motor_speed: 2, - population_size: 20, + population_size: 4, mutation_chance: 0.1, mutation_amount: 0.5, walker_health: 300, @@ -16,7 +16,7 @@ config = { elite_clones: 2, max_floor_tiles: 50, round_length: 1200, - min_body_delta: 1.4, + min_body_delta: 0, min_leg_delta: 0.4, instadeath_delta: 0.4 }; @@ -24,17 +24,60 @@ config = { globals = {}; gameInit = function() { - interfaceSetup(); + var joints = 12 + var bodyParts = 14 + var sensors = 14 + var state = sensors * 2 + var actions = joints + var input = 2 * state + 1 * actions + + globals.brains = { + actor: new window.neurojs.Network.Model([ + { type: 'input', size: input }, + { type: 'fc', size: 60, activation: 'relu' }, + { type: 'fc', size: 40, activation: 'relu', dropout: 0.30 }, + { type: 'fc', size: actions, activation: 'tanh' }, + { type: 'regression' } + + ]), + + critic: new window.neurojs.Network.Model([ + + { type: 'input', size: input + actions }, + { type: 'fc', size: 80, activation: 'relu' }, + { type: 'fc', size: 70, activation: 'relu' }, + { type: 'fc', size: 60, activation: 'relu' }, + { type: 'fc', size: 50, activation: 'relu' }, + { type: 'fc', size: 1 }, + { type: 'regression' } + + ]) + + } + + globals.brains.shared = new window.neurojs.Shared.ConfigPool() + + // this.brains.shared.set('actor', this.brains.actor.newConfiguration()) + globals.brains.shared.set('critic', globals.brains.critic.newConfiguration()) + globals.world = new b2.World(new b2.Vec2(0, -10)); - globals.walkers = createPopulation(); + [globals.agents, 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)); + globals.draw_interval = setInterval(drawFrame, Math.round(1000 / config.draw_fps)); + globals.draw_interval = setInterval(resetSimulation, Math.round(1000 * 1000 / config.draw_fps)); +} + +resetSimulation = function () { + console.log('resetting walkers') + for(var k = 0; k < config.population_size; k++) { + globals.agents[k].walker = globals.walkers[k] = new Walker(globals.world) + } } simulationStep = function() { @@ -46,10 +89,10 @@ simulationStep = function() { } 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(); - } + // 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) { @@ -71,172 +114,39 @@ setSimulationFps = function(fps) { } createPopulation = function(genomes) { - setQuote(); - if(typeof globals.generation_count == 'undefined') { - globals.generation_count = 0; - } else { - globals.generation_count++; - } - updateGeneration(globals.generation_count); + // setQuote(); + // if(typeof globals.generation_count == 'undefined') { + // globals.generation_count = 0; + // } else { + // globals.generation_count++; + // } + // updateGeneration(globals.generation_count); var walkers = []; + var agents = [] 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; - } + // walkers.push(new Walker(globals.world)); + var agent = new Agent({}, globals) + agents.push(agent); + walkers.push(agent.walker) + } - return walkers; + return [agents, walkers]; +} + +randAction= function(){ + var action = [] + for (let i = 0; i < 12; i++) { + action.push(Math.randf(-1,1)) + } + return action } 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(); + // var action = randAction() + // globals.walkers[k].simulationStep(action); + globals.agents[k].step() + // console.log(globals.walkers[k].walker.getState()) } + } - -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 deleted file mode 100644 index 1bf5f5b..0000000 --- a/js/interface.js +++ /dev/null @@ -1,131 +0,0 @@ -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/walker.js b/js/walker.js index 463d6d4..e07254e 100644 --- a/js/walker.js +++ b/js/walker.js @@ -6,8 +6,7 @@ var Walker = function() { this.__constructor.apply(this, arguments); } -Walker.prototype.__constructor = function(world, genome) { - +Walker.prototype.__constructor = function(world) { this.world = globals.world; this.density = 106.2; // common for all fixtures, no reason to be too specific @@ -19,7 +18,10 @@ Walker.prototype.__constructor = function(world, genome) { this.head_height = 0; this.steps = 0; - this.bd = new b2.BodyDef(); + this.hue = Math.randf(200,360) + + this.bd = new b2.BodyDef({positions: {x:10, y:-10}}); + this.bd.position.x += Math.randf(-10, 10) this.bd.type = b2.Body.b2_dynamicBody; this.bd.linearDamping = 0; this.bd.angularDamping = 0.01; @@ -73,14 +75,6 @@ Walker.prototype.__constructor = function(world, genome) { this.connectParts(); this.bodies = this.getBodies(); - - if(genome) { - this.genome = JSON.parse(JSON.stringify(genome)); - } else { - this.genome = this.createGenome(this.joints, this.bodies); - } - - this.name = this.makeName(this.genome); } Walker.prototype.createTorso = function() { @@ -229,18 +223,6 @@ Walker.prototype.createHead = function() { } Walker.prototype.connectParts = function() { - // neck/torso -// var jd = new b2.RevoluteJointDef(); -// var position = this.head.neck.GetPosition().Clone(); -// position.y -= this.head_def.neck_height/2; -// jd.Initialize(this.head.neck, this.torso.upper_torso, position); -// jd.lowerAngle = 0; -// jd.upperAngle = 0.2; -// jd.enableLimit = true; -// jd.maxMotorTorque = 2; -// jd.motorSpeed = 0; -// jd.enableMotor = true; -// this.joints.push(this.world.CreateJoint(jd)); //neck/torso var jd = new b2.WeldJointDef(); @@ -318,54 +300,27 @@ Walker.prototype.getBodies = function() { ]; } -Walker.prototype.createGenome = function(joints, bodies) { - var genome = []; - for(var k = 0; k < joints.length; k++) { - var gene = new Object(); - /* - gene.target_body1 = Math.floor(Math.random() * bodies.length); - gene.target_body2 = Math.floor(Math.random() * bodies.length); - gene.target_body3 = Math.floor(Math.random() * bodies.length); - gene.body_cos_multiplier1 = 6*Math.random() - 3; - gene.body_cos_multiplier2 = 6*Math.random() - 3; - gene.body_cos_multiplier3 = 6*Math.random() - 3; - - gene.torso_angle_multiplier = 4*Math.random() -2; - */ - gene.cos_factor = 6*Math.random() - 3; - gene.time_factor = Math.random()/10; - gene.time_shift = Math.random()*Math.PI/2 - genome.push(gene); - } - return genome; +Walker.prototype.getState = function () { + return this.bodies + .map(b => b.GetPosition()) + .reduce((o, p) => { o.push(p.x); o.push(p.y); return o }, []) } -Walker.prototype.simulationStep = function() { +Walker.prototype.simulationStep = function (motorSpeeds) { + + // act for(var k = 0; k < this.joints.length; k++) { - /* - var target_body1 = this.bodies[this.genome[k].target_body1]; - var target_body2 = this.bodies[this.genome[k].target_body2]; - var target_body3 = this.bodies[this.genome[k].target_body3]; - - var sin1 = Math.sin(target_body1.GetAngle()); - var sin2 = Math.sin(target_body2.GetAngle()); - var sin3 = Math.sin(target_body3.GetAngle()); - - this.joints[k].SetMotorSpeed( - this.genome[k].cos_factor * Math.sin(this.genome[k].torso_angle_multiplier*this.torso.upper_torso.GetAngle()) + - this.genome[k].body_cos_multiplier1 * sin1 + - this.genome[k].body_cos_multiplier2 * sin2 + - this.genome[k].body_cos_multiplier3 * sin3 - ); - */ - this.joints[k].SetMotorSpeed(this.genome[k].cos_factor*Math.cos(this.genome[k].time_shift+this.genome[k].time_factor*globals.step_counter)); + // var oldSpeed = this.joints[k].GetMotorSpeed() + // this.joints[k].SetMotorSpeed(oldSpeed + motorSpeeds[k]/10); // action can range from -3 to 3, radians per second + this.joints[k].SetMotorSpeed(motorSpeeds[k]*3); // action can range from -3 to 3, radians per second } var oldmax = this.max_distance; var distance = this.torso.upper_torso.GetPosition().x; this.max_distance = Math.max(this.max_distance, distance); - // score - this.head_height = this.head.head.GetPosition().y; + /* score/reward */ + // it's head should be above it's feet + this.head_height = this.head.head.GetPosition().y; this.low_foot_height = Math.min(this.left_leg.foot.GetPosition().y, this.right_leg.foot.GetPosition().y); var body_delta = this.head_height-this.low_foot_height; var leg_delta = this.right_leg.foot.GetPosition().x - this.left_leg.foot.GetPosition().x; @@ -386,38 +341,10 @@ Walker.prototype.simulationStep = function() { } } } + this.health = this.score * 800 + 10 + // console.log(body_delta, leg_delta) + - 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 diff --git a/package.json b/package.json new file mode 100644 index 0000000..1e5a6e4 --- /dev/null +++ b/package.json @@ -0,0 +1,21 @@ +{ + "name": "2d_walker_rl_js", + "version": "0.0.1", + "description": "TODO: Write a project description", + "main": "index.js", + "dependencies": {}, + "devDependencies": {}, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Jackymancs4/boxidroid.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/Jackymancs4/boxidroid/issues" + }, + "homepage": "https://github.com/Jackymancs4/boxidroid#readme" +} diff --git a/js/jsbox2d.js b/vendor/jsbox2d.js similarity index 99% rename from js/jsbox2d.js rename to vendor/jsbox2d.js index 8157f7d..54061f8 100644 --- a/js/jsbox2d.js +++ b/vendor/jsbox2d.js @@ -1 +1,2 @@ -(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>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 (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +var colors = {}; +module['exports'] = colors; + +colors.themes = {}; + +var ansiStyles = colors.styles = __webpack_require__(24); +var defineProps = Object.defineProperties; + +colors.supportsColor = __webpack_require__(25); + +if (typeof colors.enabled === "undefined") { + colors.enabled = colors.supportsColor; +} + +colors.stripColors = colors.strip = function(str){ + return ("" + str).replace(/\x1B\[\d+m/g, ''); +}; + + +var stylize = colors.stylize = function stylize (str, style) { + if (!colors.enabled) { + return str+''; + } + + return ansiStyles[style].open + str + ansiStyles[style].close; +} + +var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; +var escapeStringRegexp = function (str) { + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); + } + return str.replace(matchOperatorsRe, '\\$&'); +} + +function build(_styles) { + var builder = function builder() { + return applyStyle.apply(builder, arguments); + }; + builder._styles = _styles; + // __proto__ is used because we must return a function, but there is + // no way to create a function with a different prototype. + builder.__proto__ = proto; + return builder; +} + +var styles = (function () { + var ret = {}; + ansiStyles.grey = ansiStyles.gray; + Object.keys(ansiStyles).forEach(function (key) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); + ret[key] = { + get: function () { + return build(this._styles.concat(key)); + } + }; + }); + return ret; +})(); + +var proto = defineProps(function colors() {}, styles); + +function applyStyle() { + var args = arguments; + var argsLen = args.length; + var str = argsLen !== 0 && String(arguments[0]); + if (argsLen > 1) { + for (var a = 1; a < argsLen; a++) { + str += ' ' + args[a]; + } + } + + if (!colors.enabled || !str) { + return str; + } + + var nestedStyles = this._styles; + + var i = nestedStyles.length; + while (i--) { + var code = ansiStyles[nestedStyles[i]]; + str = code.open + str.replace(code.closeRe, code.open) + code.close; + } + + return str; +} + +function applyTheme (theme) { + for (var style in theme) { + (function(style){ + colors[style] = function(str){ + if (typeof theme[style] === 'object'){ + var out = str; + for (var i in theme[style]){ + out = colors[theme[style][i]](out); + } + return out; + } + return colors[theme[style]](str); + }; + })(style) + } +} + +colors.setTheme = function (theme) { + if (typeof theme === 'string') { + try { + colors.themes[theme] = !(function webpackMissingModule() { var e = new Error("Cannot find module \".\""); e.code = 'MODULE_NOT_FOUND';; throw e; }()); + applyTheme(colors.themes[theme]); + return colors.themes[theme]; + } catch (err) { + console.log(err); + return err; + } + } else { + applyTheme(theme); + } +}; + +function init() { + var ret = {}; + Object.keys(styles).forEach(function (name) { + ret[name] = { + get: function () { + return build([name]); + } + }; + }); + return ret; +} + +var sequencer = function sequencer (map, str) { + var exploded = str.split(""), i = 0; + exploded = exploded.map(map); + return exploded.join(""); +}; + +// custom formatter methods +colors.trap = __webpack_require__(16); +colors.zalgo = __webpack_require__(17); + +// maps +colors.maps = {}; +colors.maps.america = __webpack_require__(20); +colors.maps.zebra = __webpack_require__(23); +colors.maps.rainbow = __webpack_require__(21); +colors.maps.random = __webpack_require__(22) + +for (var map in colors.maps) { + (function(map){ + colors[map] = function (str) { + return sequencer(colors.maps[map], str); + } + })(map) +} + +defineProps(colors, init()); + +/***/ }), +/* 1 */ +/***/ (function(module, exports) { + +module.exports = class Size { + + static derive(val) { + if (val instanceof Size) { + return val; + } + + if (Number.isInteger(val)) { + return new Size(1, 1, val) + } + + if (val instanceof Object) { + return new Size(val.x, val.y, val.z) + } + + throw "Could not create size object"; + } + + constructor(x, y, z) { + this.x = x + this.y = y + this.z = z + } + + get length() { + return this.x * this.y * this.z + } + + get dimensions() { + if (this.x * this.y * this.z === 0) + return 0 + + if (this.x * this.y === 1) + return 1 + + if (this.x === 1) + return 2 + + return 3 + } + +} + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var dot = __webpack_require__(28) +var dropout = __webpack_require__(29) +var nonlinear = __webpack_require__(32) +var input = __webpack_require__(30) +var regression = __webpack_require__(33) +var noise = __webpack_require__(31) +var bayesian = __webpack_require__(27) +var variational = __webpack_require__(34) + +var Size = __webpack_require__(1) +var Tensor = __webpack_require__(35) +var Optim = __webpack_require__(4) + +var SharedConfiguration = __webpack_require__(3) + +if (typeof window === 'undefined') { + __webpack_require__(19); +} + +// defines how the network looks; which layers etc. +class Model { + + constructor(opt) { + this.representation = opt + this.build(opt) + } + + build(opt) { + this.layers = [] + + var input = null + var desc = Model.expand(opt) + + for(var i = 0; i < desc.length; i++) { + var current = desc[i] + var layer = Model.create(input, current) + + layer.label = current.label || undefined + layer.index = i + layer.model = this + layer.options = current + + if (layer.dimensions.output) + layer.size = layer.dimensions.output.length // convenience + + this.layers.push(layer) + input = layer.dimensions.output + } + + this.input = this.layers[0] + this.output = this.layers[this.layers.length - 1] + } + + newConfiguration() { + return new Configuration(this) + } + + newState() { + return this.newConfiguration().newState() + } + + numericalGradientCheck() { + var config = this.newConfiguration() + var state = config.newState() + var diff = 1e-5 + + function clear() { + // clear gradients + for (var i = 0; i < config.parameters.length; i++) { + if (config.parameters[i]) + config.parameters[i].dw.fill(0.0) + } + } + + function analyse(param, index) { + clear.call(this) + + state.forward(input) + state.backward(output) + + return config.parameters[param].dw[index] + } + + function loss() { + state.forward(input) + return state.loss(output) + } + + function measure(param, index) { + var orig = config.parameters[param].w[index] + config.parameters[param].w[index] = orig - diff + var loss1 = loss.call(this) + config.parameters[param].w[index] = orig + diff + var loss2 = loss.call(this) + config.parameters[param].w[index] = orig + + return (loss2 - loss1) / (2 * diff) + } + + function checkWeight(param, index) { + var analytical = analyse.call(this, param, index) + var numerical = measure.call(this, param, index) + var divisor = Math.abs(analytical) + + return Math.abs(numerical - analytical) / (divisor !== 0 ? divisor : 1) + } + + + var input = Float64Array.filled(this.input.size, 1.0) + var output = Float64Array.filled(this.output.size, 1.0) + + console.log('Checking analytical gradients...'.magenta) + + var total = 0.0 + for (var i = config.parameters.length - 1; i >= 0; i--) { + var param = config.parameters[i] + if (param === undefined) + continue + + var offset = 0.0 + for (var j = 0; j < param.w.length; j++) { + var error = checkWeight.call(this, i, j) + if (isNaN(error)) { + console.log('Layer ' + i) + throw 'gradient is NaN' + } + + offset += error * error + } + + total += offset + offset = Math.sqrt(offset) / param.w.length + + console.log('Layer ' + i + ' with gradient error of ' + offset) + + if (offset > 1e-3) { + throw 'analytical gradient unusually faulty' + } + } + + total = Math.sqrt(total) / config.countOfParameters + + console.log(('Mean gradient error is ' + total).bold.cyan) + console.log('Gradients are looking good!'.bold.white) + } + + + static expand(opt) { + var description = [] + for (var i = 0; i < opt.length; i++) { + var current = opt[i] + + if (current.type === 'softmax' && current.classes) + description.push({ type: 'fc', size: current.classes }) + + description.push(current) + + if (current.activation) + description.push({ type: current.activation }) + + if (current.dropout) + description.push({ type: 'dropout', probability: current.dropout }) + } + + if (![ 'softmax', 'regression' ].includes(description[description.length - 1].type)) + description.push({ type: 'regression' }) + + return description + } + + static create(inp, opt) { + switch (opt.type) { + case 'fc': return new dot.FullyConnectedLayer(inp, opt) + case 'dropout': return new dropout.DropOutLayer(inp, opt) + case 'sigmoid': return new nonlinear.SigmoidLayer(inp, opt) + case 'tanh': return new nonlinear.TanhLayer(inp, opt) + case 'relu': return new nonlinear.ReLULayer(inp, opt) + case 'elu': return new nonlinear.ELULayer(inp, opt) + case 'input': return new input.InputLayer(inp, opt) + case 'regression': return new regression.RegressionLayer(inp, opt) + case 'softmax': return new regression.SoftmaxLayer(inp, opt) + case 'noise': return new noise.UhlenbeckOrnsteinNoiseLayer(inp, opt) + case 'bayesian': return new bayesian.VariationalBayesianLayer(inp, opt) + case 'variational': return new variational.VariationalLayer(inp, opt) + case 'binary': return new variational.VariationalBinaryLayer(inp, opt) + } + + throw 'error' + } + +} + +// defines how the network behaves; parameter/weights etc. +class Configuration { + + constructor(model, parameters, optimizer) { + this.model = model + this.parameters = [] + this.optimizer = null + this.countOfParameters = 0 + + for (var i = 0; i < this.model.layers.length; i++) { + var layer = this.model.layers[i] + if (!layer.dimensions.parameters) { + continue + } + + var param = this.parameters[i] = new Tensor(layer.dimensions.parameters) + if (parameters && i in parameters) // copy from + param.w.set(parameters[i].w) + else if (layer.initialize) // initialize as new parameters + layer.initialize(param) + else // random parameters + param.w.randf(-1, 1) + + this.countOfParameters += layer.dimensions.parameters + } + + if (optimizer) { + this.useOptimizer(optimizer) + } + } + + + useOptimizer(optimizer) { + if (optimizer.constructor === Object) + optimizer = new Optim(optimizer) + + this.optimizer = optimizer + this.forEachParameter(param => optimizer.initialize(param)) + + return optimizer + } + + freeze(val = true) { + this.freezed = val + } + + optimize(accu = true) { + if (accu) this.accumulate(Number.isInteger(accu) ? accu : undefined) + this.forEachParameter(param => this.optimizer.apply(param)) + } + + accumulate(weighted) { + this.forEachParameter(param => this.optimizer.accumulate(param, weighted)) + } + + + + forEachParameter(cb) { + if (this.freezed) return + for (var i = 0; i < this.parameters.length; i++) { + var param = this.parameters[i] + if (param === undefined) + continue + + cb(param, i) + } + } + + copyParametersFrom(config) { + if (config.model !== this.model) + throw 'models must match' + + this.forEachParameter((function (param, index) { + param.w.set(config.parameters[index].w) + }).bind(this)) + } + + + newState() { + return new State(this) + } + + clone() { + return new Configuration(this.model, this.parameters, this.optimizer) + } + + + putWeights(arr) { + var joined = arr + + if (arr.length !== this.countOfParameters) + throw 'array doesnt match' + + for (var i = 0, p = 0; i < this.parameters.length; i++) { + var param = this.parameters[i] + if (param === undefined) + continue + + param.w.set(joined.subarray(p, p + param.w.length)) + + p += param.w.length + } + } + + pullWeights() { + var joined = new Float64Array(this.countOfParameters) + + for (var i = 0, p = 0; i < this.parameters.length; i++) { + var param = this.parameters[i] + if (param === undefined) + continue + + joined.set(param.w, p) + + p += param.w.length + } + + return joined + } + + + share() { + return new SharedConfiguration(this) + } + +} + +// defines current network input/hidden/output-state; activations and gradients etc. +class State { + + constructor(configuration) { + this.configuration = configuration + this.model = this.configuration.model + this.layers = this.model.layers + + this.tensors = [] // array of layer tensors; this.tensors[i] = output tensor of layer i + this.contexts = [] + + // First input + output of every layer + for (var i = 0; i < this.layers.length + 1; i++) { + if (i > 0 && this.layers[i - 1].passthrough) // if passthrough, just use last tensor + this.tensors[i] = this.tensors[i - 1] + else // if at i = layers.length, then use output of last layer as tensor size + this.tensors[i] = new Tensor(i < this.layers.length ? this.layers[i].dimensions.input : this.layers[i - 1].dimensions.output) + } + + for (var i = 0; i < this.layers.length; i++) { + var layer = this.layers[i] + var context = this.contexts[i] = new LayerContext({ + input: this.tensors[i], + output: this.tensors[i + 1], + parameters: this.configuration.parameters[i], + state: this + }) + + Object.each(layer.storage || {}, function (k, v) { + context[k] = new Float64Array(!isNaN(v) ? v : v.length); + }) + } + + this.in = this.tensors[0] + this.out = this.tensors[this.layers.length] + + this.__target = new Float64Array(this.out.w.length) + this.__l_in = this.layers[0] + this.__l_out = this.layers[this.layers.length - 1] + } + + /** + * Evaluate network + * @param {Float64Array} input + * @return {Float64Array} + */ + forward(input, opt) { + if (input != null) { + this.__l_in.toInputVector(input, this.in.w) // use 'input' as input values, while converting it to a vector + } + + this.options = opt || {} // set pass options + this.activate() // activate all layers + + return this.output // return copy of output + } + + /** + * Propagates error back, error is provided by subtracting desired from actual output values. + * @param {Float64Array | Int} desired + * @return {Float} loss + */ + backward(desired) { + if (desired != null) { + this.__l_out.toGradientVector(desired, this.out.w, this.out.dw) // convert 'desired' to target vector + } + + this.propagate() // propagate errors backwards + + return this.loss(desired) // return loss + } + + /** + * Instead of regressing the network to have minimal error, you can provide your own gradient. + * @param {Float64Array} grad + */ + backwardWithGradient(grad) { + if (Array.isArray(grad)) + this.out.dw.set(grad) + else if (this.out.dw.length === 1) + this.out.dw[0] = grad + else + throw 'error grad not propagatable'; + + this.propagate() + } + + + // get copy of current output + get output() { + return this.__l_out.result(this.contexts[this.__l_out.index]) + } + + // get loss of current + loss(desired) { + if (desired === undefined) + return + + return this.__l_out.loss(this.contexts[this.__l_out.index], desired) + } + + + // not error gradient, but value gradient => how to increase/decrease n-th output value + derivatives(n, clone = true) { + this.out.dw.fill(0.0) + this.out.dw[n] = 1.0 + + this.propagate() + + if (clone) + return this.in.dw.clone() + + return this.in.dw + } + + + // forward pass + activate() { + for (var i = 0; i < this.layers.length; i++) { + if (this.layers[i].passthrough) + continue ; + + this.layers[i].forward(this.contexts[i]) + } + } + + // backwards pass + propagate() { + // safety check + for (var i = 0; i < this.out.dw.length; i++) { + if (isNaN(this.out.dw[i])) { + throw 'warning: terror!'; + } + } + + for (var i = this.layers.length - 1; i >= 0; i--) { + if (this.layers[i].passthrough) + continue ; + + this.layers[i].backward(this.contexts[i]) + } + } + +} + +class LayerContext { + + constructor(opt) { + this.input = opt.input + this.output = opt.output + this.params = opt.parameters + this.state = opt.state + } + +} + + +module.exports = { + Model, Configuration, State +}; + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + +class EventRadio { + + constructor() { + this.events = {} + } + + + on(event, callback) { + if (!(event in this.events)) { + this.events[event] = [] + } + + this.events[event].push(callback) + } + + trigger(event, args = []) { + if (event in this.events) { + for (var i = 0; i < this.events[event].length; i++) { + this.events[event][i].apply(undefined, [this].concat(args)); + } + } + } + +} + +class ConfigPool extends EventRadio { + + constructor(names) { + super() + this.states = {} + this.configs = {} + this.requested = [] + } + + add(name, wrapper) { + if (!(name in this.states)) { + this.states[name] = [] + } + + if (name in this.configs) { + wrapper.set(this.configs[name]) + } + + this.states[name].push(wrapper) + wrapper.pool = this + wrapper.__pool_name = name + + this.trigger('add', [ wrapper, name ]) + this.trigger('add ' + name, [ wrapper ]) + } + + set(name, config) { + if (name in this.states) { + + for (var i = 0; i < this.states[name].length; i++) { + this.states[name][i].set(config) + } + + } + + this.configs[name] = config + } + + step() { + for (var i = 0; i < this.requested.length; i++) { + var name = this.requested[i] + this.configs[name].optimize(false) + } + + this.requested = [] + } + + requestOptimisation(wrapper) { + if (wrapper.__pool_name === undefined || !(wrapper.__pool_name in this.configs)) + return false + + if (this.requested.indexOf(wrapper.__pool_name) >= 0) + return true + + this.requested.push(wrapper.__pool_name) + + return true + } + +} + +class NetworkWrapper extends EventRadio { + + constructor() { + super() + + this.on('set', () => { + if (this.optim !== undefined) + this.config.useOptimizer(this.optim) + }) + } + + set(value) { + var state + + if (!value) { + return + } + + if (value.constructor.name === 'State') { + state = value + } + + else if (value.constructor.name === 'Configuration' || value.constructor.name === 'Model') { + state = value.newState() + } + + this.net = state + this.config = state.configuration + this.model = state.model + + this.trigger('set', [ state ]) + } + + useOptimizer(optim) { + this.optim = optim + + if (this.config) { + this.config.useOptimizer(optim) + } + } + + optimize() { + if (this.pool && this.pool.requestOptimisation(this)) { + return + } + + this.config.optimize(false) + } + +} + +module.exports = { + NetworkWrapper, ConfigPool +} + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.assign(RegExp, { + + escape(str) { + return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); + } + +}); + +Object.assign(Function.prototype, { + + getArguments() { + const STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; + const ARGUMENT_NAMES = /([^\s,]+)/g; + + if (this.$args) + return this.$args; + + var fnStr = this.toString().replace(STRIP_COMMENTS, ''); + var result = fnStr.slice(fnStr.indexOf('(') + 1, fnStr.indexOf(')')).match(ARGUMENT_NAMES); + if (result === null) + result = []; + + return this.$args = result; + }, + + getSource() { + return this.toString().replace(/^[^{]+{/i, '').replace(/}[^}]*$/i, '') + }, + + decompile() { + return { arguments: this.getArguments(), source: this.getSource() }; + } + +}); + +Object.assign(Object, { + + each(obj, callback) { + for (var key in obj) + if (obj.hasOwnProperty(key)) + callback(key, obj[key]); + } + +}); + +Object.assign(String.prototype, { + + replaceAll(find, replace) { + return this.replace(new RegExp(RegExp.escape(find), 'g'), replace); + } + +}); + +/** + * How to use this optimizer: + * + * 1. First initialize with options e.g. + * var optimizer = new Optim({ + * method: 'adadelta', + * regularization: { l2: 1e-2 }, + * clipping: 5 + * }) + * 2. Then create a (weight) tensor: + * var toOptimize = new Tensor(100) + * 3. And prepare the tensor for optimization + * optimizer.initialize(toOptimize) + * 4. Then add a gradient to the tensor (not practical like this, but you get the hang of it) + * toOptimize.dw[50] = 1.0 + * 5. Accumulate gradient (do this n-times if n is your batch count) + * optimizer.accumulate(toOptimize) + * 6. Finally apply gradient optimization via + * optimizer.apply(toOptimize) + * + */ + +class Optim { + + constructor(opt) { + this.update(opt || {}); + this.uuid = ++Optim.INDEX + } + + update(opt) { + this.method = opt.method || 'sgd'; + this.options = Object.assign({ + + type: 'descent', + clipping: 0, + regularization: { + l1: 0, + l2: 0 + } + + }, Optim.methods[this.method].options, opt); + + delete this.options.method; + + this.options = Object.freeze(this.options); + + this.build(); + } + + build() { + if (this.options.type === 'descent') + this.apply = this.assemble('-') + else if (this.options.type === 'ascent') + this.apply = this.assemble('+') + else + throw 'unrecognized optimizer type' + } + + assemble(dir) { + var method = Optim.methods[this.method]; + var regDir = dir === '+' ? '-' : '+' + + var performer = (method.deliver ? method.deliver(this.options) : method.perform).decompile(); + var stateDefs = [], produceDefs = []; + + this.states = performer.arguments; + + for (var i = 0; i < this.states.length; i++) { + stateDefs.push(this.states[i] + '=' + 'dw.' + this.states[i]); + } + + function _definitions() { + var defs = ''; + if (stateDefs.length > 0) + defs += 'var ' + stateDefs.join(',') + ';'; + + if (produceDefs.length > 0) + defs += 'var ' + produceDefs.join(',') + ';'; + + return defs; + } + + function _gradient() { + var producer = ''; + if (this.options.clipping > 0) { + producer += 'grad = grad > opt.clipping ? opt.clipping : (grad < -opt.clipping ? -opt.clipping : grad);\n'; + } + + var sum = 'grad'; + if (this.options.regularization.l1 > 0) { + produceDefs.push('l1grad'); + producer += 'l1grad = opt.regularization.l1 * (w[i] > 0 ? ' + regDir + '1 : ' + dir + '1);\n'; + sum += '+l1grad'; + } + + if (this.options.regularization.l2 > 0) { + produceDefs.push('l2grad'); + producer += 'l2grad = opt.regularization.l2 * w[i] * ' + regDir + '1.0;\n'; + sum += '+l2grad'; + } + + producer += 'gij = ' + '(' + sum + ') / iteration' + ';\n'; + + return { source: producer }; + } + + function replaceOptionsWithConstants(k, v) { + if (typeof v === 'object') { + Object.each(v, replaceOptionsWithConstants.bind(this + k + '.')); + return; + } + + fn = fn.replaceAll(this + k, v); + } + + var grad = _gradient.call(this); + + var fn = + `"use strict"; + var w = tensor.w, dw = tensor.dw, accdw = dw.acc; + var dx, gij, grad, iteration = dw.iteration; + if (iteration < 1) return ; + ${ _definitions() } + for (var i = 0; i < w.length; ++i) { + grad = accdw[i]; + ${ grad.source } + ${ performer.source } + w[i] ${ dir }= dx; + accdw[i] = 0.0; + } + dw.iteration = 0;`; + + Object.each(this.options, replaceOptionsWithConstants.bind('opt.')); + return new Function('tensor', fn); + } + + accumulate(tensor, weighted) { + weighted = weighted || 1 + var w = tensor.w, dw = tensor.dw, accdw = dw.acc; + var dx, gij, grad, iteration = (dw.iteration += weighted); + for (var i = 0; i < w.length; ++i) accdw[i] += weighted * dw[i]; + } + + initialize(tensor, set, linked) { + if (!tensor.initialized) { // general initialization + tensor.dw.iteration = 0; + tensor.dw.acc = new Float64Array(tensor.dw.length) + } + + for (var i = 0; i < this.states.length; ++i) { // specific (algorithm dependent) initialization + if (this.states[i] in tensor.dw) + tensor.dw[this.states[i]] = tensor.dw[this.states[i]].fill(0.0) + else + tensor.dw[this.states[i]] = new Float64Array(tensor.dw.length) + } + + tensor.initialized = true + } + + static register(name, value) { + Optim.methods[name] = value; + } + +} + +Optim.methods = {}; + +Optim.register("sgd", { + + deliver(opt) { + if (opt.momentum === 0) { + return function() { dx = opt.rate * gij; } + } + + return this.perform; + }, + + perform(mom) { + dx = opt.rate * gij + opt.momentum * mom[i]; + mom[i] = dx; + }, + + options: { + rate: 0.01, + momentum: 0 + } + +}); + +Optim.register("adadelta", { + + perform(gsum, xsum) { + gsum[i] = opt.ro * gsum[i] + (1 - opt.ro) * gij * gij; + dx = Math.sqrt((xsum[i] + opt.eps) / (gsum[i] + opt.eps)) * gij; + xsum[i] = opt.ro * xsum[i] + (1 - opt.ro) * dx * dx; // yes, xsum lags behind gsum by 1. + }, + + options: { + ro: 0.95, + eps: 1e-8 + } + +}); + +Optim.register("adam", { + + perform(m, v) { + m[i] = opt.beta1 * m[i] + (1 - opt.beta1) * gij; // update biased first moment estimate + v[i] = opt.beta2 * v[i] + (1 - opt.beta2) * gij * gij; // update biased second moment estimate + var bcm = m[i] / (1 - Math.pow(opt.beta1, iteration)); // correct bias first moment estimate + var bcv = v[i] / (1 - Math.pow(opt.beta2, iteration)); // correct bias second moment estimate + dx = opt.rate * bcm / (Math.sqrt(bcv) + opt.eps); + }, + + options: { + rate: 0.01, + eps: 1e-8, + beta1: 0.9, + beta2: 0.999 + } + +}); + +Optim.INDEX = 0 + +module.exports = Optim; + + +/***/ }), +/* 5 */ +/***/ (function(module, exports) { + +class ReplayBuffer { + + add(e) { throw 'not implemented' } + sample(n) { throw 'not implemented' } + getAverageLoss() { throw 'not implemented' } + getImportanceSamplingWeight(e) { return 1.0 } + updateAfterLearning() {} + +} + +class UniformReplayBuffer extends ReplayBuffer { + + constructor(size) { + super() + this.buffer = [] + this.size = size + } + + add(e) { + + if (this.buffer.length >= this.size) { + this.buffer[Math.randi(0, this.buffer.length)] = e + } + + else { + this.buffer.push(e) + } + + } + + sample(n) { + var batch = [] + + if (this.buffer.length <= n) + return this.buffer + + for (var i = 0; i < n; i++) { + batch.push(Array.random(this.buffer)) + } + + return batch + } + + draw() { + return Array.random(this.buffer) + } + + getAverageLoss() { + return Array.sum(this.buffer, x => x.loss) / this.buffer.length + } + +} + +class PrioritizedReplayBuffer extends ReplayBuffer { + + constructor(N) { + super() + + this.root = new PrioritizedReplayBuffer.Node(null, null) + this.iterations = 0 + this.size = 0 + + this.maxISW = 1.0 + this.beta = 0.5 + + for (var i = 0; i < N - 1; ++i) { + this.root.add(null) + } + + this.leafs = this.root.getLeafs() + + if (this.leafs.length !== this.root.size) + throw 'could not create replay tree...' + } + + add(e) { + if (this.size === this.leafs.length) { + this.root.descent((a, b) => a.minimum < b.minimum ? 0 : 1).set(e) + } + + else { + this.leafs[this.size].set(e) + } + + this.iterations += 1 + this.size = Math.max(this.size, this.iterations % this.leafs.length) + } + + sample(n) { + var batch = [] + + this.maxISW = Math.pow(this.size * (this.root.minimum / this.root.value), -this.beta) + + if (this.size < 5 * n) + return [ ] + + while (batch.length < n) + batch.push(this.root.cumulativeSample(Math.random() * this.root.value).experience) + + return batch + } + + draw(prioritised) { + if (!prioritised) + return this.leafs[Math.randi(0, this.size)].experience + + return this.root.cumulativeSample(Math.random() * this.root.value).experience + } + + updateAfterLearning(batch) { + for (var i = 0; i < batch.length; i++) { + var e = batch[i] + if (e !== e.node.experience) + throw 'association error' + + e.node.revalue() + } + } + + getImportanceSamplingWeight(e) { + if (e.priority === undefined) + return 1.0 + + return Math.pow(this.size * (e.priority / this.root.value), -this.beta) + } + + getAverageLoss() { + return this.root.value / this.root.size + } + +} + +PrioritizedReplayBuffer.Node = class Node { + + constructor(parent, experience) { + this.parent = parent + this.children = [] + this.size = 1 + this.value = 0.0 + + this.maximum = -Infinity + this.minimum = Infinity + + this.experience = experience + this.revalue() + } + + + cumulativeSample(x) { + if (this.children.length === 0) + return this + + if (this.children[0].value < x) + return this.children[1].cumulativeSample(x - this.children[0].value) + else + return this.children[0].cumulativeSample(x) + } + + update() { + this.value = Array.sum(this.children, x => x.value) + this.maximum = this.children.reduce((a, b) => a.maximum > b.maximum ? a : b).maximum + this.minimum = this.children.reduce((a, b) => a.minimum < b.minimum ? a : b).minimum + + if (this.parent) + this.parent.update() + } + + revalue() { + if (this.children.length > 0) + throw 'not possible' + + if (!this.experience) + return + + this.value = this.experience.priority || Infinity + + this.maximum = this.value + this.minimum = this.value + + if (this.parent) + this.parent.update() + } + + set(experience) { + if (this.children.length > 0) + throw "can't set experience of node with children" + + experience.node = this + + this.experience = experience + this.revalue() + } + + add(experience) { + if (this.children.length === 0) { // branch off + this.children.push(new PrioritizedReplayBuffer.Node(this, this.experience)) + this.children.push(new PrioritizedReplayBuffer.Node(this, experience)) + this.experience = null + + // this.update() + } else { + this.children.reduce((a, b) => a.size < b.size ? a : b).add(experience) + } + + this.size++ + } + + descent(dir) { + if (this.children.length === 0) + return this + + return this.children[ dir(this.children[0], this.children[1]) ].descent(dir) + } + + getLeafs() { + if (this.children.length === 0) + return [ this ] + + var unfolded = [] + for (var i = 0; i < this.children.length; i++) { + unfolded.push(this.children[i].getLeafs()) + } + + return Array.prototype.concat.apply([], unfolded) + } + +} + +module.exports = { + + ReplayBuffer, + UniformReplayBuffer, + PrioritizedReplayBuffer + +} + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + +var binary = __webpack_require__(7); +var network = __webpack_require__(2); + +class NetOnDisk { + + static write(config) { + var contents = []; + + contents.push(config.model.representation) + contents.push(config.pullWeights()) + + return binary.Writer.write(contents) + } + + static read(buffer) { + var contents = binary.Reader.read(buffer) + + var model = new network.Model(contents[0]) + var config = model.newConfiguration() + + config.putWeights(contents[1]) + + return config + } + + + + static writeMultiPart(list) { + var contents = []; + + contents.push(Object.keys(list)) + + for (var name in list) { + var config = list[name] + + if (!config instanceof network.Configuration) { + throw 'config in list must be of type Network.Configuration' + } + + contents.push(name) + contents.push(config.model.representation) + contents.push(config.pullWeights()) + } + + return binary.Writer.write(contents) + } + + static readMultiPart(buffer) { + var contents = binary.Reader.read(buffer) + + var ptr = -1 + var names = contents[++ptr] + + var list = {} + + for (var i = 0; i < names.length; i++) { + var name = names[i] + + if (contents[++ptr] !== name) { + throw 'name does not match up' + } + + var model = new network.Model(contents[++ptr]) + var config = model.newConfiguration() + + config.putWeights(contents[++ptr]) + + list[name] = config + } + + return list + } + +} + +module.exports = NetOnDisk + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(global) {var StringView = __webpack_require__(40); + +function isObjLiteral(_obj) { + var _test = _obj; + return ( typeof _obj !== 'object' || _obj === null ? + false : + ( + (function () { + while (!false) { + if ( Object.getPrototypeOf( _test = Object.getPrototypeOf(_test) ) === null) { + break; + } + } + return Object.getPrototypeOf(_obj) === _test; + })() + ) + ); +} + +class BinaryWriter { + + /** + * Returns array buffer, which contains the binary data. + * @param {array} contents + * @return {ArrayBuffer} + */ + static write(contents) { + var toc = [], length = 0; + + for (var i = 0; i < contents.length; i++) { + var value = contents[i] + var isobject = false + + if (value.constructor === Object || value.constructor === Array) { + value = (contents[i] = JSON.stringify(value)) + isobject = true + } + + if (typeof value === 'string') { + toc.push({ + t: 's', + l: value.length + }); + + if (isobject) { + toc[toc.length - 1]['o'] = 1; + } + + length += value.length + } + + else if (ArrayBuffer.isView(value)) { + toc.push({ + t: 't', + l: value.byteLength, + i: value.constructor.name + }) + + length += value.byteLength + } + + else if (value instanceof ArrayBuffer) { + toc.push({ + t: 'b', + l: value.byteLength + }) + + length += value.byteLength + } + } + + var jsonified = JSON.stringify(toc) + + length += jsonified.length + Uint32Array.BYTES_PER_ELEMENT + 1 + + var writer = new BinaryWriter(length) + + writer.setUint8(BinaryWriter.validationByte) // validation byte + writer.setUint32(jsonified.length) // table of contents length + writer.setString(jsonified) // ToC + + for (var i = 0; i < toc.length; i++) { + switch(toc[i].t) { + case 's': writer.setString(contents[i]); break + case 't': writer.setTypedArray(contents[i]); break + case 'b': writer.setBuffer(contents[i]); break + } + } + + if (!writer.isAtEnd()) { + throw "The lengths don't match up"; + } + + return writer.raw + } + + + constructor(length) { + this.array = new Uint8Array(length) + this.buffer = this.array.buffer + this.dataView = new DataView(this.buffer) + this.index = 0 + } + + setUint8(val) { + this.dataView.setUint8(this.index, val) + this.index += Uint8Array.BYTES_PER_ELEMENT + } + + setUint32(val) { + this.dataView.setUint32(this.index, val) + this.index += Uint32Array.BYTES_PER_ELEMENT + } + + setString(string) { + var sv = new StringView(string); + this.array.set(sv.rawData, this.index); + this.index += sv.buffer.byteLength + } + + setTypedArray(arr) { + this.array.set(new Uint8Array(arr.buffer), this.index) + this.index += arr.byteLength + } + + setBuffer(buf) { + this.array.set(new Uint8Array(buf), this.index) + this.index += buf.byteLength + } + + isAtEnd() { + return this.buffer.byteLength === this.index + } + + get raw() { + return this.array.buffer + } + +} + + +class BinaryReader { + + /** + * Returns the contents read from the array buffer + * @param {ArrayBuffer} buffer + * @return {array} + */ + static read(buffer) { + var reader = new BinaryReader(buffer) + + var validation = reader.getUint8() + + if (validation !== BinaryWriter.validationByte) { + throw "validation byte doesn't match." + } + + var tocLength = reader.getUint32() + var tocString = reader.getString(tocLength) + var toc = JSON.parse(tocString) + var contents = [] + + for (var i = 0; i < toc.length; i++) { + switch (toc[i].t) { + case 's': contents.push(reader.getString(toc[i].l)); break + case 't': contents.push(new (typeof window !== 'undefined' ? window : global)[toc[i].i](reader.getBuffer(toc[i].l))); break + case 'b': contents.push(reader.getBuffer(toc[i].l)); break + } + + if (toc[i]['o'] === 1) { + contents[i] = JSON.parse(contents[i]); + } + } + + return contents + } + + + constructor(buffer) { + this.array = new Uint8Array(buffer) + this.buffer = buffer + this.dataView = new DataView(buffer) + this.index = 0 + } + + + getUint8() { + var val = this.dataView.getUint8(this.index) + this.index += Uint8Array.BYTES_PER_ELEMENT + + return val + } + + getUint32() { + var val = this.dataView.getUint32(this.index) + this.index += Uint32Array.BYTES_PER_ELEMENT + + return val + } + + getString(length) { + var arr = this.array.subarray(this.index, this.index + length) + var str = (new StringView(arr)).toString() + + this.index += arr.byteLength + + return str + } + + getBuffer(byteLength) { + var arr = this.array.slice(this.index, this.index + byteLength) + this.index += byteLength + + return arr.buffer + } + + isAtEnd() { + return this.buffer.byteLength === this.index + } + +} + +BinaryWriter.validationByte = 0x8F; + +module.exports = { + 'Writer' : BinaryWriter, + 'Reader' : BinaryReader +}; +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(26))) + +/***/ }), +/* 8 */ +/***/ (function(module, exports) { + +function webpackEmptyContext(req) { + throw new Error("Cannot find module '" + req + "'."); +} +webpackEmptyContext.keys = function() { return []; }; +webpackEmptyContext.resolve = webpackEmptyContext; +module.exports = webpackEmptyContext; +webpackEmptyContext.id = 8; + + +/***/ }), +/* 9 */ +/***/ (function(module, exports) { + +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + + +/***/ }), +/* 10 */ +/***/ (function(module, exports) { + + +class Algorithm { + + // what to do? + act(state, target) { throw 'Not implemented' } + + // how good is an action at state + value(state, action, target) { throw 'Not implemented' } + + // replay + optimize(e, descent = true) { throw 'Not implemented' } + + // adjust weights etc + learn() { throw 'Not implemented' } + + import(params) { throw 'Not implemented' } + export() { throw 'Not implemented' } + + + evaluate(state, target) { + return this.value(state, this.act(state, target), target) + } + +} + +module.exports = Algorithm + +/***/ }), +/* 11 */ +/***/ (function(module, exports) { + +class WebLoader { + + static load(path, completion) { + var request = new XMLHttpRequest() + request.open("GET", path, true) + request.responseType = "arraybuffer" + request.addEventListener('load', function(e) { + completion(request.response) + }) + + request.send(null) + } + + static loadConfig(path, model, completion) { + var config = model.newConfiguration() + WebLoader.loadConfigInto(path, config, completion.bind(null, config)) + } + + static loadConfigInto(path, config, completion) { + WebLoader.load(path, function (buffer) { + var weights = new Float64Array(buffer) + config.read(weights) + completion() + }) + } + + + static loadAgent(path, agent, completion) { + agent.ready = false + + WebLoader.load(path, function (buffer) { + var weights = new Float64Array(buffer) + agent.import(weights) + agent.ready = true + + if (completion) + completion(agent) + }) + } + +} + +module.exports = WebLoader + +/***/ }), +/* 12 */ +/***/ (function(module, exports) { + +if (Float64Array.prototype.fill === undefined) + Float64Array.prototype.fill = function (v) { + for (var i = 0; i < this.length; i++) { this[i] = v; } + }; + + +Object.assign(Math, { + + statistics: true, + + randn() { + var U1, U2 = this.randn.U2, W, mult; + if (U2) { + this.randn.U2 = null; // deactivate for next time + return U2; + } + + do { + U1 = -1 + this.random() * 2; + U2 = -1 + this.random() * 2; + W = U1 * U1 + U2 * U2; + } while (W >= 1 || W === 0); + + mult = Math.sqrt(-2 * Math.log(W) / W); + this.randn.U2 = U2 * mult; + + return U1 * mult; + }, + + randf(a, b) { + return this.random() * (b - a) + a; + }, + + randi(a, b) { + return a + Math.floor(Math.random() * (b - a)) + }, + + uhlenbeckOrnstein(old, theta, sigma, dt) { + return old - theta * old * dt + Math.sqrt(dt) * Math.randn(0.0, sigma) + } + +}) + +Object.assign(Array, { + + random(arr) { + return arr[Math.floor(Math.random() * arr.length)] + }, + + randomAndRemove() { + var index = Math.floor(Math.random() * this.length) + var value = this[index] + this.splice(index, 1) + + return value + }, + + sum(arr, valueFunc) { + valueFunc = valueFunc || (x => x); + var sum = 0.0 + for (var i = 0; i < arr.length; i++) { + sum += valueFunc(arr[i]) + } + + return sum + }, + + lowest(valueFunc) { + return this.reduce((a, b) => valueFunc(a) < valueFunc(b) ? a : b) + }, + + highest(valueFunc) { + return this.reduce((a, b) => valueFunc(a) > valueFunc(b) ? a : b) + }, + + sample(probFunc) { + var des = Math.random() + var pos = 0.0 + for (var i = 0; i < this.children.length; i++) { + if (des < (pos += prob[i])) + return this.children[i] + } + + return this.children[this.children.length - 1] + } + +}) + + +Object.assign(Float64Array, { + + filled(n, v) { + return (new Float64Array(n)).fill(v) + }, + + oneHot(n, N) { + var vec = new Float64Array(N) + vec[n] = 1.0 + return vec + }, + + noise(N, a, b) { + var vec = new Float64Array(N) + vec.randf(a || -1, b || 1) + return vec + } + +}); + + +Object.assign(Float64Array.prototype, { + + randn(mu, std) { + for (var i = 0; i < this.length; i++) { this[i] = mu + std * Math.randn(); } + }, + + randf(a, b) { + for (var i = 0; i < this.length; i++) { this[i] = Math.randf(a, b); } + }, + + maxi() { + var maxv = -Infinity, maxi = 0.0 + for (var i = 0; i < this.length; i++) { + if (this[i] > maxv) { + maxv = this[i]; maxi = i + } + } + + return maxi + }, + + clone() { + var copied = new Float64Array(this.length) + copied.set(this) + return copied + }, + + diff(x, y) { + for (var i = 0; i < this.length; i++) { this[i] = x[i] - y[i] } + }, + + add(x, y) { + for (var i = 0; i < this.length; i++) { this[i] = x[i] + y[i] } + }, + + mult(x, y) { + for (var i = 0; i < this.length; i++) { this[i] = x[i] * y } + } + +}); + + + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + +// var network = require('../network.js') +var Window = __webpack_require__(36) +var Experience = __webpack_require__(39) +var Buffers = __webpack_require__(5) +var DQN = __webpack_require__(38) +var DDPG = __webpack_require__(37) + +/** + * The Agent class represents the + * reinforcement-learner. + */ +class Agent { + + constructor(opt) { + + this.options = Object.assign({ + + type: 'q-learning', // sarsa or q-learning + experience: 25e3, + temporalWindow: 0, + + learningPerTick: 64, + startLearningAt: 1000, + + buffer: Buffers.PrioritizedReplayBuffer, + + algorithm: 'ddpg', + + discount: opt.discount || 0.9, + beta: 0.15, // how to prioritise experiences (0 = no prioritisation, 1 = full prioritisation) + + }, opt) + + // options + this.states = this.options.states // state space + this.actions = this.options.actions // action space + this.input = Agent.getInputDimension(this.states, this.actions, this.options.temporalWindow) // extended state (over time) + + // settings + this.buffer = new this.options.buffer(this.options.experience) + this.history = { + states: new Window(Math.max(2, this.options.temporalWindow)), + actions: new Window(Math.max(2, this.options.temporalWindow)), + inputs: new Window(2), + rewards: new Window(2), + } + + this.age = 1 + this.learning = true + this.ready = true + + switch (this.options.algorithm) { + case 'dqn': + this.algorithm = new DQN(this); break + case 'ddpg': + this.algorithm = new DDPG(this); break + default: + throw 'unknown algorithm' + } + } + + /** + * Let the agent make an action, includes exploration through noise + * @param {Array} state + * @return {Array} An action + */ + policy(state) { + if (!this.ready) + return + + var input = this.getStateInputVector(state) + var action = this.act(input) + + this.history.inputs.push(input) + this.history.states.push(state) + this.history.actions.push(action) + this.acted = true + + return action + } + + actionToVector(action) { + if (action instanceof Float64Array) { + return action + } + + if (Number.isInteger(action)) { + return Float64Array.oneHot(action, this.actions) + } + + throw 'Action is invalid' + } + + getStateInputVector(state) { + if (this.options.temporalWindow > 0) { + var input = new Float64Array(this.input) + var cursor = 0 + + for (var t = this.options.temporalWindow - 1; t >= 0; t--) { + if (this.history.states.size > t) { + input.set(this.history.states.get(t), cursor) + input.set(this.actionToVector( this.history.actions.get(t) ), cursor + this.states) + } + + cursor += this.states + this.actions + } + + input.set(state, cursor) + + return input + } + + return state + } + + /** + * Simulate that the agent did an action + * @param {Array} state + * @param {Array} action + */ + simulate(state, action) { + if (!this.ready) + return + + var input = this.getStateInputVector(state) + + this.history.inputs.push(input) + this.history.states.push(state) + this.history.actions.push(action) + this.acted = true + } + + /** + * Adds an experience to the buffer and replays a batch of experiences + * @param {Float} reward + * @return {Float} The loss + */ + learn(reward) { + if (!this.acted || !this.ready) + return + + this.acted = false + this.history.rewards.push(reward) + + // Learning happens always one step after actually experiencing + if (this.history.states.size < 2 || this.learning === false) + return + + // Create new experience + var e = new Experience(this) + e.action0 = this.history.actions.get(1) + e.state0 = this.history.inputs.get(1) + e.reward0 = this.history.rewards.get(1) + e.state1 = this.history.inputs.get(0) + e.action1 = this.history.actions.get(0) // for SARSA only + e.init() // set loss etc. + + // Add experience to replay buffer + this.buffer.add(e) + + // Get older + ++this.age + + return this.backward() + } + + backward() { + if (this.options.startLearningAt > this.age) + return false + + // Set training + this.training = true + + // Learn batch + var loss = this.replay() + + // Execute algorithm + this.algorithm.learn() + + return loss + } + + replay() { + var batch = this.buffer.sample(this.options.learningPerTick), loss = 0.0 + + for (var i = 0; i < batch.length; i++) { + loss += batch[i].step() + } + + this.buffer.updateAfterLearning(batch) + + return loss / batch.length + } + + + // + act(state, target) { + return this.algorithm.act(state, target) + } + + value(state, action, target) { + return this.algorithm.value(state, action, target) + } + + evaluate(state, target) { + return this.algorithm.evaluate(state, target) + } + + + + // utility functions + export() { + return this.algorithm.export() + } + + static getInputDimension(states, actions, temporalWindow) { + return states + temporalWindow * (states + actions) + } + +} + +module.exports = Agent + +/***/ }), +/* 14 */ +/***/ (function(module, exports) { + +class FileLoader { + + static download(file, callback) { + // Create XHR, Blob and FileReader objects + var xhr = new XMLHttpRequest(), blob, fileReader = new FileReader(); + + xhr.open("GET", file, true); + // Set the responseType to arraybuffer. "blob" is an option too, rendering manual Blob creation unnecessary, but the support for "blob" is not widespread enough yet + xhr.responseType = "arraybuffer"; + + xhr.addEventListener("load", function () { + if (xhr.status === 200) { + callback(null, xhr.response) + } + + else { + callback(xhr.status, null) + } + }, false); + + // Send XHR + xhr.send(); + } + +} + +module.exports = FileLoader; + +/***/ }), +/* 15 */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(process) {function CheckSupport() { + + if (process !== undefined && !process.browser) { + if (process.version.indexOf('v') !== 0) { + throw 'unknown node version.'; + } + + var vn = process.version.substring(1).split('.'); + var major = parseInt(vn[0]); + var minor = parseInt(vn[1]); + + if (major > 6) return true; + if (major === 6 && minor >= 6) return true; + + return false; + } + + else if (typeof window !== 'undefined') { + var supported = { + 'safari': 10, + 'chrome': 54 + }; + + return true; + } + + return true; + +} + +module.exports = CheckSupport; +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(9))) + +/***/ }), +/* 16 */ +/***/ (function(module, exports) { + +module['exports'] = function runTheTrap (text, options) { + var result = ""; + text = text || "Run the trap, drop the bass"; + text = text.split(''); + var trap = { + a: ["\u0040", "\u0104", "\u023a", "\u0245", "\u0394", "\u039b", "\u0414"], + b: ["\u00df", "\u0181", "\u0243", "\u026e", "\u03b2", "\u0e3f"], + c: ["\u00a9", "\u023b", "\u03fe"], + d: ["\u00d0", "\u018a", "\u0500" , "\u0501" ,"\u0502", "\u0503"], + e: ["\u00cb", "\u0115", "\u018e", "\u0258", "\u03a3", "\u03be", "\u04bc", "\u0a6c"], + f: ["\u04fa"], + g: ["\u0262"], + h: ["\u0126", "\u0195", "\u04a2", "\u04ba", "\u04c7", "\u050a"], + i: ["\u0f0f"], + j: ["\u0134"], + k: ["\u0138", "\u04a0", "\u04c3", "\u051e"], + l: ["\u0139"], + m: ["\u028d", "\u04cd", "\u04ce", "\u0520", "\u0521", "\u0d69"], + n: ["\u00d1", "\u014b", "\u019d", "\u0376", "\u03a0", "\u048a"], + o: ["\u00d8", "\u00f5", "\u00f8", "\u01fe", "\u0298", "\u047a", "\u05dd", "\u06dd", "\u0e4f"], + p: ["\u01f7", "\u048e"], + q: ["\u09cd"], + r: ["\u00ae", "\u01a6", "\u0210", "\u024c", "\u0280", "\u042f"], + s: ["\u00a7", "\u03de", "\u03df", "\u03e8"], + t: ["\u0141", "\u0166", "\u0373"], + u: ["\u01b1", "\u054d"], + v: ["\u05d8"], + w: ["\u0428", "\u0460", "\u047c", "\u0d70"], + x: ["\u04b2", "\u04fe", "\u04fc", "\u04fd"], + y: ["\u00a5", "\u04b0", "\u04cb"], + z: ["\u01b5", "\u0240"] + } + text.forEach(function(c){ + c = c.toLowerCase(); + var chars = trap[c] || [" "]; + var rand = Math.floor(Math.random() * chars.length); + if (typeof trap[c] !== "undefined") { + result += trap[c][rand]; + } else { + result += c; + } + }); + return result; + +} + + +/***/ }), +/* 17 */ +/***/ (function(module, exports) { + +// please no +module['exports'] = function zalgo(text, options) { + text = text || " he is here "; + var soul = { + "up" : [ + '̍', '̎', '̄', '̅', + '̿', '̑', '̆', '̐', + '͒', '͗', '͑', '̇', + '̈', '̊', '͂', '̓', + '̈', '͊', '͋', '͌', + '̃', '̂', '̌', '͐', + '̀', '́', '̋', '̏', + '̒', '̓', '̔', '̽', + '̉', 'ͣ', 'ͤ', 'ͥ', + 'ͦ', 'ͧ', 'ͨ', 'ͩ', + 'ͪ', 'ͫ', 'ͬ', 'ͭ', + 'ͮ', 'ͯ', '̾', '͛', + '͆', '̚' + ], + "down" : [ + '̖', '̗', '̘', '̙', + '̜', '̝', '̞', '̟', + '̠', '̤', '̥', '̦', + '̩', '̪', '̫', '̬', + '̭', '̮', '̯', '̰', + '̱', '̲', '̳', '̹', + '̺', '̻', '̼', 'ͅ', + '͇', '͈', '͉', '͍', + '͎', '͓', '͔', '͕', + '͖', '͙', '͚', '̣' + ], + "mid" : [ + '̕', '̛', '̀', '́', + '͘', '̡', '̢', '̧', + '̨', '̴', '̵', '̶', + '͜', '͝', '͞', + '͟', '͠', '͢', '̸', + '̷', '͡', ' ҉' + ] + }, + all = [].concat(soul.up, soul.down, soul.mid), + zalgo = {}; + + function randomNumber(range) { + var r = Math.floor(Math.random() * range); + return r; + } + + function is_char(character) { + var bool = false; + all.filter(function (i) { + bool = (i === character); + }); + return bool; + } + + + function heComes(text, options) { + var result = '', counts, l; + options = options || {}; + options["up"] = typeof options["up"] !== 'undefined' ? options["up"] : true; + options["mid"] = typeof options["mid"] !== 'undefined' ? options["mid"] : true; + options["down"] = typeof options["down"] !== 'undefined' ? options["down"] : true; + options["size"] = typeof options["size"] !== 'undefined' ? options["size"] : "maxi"; + text = text.split(''); + for (l in text) { + if (is_char(l)) { + continue; + } + result = result + text[l]; + counts = {"up" : 0, "down" : 0, "mid" : 0}; + switch (options.size) { + case 'mini': + counts.up = randomNumber(8); + counts.mid = randomNumber(2); + counts.down = randomNumber(8); + break; + case 'maxi': + counts.up = randomNumber(16) + 3; + counts.mid = randomNumber(4) + 1; + counts.down = randomNumber(64) + 3; + break; + default: + counts.up = randomNumber(8) + 1; + counts.mid = randomNumber(6) / 2; + counts.down = randomNumber(8) + 1; + break; + } + + var arr = ["up", "mid", "down"]; + for (var d in arr) { + var index = arr[d]; + for (var i = 0 ; i <= counts[index]; i++) { + if (options[index]) { + result = result + soul[index][randomNumber(soul[index].length)]; + } + } + } + } + return result; + } + // don't summon him + return heComes(text, options); +} + + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + +var colors = __webpack_require__(0); + +module['exports'] = function () { + + // + // Extends prototype of native string object to allow for "foo".red syntax + // + var addProperty = function (color, func) { + String.prototype.__defineGetter__(color, func); + }; + + var sequencer = function sequencer (map, str) { + return function () { + var exploded = this.split(""), i = 0; + exploded = exploded.map(map); + return exploded.join(""); + } + }; + + addProperty('strip', function () { + return colors.strip(this); + }); + + addProperty('stripColors', function () { + return colors.strip(this); + }); + + addProperty("trap", function(){ + return colors.trap(this); + }); + + addProperty("zalgo", function(){ + return colors.zalgo(this); + }); + + addProperty("zebra", function(){ + return colors.zebra(this); + }); + + addProperty("rainbow", function(){ + return colors.rainbow(this); + }); + + addProperty("random", function(){ + return colors.random(this); + }); + + addProperty("america", function(){ + return colors.america(this); + }); + + // + // Iterate through all default styles and colors + // + var x = Object.keys(colors.styles); + x.forEach(function (style) { + addProperty(style, function () { + return colors.stylize(this, style); + }); + }); + + function applyTheme(theme) { + // + // Remark: This is a list of methods that exist + // on String that you should not overwrite. + // + var stringPrototypeBlacklist = [ + '__defineGetter__', '__defineSetter__', '__lookupGetter__', '__lookupSetter__', 'charAt', 'constructor', + 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf', 'charCodeAt', + 'indexOf', 'lastIndexof', 'length', 'localeCompare', 'match', 'replace', 'search', 'slice', 'split', 'substring', + 'toLocaleLowerCase', 'toLocaleUpperCase', 'toLowerCase', 'toUpperCase', 'trim', 'trimLeft', 'trimRight' + ]; + + Object.keys(theme).forEach(function (prop) { + if (stringPrototypeBlacklist.indexOf(prop) !== -1) { + console.log('warn: '.red + ('String.prototype' + prop).magenta + ' is probably something you don\'t want to override. Ignoring style name'); + } + else { + if (typeof(theme[prop]) === 'string') { + colors[prop] = colors[theme[prop]]; + addProperty(prop, function () { + return colors[theme[prop]](this); + }); + } + else { + addProperty(prop, function () { + var ret = this; + for (var t = 0; t < theme[prop].length; t++) { + ret = colors[theme[prop][t]](ret); + } + return ret; + }); + } + } + }); + } + + colors.setTheme = function (theme) { + if (typeof theme === 'string') { + try { + colors.themes[theme] = !(function webpackMissingModule() { var e = new Error("Cannot find module \".\""); e.code = 'MODULE_NOT_FOUND';; throw e; }()); + applyTheme(colors.themes[theme]); + return colors.themes[theme]; + } catch (err) { + console.log(err); + return err; + } + } else { + applyTheme(theme); + } + }; + +}; + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + +var colors = __webpack_require__(0); +module['exports'] = colors; + +// Remark: By default, colors will add style properties to String.prototype +// +// If you don't wish to extend String.prototype you can do this instead and native String will not be touched +// +// var colors = require('colors/safe); +// colors.red("foo") +// +// +__webpack_require__(18)(); + +/***/ }), +/* 20 */ +/***/ (function(module, exports, __webpack_require__) { + +var colors = __webpack_require__(0); + +module['exports'] = (function() { + return function (letter, i, exploded) { + if(letter === " ") return letter; + switch(i%3) { + case 0: return colors.red(letter); + case 1: return colors.white(letter) + case 2: return colors.blue(letter) + } + } +})(); + +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + +var colors = __webpack_require__(0); + +module['exports'] = (function () { + var rainbowColors = ['red', 'yellow', 'green', 'blue', 'magenta']; //RoY G BiV + return function (letter, i, exploded) { + if (letter === " ") { + return letter; + } else { + return colors[rainbowColors[i++ % rainbowColors.length]](letter); + } + }; +})(); + + + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { + +var colors = __webpack_require__(0); + +module['exports'] = (function () { + var available = ['underline', 'inverse', 'grey', 'yellow', 'red', 'green', 'blue', 'white', 'cyan', 'magenta']; + return function(letter, i, exploded) { + return letter === " " ? letter : colors[available[Math.round(Math.random() * (available.length - 1))]](letter); + }; +})(); + +/***/ }), +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { + +var colors = __webpack_require__(0); + +module['exports'] = function (letter, i, exploded) { + return i % 2 === 0 ? letter : colors.inverse(letter); +}; + +/***/ }), +/* 24 */ +/***/ (function(module, exports) { + +/* +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +var styles = {}; +module['exports'] = styles; + +var codes = { + reset: [0, 0], + + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29], + + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], + grey: [90, 39], + + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], + + // legacy styles for colors pre v1.0.0 + blackBG: [40, 49], + redBG: [41, 49], + greenBG: [42, 49], + yellowBG: [43, 49], + blueBG: [44, 49], + magentaBG: [45, 49], + cyanBG: [46, 49], + whiteBG: [47, 49] + +}; + +Object.keys(codes).forEach(function (key) { + var val = codes[key]; + var style = styles[key] = []; + style.open = '\u001b[' + val[0] + 'm'; + style.close = '\u001b[' + val[1] + 'm'; +}); + +/***/ }), +/* 25 */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(process) {/* +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +var argv = process.argv; + +module.exports = (function () { + if (argv.indexOf('--no-color') !== -1 || + argv.indexOf('--color=false') !== -1) { + return false; + } + + if (argv.indexOf('--color') !== -1 || + argv.indexOf('--color=true') !== -1 || + argv.indexOf('--color=always') !== -1) { + return true; + } + + if (process.stdout && !process.stdout.isTTY) { + return false; + } + + if (process.platform === 'win32') { + return true; + } + + if ('COLORTERM' in process.env) { + return true; + } + + if (process.env.TERM === 'dumb') { + return false; + } + + if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) { + return true; + } + + return false; +})(); +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(9))) + +/***/ }), +/* 26 */ +/***/ (function(module, exports) { + +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || Function("return this")() || (1,eval)("this"); +} catch(e) { + // This works if the window reference is available + if(typeof window === "object") + g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var Size = __webpack_require__(1); + +// http://arxiv.org/pdf/1505.05424.pdf +class VariationalBayesianLayer { + + constructor(input, opt) { + opt.size = Size.derive(opt.size) + + this.dimensions = { + input, + output: opt.size, + parameters: 2 * (input.length * opt.size.length + opt.size.length) // mean and std + } + + this.storage = { + sample: input.length * opt.size.length + opt.size.length, + weights: input.length * opt.size.length + opt.size.length + } + + + } + + forward(ctx) { + var sum = 0.0, X = this.dimensions.input.length, Y = this.dimensions.output.length + var inpw = ctx.input.w, outw = ctx.output.w, paramw = ctx.params.w + var sampled = ctx.sample, weights = ctx.weights, epsilon = 0 + var mu, std, w, b + + for (var i = 0; i < Y; i++) { + sum = 0.0 + for (var j = 0; j < X; j++) { + mu = paramw[(i * X + j) * 2 + 0] + std = Math.log(1 + Math.exp( paramw[(i * X + j) * 2 + 1] )) + + sampled[i * X + j] = epsilon = Math.randn() + weights[i * X + j] = w = mu + std * epsilon + + sum += inpw[j] * w + } + + mu = paramw[(X * Y + i) * 2 + 0] + std = Math.log(1 + Math.exp( paramw[(X * Y + i) * 2 + 1] )) + + sampled[X * Y + i] = epsilon = Math.randn() + weights[X * Y + i] = b = mu + std * epsilon + + outw[i] = sum + b + } + + } + + backward(ctx) { + var sum = 0.0, X = this.dimensions.input.length, Y = this.dimensions.output.length + var inpw = ctx.input.w, outw = ctx.output.w, paramw = ctx.params.w + var inpdw = ctx.input.dw, outdw = ctx.output.dw, paramdw = ctx.params.dw + var sampled = ctx.sample, weights = ctx.weights + + for (var i = 0; i < X; i++) { + sum = 0.0 + for (var j = 0; j < Y; j++) { + paramdw[(j * X + i) * 2 + 0] = inpw[i] * outdw[j] + paramdw[(j * X + i) * 2 + 1] = inpw[i] * outdw[j] * sampled[j * X + i] / (1.0 + Math.exp(-paramw[(j * X + i) * 2 + 1])) + sum += weights[j * X + i] * outdw[j] + } + + inpdw[i] = sum + } + + for (var i = 0; i < Y; i++) { + paramdw[(X * Y + i) * 2 + 0] = outdw[i] + paramdw[(X * Y + i) * 2 + 1] = outdw[i] * sampled[X * Y + i] / (1.0 + Math.exp(-paramw[(X * Y + i) * 2 + 1])) + } + } + + initialize(params) { + var H = this.dimensions.parameters / 2 + var elements = (this.dimensions.input.length + this.dimensions.output.length) + var scale = Math.sqrt(2.0 / elements) + + for (var i = 0; i < H; i+=2) { + params.w[i] = Math.randn() * scale + params.w[i + 1] = Math.randn() + } + } + +} + +module.exports = { + VariationalBayesianLayer +} + +/***/ }), +/* 28 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var Size = __webpack_require__(1); + +class FullyConnectedLayer { + + constructor(input, opt) { + opt.size = Size.derive(opt.size) + + this.dimensions = { + input, + output: opt.size, + parameters: input.length * opt.size.length + opt.size.length + } + + } + + forward(ctx) { + var sum = 0.0, X = this.dimensions.input.length, Y = this.dimensions.output.length + var inpw = ctx.input.w, outw = ctx.output.w, paramw = ctx.params.w + + + for (var i = 0; i < Y; i++) { + sum = 0.0 + for (var j = 0; j < X; j++) { + sum += inpw[j] * paramw[i * X + j] + } + + outw[i] = sum + paramw[X * Y + i] + } + + // outw.set(this.fwd(inpw, paramw)); + } + + backward(ctx) { + var sum = 0.0, X = this.dimensions.input.length, Y = this.dimensions.output.length + var inpw = ctx.input.w, outw = ctx.output.w, paramw = ctx.params.w + var inpdw = ctx.input.dw, outdw = ctx.output.dw, paramdw = ctx.params.dw + + for (var i = 0; i < X; i++) { + sum = 0.0 + for (var j = 0; j < Y; j++) { + sum += paramw[j * X + i] * outdw[j] + paramdw[j * X + i] = inpw[i] * outdw[j] + } + + inpdw[i] = sum + } + + for (var i = 0; i < Y; i++) { + paramdw[X * Y + i] = outdw[i] + } + } + + initialize(params) { + var X = this.dimensions.input.length, Y = this.dimensions.output.length + + if (this.options.init) { + params.w.randn(0.0, this.options.init) + } + + else { + // var dropout = this.options.dropout || 0 + // var elements = (1 - dropout) * (this.dimensions.input.length + this.dimensions.output.length) + var scale = Math.sqrt(1.0 / X) + params.w.randn((this.options.mean / X) || 0.0, scale) + } + + // biases should be zero + for (var i = 0; i < Y; i++) { + params.w[X * Y + i] = 0.0 + } + } + +} + +module.exports = { + FullyConnectedLayer +} + +/***/ }), +/* 29 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +class DropOutLayer { + + constructor(input, opt) { + this.dimensions = { + input, + output: input, + parameters: 0 + } + + this.probability = opt.probability + this.storage = { + activations: input + } + } + + forward(ctx) { + var X = this.dimensions.input.length + var inpw = ctx.input.w, outw = ctx.output.w + var prob = this.probability, act = ctx.activations + + // if (ctx.state.options.learning !== true) { + // for (var i = 0; i < X; i++) + // outw[i] = inpw[i] * prob + + // return + // } + + for (var i = 0; i < X; i++) { + if (Math.random() < prob) { // dropping out + outw[i] = 0.0 + act[i] = 0.0 + } + + else { + outw[i] = inpw[i] / (1.0 - prob) + act[i] = 1.0 + } + } + } + + backward(ctx) { + var X = this.dimensions.input.length + var inpw = ctx.input.w, outw = ctx.output.w + var inpdw = ctx.input.dw, outdw = ctx.output.dw + var prob = this.probability, act = ctx.activations + + // if (ctx.state.options.learning !== true) { + // // for (var i = 0; i < X; i++) + // // inpdw[i] = outdw[i] * prob + + // return + // } + + for (var i = 0; i < X; i++) { + inpdw[i] = act[i] * outdw[i] / (1.0 - prob) + } + } + +} + +module.exports = { + DropOutLayer +}; + +/***/ }), +/* 30 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var Size = __webpack_require__(1); + +class InputLayer { + + constructor(inp, opt) { + this.dimensions = { + input: Size.derive(opt.size), + output: Size.derive(opt.size), + parameters: 0 + }; + + this.input = true + this.passthrough = true + } + + toInputVector(input, out) { + if (input === undefined) + return + + if (Number.isInteger(input) && input < this.dimensions.intrinsic) { + out.fill(0.0) + out[input] = 1.0 + } + + else if (input.length === out.length) { + out.set(input) + } + + else { + throw 'invalid input format'; + } + } + +} + +module.exports = { + InputLayer +} + +/***/ }), +/* 31 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + + +class UhlenbeckOrnsteinNoiseLayer { + + constructor(input, opt) { + this.dimensions = { + input, + output: input, + parameters: 0 + } + + this.theta = opt.theta || 0.15 + this.sigma = opt.sigma || 0.3 + this.delta = opt.delta || 0.1 + + this.storage = { + noise: input + } + } + + forward(ctx) { + var X = this.dimensions.input.length + var outw = ctx.output.w, inpw = ctx.input.w + + var alpha = 0.3 + for (var i = 0; i < X; i++) { + outw[i] = (1-alpha) * inpw[i] + alpha * (ctx.noise[i] = Math.uhlenbeckOrnstein(ctx.noise[i], this.theta, this.sigma, this.delta)) + } + } + + backward(ctx) { + ctx.input.dw.set(ctx.output.dw) + } + +} + +module.exports = { + UhlenbeckOrnsteinNoiseLayer +}; + + +/***/ }), +/* 32 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +class NonLinearityLayer { + + constructor(input, opt) { + this.dimensions = { + input, + output: input, + parameters: 0 + }; + } + +} + +class SigmoidLayer extends NonLinearityLayer { + + forward(ctx) { + var X = this.dimensions.input.length; + var inpw = ctx.input.w, outw = ctx.output.w + + for (var i = 0; i < X; i++) { + outw[i] = 1 / (1 + Math.exp(-inpw[i])) + } + } + + backward(ctx) { + var X = this.dimensions.input.length + var inpw = ctx.input.w, outw = ctx.output.w + var inpdw = ctx.input.dw, outdw = ctx.output.dw + + for (var i = 0; i < X; i++) { + inpdw[i] = outw[i] * (1.0 - outw[i]) * outdw[i] + } + } + +} + +class TanhLayer extends NonLinearityLayer { + + forward(ctx) { + var X = this.dimensions.input.length + var inpw = ctx.input.w, outw = ctx.output.w + var y = 0.0; + + for (var i = 0; i < X; i++) { + y = Math.exp(2 * inpw[i]); + outw[i] = (y - 1) / (y + 1); + } + } + + backward(ctx) { + var X = this.dimensions.input.length + var inpw = ctx.input.w, outw = ctx.output.w + var inpdw = ctx.input.dw, outdw = ctx.output.dw + + for (var i = 0; i < X; i++) { + inpdw[i] = (1 - outw[i] * outw[i]) * outdw[i]; + } + } + +} + +class ReLULayer extends NonLinearityLayer { + + constructor(input, opt) { + super(input, opt) + this.leaky = opt.leaky || 0 + } + + forward(ctx) { + var X = this.dimensions.input.length + var inpw = ctx.input.w, outw = ctx.output.w + var y = 0.0; + + for (var i = 0; i < X; i++) { + outw[i] = (inpw[i] > 0.0 ? inpw[i] : this.leaky * inpw[i]); + } + } + + backward(ctx) { + var X = this.dimensions.input.length + var inpw = ctx.input.w, outw = ctx.output.w + var inpdw = ctx.input.dw, outdw = ctx.output.dw + + for (var i = 0; i < X; i++) { + inpdw[i] = (inpw[i] > 0.0 ? 1.0 : this.leaky) * outdw[i]; + } + } + +} + +class ELULayer extends NonLinearityLayer { + + constructor(input, opt) { + super(input, opt) + this.alpha = opt.alpha || 1.0 + } + + forward(ctx) { + var X = this.dimensions.input.length + var inpw = ctx.input.w, outw = ctx.output.w + var y = 0.0; + + for (var i = 0; i < X; i++) { + outw[i] = (inpw[i] > 0.0 ? inpw[i] : this.alpha * (Math.exp(inpw[i]) - 1)); + } + } + + backward(ctx) { + var X = this.dimensions.input.length + var inpw = ctx.input.w, outw = ctx.output.w + var inpdw = ctx.input.dw, outdw = ctx.output.dw + + for (var i = 0; i < X; i++) { + inpdw[i] = (inpw[i] > 0.0 ? 1.0 : outw[i] + this.alpha) * outdw[i]; + } + } + +} + +module.exports = { + SigmoidLayer, TanhLayer, ReLULayer, ELULayer +}; + +/***/ }), +/* 33 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +class OutputLayer { + + constructor(inp, opt) { + this.dimensions = { + input: inp, + output: inp, + parameters: 0 + }; + + this.output = true + } + + result(ctx) { + return ctx.output.w.clone() + } + + +} + +class SoftmaxLayer extends OutputLayer { + + forward(ctx) { + var X = this.dimensions.input.length + var inpw = ctx.input.w, outw = ctx.output.w + var inpmax = -Infinity + + for (var i = 0; i < X; ++i) + if (inpw[i] > inpmax) inpmax = inpw[i] + + var expsum = 0.0 + for (var i = 0; i < X; ++i) + expsum += outw[i] = Math.exp(inpw[i] - inpmax) + + for (var i = 0; i < X; ++i) + outw[i] /= expsum + } + + backward(ctx) { + var X = this.dimensions.input.length + var inpdw = ctx.input.dw + var outdw = ctx.output.dw, outw = ctx.output.w + + for (var i = 0; i < X; i++) { + var sum = outw[i] * (1 - outw[i]) * outdw[i] + + for (var j = 0; j < X; j++) { + if (i !== j) sum -= outw[j] * outw[i] * outdw[j] + } + + inpdw[i] = sum + } + } + + loss(ctx, desired, target) { + return -Math.log(ctx.output.w[desired]) + } + + toGradientVector(desired, actual, out) { + if (Number.isInteger(desired) !== true || desired >= this.size) + throw 'target must be class index in softmax' + + for (var i = 0; i < this.size; i++) { + out[i] = actual[i] - (desired === i ? 1.0 : 0.0) + } + } + +} + +class RegressionLayer extends OutputLayer { + + constructor(inp, opt) { + super(inp, opt) + this.passthrough = true + } + + loss(ctx, desired) { + var loss = 0.0 + var grads = this.toGradientVector(desired, ctx.output.w) + + for (var i = 0; i < this.dimensions.input.length; i++) { + loss += 0.5 * grads[i] * grads[i] + } + + return loss + } + + toGradientVector(desired, actual, out) { + var X = this.dimensions.input.length + + if (out === undefined) { + out = new Float64Array(X) + } + + // target is maximizing argmax, set n-th value to 1, rest to 0 + if (X > 1 && !isNaN(desired) && Number.isInteger(desired) && desired < X) { + for (var i = 0; i < X; ++i) { + out[i] = actual[i] - (i === desired ? 1.0 : 0.0) + } + } + + // single value output + else if (X === 1 && !isNaN(desired)) { + out[0] = actual[0] - desired + } + + else if (desired instanceof Array || desired instanceof Float64Array) { + for (var i = 0; i < out.length; ++i) { + out[i] = actual[i] - desired[i] + } + } + + else { + throw 'invalid target' + } + + return out + } + +} + +module.exports = { + RegressionLayer, SoftmaxLayer +}; + + +/***/ }), +/* 34 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var Size = __webpack_require__(1); + +function sigm(x) { + return 1 / (1 + Math.exp(-x)) +} + +function dsigm(fx) { + return fx * (1.0 - fx) +} + +class VariationalLayer { + + constructor(input, opt) { + if (input.length % 2 !== 0) { + throw 'input must be divisible by two.' + } + + this.dimensions = { + input: input, + output: new Size(1, 1, input.length / 2), + parameters: 0 + } + + this.storage = { + samples: this.dimensions.output.length + } + + this.variance_decay = opt.variance_decay || 0.0 + + } + + forward(ctx) { + var Y = this.dimensions.output.length + var inpw = ctx.input.w, outw = ctx.output.w + var samples = ctx.samples + + for (var i = 0; i < Y; i++) { + var eps = Math.randn(0.0, 1.0) + outw[i] = inpw[2 * i + 0] + inpw[2 * i + 1] * eps + samples[i] = eps + } + } + + backward(ctx) { + var Y = this.dimensions.output.length + var inpw = ctx.input.w, outw = ctx.output.w + var inpdw = ctx.input.dw, outdw = ctx.output.dw + var samples = ctx.samples + + for (var i = 0; i < Y; i++) { + inpdw[2 * i + 0] += outdw[i] + inpdw[2 * i + 1] += samples[i] * outdw[i] + } + } + +} + + +class VariationalBinaryLayer { + + constructor(input, opt) { + this.dimensions = { + input: input, + output: new Size(1, 1, input.length), + parameters: 0 + } + + this.storage = { + probs: this.dimensions.output.length + } + + } + + forward(ctx) { + var Y = this.dimensions.output.length + var inpw = ctx.input.w, outw = ctx.output.w + var probs = ctx.probs + + for (var i = 0; i < Y; i++) { + var eps = Math.random() + probs[i] = sigm(inpw[i]) // activate with probability + outw[i] = eps <= probs[i] ? 1.0 : 0.0 + } + } + + backward(ctx) { + var Y = this.dimensions.output.length + var inpw = ctx.input.w, outw = ctx.output.w + var inpdw = ctx.input.dw, outdw = ctx.output.dw + var probs = ctx.probs + + for (var i = 0; i < Y; i++) { + inpdw[i] = dsigm( probs[i] ) * outdw[i] + } + } + +} + + +module.exports = { + VariationalBinaryLayer +} + +/***/ }), +/* 35 */ +/***/ (function(module, exports, __webpack_require__) { + +var Size = __webpack_require__(1); + +module.exports = class Tensor { + + constructor(size) { + this.size = Size.derive(size) + this.w = new Float64Array(this.size.length); + this.dw = new Float64Array(this.size.length); + } + +} + +/***/ }), +/* 36 */ +/***/ (function(module, exports) { + +class Window { + + constructor(n) { + this.list = [] + this.length = n + } + + push(value) { + this.list.unshift(value) + + if (this.list.length > this.length) { + this.list.pop() + } + } + + get(nth) { + return this.list[nth] + } + + get size() { + return this.list.length + } + +} + +module.exports = Window + +/***/ }), +/* 37 */ +/***/ (function(module, exports, __webpack_require__) { + +var network = __webpack_require__(2) +var shared = __webpack_require__(3) + +var NetOnDisk = __webpack_require__(6) +var Algorithm = __webpack_require__(10) + + +/* Deep deterministic policy gradient */ +class DDPG extends Algorithm { + + constructor(agent) { + super() + // options + this.options = Object.assign({ + alpha: 0, // advantage learning (AL) http://arxiv.org/pdf/1512.04860v1.pdf; increase action-gap + theta: 0.001, // soft target updates + }, agent.options) + + + this.actor = new shared.NetworkWrapper() + this.critic = new shared.NetworkWrapper() + + // target networks + + var targetCreate = (wrapper, state) => { + wrapper.live = state + + if (this.options.theta < 1) { + wrapper.target = wrapper.live.model.newState() + } + + else { + wrapper.target = wrapper.live + } + } + + this.actor.on('set', targetCreate) + this.critic.on('set', targetCreate) + + // network validations + + this.actor.on('set', (wrapper, state) => { + if (state.in.w.length !== this.agent.input) { + throw 'actor input length insufficient' + } + + if (state.out.w.length !== this.agent.actions) { + throw 'actor output insufficient' + } + }) + + this.critic.on('set', (wrapper, state) => { + if (state.in.w.length !== this.agent.input + this.agent.actions) { + throw 'critic input length insufficient' + } + + if (state.out.w.length !== 1) { + throw 'critic output length insufficient' + } + }) + + // optimizer + + this.actor.useOptimizer({ + type: 'ascent', + method: 'adadelta', + regularization: { l2: 1e-2 } + }) + + this.critic.useOptimizer({ + type: 'descent', + method: 'adadelta', + regularization: { l2: 1e-3 } + }) + + // agent + this.agent = agent + + this.input = agent.input + this.buffer = agent.buffer + + // network weight updates + this.targetActorUpdate = this.progressiveCopy.bind(this, this.actor) + this.targetCriticUpdate = this.progressiveCopy.bind(this, this.critic) + + // adopt networks + this.actor.set(this.options.actor) + this.critic.set(this.options.critic) + } + + act(state, target) { + if (target) { + return this.actor.target.forward(state) + } + + return this.actor.live.forward(state) + } + + value(state, action, target) { + var net = target ? this.critic.target : this.critic.live + + net.in.w.set(state, 0) + net.in.w.set(action, this.input) + + return net.forward()[0] + } + + optimize(e, descent = true) { + var target = e.target() + var value = e.estimate() + + var grad = value - target + var gradAL = grad + + if (this.options.alpha > 0) { + gradAL = grad + this.options.alpha * (value - this.evaluate(e.state0, true)) // advantage learning + } + + if (descent) { + var isw = this.buffer.getImportanceSamplingWeight(e) + this.critic.live.backwardWithGradient(gradAL * isw) + this.critic.live.configuration.accumulate() + this.teach(e, isw) + } + + return 0.5 * gradAL * gradAL // Math.pow(this.teach(e, isw, descent) - target, 2) + } + + teach(e, isw = 1.0, descent = true) { + var action = this.actor.live.forward(e.state0) // which action to take? + var val = this.value(e.state0, action) // how good will the future be, if i take this action? + var grad = this.critic.live.derivatives(0, false) // how will the future change, if i change this action + + for (var i = 0; i < this.options.actions; i++) { + this.actor.live.out.dw[i] = grad[this.input + i] * isw + } + + if (descent) { + this.actor.live.backward() // propagate change + this.actor.config.accumulate() + } + } + + learn() { + // Improve through batch accumuluated gradients + this.actor.optimize() + this.critic.optimize() + + // Copy actor and critic to target networks slowly + this.targetNetworkUpdates() + } + + targetNetworkUpdates() { + this.actor.target.configuration.forEachParameter(this.targetActorUpdate) + this.critic.target.configuration.forEachParameter(this.targetCriticUpdate) + } + + progressiveCopy(net, param, index) { + if (this.options.theta >= 1) { + return + } + + // _ = network in use, no _ = target network + var _theta = this.options.theta, _paramw = net.config.parameters[index].w + var theta = 1.0 - _theta, paramw = param.w + + for (var i = 0; i < param.w.length; i++) { + paramw[i] = _theta * _paramw[i] + theta * paramw[i] + } + } + + + import(file) { + var multiPart = NetOnDisk.readMultiPart(file) + this.actor.set(multiPart.actor) + this.critic.set(multiPart.critic) + } + + export() { + return NetOnDisk.writeMultiPart({ + 'actor': this.actor.config, + 'critic': this.critic.config + }) + } + +} + +module.exports = DDPG; + +/***/ }), +/* 38 */ +/***/ (function(module, exports, __webpack_require__) { + +var Algorithm = __webpack_require__(10) + +class DQN extends Algorithm { + + constructor(agent) { + // options + this.options = Object.assign({ + + alpha: 0.1, // advantage learning (AL) http://arxiv.org/pdf/1512.04860v1.pdf; increase action-gap + theta: 0.001, // soft target updates + + learningSteps: 100e3, + learningStepsBurnin: 3e3, + + epsilonMin: 0.05, + epsilonAtTestTime: 0.05 + + + }, agent.options) + + // + this.net = agent.options.network.newState() + this.target = this.net.model.newState() // agent.options.target.actor.newState() + // this.target.configuration.copyParametersFrom(this.net.configuration) + + // + this.targetWeightCopy = this.progressiveCopy.bind(this, this.net.configuration) + + this.net.configuration.useOptimizer({ + type: 'descent', + method: 'adadelta', + regularization: { l2: 1e-3 } + }) + + // agent + this.agent = agent + this.buffer = agent.buffer + + this.states = this.agent.states + this.actions = this.agent.actions + this.input = this.agent.input + } + + // what to do? + act(state, target) { + + if (this.agent.learning) + this.epsilon = Math.max(1.0 - Math.max((this.agent.age - this.options.learningStepsBurnin) / this.options.learningSteps, 0.0), this.options.epsilonMin) + else + this.epsilon = this.options.epsilonAtTestTime + + if (Math.random() <= this.epsilon) { + return Math.randi(0, this.actions) + } + + this.net.forward(state) + + return this.net.out.w.maxi() + + } + + // how good is an action at state + value(state, action, target) { + target = target == null ? this.net : this.target + target.forward(state) + return target.out.w[action] + } + + // replay + optimize(e, descent = true) { + var target = e.target() + var value = e.estimate() + + var grad = value - target + var gradAL = grad + this.options.alpha * (value - this.agent.evaluate(e.state0, true)) // advantage learning + var isw = this.buffer.getImportanceSamplingWeight(e) + + this.net.out.dw.fill(0.0) + this.net.out.dw[e.action0] = gradAL * isw + + if (descent) { + this.net.backward() + this.net.configuration.accumulate() + } + + return gradAL * gradAL * 0.5 + } + + // adjust weights etc + learn() { + this.net.configuration.optimize(false) + this.targetUpdate() + } + + + targetUpdate() { + if (this.options.theta < 1) { + this.target.configuration.forEachParameter(this.targetWeightCopy) + } + } + + progressiveCopy(net, param, index) { + var _theta = this.options.theta + for (var i = 0; i < param.w.length; i++) { + param.w[i] = _theta * net.parameters[index].w[i] + (1.0 - _theta) * param.w[i] + } + } + + + import(params) { + if (params.length !== this.net.configuration.countOfParameters) + return false + + this.net.configuration.read(params) + + return true + } + + export() { + return this.net.configuration.write() + } + +} + +module.exports = DQN; + +/***/ }), +/* 39 */ +/***/ (function(module, exports) { + +class Experience { + + constructor(agent) { + this.agent = agent + this.learnSteps = 0 + + if (agent.options.type === 'sarsa') + this.target = this.__sarsa_target + else + this.target = this.__q_target + } + + __q_target() { + return this.reward0 + this.agent.options.discount * this.agent.evaluate(this.state1, true) // this.agent.value(this.state1, this.agent.act(this.state1, true), true) + } + + __sarsa_target() { + return this.reward0 + this.agent.options.discount * this.agent.value(this.state1, this.action1, true) + } + + estimate() { + return this.value = this.agent.value(this.state0, this.action0) + } + + step() { + this.loss = this.agent.algorithm.optimize(this) + + this.learnSteps++ + this.lastLearnedAt = this.agent.age + + return this.loss + } + + init() { + this.loss = this.agent.algorithm.optimize(this, false) + this.atAge = this.agent.age + } + + get priority() { + if (this.loss === undefined) + return undefined + + return Math.pow(this.loss, this.agent.options.beta || 0.5) + } + +} + +module.exports = Experience + +/***/ }), +/* 40 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +/*\ +|*| +|*| :: Number.isInteger() polyfill :: +|*| +|*| https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger +|*| +\*/ + +if (!Number.isInteger) { + Number.isInteger = function isInteger (nVal) { + return typeof nVal === "number" && isFinite(nVal) && nVal > -9007199254740992 && nVal < 9007199254740992 && Math.floor(nVal) === nVal; + }; +} + +/*\ +|*| +|*| StringView - Mozilla Developer Network +|*| +|*| Revision #9, October 30, 2016 +|*| +|*| https://developer.mozilla.org/en-US/Add-ons/Code_snippets/StringView +|*| https://developer.mozilla.org/en-US/docs/User:fusionchess +|*| https://github.com/madmurphy/stringview.js +|*| +|*| This framework is released under the GNU Lesser General Public License, version 3 or later. +|*| http://www.gnu.org/licenses/lgpl-3.0.html +|*| +\*/ + +function StringView (vInput, sEncoding /* optional (default: UTF-8) */, nOffset /* optional */, nLength /* optional */) { + + var fTAView, aWhole, aRaw, fPutOutptCode, fGetOutptChrSize, nInptLen, nStartIdx = isFinite(nOffset) ? nOffset : 0, nTranscrType = 15; + + if (sEncoding) { this.encoding = sEncoding.toString(); } + + encSwitch: switch (this.encoding) { + case "UTF-8": + fPutOutptCode = StringView.putUTF8CharCode; + fGetOutptChrSize = StringView.getUTF8CharLength; + fTAView = Uint8Array; + break encSwitch; + case "UTF-16": + fPutOutptCode = StringView.putUTF16CharCode; + fGetOutptChrSize = StringView.getUTF16CharLength; + fTAView = Uint16Array; + break encSwitch; + case "UTF-32": + fTAView = Uint32Array; + nTranscrType &= 14; + break encSwitch; + default: + /* case "ASCII", or case "BinaryString" or unknown cases */ + fTAView = Uint8Array; + nTranscrType &= 14; + } + + typeSwitch: switch (typeof vInput) { + case "string": + /* the input argument is a primitive string: a new buffer will be created. */ + nTranscrType &= 7; + break typeSwitch; + case "object": + classSwitch: switch (vInput.constructor) { + case StringView: + /* the input argument is a stringView: a new buffer will be created. */ + nTranscrType &= 3; + break typeSwitch; + case String: + /* the input argument is an objectified string: a new buffer will be created. */ + nTranscrType &= 7; + break typeSwitch; + case ArrayBuffer: + /* the input argument is an arrayBuffer: the buffer will be shared. */ + aWhole = new fTAView(vInput); + nInptLen = this.encoding === "UTF-32" ? + vInput.byteLength >>> 2 + : this.encoding === "UTF-16" ? + vInput.byteLength >>> 1 + : + vInput.byteLength; + aRaw = nStartIdx === 0 && (!isFinite(nLength) || nLength === nInptLen) ? + aWhole + : new fTAView(vInput, nStartIdx, !isFinite(nLength) ? nInptLen - nStartIdx : nLength); + + break typeSwitch; + case Uint32Array: + case Uint16Array: + case Uint8Array: + /* the input argument is a typedArray: the buffer, and possibly the array itself, will be shared. */ + fTAView = vInput.constructor; + nInptLen = vInput.length; + aWhole = vInput.byteOffset === 0 && vInput.length === ( + fTAView === Uint32Array ? + vInput.buffer.byteLength >>> 2 + : fTAView === Uint16Array ? + vInput.buffer.byteLength >>> 1 + : + vInput.buffer.byteLength + ) ? vInput : new fTAView(vInput.buffer); + aRaw = nStartIdx === 0 && (!isFinite(nLength) || nLength === nInptLen) ? + vInput + : vInput.subarray(nStartIdx, isFinite(nLength) ? nStartIdx + nLength : nInptLen); + + break typeSwitch; + default: + /* the input argument is an array or another serializable object: a new typedArray will be created. */ + aWhole = new fTAView(vInput); + nInptLen = aWhole.length; + aRaw = nStartIdx === 0 && (!isFinite(nLength) || nLength === nInptLen) ? + aWhole + : aWhole.subarray(nStartIdx, isFinite(nLength) ? nStartIdx + nLength : nInptLen); + } + break typeSwitch; + default: + /* the input argument is a number, a boolean or a function: a new typedArray will be created. */ + aWhole = aRaw = new fTAView(Number(vInput) || 0); + + } + + if (nTranscrType < 8) { + + var vSource, nOutptLen, nCharStart, nCharEnd, nEndIdx, fGetInptChrSize, fGetInptChrCode; + + if (nTranscrType & 4) { /* input is string */ + + vSource = vInput; + nOutptLen = nInptLen = vSource.length; + nTranscrType ^= this.encoding === "UTF-32" ? 0 : 2; + /* ...or...: nTranscrType ^= Number(this.encoding !== "UTF-32") << 1; */ + nStartIdx = nCharStart = nOffset ? Math.max((nOutptLen + nOffset) % nOutptLen, 0) : 0; + nEndIdx = nCharEnd = (Number.isInteger(nLength) ? Math.min(Math.max(nLength, 0) + nStartIdx, nOutptLen) : nOutptLen) - 1; + + } else { /* input is stringView */ + + vSource = vInput.rawData; + nInptLen = vInput.makeIndex(); + nStartIdx = nCharStart = nOffset ? Math.max((nInptLen + nOffset) % nInptLen, 0) : 0; + nOutptLen = Number.isInteger(nLength) ? Math.min(Math.max(nLength, 0), nInptLen - nCharStart) : nInptLen; + nEndIdx = nCharEnd = nOutptLen + nCharStart; + + if (vInput.encoding === "UTF-8") { + fGetInptChrSize = StringView.getUTF8CharLength; + fGetInptChrCode = StringView.loadUTF8CharCode; + } else if (vInput.encoding === "UTF-16") { + fGetInptChrSize = StringView.getUTF16CharLength; + fGetInptChrCode = StringView.loadUTF16CharCode; + } else { + nTranscrType &= 1; + } + + } + + if (nOutptLen === 0 || nTranscrType < 4 && vSource.encoding === this.encoding && nCharStart === 0 && nOutptLen === nInptLen) { + + /* the encoding is the same, the length too and the offset is 0... or the input is empty! */ + + nTranscrType = 7; + + } + + conversionSwitch: switch (nTranscrType) { + + case 0: + + /* both the source and the new StringView have a fixed-length encoding... */ + + aWhole = new fTAView(nOutptLen); + for (var nOutptIdx = 0; nOutptIdx < nOutptLen; aWhole[nOutptIdx] = vSource[nStartIdx + nOutptIdx++]); + break conversionSwitch; + + case 1: + + /* the source has a fixed-length encoding but the new StringView has a variable-length encoding... */ + + /* mapping... */ + + nOutptLen = 0; + + for (var nInptIdx = nStartIdx; nInptIdx < nEndIdx; nInptIdx++) { + nOutptLen += fGetOutptChrSize(vSource[nInptIdx]); + } + + aWhole = new fTAView(nOutptLen); + + /* transcription of the source... */ + + for (var nInptIdx = nStartIdx, nOutptIdx = 0; nOutptIdx < nOutptLen; nInptIdx++) { + nOutptIdx = fPutOutptCode(aWhole, vSource[nInptIdx], nOutptIdx); + } + + break conversionSwitch; + + case 2: + + /* the source has a variable-length encoding but the new StringView has a fixed-length encoding... */ + + /* mapping... */ + + nStartIdx = 0; + + var nChrCode; + + for (nChrIdx = 0; nChrIdx < nCharStart; nChrIdx++) { + nChrCode = fGetInptChrCode(vSource, nStartIdx); + nStartIdx += fGetInptChrSize(nChrCode); + } + + aWhole = new fTAView(nOutptLen); + + /* transcription of the source... */ + + for (var nInptIdx = nStartIdx, nOutptIdx = 0; nOutptIdx < nOutptLen; nInptIdx += fGetInptChrSize(nChrCode), nOutptIdx++) { + nChrCode = fGetInptChrCode(vSource, nInptIdx); + aWhole[nOutptIdx] = nChrCode; + } + + break conversionSwitch; + + case 3: + + /* both the source and the new StringView have a variable-length encoding... */ + + /* mapping... */ + + nOutptLen = 0; + + var nChrCode; + + for (var nChrIdx = 0, nInptIdx = 0; nChrIdx < nCharEnd; nInptIdx += fGetInptChrSize(nChrCode)) { + nChrCode = fGetInptChrCode(vSource, nInptIdx); + if (nChrIdx === nCharStart) { nStartIdx = nInptIdx; } + if (++nChrIdx > nCharStart) { nOutptLen += fGetOutptChrSize(nChrCode); } + } + + aWhole = new fTAView(nOutptLen); + + /* transcription... */ + + for (var nInptIdx = nStartIdx, nOutptIdx = 0; nOutptIdx < nOutptLen; nInptIdx += fGetInptChrSize(nChrCode)) { + nChrCode = fGetInptChrCode(vSource, nInptIdx); + nOutptIdx = fPutOutptCode(aWhole, nChrCode, nOutptIdx); + } + + break conversionSwitch; + + case 4: + + /* DOMString to ASCII or BinaryString or other unknown encodings */ + + aWhole = new fTAView(nOutptLen); + + /* transcription... */ + + for (var nIdx = 0; nIdx < nOutptLen; nIdx++) { + aWhole[nIdx] = vSource.charCodeAt(nIdx) & 0xff; + } + + break conversionSwitch; + + case 5: + + /* DOMString to UTF-8 or to UTF-16 */ + + /* mapping... */ + + nOutptLen = 0; + + for (var nMapIdx = 0; nMapIdx < nInptLen; nMapIdx++) { + if (nMapIdx === nCharStart) { nStartIdx = nOutptLen; } + nOutptLen += fGetOutptChrSize(vSource.charCodeAt(nMapIdx)); + if (nMapIdx === nCharEnd) { nEndIdx = nOutptLen; } + } + + aWhole = new fTAView(nOutptLen); + + /* transcription... */ + + for (var nOutptIdx = 0, nChrIdx = 0; nOutptIdx < nOutptLen; nChrIdx++) { + nOutptIdx = fPutOutptCode(aWhole, vSource.charCodeAt(nChrIdx), nOutptIdx); + } + + break conversionSwitch; + + case 6: + + /* DOMString to UTF-32 */ + + aWhole = new fTAView(nOutptLen); + + /* transcription... */ + + for (var nIdx = 0; nIdx < nOutptLen; nIdx++) { + aWhole[nIdx] = vSource.charCodeAt(nIdx); + } + + break conversionSwitch; + + case 7: + + aWhole = new fTAView(nOutptLen ? vSource : 0); + break conversionSwitch; + + } + + aRaw = nTranscrType > 3 && (nStartIdx > 0 || nEndIdx < aWhole.length - 1) ? aWhole.subarray(nStartIdx, nEndIdx) : aWhole; + + } + + this.buffer = aWhole.buffer; + this.bufferView = aWhole; + this.rawData = aRaw; + + Object.freeze(this); + +} + +/* CONSTRUCTOR'S METHODS */ + +StringView.loadUTF8CharCode = function (aChars, nIdx) { + + var nLen = aChars.length, nPart = aChars[nIdx]; + + return nPart > 251 && nPart < 254 && nIdx + 5 < nLen ? + /* (nPart - 252 << 30) may be not safe in ECMAScript! So...: */ + /* six bytes */ (nPart - 252) * 1073741824 + (aChars[nIdx + 1] - 128 << 24) + (aChars[nIdx + 2] - 128 << 18) + (aChars[nIdx + 3] - 128 << 12) + (aChars[nIdx + 4] - 128 << 6) + aChars[nIdx + 5] - 128 + : nPart > 247 && nPart < 252 && nIdx + 4 < nLen ? + /* five bytes */ (nPart - 248 << 24) + (aChars[nIdx + 1] - 128 << 18) + (aChars[nIdx + 2] - 128 << 12) + (aChars[nIdx + 3] - 128 << 6) + aChars[nIdx + 4] - 128 + : nPart > 239 && nPart < 248 && nIdx + 3 < nLen ? + /* four bytes */(nPart - 240 << 18) + (aChars[nIdx + 1] - 128 << 12) + (aChars[nIdx + 2] - 128 << 6) + aChars[nIdx + 3] - 128 + : nPart > 223 && nPart < 240 && nIdx + 2 < nLen ? + /* three bytes */ (nPart - 224 << 12) + (aChars[nIdx + 1] - 128 << 6) + aChars[nIdx + 2] - 128 + : nPart > 191 && nPart < 224 && nIdx + 1 < nLen ? + /* two bytes */ (nPart - 192 << 6) + aChars[nIdx + 1] - 128 + : + /* one byte */ nPart; + +}; + +StringView.putUTF8CharCode = function (aTarget, nChar, nPutAt) { + + var nIdx = nPutAt; + + if (nChar < 0x80 /* 128 */) { + /* one byte */ + aTarget[nIdx++] = nChar; + } else if (nChar < 0x800 /* 2048 */) { + /* two bytes */ + aTarget[nIdx++] = 0xc0 /* 192 */ + (nChar >>> 6); + aTarget[nIdx++] = 0x80 /* 128 */ + (nChar & 0x3f /* 63 */); + } else if (nChar < 0x10000 /* 65536 */) { + /* three bytes */ + aTarget[nIdx++] = 0xe0 /* 224 */ + (nChar >>> 12); + aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 6) & 0x3f /* 63 */); + aTarget[nIdx++] = 0x80 /* 128 */ + (nChar & 0x3f /* 63 */); + } else if (nChar < 0x200000 /* 2097152 */) { + /* four bytes */ + aTarget[nIdx++] = 0xf0 /* 240 */ + (nChar >>> 18); + aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 12) & 0x3f /* 63 */); + aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 6) & 0x3f /* 63 */); + aTarget[nIdx++] = 0x80 /* 128 */ + (nChar & 0x3f /* 63 */); + } else if (nChar < 0x4000000 /* 67108864 */) { + /* five bytes */ + aTarget[nIdx++] = 0xf8 /* 248 */ + (nChar >>> 24); + aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 18) & 0x3f /* 63 */); + aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 12) & 0x3f /* 63 */); + aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 6) & 0x3f /* 63 */); + aTarget[nIdx++] = 0x80 /* 128 */ + (nChar & 0x3f /* 63 */); + } else /* if (nChar <= 0x7fffffff) */ { /* 2147483647 */ + /* six bytes */ + aTarget[nIdx++] = 0xfc /* 252 */ + /* (nChar >>> 30) may be not safe in ECMAScript! So...: */ (nChar / 1073741824); + aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 24) & 0x3f /* 63 */); + aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 18) & 0x3f /* 63 */); + aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 12) & 0x3f /* 63 */); + aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 6) & 0x3f /* 63 */); + aTarget[nIdx++] = 0x80 /* 128 */ + (nChar & 0x3f /* 63 */); + } + + return nIdx; + +}; + +StringView.getUTF8CharLength = function (nChar) { + return nChar < 0x80 ? 1 : nChar < 0x800 ? 2 : nChar < 0x10000 ? 3 : nChar < 0x200000 ? 4 : nChar < 0x4000000 ? 5 : 6; +}; + +StringView.loadUTF16CharCode = function (aChars, nIdx) { + + /* UTF-16 to DOMString decoding algorithm */ + var nFrstChr = aChars[nIdx]; + + return nFrstChr > 0xD7BF /* 55231 */ && nIdx + 1 < aChars.length ? + (nFrstChr - 0xD800 /* 55296 */ << 10) + aChars[nIdx + 1] + 0x2400 /* 9216 */ + : nFrstChr; + +}; + +StringView.putUTF16CharCode = function (aTarget, nChar, nPutAt) { + + var nIdx = nPutAt; + + if (nChar < 0x10000 /* 65536 */) { + /* one element */ + aTarget[nIdx++] = nChar; + } else { + /* two elements */ + aTarget[nIdx++] = 0xD7C0 /* 55232 */ + (nChar >>> 10); + aTarget[nIdx++] = 0xDC00 /* 56320 */ + (nChar & 0x3FF /* 1023 */); + } + + return nIdx; + +}; + +StringView.getUTF16CharLength = function (nChar) { + return nChar < 0x10000 ? 1 : 2; +}; + +/* Array of bytes to base64 string decoding */ + +StringView.b64ToUint6 = function (nChr) { + + return nChr > 64 && nChr < 91 ? + nChr - 65 + : nChr > 96 && nChr < 123 ? + nChr - 71 + : nChr > 47 && nChr < 58 ? + nChr + 4 + : nChr === 43 ? + 62 + : nChr === 47 ? + 63 + : + 0; + +}; + +StringView.uint6ToB64 = function (nUint6) { + + return nUint6 < 26 ? + nUint6 + 65 + : nUint6 < 52 ? + nUint6 + 71 + : nUint6 < 62 ? + nUint6 - 4 + : nUint6 === 62 ? + 43 + : nUint6 === 63 ? + 47 + : + 65; + +}; + +/* Base64 string to array encoding */ + +StringView.bytesToBase64 = function (aBytes) { + + var eqLen = (3 - (aBytes.length % 3)) % 3, sB64Enc = ""; + + for (var nMod3, nLen = aBytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) { + nMod3 = nIdx % 3; + /* Uncomment the following line in order to split the output in lines 76-character long: */ + /* + if (nIdx > 0 && (nIdx * 4 / 3) % 76 === 0) { sB64Enc += "\r\n"; } + */ + nUint24 |= aBytes[nIdx] << (16 >>> nMod3 & 24); + if (nMod3 === 2 || aBytes.length - nIdx === 1) { + sB64Enc += String.fromCharCode(StringView.uint6ToB64(nUint24 >>> 18 & 63), StringView.uint6ToB64(nUint24 >>> 12 & 63), StringView.uint6ToB64(nUint24 >>> 6 & 63), StringView.uint6ToB64(nUint24 & 63)); + nUint24 = 0; + } + } + + return eqLen === 0 ? + sB64Enc + : + sB64Enc.substring(0, sB64Enc.length - eqLen) + (eqLen === 1 ? "=" : "=="); + + +}; + + +StringView.base64ToBytes = function (sBase64, nBlockBytes) { + + var + sB64Enc = sBase64.replace(/[^A-Za-z0-9\+\/]/g, ""), nInLen = sB64Enc.length, + nOutLen = nBlockBytes ? Math.ceil((nInLen * 3 + 1 >>> 2) / nBlockBytes) * nBlockBytes : nInLen * 3 + 1 >>> 2, aBytes = new Uint8Array(nOutLen); + + for (var nMod3, nMod4, nUint24 = 0, nOutIdx = 0, nInIdx = 0; nInIdx < nInLen; nInIdx++) { + nMod4 = nInIdx & 3; + nUint24 |= StringView.b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << 18 - 6 * nMod4; + if (nMod4 === 3 || nInLen - nInIdx === 1) { + for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) { + aBytes[nOutIdx] = nUint24 >>> (16 >>> nMod3 & 24) & 255; + } + nUint24 = 0; + } + } + + return aBytes; + +}; + +StringView.makeFromBase64 = function (sB64Inpt, sEncoding, nByteOffset, nLength) { + + return new StringView(sEncoding === "UTF-16" || sEncoding === "UTF-32" ? StringView.base64ToBytes(sB64Inpt, sEncoding === "UTF-16" ? 2 : 4).buffer : StringView.base64ToBytes(sB64Inpt), sEncoding, nByteOffset, nLength); + +}; + +/* DEFAULT VALUES */ + +StringView.prototype.encoding = "UTF-8"; /* Default encoding... */ + +/* INSTANCES' METHODS */ + +StringView.prototype.makeIndex = function (nChrLength, nStartFrom) { + + var + + aTarget = this.rawData, nChrEnd, nRawLength = aTarget.length, + nStartIdx = nStartFrom || 0, nIdxEnd = nStartIdx, nStopAtChr = isNaN(nChrLength) ? Infinity : nChrLength; + + if (nChrLength + 1 > aTarget.length) { throw new RangeError("StringView.prototype.makeIndex - The offset can\'t be major than the length of the array - 1."); } + + switch (this.encoding) { + + case "UTF-8": + + var nPart; + + for (nChrEnd = 0; nIdxEnd < nRawLength && nChrEnd < nStopAtChr; nChrEnd++) { + nPart = aTarget[nIdxEnd]; + nIdxEnd += nPart > 251 && nPart < 254 && nIdxEnd + 5 < nRawLength ? 6 + : nPart > 247 && nPart < 252 && nIdxEnd + 4 < nRawLength ? 5 + : nPart > 239 && nPart < 248 && nIdxEnd + 3 < nRawLength ? 4 + : nPart > 223 && nPart < 240 && nIdxEnd + 2 < nRawLength ? 3 + : nPart > 191 && nPart < 224 && nIdxEnd + 1 < nRawLength ? 2 + : 1; + } + + break; + + case "UTF-16": + + for (nChrEnd = nStartIdx; nIdxEnd < nRawLength && nChrEnd < nStopAtChr; nChrEnd++) { + nIdxEnd += aTarget[nIdxEnd] > 0xD7BF /* 55231 */ && nIdxEnd + 1 < aTarget.length ? 2 : 1; + } + + break; + + default: + + nIdxEnd = nChrEnd = isFinite(nChrLength) ? nChrLength : nRawLength - 1; + + } + + if (nChrLength) { return nIdxEnd; } + + return nChrEnd; + +}; + +StringView.prototype.toBase64 = function (bWholeBuffer) { + + return StringView.bytesToBase64( + bWholeBuffer ? + ( + this.bufferView.constructor === Uint8Array ? + this.bufferView + : + new Uint8Array(this.buffer) + ) + : this.rawData.constructor === Uint8Array ? + this.rawData + : + new Uint8Array(this.buffer, this.rawData.byteOffset, this.rawData.length << (this.rawData.constructor === Uint16Array ? 1 : 2)) + ); + +}; + +StringView.prototype.subview = function (nCharOffset /* optional */, nCharLength /* optional */) { + + var + + nChrLen, nCharStart, nStrLen, bVariableLen = this.encoding === "UTF-8" || this.encoding === "UTF-16", + nStartOffset = nCharOffset, nStringLength, nRawLen = this.rawData.length; + + if (nRawLen === 0) { + return new StringView(this.buffer, this.encoding); + } + + nStringLength = bVariableLen ? this.makeIndex() : nRawLen; + nCharStart = nCharOffset ? Math.max((nStringLength + nCharOffset) % nStringLength, 0) : 0; + nStrLen = Number.isInteger(nCharLength) ? Math.max(nCharLength, 0) + nCharStart > nStringLength ? nStringLength - nCharStart : nCharLength : nStringLength; + + if (nCharStart === 0 && nStrLen === nStringLength) { return this; } + + if (bVariableLen) { + nStartOffset = this.makeIndex(nCharStart); + nChrLen = this.makeIndex(nStrLen, nStartOffset) - nStartOffset; + } else { + nStartOffset = nCharStart; + nChrLen = nStrLen - nCharStart; + } + + if (this.encoding === "UTF-16") { + nStartOffset <<= 1; + } else if (this.encoding === "UTF-32") { + nStartOffset <<= 2; + } + + return new StringView(this.buffer, this.encoding, nStartOffset, nChrLen); + +}; + +StringView.prototype.forEachChar = function (fCallback, oThat, nChrOffset, nChrLen) { + + var aSource = this.rawData, nRawEnd, nRawIdx; + + if (this.encoding === "UTF-8" || this.encoding === "UTF-16") { + + var fGetInptChrSize, fGetInptChrCode; + + if (this.encoding === "UTF-8") { + fGetInptChrSize = StringView.getUTF8CharLength; + fGetInptChrCode = StringView.loadUTF8CharCode; + } else if (this.encoding === "UTF-16") { + fGetInptChrSize = StringView.getUTF16CharLength; + fGetInptChrCode = StringView.loadUTF16CharCode; + } + + nRawIdx = isFinite(nChrOffset) ? this.makeIndex(nChrOffset) : 0; + nRawEnd = isFinite(nChrLen) ? this.makeIndex(nChrLen, nRawIdx) : aSource.length; + + for (var nChrCode, nChrIdx = 0; nRawIdx < nRawEnd; nChrIdx++) { + nChrCode = fGetInptChrCode(aSource, nRawIdx); + fCallback.call(oThat || null, nChrCode, nChrIdx, nRawIdx, aSource); + nRawIdx += fGetInptChrSize(nChrCode); + } + + } else { + + nRawIdx = isFinite(nChrOffset) ? nChrOffset : 0; + nRawEnd = isFinite(nChrLen) ? nChrLen + nRawIdx : aSource.length; + + for (nRawIdx; nRawIdx < nRawEnd; nRawIdx++) { + fCallback.call(oThat || null, aSource[nRawIdx], nRawIdx, nRawIdx, aSource); + } + + } + +}; + +StringView.prototype.valueOf = StringView.prototype.toString = function () { + + if (this.encoding !== "UTF-8" && this.encoding !== "UTF-16") { + /* ASCII, UTF-32 or BinaryString to DOMString */ + return String.fromCharCode.apply(null, this.rawData); + } + + var fGetCode, fGetIncr, sView = ""; + + if (this.encoding === "UTF-8") { + fGetIncr = StringView.getUTF8CharLength; + fGetCode = StringView.loadUTF8CharCode; + } else if (this.encoding === "UTF-16") { + fGetIncr = StringView.getUTF16CharLength; + fGetCode = StringView.loadUTF16CharCode; + } + + for (var nChr, nLen = this.rawData.length, nIdx = 0; nIdx < nLen; nIdx += fGetIncr(nChr)) { + nChr = fGetCode(this.rawData, nIdx); + sView += String.fromCharCode(nChr); + } + + return sView; + +}; + +module.exports = StringView; + +/***/ }), +/* 41 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +if (!__webpack_require__(15)()) { + throw 'env unsupported'; +} + +__webpack_require__(12) + +var neurojs = { + + Network: __webpack_require__(2), + Agent: __webpack_require__(13), + Optim: __webpack_require__(4), + Loader: __webpack_require__(11), + Buffers: __webpack_require__(5), + NetOnDisk: __webpack_require__(6), + FileLoader: __webpack_require__(14), + Binary: __webpack_require__(7), + Shared: __webpack_require__(3) + +} + +if (typeof window !== 'undefined') { + window.neurojs = neurojs +} else { + module.exports = neurojs +} + + +/***/ }) +/******/ ]); \ No newline at end of file