diff --git a/index.htm b/index.htm
deleted file mode 100644
index 1178079..0000000
--- a/index.htm
+++ /dev/null
@@ -1,127 +0,0 @@
-
-
-
-
-
Genetic Algorithm Walkers
-
"It's like watching other people QWOP"
-
-
-
-
-
-
-
Current Generation (0 )
-
-
-
- Name
- Score
-
-
-
-
-
-
-
-
-
Record History
-
-
-
- Gen
- Name
- Score
-
-
-
-
-
-
-
-
-
Controls
- Gene mutation probability
-
- 0%
- 1%
- 5%
- 10%
- 25%
- 50%
- 75%
- 100%
-
- Gene mutation amount
-
- 0%
- 1%
- 5%
- 10%
- 25%
- 50%
- 75%
- 100%
-
- Champions to copy
-
- Motor noise
-
- 0%
- 1%
- 2%
- 3%
- 4%
- 5%
- 10%
-
- Round length
-
- Very short
- Short
- Regular
- Long
- Looooong
-
- Animation quality
-
- none
- 10 fps
- 30 fps
- 60 fps
-
- Simulation speed
-
- Pause
- 30
- 60
- 120
- 1000
-
-
- 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