| //////////////////////////////////////////////////////////////////////////////// |
| // base.js |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| // Copyright 2013 the V8 project authors. All rights reserved. |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions are |
| // met: |
| // |
| // * Redistributions of source code must retain the above copyright |
| // notice, this list of conditions and the following disclaimer. |
| // * Redistributions in binary form must reproduce the above |
| // copyright notice, this list of conditions and the following |
| // disclaimer in the documentation and/or other materials provided |
| // with the distribution. |
| // * Neither the name of Google Inc. nor the names of its |
| // contributors may be used to endorse or promote products derived |
| // from this software without specific prior written permission. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| if(typeof(WScript) === "undefined") |
| { |
| var WScript = { |
| Echo: print |
| } |
| } |
| |
| // Performance.now is used in latency benchmarks, the fallback is Date.now. |
| var performance = performance || {}; |
| performance.now = (function() { |
| return performance.now || |
| performance.mozNow || |
| performance.msNow || |
| performance.oNow || |
| performance.webkitNow || |
| Date.now; |
| })(); |
| |
| // Simple framework for running the benchmark suites and |
| // computing a score based on the timing measurements. |
| |
| |
| // A benchmark has a name (string) and a function that will be run to |
| // do the performance measurement. The optional setup and tearDown |
| // arguments are functions that will be invoked before and after |
| // running the benchmark, but the running time of these functions will |
| // not be accounted for in the benchmark score. |
| function Benchmark(name, doWarmup, doDeterministic, deterministicIterations, |
| run, setup, tearDown, rmsResult, minIterations) { |
| this.name = name; |
| this.doWarmup = doWarmup; |
| this.doDeterministic = doDeterministic; |
| this.deterministicIterations = deterministicIterations; |
| this.run = run; |
| this.Setup = setup ? setup : function() { }; |
| this.TearDown = tearDown ? tearDown : function() { }; |
| this.rmsResult = rmsResult ? rmsResult : null; |
| this.minIterations = minIterations ? minIterations : 32; |
| } |
| |
| |
| // Benchmark results hold the benchmark and the measured time used to |
| // run the benchmark. The benchmark score is computed later once a |
| // full benchmark suite has run to completion. If latency is set to 0 |
| // then there is no latency score for this benchmark. |
| function BenchmarkResult(benchmark, time, latency) { |
| this.benchmark = benchmark; |
| this.time = time; |
| this.latency = latency; |
| } |
| |
| |
| // Automatically convert results to numbers. Used by the geometric |
| // mean computation. |
| BenchmarkResult.prototype.valueOf = function() { |
| return this.time; |
| } |
| |
| |
| // Suites of benchmarks consist of a name and the set of benchmarks in |
| // addition to the reference timing that the final score will be based |
| // on. This way, all scores are relative to a reference run and higher |
| // scores implies better performance. |
| function BenchmarkSuite(name, reference, benchmarks) { |
| this.name = name; |
| this.reference = reference; |
| this.benchmarks = benchmarks; |
| BenchmarkSuite.suites.push(this); |
| } |
| |
| |
| // Keep track of all declared benchmark suites. |
| BenchmarkSuite.suites = []; |
| |
| // Scores are not comparable across versions. Bump the version if |
| // you're making changes that will affect that scores, e.g. if you add |
| // a new benchmark or change an existing one. |
| BenchmarkSuite.version = '9'; |
| |
| |
| // Defines global benchsuite running mode that overrides benchmark suite |
| // behavior. Intended to be set by the benchmark driver. Undefined |
| // values here allow a benchmark to define behaviour itself. |
| BenchmarkSuite.config = { |
| doWarmup: undefined, |
| doDeterministic: undefined |
| }; |
| |
| |
| // Override the alert function to throw an exception instead. |
| alert = function(s) { |
| throw "Alert called with argument: " + s; |
| }; |
| |
| |
| // To make the benchmark results predictable, we replace Math.random |
| // with a 100% deterministic alternative. |
| BenchmarkSuite.ResetRNG = function() { |
| Math.random = (function() { |
| var seed = 49734321; |
| return function() { |
| // Robert Jenkins' 32 bit integer hash function. |
| seed = ((seed + 0x7ed55d16) + (seed << 12)) & 0xffffffff; |
| seed = ((seed ^ 0xc761c23c) ^ (seed >>> 19)) & 0xffffffff; |
| seed = ((seed + 0x165667b1) + (seed << 5)) & 0xffffffff; |
| seed = ((seed + 0xd3a2646c) ^ (seed << 9)) & 0xffffffff; |
| seed = ((seed + 0xfd7046c5) + (seed << 3)) & 0xffffffff; |
| seed = ((seed ^ 0xb55a4f09) ^ (seed >>> 16)) & 0xffffffff; |
| return (seed & 0xfffffff) / 0x10000000; |
| }; |
| })(); |
| } |
| |
| |
| // Runs all registered benchmark suites and optionally yields between |
| // each individual benchmark to avoid running for too long in the |
| // context of browsers. Once done, the final score is reported to the |
| // runner. |
| BenchmarkSuite.RunSuites = function(runner, skipBenchmarks) { |
| skipBenchmarks = typeof skipBenchmarks === 'undefined' ? [] : skipBenchmarks; |
| var continuation = null; |
| var suites = BenchmarkSuite.suites; |
| var length = suites.length; |
| BenchmarkSuite.scores = []; |
| var index = 0; |
| function RunStep() { |
| while (continuation || index < length) { |
| if (continuation) { |
| continuation = continuation(); |
| } else { |
| var suite = suites[index++]; |
| if (runner.NotifyStart) runner.NotifyStart(suite.name); |
| if (skipBenchmarks.indexOf(suite.name) > -1) { |
| suite.NotifySkipped(runner); |
| } else { |
| continuation = suite.RunStep(runner); |
| } |
| } |
| if (continuation && typeof window != 'undefined' && window.setTimeout) { |
| window.setTimeout(RunStep, 25); |
| return; |
| } |
| } |
| |
| // show final result |
| if (runner.NotifyScore) { |
| var score = BenchmarkSuite.GeometricMean(BenchmarkSuite.scores); |
| var formatted = BenchmarkSuite.FormatScore(100 * score); |
| runner.NotifyScore(formatted); |
| } |
| } |
| RunStep(); |
| } |
| |
| |
| // Counts the total number of registered benchmarks. Useful for |
| // showing progress as a percentage. |
| BenchmarkSuite.CountBenchmarks = function() { |
| var result = 0; |
| var suites = BenchmarkSuite.suites; |
| for (var i = 0; i < suites.length; i++) { |
| result += suites[i].benchmarks.length; |
| } |
| return result; |
| } |
| |
| |
| // Computes the geometric mean of a set of numbers. |
| BenchmarkSuite.GeometricMean = function(numbers) { |
| var log = 0; |
| for (var i = 0; i < numbers.length; i++) { |
| log += Math.log(numbers[i]); |
| } |
| return Math.pow(Math.E, log / numbers.length); |
| } |
| |
| |
| // Computes the geometric mean of a set of throughput time measurements. |
| BenchmarkSuite.GeometricMeanTime = function(measurements) { |
| var log = 0; |
| for (var i = 0; i < measurements.length; i++) { |
| log += Math.log(measurements[i].time); |
| } |
| return Math.pow(Math.E, log / measurements.length); |
| } |
| |
| |
| // Computes the geometric mean of a set of rms measurements. |
| BenchmarkSuite.GeometricMeanLatency = function(measurements) { |
| var log = 0; |
| var hasLatencyResult = false; |
| for (var i = 0; i < measurements.length; i++) { |
| if (measurements[i].latency != 0) { |
| log += Math.log(measurements[i].latency); |
| hasLatencyResult = true; |
| } |
| } |
| if (hasLatencyResult) { |
| return Math.pow(Math.E, log / measurements.length); |
| } else { |
| return 0; |
| } |
| } |
| |
| |
| // Converts a score value to a string with at least three significant |
| // digits. |
| BenchmarkSuite.FormatScore = function(value) { |
| if (value > 100) { |
| return value.toFixed(0); |
| } else { |
| return value.toPrecision(3); |
| } |
| } |
| |
| // Notifies the runner that we're done running a single benchmark in |
| // the benchmark suite. This can be useful to report progress. |
| BenchmarkSuite.prototype.NotifyStep = function(result) { |
| this.results.push(result); |
| if (this.runner.NotifyStep) this.runner.NotifyStep(result.benchmark.name); |
| } |
| |
| |
| // Notifies the runner that we're done with running a suite and that |
| // we have a result which can be reported to the user if needed. |
| BenchmarkSuite.prototype.NotifyResult = function() { |
| var mean = BenchmarkSuite.GeometricMeanTime(this.results); |
| var score = this.reference[0] / mean; |
| BenchmarkSuite.scores.push(score); |
| if (this.runner.NotifyResult) { |
| var formatted = BenchmarkSuite.FormatScore(100 * score); |
| this.runner.NotifyResult(this.name, formatted); |
| } |
| if (this.reference.length == 2) { |
| var meanLatency = BenchmarkSuite.GeometricMeanLatency(this.results); |
| if (meanLatency != 0) { |
| var scoreLatency = this.reference[1] / meanLatency; |
| BenchmarkSuite.scores.push(scoreLatency); |
| if (this.runner.NotifyResult) { |
| var formattedLatency = BenchmarkSuite.FormatScore(100 * scoreLatency) |
| this.runner.NotifyResult(this.name + "Latency", formattedLatency); |
| } |
| } |
| } |
| } |
| |
| |
| BenchmarkSuite.prototype.NotifySkipped = function(runner) { |
| BenchmarkSuite.scores.push(1); // push default reference score. |
| if (runner.NotifyResult) { |
| runner.NotifyResult(this.name, "Skipped"); |
| } |
| } |
| |
| |
| // Notifies the runner that running a benchmark resulted in an error. |
| BenchmarkSuite.prototype.NotifyError = function(error) { |
| if (this.runner.NotifyError) { |
| this.runner.NotifyError(this.name, error); |
| } |
| if (this.runner.NotifyStep) { |
| this.runner.NotifyStep(this.name); |
| } |
| } |
| |
| |
| // Runs a single benchmark for at least a second and computes the |
| // average time it takes to run a single iteration. |
| BenchmarkSuite.prototype.RunSingleBenchmark = function(benchmark, data) { |
| var config = BenchmarkSuite.config; |
| var doWarmup = config.doWarmup !== undefined |
| ? config.doWarmup |
| : benchmark.doWarmup; |
| var doDeterministic = config.doDeterministic !== undefined |
| ? config.doDeterministic |
| : benchmark.doDeterministic; |
| |
| function Measure(data) { |
| var elapsed = 0; |
| var start = new Date(); |
| |
| // Run either for 1 second or for the number of iterations specified |
| // by minIterations, depending on the config flag doDeterministic. |
| for (var i = 0; (doDeterministic ? |
| i<benchmark.deterministicIterations : elapsed < 1000); i++) { |
| benchmark.run(); |
| elapsed = new Date() - start; |
| } |
| if (data != null) { |
| data.runs += i; |
| data.elapsed += elapsed; |
| } |
| } |
| |
| // Sets up data in order to skip or not the warmup phase. |
| if (!doWarmup && data == null) { |
| data = { runs: 0, elapsed: 0 }; |
| } |
| |
| if (data == null) { |
| Measure(null); |
| return { runs: 0, elapsed: 0 }; |
| } else { |
| Measure(data); |
| // If we've run too few iterations, we continue for another second. |
| if (data.runs < benchmark.minIterations) return data; |
| var usec = (data.elapsed * 1000) / data.runs; |
| var rms = (benchmark.rmsResult != null) ? benchmark.rmsResult() : 0; |
| this.NotifyStep(new BenchmarkResult(benchmark, usec, rms)); |
| return null; |
| } |
| } |
| |
| |
| // This function starts running a suite, but stops between each |
| // individual benchmark in the suite and returns a continuation |
| // function which can be invoked to run the next benchmark. Once the |
| // last benchmark has been executed, null is returned. |
| BenchmarkSuite.prototype.RunStep = function(runner) { |
| BenchmarkSuite.ResetRNG(); |
| this.results = []; |
| this.runner = runner; |
| var length = this.benchmarks.length; |
| var index = 0; |
| var suite = this; |
| var data; |
| |
| // Run the setup, the actual benchmark, and the tear down in three |
| // separate steps to allow the framework to yield between any of the |
| // steps. |
| |
| function RunNextSetup() { |
| if (index < length) { |
| try { |
| suite.benchmarks[index].Setup(); |
| } catch (e) { |
| suite.NotifyError(e); |
| return null; |
| } |
| return RunNextBenchmark; |
| } |
| suite.NotifyResult(); |
| return null; |
| } |
| |
| function RunNextBenchmark() { |
| try { |
| data = suite.RunSingleBenchmark(suite.benchmarks[index], data); |
| } catch (e) { |
| suite.NotifyError(e); |
| return null; |
| } |
| // If data is null, we're done with this benchmark. |
| return (data == null) ? RunNextTearDown : RunNextBenchmark(); |
| } |
| |
| function RunNextTearDown() { |
| try { |
| suite.benchmarks[index++].TearDown(); |
| } catch (e) { |
| suite.NotifyError(e); |
| return null; |
| } |
| return RunNextSetup; |
| } |
| |
| // Start out running the setup. |
| return RunNextSetup(); |
| } |
| |
| ///////////////////////////////////////////////////////////// |
| // box2d.js |
| ///////////////////////////////////////////////////////////// |
| |
| // Portions copyright 2013 Google, Inc |
| |
| /* |
| * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com |
| * |
| * This software is provided 'as-is', without any express or implied |
| * warranty. In no event will the authors be held liable for any damages |
| * arising from the use of this software. |
| * Permission is granted to anyone to use this software for any purpose, |
| * including commercial applications, and to alter it and redistribute it |
| * freely, subject to the following restrictions: |
| * 1. The origin of this software must not be misrepresented; you must not |
| * claim that you wrote the original software. If you use this software |
| * in a product, an acknowledgment in the product documentation would be |
| * appreciated but is not required. |
| * 2. Altered source versions must be plainly marked as such, and must not be |
| * misrepresented as being the original software. |
| * 3. This notice may not be removed or altered from any source distribution. |
| */ |
| |
| /* |
| * Following code is beautified using http://jsbeautifier.org/ |
| */ |
| |
| var Box2D = {}; |
| (function (F, G) { |
| function K() {} |
| if (!(Object.defineProperty instanceof Function) && Object.prototype.__defineGetter__ instanceof Function && Object.prototype.__defineSetter__ instanceof Function) Object.defineProperty = function (y, w, A) { |
| A.get instanceof Function && y.__defineGetter__(w, A.get); |
| A.set instanceof Function && y.__defineSetter__(w, A.set) |
| }; |
| F.inherit = function (y, w) { |
| K.prototype = w.prototype; |
| y.prototype = new K; |
| y.prototype.constructor = y |
| }; |
| F.generateCallback = function (y, w) { |
| return function () { |
| w.apply(y, arguments) |
| } |
| }; |
| F.NVector = function (y) { |
| if (y === G) y = 0; |
| for (var w = Array(y || 0), A = 0; A < y; ++A) w[A] = 0; |
| return w |
| }; |
| F.is = function (y, w) { |
| if (y === null) return false; |
| if (w instanceof Function && y instanceof w) return true; |
| if (y.constructor.__implements != G && y.constructor.__implements[w]) return true; |
| return false |
| }; |
| F.parseUInt = function (y) { |
| return Math.abs(parseInt(y)) |
| } |
| })(Box2D); |
| var Vector = Array, |
| Vector_a2j_Number = Box2D.NVector; |
| if (typeof Box2D === "undefined") Box2D = {}; |
| if (typeof Box2D.Collision === "undefined") Box2D.Collision = {}; |
| if (typeof Box2D.Collision.Shapes === "undefined") Box2D.Collision.Shapes = {}; |
| if (typeof Box2D.Common === "undefined") Box2D.Common = {}; |
| if (typeof Box2D.Common.Math === "undefined") Box2D.Common.Math = {}; |
| if (typeof Box2D.Dynamics === "undefined") Box2D.Dynamics = {}; |
| if (typeof Box2D.Dynamics.Contacts === "undefined") Box2D.Dynamics.Contacts = {}; |
| if (typeof Box2D.Dynamics.Controllers === "undefined") Box2D.Dynamics.Controllers = {}; |
| if (typeof Box2D.Dynamics.Joints === "undefined") Box2D.Dynamics.Joints = {}; |
| (function () { |
| function F() { |
| F.b2AABB.apply(this, arguments) |
| } |
| |
| function G() { |
| G.b2Bound.apply(this, arguments) |
| } |
| |
| function K() { |
| K.b2BoundValues.apply(this, arguments); |
| this.constructor === K && this.b2BoundValues.apply(this, arguments) |
| } |
| |
| function y() { |
| y.b2Collision.apply(this, arguments) |
| } |
| |
| function w() { |
| w.b2ContactID.apply(this, arguments); |
| this.constructor === w && this.b2ContactID.apply(this, arguments) |
| } |
| |
| function A() { |
| A.b2ContactPoint.apply(this, arguments) |
| } |
| |
| function U() { |
| U.b2Distance.apply(this, arguments) |
| } |
| |
| function p() { |
| p.b2DistanceInput.apply(this, |
| arguments) |
| } |
| |
| function B() { |
| B.b2DistanceOutput.apply(this, arguments) |
| } |
| |
| function Q() { |
| Q.b2DistanceProxy.apply(this, arguments) |
| } |
| |
| function V() { |
| V.b2DynamicTree.apply(this, arguments); |
| this.constructor === V && this.b2DynamicTree.apply(this, arguments) |
| } |
| |
| function M() { |
| M.b2DynamicTreeBroadPhase.apply(this, arguments) |
| } |
| |
| function L() { |
| L.b2DynamicTreeNode.apply(this, arguments) |
| } |
| |
| function I() { |
| I.b2DynamicTreePair.apply(this, arguments) |
| } |
| |
| function W() { |
| W.b2Manifold.apply(this, arguments); |
| this.constructor === W && this.b2Manifold.apply(this, arguments) |
| } |
| |
| function Y() { |
| Y.b2ManifoldPoint.apply(this, arguments); |
| this.constructor === Y && this.b2ManifoldPoint.apply(this, arguments) |
| } |
| |
| function k() { |
| k.b2Point.apply(this, arguments) |
| } |
| |
| function z() { |
| z.b2RayCastInput.apply(this, arguments); |
| this.constructor === z && this.b2RayCastInput.apply(this, arguments) |
| } |
| |
| function u() { |
| u.b2RayCastOutput.apply(this, arguments) |
| } |
| |
| function D() { |
| D.b2Segment.apply(this, arguments) |
| } |
| |
| function H() { |
| H.b2SeparationFunction.apply(this, arguments) |
| } |
| |
| function O() { |
| O.b2Simplex.apply(this, arguments); |
| this.constructor === O && this.b2Simplex.apply(this, arguments) |
| } |
| |
| function E() { |
| E.b2SimplexCache.apply(this, arguments) |
| } |
| |
| function R() { |
| R.b2SimplexVertex.apply(this, arguments) |
| } |
| |
| function N() { |
| N.b2TimeOfImpact.apply(this, arguments) |
| } |
| |
| function S() { |
| S.b2TOIInput.apply(this, arguments) |
| } |
| |
| function aa() { |
| aa.b2WorldManifold.apply(this, arguments); |
| this.constructor === aa && this.b2WorldManifold.apply(this, arguments) |
| } |
| |
| function Z() { |
| Z.ClipVertex.apply(this, arguments) |
| } |
| |
| function d() { |
| d.Features.apply(this, arguments) |
| } |
| |
| function h() { |
| h.b2CircleShape.apply(this, arguments); |
| this.constructor === h && this.b2CircleShape.apply(this, arguments) |
| } |
| |
| function l() { |
| l.b2EdgeChainDef.apply(this, arguments); |
| this.constructor === l && this.b2EdgeChainDef.apply(this, arguments) |
| } |
| |
| function j() { |
| j.b2EdgeShape.apply(this, arguments); |
| this.constructor === j && this.b2EdgeShape.apply(this, arguments) |
| } |
| |
| function o() { |
| o.b2MassData.apply(this, arguments) |
| } |
| |
| function q() { |
| q.b2PolygonShape.apply(this, arguments); |
| this.constructor === q && this.b2PolygonShape.apply(this, arguments) |
| } |
| |
| function n() { |
| n.b2Shape.apply(this, arguments); |
| this.constructor === n && this.b2Shape.apply(this, arguments) |
| } |
| |
| function a() { |
| a.b2Color.apply(this, arguments); |
| this.constructor === a && this.b2Color.apply(this, arguments) |
| } |
| |
| function c() { |
| c.b2Settings.apply(this, arguments) |
| } |
| |
| function g() { |
| g.b2Mat22.apply(this, arguments); |
| this.constructor === g && this.b2Mat22.apply(this, arguments) |
| } |
| |
| function b() { |
| b.b2Mat33.apply(this, arguments); |
| this.constructor === b && this.b2Mat33.apply(this, arguments) |
| } |
| |
| function e() { |
| e.b2Math.apply(this, arguments) |
| } |
| |
| function f() { |
| f.b2Sweep.apply(this, arguments) |
| } |
| |
| function m() { |
| m.b2Transform.apply(this, |
| arguments); |
| this.constructor === m && this.b2Transform.apply(this, arguments) |
| } |
| |
| function r() { |
| r.b2Vec2.apply(this, arguments); |
| this.constructor === r && this.b2Vec2.apply(this, arguments) |
| } |
| |
| function s() { |
| s.b2Vec3.apply(this, arguments); |
| this.constructor === s && this.b2Vec3.apply(this, arguments) |
| } |
| |
| function v() { |
| v.b2Body.apply(this, arguments); |
| this.constructor === v && this.b2Body.apply(this, arguments) |
| } |
| |
| function t() { |
| t.b2BodyDef.apply(this, arguments); |
| this.constructor === t && this.b2BodyDef.apply(this, arguments) |
| } |
| |
| function x() { |
| x.b2ContactFilter.apply(this, |
| arguments) |
| } |
| |
| function C() { |
| C.b2ContactImpulse.apply(this, arguments) |
| } |
| |
| function J() { |
| J.b2ContactListener.apply(this, arguments) |
| } |
| |
| function T() { |
| T.b2ContactManager.apply(this, arguments); |
| this.constructor === T && this.b2ContactManager.apply(this, arguments) |
| } |
| |
| function P() { |
| P.b2DebugDraw.apply(this, arguments); |
| this.constructor === P && this.b2DebugDraw.apply(this, arguments) |
| } |
| |
| function X() { |
| X.b2DestructionListener.apply(this, arguments) |
| } |
| |
| function $() { |
| $.b2FilterData.apply(this, arguments) |
| } |
| |
| function ba() { |
| ba.b2Fixture.apply(this, arguments); |
| this.constructor === ba && this.b2Fixture.apply(this, arguments) |
| } |
| |
| function ca() { |
| ca.b2FixtureDef.apply(this, arguments); |
| this.constructor === ca && this.b2FixtureDef.apply(this, arguments) |
| } |
| |
| function da() { |
| da.b2Island.apply(this, arguments); |
| this.constructor === da && this.b2Island.apply(this, arguments) |
| } |
| |
| function Fa() { |
| Fa.b2TimeStep.apply(this, arguments) |
| } |
| |
| function ea() { |
| ea.b2World.apply(this, arguments); |
| this.constructor === ea && this.b2World.apply(this, arguments) |
| } |
| |
| function Ga() { |
| Ga.b2CircleContact.apply(this, arguments) |
| } |
| |
| function fa() { |
| fa.b2Contact.apply(this, |
| arguments); |
| this.constructor === fa && this.b2Contact.apply(this, arguments) |
| } |
| |
| function ga() { |
| ga.b2ContactConstraint.apply(this, arguments); |
| this.constructor === ga && this.b2ContactConstraint.apply(this, arguments) |
| } |
| |
| function Ha() { |
| Ha.b2ContactConstraintPoint.apply(this, arguments) |
| } |
| |
| function Ia() { |
| Ia.b2ContactEdge.apply(this, arguments) |
| } |
| |
| function ha() { |
| ha.b2ContactFactory.apply(this, arguments); |
| this.constructor === ha && this.b2ContactFactory.apply(this, arguments) |
| } |
| |
| function Ja() { |
| Ja.b2ContactRegister.apply(this, arguments) |
| } |
| |
| function Ka() { |
| Ka.b2ContactResult.apply(this, |
| arguments) |
| } |
| |
| function ia() { |
| ia.b2ContactSolver.apply(this, arguments); |
| this.constructor === ia && this.b2ContactSolver.apply(this, arguments) |
| } |
| |
| function La() { |
| La.b2EdgeAndCircleContact.apply(this, arguments) |
| } |
| |
| function ja() { |
| ja.b2NullContact.apply(this, arguments); |
| this.constructor === ja && this.b2NullContact.apply(this, arguments) |
| } |
| |
| function Ma() { |
| Ma.b2PolyAndCircleContact.apply(this, arguments) |
| } |
| |
| function Na() { |
| Na.b2PolyAndEdgeContact.apply(this, arguments) |
| } |
| |
| function Oa() { |
| Oa.b2PolygonContact.apply(this, arguments) |
| } |
| |
| function ka() { |
| ka.b2PositionSolverManifold.apply(this, |
| arguments); |
| this.constructor === ka && this.b2PositionSolverManifold.apply(this, arguments) |
| } |
| |
| function Pa() { |
| Pa.b2BuoyancyController.apply(this, arguments) |
| } |
| |
| function Qa() { |
| Qa.b2ConstantAccelController.apply(this, arguments) |
| } |
| |
| function Ra() { |
| Ra.b2ConstantForceController.apply(this, arguments) |
| } |
| |
| function Sa() { |
| Sa.b2Controller.apply(this, arguments) |
| } |
| |
| function Ta() { |
| Ta.b2ControllerEdge.apply(this, arguments) |
| } |
| |
| function Ua() { |
| Ua.b2GravityController.apply(this, arguments) |
| } |
| |
| function Va() { |
| Va.b2TensorDampingController.apply(this, arguments) |
| } |
| |
| function la() { |
| la.b2DistanceJoint.apply(this, arguments); |
| this.constructor === la && this.b2DistanceJoint.apply(this, arguments) |
| } |
| |
| function ma() { |
| ma.b2DistanceJointDef.apply(this, arguments); |
| this.constructor === ma && this.b2DistanceJointDef.apply(this, arguments) |
| } |
| |
| function na() { |
| na.b2FrictionJoint.apply(this, arguments); |
| this.constructor === na && this.b2FrictionJoint.apply(this, arguments) |
| } |
| |
| function oa() { |
| oa.b2FrictionJointDef.apply(this, arguments); |
| this.constructor === oa && this.b2FrictionJointDef.apply(this, arguments) |
| } |
| |
| function pa() { |
| pa.b2GearJoint.apply(this, |
| arguments); |
| this.constructor === pa && this.b2GearJoint.apply(this, arguments) |
| } |
| |
| function qa() { |
| qa.b2GearJointDef.apply(this, arguments); |
| this.constructor === qa && this.b2GearJointDef.apply(this, arguments) |
| } |
| |
| function Wa() { |
| Wa.b2Jacobian.apply(this, arguments) |
| } |
| |
| function ra() { |
| ra.b2Joint.apply(this, arguments); |
| this.constructor === ra && this.b2Joint.apply(this, arguments) |
| } |
| |
| function sa() { |
| sa.b2JointDef.apply(this, arguments); |
| this.constructor === sa && this.b2JointDef.apply(this, arguments) |
| } |
| |
| function Xa() { |
| Xa.b2JointEdge.apply(this, arguments) |
| } |
| |
| function ta() { |
| ta.b2LineJoint.apply(this, arguments); |
| this.constructor === ta && this.b2LineJoint.apply(this, arguments) |
| } |
| |
| function ua() { |
| ua.b2LineJointDef.apply(this, arguments); |
| this.constructor === ua && this.b2LineJointDef.apply(this, arguments) |
| } |
| |
| function va() { |
| va.b2MouseJoint.apply(this, arguments); |
| this.constructor === va && this.b2MouseJoint.apply(this, arguments) |
| } |
| |
| function wa() { |
| wa.b2MouseJointDef.apply(this, arguments); |
| this.constructor === wa && this.b2MouseJointDef.apply(this, arguments) |
| } |
| |
| function xa() { |
| xa.b2PrismaticJoint.apply(this, |
| arguments); |
| this.constructor === xa && this.b2PrismaticJoint.apply(this, arguments) |
| } |
| |
| function ya() { |
| ya.b2PrismaticJointDef.apply(this, arguments); |
| this.constructor === ya && this.b2PrismaticJointDef.apply(this, arguments) |
| } |
| |
| function za() { |
| za.b2PulleyJoint.apply(this, arguments); |
| this.constructor === za && this.b2PulleyJoint.apply(this, arguments) |
| } |
| |
| function Aa() { |
| Aa.b2PulleyJointDef.apply(this, arguments); |
| this.constructor === Aa && this.b2PulleyJointDef.apply(this, arguments) |
| } |
| |
| function Ba() { |
| Ba.b2RevoluteJoint.apply(this, arguments); |
| this.constructor === Ba && this.b2RevoluteJoint.apply(this, arguments) |
| } |
| |
| function Ca() { |
| Ca.b2RevoluteJointDef.apply(this, arguments); |
| this.constructor === Ca && this.b2RevoluteJointDef.apply(this, arguments) |
| } |
| |
| function Da() { |
| Da.b2WeldJoint.apply(this, arguments); |
| this.constructor === Da && this.b2WeldJoint.apply(this, arguments) |
| } |
| |
| function Ea() { |
| Ea.b2WeldJointDef.apply(this, arguments); |
| this.constructor === Ea && this.b2WeldJointDef.apply(this, arguments) |
| } |
| Box2D.Collision.IBroadPhase = "Box2D.Collision.IBroadPhase"; |
| Box2D.Collision.b2AABB = F; |
| Box2D.Collision.b2Bound = G; |
| Box2D.Collision.b2BoundValues = K; |
| Box2D.Collision.b2Collision = y; |
| Box2D.Collision.b2ContactID = w; |
| Box2D.Collision.b2ContactPoint = A; |
| Box2D.Collision.b2Distance = U; |
| Box2D.Collision.b2DistanceInput = p; |
| Box2D.Collision.b2DistanceOutput = B; |
| Box2D.Collision.b2DistanceProxy = Q; |
| Box2D.Collision.b2DynamicTree = V; |
| Box2D.Collision.b2DynamicTreeBroadPhase = M; |
| Box2D.Collision.b2DynamicTreeNode = L; |
| Box2D.Collision.b2DynamicTreePair = I; |
| Box2D.Collision.b2Manifold = W; |
| Box2D.Collision.b2ManifoldPoint = Y; |
| Box2D.Collision.b2Point = k; |
| Box2D.Collision.b2RayCastInput = z; |
| Box2D.Collision.b2RayCastOutput = u; |
| Box2D.Collision.b2Segment = D; |
| Box2D.Collision.b2SeparationFunction = H; |
| Box2D.Collision.b2Simplex = O; |
| Box2D.Collision.b2SimplexCache = E; |
| Box2D.Collision.b2SimplexVertex = R; |
| Box2D.Collision.b2TimeOfImpact = N; |
| Box2D.Collision.b2TOIInput = S; |
| Box2D.Collision.b2WorldManifold = aa; |
| Box2D.Collision.ClipVertex = Z; |
| Box2D.Collision.Features = d; |
| Box2D.Collision.Shapes.b2CircleShape = h; |
| Box2D.Collision.Shapes.b2EdgeChainDef = l; |
| Box2D.Collision.Shapes.b2EdgeShape = j; |
| Box2D.Collision.Shapes.b2MassData = o; |
| Box2D.Collision.Shapes.b2PolygonShape = q; |
| Box2D.Collision.Shapes.b2Shape = n; |
| Box2D.Common.b2internal = "Box2D.Common.b2internal"; |
| Box2D.Common.b2Color = a; |
| Box2D.Common.b2Settings = c; |
| Box2D.Common.Math.b2Mat22 = g; |
| Box2D.Common.Math.b2Mat33 = b; |
| Box2D.Common.Math.b2Math = e; |
| Box2D.Common.Math.b2Sweep = f; |
| Box2D.Common.Math.b2Transform = m; |
| Box2D.Common.Math.b2Vec2 = r; |
| Box2D.Common.Math.b2Vec3 = s; |
| Box2D.Dynamics.b2Body = v; |
| Box2D.Dynamics.b2BodyDef = t; |
| Box2D.Dynamics.b2ContactFilter = x; |
| Box2D.Dynamics.b2ContactImpulse = C; |
| Box2D.Dynamics.b2ContactListener = J; |
| Box2D.Dynamics.b2ContactManager = T; |
| Box2D.Dynamics.b2DebugDraw = P; |
| Box2D.Dynamics.b2DestructionListener = X; |
| Box2D.Dynamics.b2FilterData = $; |
| Box2D.Dynamics.b2Fixture = ba; |
| Box2D.Dynamics.b2FixtureDef = ca; |
| Box2D.Dynamics.b2Island = da; |
| Box2D.Dynamics.b2TimeStep = Fa; |
| Box2D.Dynamics.b2World = ea; |
| Box2D.Dynamics.Contacts.b2CircleContact = Ga; |
| Box2D.Dynamics.Contacts.b2Contact = fa; |
| Box2D.Dynamics.Contacts.b2ContactConstraint = ga; |
| Box2D.Dynamics.Contacts.b2ContactConstraintPoint = Ha; |
| Box2D.Dynamics.Contacts.b2ContactEdge = Ia; |
| Box2D.Dynamics.Contacts.b2ContactFactory = ha; |
| Box2D.Dynamics.Contacts.b2ContactRegister = Ja; |
| Box2D.Dynamics.Contacts.b2ContactResult = Ka; |
| Box2D.Dynamics.Contacts.b2ContactSolver = ia; |
| Box2D.Dynamics.Contacts.b2EdgeAndCircleContact = La; |
| Box2D.Dynamics.Contacts.b2NullContact = ja; |
| Box2D.Dynamics.Contacts.b2PolyAndCircleContact = Ma; |
| Box2D.Dynamics.Contacts.b2PolyAndEdgeContact = Na; |
| Box2D.Dynamics.Contacts.b2PolygonContact = Oa; |
| Box2D.Dynamics.Contacts.b2PositionSolverManifold = ka; |
| Box2D.Dynamics.Controllers.b2BuoyancyController = Pa; |
| Box2D.Dynamics.Controllers.b2ConstantAccelController = Qa; |
| Box2D.Dynamics.Controllers.b2ConstantForceController = Ra; |
| Box2D.Dynamics.Controllers.b2Controller = Sa; |
| Box2D.Dynamics.Controllers.b2ControllerEdge = Ta; |
| Box2D.Dynamics.Controllers.b2GravityController = Ua; |
| Box2D.Dynamics.Controllers.b2TensorDampingController = Va; |
| Box2D.Dynamics.Joints.b2DistanceJoint = la; |
| Box2D.Dynamics.Joints.b2DistanceJointDef = ma; |
| Box2D.Dynamics.Joints.b2FrictionJoint = na; |
| Box2D.Dynamics.Joints.b2FrictionJointDef = oa; |
| Box2D.Dynamics.Joints.b2GearJoint = pa; |
| Box2D.Dynamics.Joints.b2GearJointDef = qa; |
| Box2D.Dynamics.Joints.b2Jacobian = Wa; |
| Box2D.Dynamics.Joints.b2Joint = ra; |
| Box2D.Dynamics.Joints.b2JointDef = sa; |
| Box2D.Dynamics.Joints.b2JointEdge = Xa; |
| Box2D.Dynamics.Joints.b2LineJoint = ta; |
| Box2D.Dynamics.Joints.b2LineJointDef = ua; |
| Box2D.Dynamics.Joints.b2MouseJoint = va; |
| Box2D.Dynamics.Joints.b2MouseJointDef = wa; |
| Box2D.Dynamics.Joints.b2PrismaticJoint = xa; |
| Box2D.Dynamics.Joints.b2PrismaticJointDef = ya; |
| Box2D.Dynamics.Joints.b2PulleyJoint = za; |
| Box2D.Dynamics.Joints.b2PulleyJointDef = Aa; |
| Box2D.Dynamics.Joints.b2RevoluteJoint = Ba; |
| Box2D.Dynamics.Joints.b2RevoluteJointDef = Ca; |
| Box2D.Dynamics.Joints.b2WeldJoint = Da; |
| Box2D.Dynamics.Joints.b2WeldJointDef = Ea |
| })(); |
| Box2D.postDefs = []; |
| (function () { |
| var F = Box2D.Collision.Shapes.b2CircleShape, |
| G = Box2D.Collision.Shapes.b2PolygonShape, |
| K = Box2D.Collision.Shapes.b2Shape, |
| y = Box2D.Common.b2Settings, |
| w = Box2D.Common.Math.b2Math, |
| A = Box2D.Common.Math.b2Sweep, |
| U = Box2D.Common.Math.b2Transform, |
| p = Box2D.Common.Math.b2Vec2, |
| B = Box2D.Collision.b2AABB, |
| Q = Box2D.Collision.b2Bound, |
| V = Box2D.Collision.b2BoundValues, |
| M = Box2D.Collision.b2Collision, |
| L = Box2D.Collision.b2ContactID, |
| I = Box2D.Collision.b2ContactPoint, |
| W = Box2D.Collision.b2Distance, |
| Y = Box2D.Collision.b2DistanceInput, |
| k = Box2D.Collision.b2DistanceOutput, |
| z = Box2D.Collision.b2DistanceProxy, |
| u = Box2D.Collision.b2DynamicTree, |
| D = Box2D.Collision.b2DynamicTreeBroadPhase, |
| H = Box2D.Collision.b2DynamicTreeNode, |
| O = Box2D.Collision.b2DynamicTreePair, |
| E = Box2D.Collision.b2Manifold, |
| R = Box2D.Collision.b2ManifoldPoint, |
| N = Box2D.Collision.b2Point, |
| S = Box2D.Collision.b2RayCastInput, |
| aa = Box2D.Collision.b2RayCastOutput, |
| Z = Box2D.Collision.b2Segment, |
| d = Box2D.Collision.b2SeparationFunction, |
| h = Box2D.Collision.b2Simplex, |
| l = Box2D.Collision.b2SimplexCache, |
| j = Box2D.Collision.b2SimplexVertex, |
| o = Box2D.Collision.b2TimeOfImpact, |
| q = Box2D.Collision.b2TOIInput, |
| n = Box2D.Collision.b2WorldManifold, |
| a = Box2D.Collision.ClipVertex, |
| c = Box2D.Collision.Features, |
| g = Box2D.Collision.IBroadPhase; |
| B.b2AABB = function () { |
| this.lowerBound = new p; |
| this.upperBound = new p |
| }; |
| B.prototype.IsValid = function () { |
| var b = this.upperBound.y - this.lowerBound.y; |
| return b = (b = this.upperBound.x - this.lowerBound.x >= 0 && b >= 0) && this.lowerBound.IsValid() && this.upperBound.IsValid() |
| }; |
| B.prototype.GetCenter = function () { |
| return new p((this.lowerBound.x + this.upperBound.x) / 2, (this.lowerBound.y + this.upperBound.y) / 2) |
| }; |
| B.prototype.GetExtents = function () { |
| return new p((this.upperBound.x - this.lowerBound.x) / 2, (this.upperBound.y - this.lowerBound.y) / 2) |
| }; |
| B.prototype.Contains = function (b) { |
| var e = true; |
| return e = (e = (e = (e = e && this.lowerBound.x <= b.lowerBound.x) && this.lowerBound.y <= b.lowerBound.y) && b.upperBound.x <= this.upperBound.x) && b.upperBound.y <= this.upperBound.y |
| }; |
| B.prototype.RayCast = function (b, e) { |
| var f = -Number.MAX_VALUE, |
| m = Number.MAX_VALUE, |
| r = e.p1.x, |
| s = e.p1.y, |
| v = e.p2.x - e.p1.x, |
| t = e.p2.y - e.p1.y, |
| x = Math.abs(t), |
| C = b.normal, |
| J = 0, |
| T = 0, |
| P = J = 0; |
| P = 0; |
| if (Math.abs(v) < Number.MIN_VALUE) { |
| if (r < this.lowerBound.x || this.upperBound.x < r) return false |
| } else { |
| J = 1 / v; |
| T = (this.lowerBound.x - r) * J; |
| J = (this.upperBound.x - r) * J; |
| P = -1; |
| if (T > J) { |
| P = T; |
| T = J; |
| J = P; |
| P = 1 |
| } |
| if (T > f) { |
| C.x = P; |
| C.y = 0; |
| f = T |
| } |
| m = Math.min(m, J); |
| if (f > m) return false |
| } if (x < Number.MIN_VALUE) { |
| if (s < this.lowerBound.y || this.upperBound.y < s) return false |
| } else { |
| J = 1 / t; |
| T = (this.lowerBound.y - s) * J; |
| J = (this.upperBound.y - s) * J; |
| P = -1; |
| if (T > J) { |
| P = T; |
| T = J; |
| J = P; |
| P = 1 |
| } |
| if (T > f) { |
| C.y = P; |
| C.x = 0; |
| f = T |
| } |
| m = Math.min(m, J); |
| if (f > m) return false |
| } |
| b.fraction = f; |
| return true |
| }; |
| B.prototype.TestOverlap = function (b) { |
| var e = b.lowerBound.y - this.upperBound.y, |
| f = this.lowerBound.y - b.upperBound.y; |
| if (b.lowerBound.x - this.upperBound.x > 0 || e > 0) return false; |
| if (this.lowerBound.x - b.upperBound.x > 0 || f > 0) return false; |
| return true |
| }; |
| B.Combine = function (b, e) { |
| var f = new B; |
| f.Combine(b, e); |
| return f |
| }; |
| B.prototype.Combine = function (b, e) { |
| this.lowerBound.x = Math.min(b.lowerBound.x, e.lowerBound.x); |
| this.lowerBound.y = Math.min(b.lowerBound.y, e.lowerBound.y); |
| this.upperBound.x = Math.max(b.upperBound.x, e.upperBound.x); |
| this.upperBound.y = Math.max(b.upperBound.y, e.upperBound.y) |
| }; |
| Q.b2Bound = function () {}; |
| Q.prototype.IsLower = function () { |
| return (this.value & 1) == 0 |
| }; |
| Q.prototype.IsUpper = function () { |
| return (this.value & 1) == 1 |
| }; |
| Q.prototype.Swap = function (b) { |
| var e = this.value, |
| f = this.proxy, |
| m = this.stabbingCount; |
| this.value = b.value; |
| this.proxy = b.proxy; |
| this.stabbingCount = b.stabbingCount; |
| b.value = e; |
| b.proxy = f; |
| b.stabbingCount = m |
| }; |
| V.b2BoundValues = function () {}; |
| V.prototype.b2BoundValues = function () { |
| this.lowerValues = new Vector_a2j_Number; |
| this.lowerValues[0] = 0; |
| this.lowerValues[1] = 0; |
| this.upperValues = new Vector_a2j_Number; |
| this.upperValues[0] = 0; |
| this.upperValues[1] = 0 |
| }; |
| M.b2Collision = function () {}; |
| M.ClipSegmentToLine = function (b, e, f, m) { |
| if (m === undefined) m = 0; |
| var r, s = 0; |
| r = e[0]; |
| var v = r.v; |
| r = e[1]; |
| var t = r.v, |
| x = f.x * v.x + f.y * v.y - m; |
| r = f.x * t.x + f.y * t.y - m; |
| x <= 0 && b[s++].Set(e[0]); |
| r <= 0 && b[s++].Set(e[1]); |
| if (x * r < 0) { |
| f = x / (x - r); |
| r = b[s]; |
| r = r.v; |
| r.x = v.x + f * (t.x - v.x); |
| r.y = v.y + f * (t.y - v.y); |
| r = b[s]; |
| r.id = (x > 0 ? e[0] : e[1]).id; |
| ++s |
| } |
| return s |
| }; |
| M.EdgeSeparation = function (b, e, f, m, r) { |
| if (f === undefined) f = 0; |
| parseInt(b.m_vertexCount); |
| var s = b.m_vertices; |
| b = b.m_normals; |
| var v = parseInt(m.m_vertexCount), |
| t = m.m_vertices, |
| x, C; |
| x = e.R; |
| C = b[f]; |
| b = x.col1.x * C.x + x.col2.x * C.y; |
| m = x.col1.y * C.x + x.col2.y * C.y; |
| x = r.R; |
| var J = x.col1.x * b + x.col1.y * m; |
| x = x.col2.x * b + x.col2.y * m; |
| for (var T = 0, P = Number.MAX_VALUE, X = 0; X < v; ++X) { |
| C = t[X]; |
| C = C.x * J + C.y * x; |
| if (C < P) { |
| P = C; |
| T = X |
| } |
| } |
| C = s[f]; |
| x = e.R; |
| f = e.position.x + (x.col1.x * C.x + x.col2.x * C.y); |
| e = e.position.y + (x.col1.y * C.x + x.col2.y * C.y); |
| C = t[T]; |
| x = r.R; |
| s = r.position.x + (x.col1.x * C.x + x.col2.x * C.y); |
| r = r.position.y + (x.col1.y * C.x + x.col2.y * C.y); |
| s -= f; |
| r -= e; |
| return s * b + r * m |
| }; |
| M.FindMaxSeparation = function (b, e, f, m, r) { |
| var s = parseInt(e.m_vertexCount), |
| v = e.m_normals, |
| t, x; |
| x = r.R; |
| t = m.m_centroid; |
| var C = r.position.x + (x.col1.x * t.x + x.col2.x * t.y), |
| J = r.position.y + (x.col1.y * t.x + x.col2.y * t.y); |
| x = f.R; |
| t = e.m_centroid; |
| C -= f.position.x + (x.col1.x * t.x + x.col2.x * t.y); |
| J -= f.position.y + (x.col1.y * t.x + x.col2.y * t.y); |
| x = C * f.R.col1.x + J * f.R.col1.y; |
| J = C * f.R.col2.x + J * f.R.col2.y; |
| C = 0; |
| for (var T = -Number.MAX_VALUE, P = 0; P < s; ++P) { |
| t = v[P]; |
| t = t.x * x + t.y * J; |
| if (t > T) { |
| T = t; |
| C = P |
| } |
| } |
| v = M.EdgeSeparation(e, f, C, m, r); |
| t = parseInt(C - 1 >= 0 ? C - 1 : s - 1); |
| x = M.EdgeSeparation(e, f, t, m, r); |
| J = parseInt(C + 1 < s ? C + 1 : 0); |
| T = M.EdgeSeparation(e, f, J, m, r); |
| var X = P = 0, |
| $ = 0; |
| if (x > v && x > T) { |
| $ = -1; |
| P = t; |
| X = x |
| } else if (T > v) { |
| $ = 1; |
| P = J; |
| X = T |
| } else { |
| b[0] = C; |
| return v |
| } |
| for (;;) { |
| C = $ == -1 ? P - 1 >= 0 ? P - 1 : s - 1 : P + 1 < s ? P + 1 : 0; |
| v = M.EdgeSeparation(e, f, C, m, r); |
| if (v > X) { |
| P = C; |
| X = v |
| } else break |
| } |
| b[0] = P; |
| return X |
| }; |
| M.FindIncidentEdge = function (b, e, f, m, r, s) { |
| if (m === undefined) m = 0; |
| parseInt(e.m_vertexCount); |
| var v = e.m_normals, |
| t = parseInt(r.m_vertexCount); |
| e = r.m_vertices; |
| r = r.m_normals; |
| var x; |
| x = f.R; |
| f = v[m]; |
| v = x.col1.x * f.x + x.col2.x * f.y; |
| var C = x.col1.y * f.x + x.col2.y * f.y; |
| x = s.R; |
| f = x.col1.x * v + x.col1.y * C; |
| C = x.col2.x * v + x.col2.y * C; |
| v = f; |
| x = 0; |
| for (var J = Number.MAX_VALUE, T = 0; T < t; ++T) { |
| f = r[T]; |
| f = v * f.x + C * f.y; |
| if (f < J) { |
| J = f; |
| x = T |
| } |
| } |
| r = parseInt(x); |
| v = parseInt(r + 1 < t ? r + 1 : 0); |
| t = b[0]; |
| f = e[r]; |
| x = s.R; |
| t.v.x = s.position.x + (x.col1.x * f.x + x.col2.x * f.y); |
| t.v.y = s.position.y + (x.col1.y * f.x + x.col2.y * f.y); |
| t.id.features.referenceEdge = m; |
| t.id.features.incidentEdge = r; |
| t.id.features.incidentVertex = 0; |
| t = b[1]; |
| f = e[v]; |
| x = s.R; |
| t.v.x = s.position.x + (x.col1.x * f.x + x.col2.x * f.y); |
| t.v.y = s.position.y + (x.col1.y * f.x + x.col2.y * f.y); |
| t.id.features.referenceEdge = m; |
| t.id.features.incidentEdge = v; |
| t.id.features.incidentVertex = 1 |
| }; |
| M.MakeClipPointVector = function () { |
| var b = new Vector(2); |
| b[0] = new a; |
| b[1] = new a; |
| return b |
| }; |
| M.CollidePolygons = function (b, e, f, m, r) { |
| var s; |
| b.m_pointCount = 0; |
| var v = e.m_radius + m.m_radius; |
| s = 0; |
| M.s_edgeAO[0] = s; |
| var t = M.FindMaxSeparation(M.s_edgeAO, e, f, m, r); |
| s = M.s_edgeAO[0]; |
| if (!(t > v)) { |
| var x = 0; |
| M.s_edgeBO[0] = x; |
| var C = M.FindMaxSeparation(M.s_edgeBO, |
| m, r, e, f); |
| x = M.s_edgeBO[0]; |
| if (!(C > v)) { |
| var J = 0, |
| T = 0; |
| if (C > 0.98 * t + 0.0010) { |
| t = m; |
| m = e; |
| e = r; |
| f = f; |
| J = x; |
| b.m_type = E.e_faceB; |
| T = 1 |
| } else { |
| t = e; |
| m = m; |
| e = f; |
| f = r; |
| J = s; |
| b.m_type = E.e_faceA; |
| T = 0 |
| } |
| s = M.s_incidentEdge; |
| M.FindIncidentEdge(s, t, e, J, m, f); |
| x = parseInt(t.m_vertexCount); |
| r = t.m_vertices; |
| t = r[J]; |
| var P; |
| P = J + 1 < x ? r[parseInt(J + 1)] : r[0]; |
| J = M.s_localTangent; |
| J.Set(P.x - t.x, P.y - t.y); |
| J.Normalize(); |
| r = M.s_localNormal; |
| r.x = J.y; |
| r.y = -J.x; |
| m = M.s_planePoint; |
| m.Set(0.5 * (t.x + P.x), 0.5 * (t.y + P.y)); |
| C = M.s_tangent; |
| x = e.R; |
| C.x = x.col1.x * J.x + x.col2.x * J.y; |
| C.y = x.col1.y * J.x + x.col2.y * J.y; |
| var X = M.s_tangent2; |
| X.x = -C.x; |
| X.y = -C.y; |
| J = M.s_normal; |
| J.x = C.y; |
| J.y = -C.x; |
| var $ = M.s_v11, |
| ba = M.s_v12; |
| $.x = e.position.x + (x.col1.x * t.x + x.col2.x * t.y); |
| $.y = e.position.y + (x.col1.y * t.x + x.col2.y * t.y); |
| ba.x = e.position.x + (x.col1.x * P.x + x.col2.x * P.y); |
| ba.y = e.position.y + (x.col1.y * P.x + x.col2.y * P.y); |
| e = J.x * $.x + J.y * $.y; |
| x = C.x * ba.x + C.y * ba.y + v; |
| P = M.s_clipPoints1; |
| t = M.s_clipPoints2; |
| ba = 0; |
| ba = M.ClipSegmentToLine(P, s, X, -C.x * $.x - C.y * $.y + v); |
| if (!(ba < 2)) { |
| ba = M.ClipSegmentToLine(t, P, C, x); |
| if (!(ba < 2)) { |
| b.m_localPlaneNormal.SetV(r); |
| b.m_localPoint.SetV(m); |
| for (m = r = 0; m < y.b2_maxManifoldPoints; ++m) { |
| s = t[m]; |
| if (J.x * s.v.x + J.y * s.v.y - e <= v) { |
| C = b.m_points[r]; |
| x = f.R; |
| X = s.v.x - f.position.x; |
| $ = s.v.y - f.position.y; |
| C.m_localPoint.x = X * x.col1.x + $ * x.col1.y; |
| C.m_localPoint.y = X * x.col2.x + $ * x.col2.y; |
| C.m_id.Set(s.id); |
| C.m_id.features.flip = T; |
| ++r |
| } |
| } |
| b.m_pointCount = r |
| } |
| } |
| } |
| } |
| }; |
| M.CollideCircles = function (b, e, f, m, r) { |
| b.m_pointCount = 0; |
| var s, v; |
| s = f.R; |
| v = e.m_p; |
| var t = f.position.x + (s.col1.x * v.x + s.col2.x * v.y); |
| f = f.position.y + (s.col1.y * v.x + s.col2.y * v.y); |
| s = r.R; |
| v = m.m_p; |
| t = r.position.x + (s.col1.x * v.x + s.col2.x * v.y) - t; |
| r = r.position.y + (s.col1.y * v.x + s.col2.y * v.y) - f; |
| s = e.m_radius + m.m_radius; |
| if (!(t * t + r * r > s * s)) { |
| b.m_type = E.e_circles; |
| b.m_localPoint.SetV(e.m_p); |
| b.m_localPlaneNormal.SetZero(); |
| b.m_pointCount = 1; |
| b.m_points[0].m_localPoint.SetV(m.m_p); |
| b.m_points[0].m_id.key = 0 |
| } |
| }; |
| M.CollidePolygonAndCircle = function (b, e, f, m, r) { |
| var s = b.m_pointCount = 0, |
| v = 0, |
| t, x; |
| x = r.R; |
| t = m.m_p; |
| var C = r.position.y + (x.col1.y * t.x + x.col2.y * t.y); |
| s = r.position.x + (x.col1.x * t.x + x.col2.x * t.y) - f.position.x; |
| v = C - f.position.y; |
| x = f.R; |
| f = s * x.col1.x + v * x.col1.y; |
| x = s * x.col2.x + v * x.col2.y; |
| var J = 0; |
| C = -Number.MAX_VALUE; |
| r = e.m_radius + m.m_radius; |
| var T = parseInt(e.m_vertexCount), |
| P = e.m_vertices; |
| e = e.m_normals; |
| for (var X = 0; X < T; ++X) { |
| t = P[X]; |
| s = f - t.x; |
| v = x - t.y; |
| t = e[X]; |
| s = t.x * s + t.y * v; |
| if (s > r) return; |
| if (s > C) { |
| C = s; |
| J = X |
| } |
| } |
| s = parseInt(J); |
| v = parseInt(s + 1 < T ? s + 1 : 0); |
| t = P[s]; |
| P = P[v]; |
| if (C < Number.MIN_VALUE) { |
| b.m_pointCount = 1; |
| b.m_type = E.e_faceA; |
| b.m_localPlaneNormal.SetV(e[J]); |
| b.m_localPoint.x = 0.5 * (t.x + P.x); |
| b.m_localPoint.y = 0.5 * (t.y + P.y) |
| } else { |
| C = (f - P.x) * (t.x - P.x) + (x - P.y) * (t.y - P.y); |
| if ((f - t.x) * (P.x - t.x) + (x - t.y) * (P.y - t.y) <= 0) { |
| if ((f - t.x) * (f - t.x) + (x - t.y) * (x - t.y) > r * r) return; |
| b.m_pointCount = 1; |
| b.m_type = E.e_faceA; |
| b.m_localPlaneNormal.x = f - t.x; |
| b.m_localPlaneNormal.y = x - t.y; |
| b.m_localPlaneNormal.Normalize(); |
| b.m_localPoint.SetV(t) |
| } else if (C <= 0) { |
| if ((f - P.x) * (f - P.x) + (x - P.y) * (x - P.y) > r * r) return; |
| b.m_pointCount = 1; |
| b.m_type = E.e_faceA; |
| b.m_localPlaneNormal.x = f - P.x; |
| b.m_localPlaneNormal.y = x - P.y; |
| b.m_localPlaneNormal.Normalize(); |
| b.m_localPoint.SetV(P) |
| } else { |
| J = 0.5 * (t.x + P.x); |
| t = 0.5 * (t.y + P.y); |
| C = (f - J) * e[s].x + (x - t) * e[s].y; |
| if (C > r) return; |
| b.m_pointCount = 1; |
| b.m_type = E.e_faceA; |
| b.m_localPlaneNormal.x = e[s].x; |
| b.m_localPlaneNormal.y = e[s].y; |
| b.m_localPlaneNormal.Normalize(); |
| b.m_localPoint.Set(J, t) |
| } |
| } |
| b.m_points[0].m_localPoint.SetV(m.m_p); |
| b.m_points[0].m_id.key = 0 |
| }; |
| M.TestOverlap = function (b, e) { |
| var f = e.lowerBound, |
| m = b.upperBound, |
| r = f.x - m.x, |
| s = f.y - m.y; |
| f = b.lowerBound; |
| m = e.upperBound; |
| var v = f.y - m.y; |
| if (r > 0 || s > 0) return false; |
| if (f.x - m.x > 0 || v > 0) return false; |
| return true |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Collision.b2Collision.s_incidentEdge = M.MakeClipPointVector(); |
| Box2D.Collision.b2Collision.s_clipPoints1 = M.MakeClipPointVector(); |
| Box2D.Collision.b2Collision.s_clipPoints2 = M.MakeClipPointVector(); |
| Box2D.Collision.b2Collision.s_edgeAO = new Vector_a2j_Number(1); |
| Box2D.Collision.b2Collision.s_edgeBO = new Vector_a2j_Number(1); |
| Box2D.Collision.b2Collision.s_localTangent = new p; |
| Box2D.Collision.b2Collision.s_localNormal = new p; |
| Box2D.Collision.b2Collision.s_planePoint = new p; |
| Box2D.Collision.b2Collision.s_normal = new p; |
| Box2D.Collision.b2Collision.s_tangent = new p; |
| Box2D.Collision.b2Collision.s_tangent2 = new p; |
| Box2D.Collision.b2Collision.s_v11 = new p; |
| Box2D.Collision.b2Collision.s_v12 = new p; |
| Box2D.Collision.b2Collision.b2CollidePolyTempVec = new p; |
| Box2D.Collision.b2Collision.b2_nullFeature = 255 |
| }); |
| L.b2ContactID = function () { |
| this.features = new c |
| }; |
| L.prototype.b2ContactID = function () { |
| this.features._m_id = this |
| }; |
| L.prototype.Set = function (b) { |
| this.key = b._key |
| }; |
| L.prototype.Copy = function () { |
| var b = new L; |
| b.key = this.key; |
| return b |
| }; |
| Object.defineProperty(L.prototype, "key", { |
| enumerable: false, |
| configurable: true, |
| get: function () { |
| return this._key |
| } |
| }); |
| Object.defineProperty(L.prototype, "key", { |
| enumerable: false, |
| configurable: true, |
| set: function (b) { |
| if (b === undefined) b = 0; |
| this._key = b; |
| this.features._referenceEdge = this._key & 255; |
| this.features._incidentEdge = (this._key & 65280) >> 8 & 255; |
| this.features._incidentVertex = (this._key & 16711680) >> 16 & 255; |
| this.features._flip = (this._key & 4278190080) >> 24 & 255 |
| } |
| }); |
| I.b2ContactPoint = function () { |
| this.position = new p; |
| this.velocity = new p; |
| this.normal = new p; |
| this.id = new L |
| }; |
| W.b2Distance = function () {}; |
| W.Distance = function (b, e, f) { |
| ++W.b2_gjkCalls; |
| var m = f.proxyA, |
| r = f.proxyB, |
| s = f.transformA, |
| v = f.transformB, |
| t = W.s_simplex; |
| t.ReadCache(e, m, s, r, v); |
| var x = t.m_vertices, |
| C = W.s_saveA, |
| J = W.s_saveB, |
| T = 0; |
| t.GetClosestPoint().LengthSquared(); |
| for (var P = 0, X, $ = 0; $ < 20;) { |
| T = t.m_count; |
| for (P = 0; P < T; P++) { |
| C[P] = x[P].indexA; |
| J[P] = x[P].indexB |
| } |
| switch (t.m_count) { |
| case 1: |
| break; |
| case 2: |
| t.Solve2(); |
| break; |
| case 3: |
| t.Solve3(); |
| break; |
| default: |
| y.b2Assert(false) |
| } |
| if (t.m_count == 3) break; |
| X = t.GetClosestPoint(); |
| X.LengthSquared(); |
| P = t.GetSearchDirection(); |
| if (P.LengthSquared() < Number.MIN_VALUE * Number.MIN_VALUE) break; |
| X = x[t.m_count]; |
| X.indexA = m.GetSupport(w.MulTMV(s.R, P.GetNegative())); |
| X.wA = w.MulX(s, m.GetVertex(X.indexA)); |
| X.indexB = r.GetSupport(w.MulTMV(v.R, P)); |
| X.wB = w.MulX(v, r.GetVertex(X.indexB)); |
| X.w = w.SubtractVV(X.wB, X.wA); |
| ++$; |
| ++W.b2_gjkIters; |
| var ba = false; |
| for (P = 0; P < T; P++) |
| if (X.indexA == C[P] && X.indexB == J[P]) { |
| ba = true; |
| break |
| } |
| if (ba) break; |
| ++t.m_count |
| } |
| W.b2_gjkMaxIters = w.Max(W.b2_gjkMaxIters, $); |
| t.GetWitnessPoints(b.pointA, b.pointB); |
| b.distance = w.SubtractVV(b.pointA, |
| b.pointB).Length(); |
| b.iterations = $; |
| t.WriteCache(e); |
| if (f.useRadii) { |
| e = m.m_radius; |
| r = r.m_radius; |
| if (b.distance > e + r && b.distance > Number.MIN_VALUE) { |
| b.distance -= e + r; |
| f = w.SubtractVV(b.pointB, b.pointA); |
| f.Normalize(); |
| b.pointA.x += e * f.x; |
| b.pointA.y += e * f.y; |
| b.pointB.x -= r * f.x; |
| b.pointB.y -= r * f.y |
| } else { |
| X = new p; |
| X.x = 0.5 * (b.pointA.x + b.pointB.x); |
| X.y = 0.5 * (b.pointA.y + b.pointB.y); |
| b.pointA.x = b.pointB.x = X.x; |
| b.pointA.y = b.pointB.y = X.y; |
| b.distance = 0 |
| } |
| } |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Collision.b2Distance.s_simplex = new h; |
| Box2D.Collision.b2Distance.s_saveA = new Vector_a2j_Number(3); |
| Box2D.Collision.b2Distance.s_saveB = new Vector_a2j_Number(3) |
| }); |
| Y.b2DistanceInput = function () {}; |
| k.b2DistanceOutput = function () { |
| this.pointA = new p; |
| this.pointB = new p |
| }; |
| z.b2DistanceProxy = function () {}; |
| z.prototype.Set = function (b) { |
| switch (b.GetType()) { |
| case K.e_circleShape: |
| b = b instanceof F ? b : null; |
| this.m_vertices = new Vector(1, true); |
| this.m_vertices[0] = b.m_p; |
| this.m_count = 1; |
| this.m_radius = b.m_radius; |
| break; |
| case K.e_polygonShape: |
| b = b instanceof G ? b : null; |
| this.m_vertices = b.m_vertices; |
| this.m_count = b.m_vertexCount; |
| this.m_radius = b.m_radius; |
| break; |
| default: |
| y.b2Assert(false) |
| } |
| }; |
| z.prototype.GetSupport = function (b) { |
| for (var e = 0, f = this.m_vertices[0].x * b.x + this.m_vertices[0].y * b.y, m = 1; m < this.m_count; ++m) { |
| var r = this.m_vertices[m].x * b.x + this.m_vertices[m].y * b.y; |
| if (r > f) { |
| e = m; |
| f = r |
| } |
| } |
| return e |
| }; |
| z.prototype.GetSupportVertex = function (b) { |
| for (var e = 0, f = this.m_vertices[0].x * b.x + this.m_vertices[0].y * b.y, m = 1; m < this.m_count; ++m) { |
| var r = this.m_vertices[m].x * b.x + this.m_vertices[m].y * b.y; |
| if (r > f) { |
| e = m; |
| f = r |
| } |
| } |
| return this.m_vertices[e] |
| }; |
| z.prototype.GetVertexCount = function () { |
| return this.m_count |
| }; |
| z.prototype.GetVertex = function (b) { |
| if (b === undefined) b = 0; |
| y.b2Assert(0 <= b && b < this.m_count); |
| return this.m_vertices[b] |
| }; |
| u.b2DynamicTree = function () {}; |
| u.prototype.b2DynamicTree = function () { |
| this.m_freeList = this.m_root = null; |
| this.m_insertionCount = this.m_path = 0 |
| }; |
| u.prototype.CreateProxy = function (b, e) { |
| var f = this.AllocateNode(), |
| m = y.b2_aabbExtension, |
| r = y.b2_aabbExtension; |
| f.aabb.lowerBound.x = b.lowerBound.x - m; |
| f.aabb.lowerBound.y = b.lowerBound.y - r; |
| f.aabb.upperBound.x = b.upperBound.x + m; |
| f.aabb.upperBound.y = b.upperBound.y + r; |
| f.userData = e; |
| this.InsertLeaf(f); |
| return f |
| }; |
| u.prototype.DestroyProxy = function (b) { |
| this.RemoveLeaf(b); |
| this.FreeNode(b) |
| }; |
| u.prototype.MoveProxy = function (b, e, f) { |
| y.b2Assert(b.IsLeaf()); |
| if (b.aabb.Contains(e)) return false; |
| this.RemoveLeaf(b); |
| var m = y.b2_aabbExtension + y.b2_aabbMultiplier * (f.x > 0 ? f.x : -f.x); |
| f = y.b2_aabbExtension + y.b2_aabbMultiplier * (f.y > 0 ? f.y : -f.y); |
| b.aabb.lowerBound.x = e.lowerBound.x - m; |
| b.aabb.lowerBound.y = e.lowerBound.y - f; |
| b.aabb.upperBound.x = e.upperBound.x + m; |
| b.aabb.upperBound.y = e.upperBound.y + f; |
| this.InsertLeaf(b); |
| return true |
| }; |
| u.prototype.Rebalance = function (b) { |
| if (b === undefined) b = 0; |
| if (this.m_root != null) for (var e = 0; e < b; e++) { |
| for (var f = this.m_root, m = 0; f.IsLeaf() == false;) { |
| f = this.m_path >> m & 1 ? f.child2 : f.child1; |
| m = m + 1 & 31 |
| }++this.m_path; |
| this.RemoveLeaf(f); |
| this.InsertLeaf(f) |
| } |
| }; |
| u.prototype.GetFatAABB = function (b) { |
| return b.aabb |
| }; |
| u.prototype.GetUserData = function (b) { |
| return b.userData |
| }; |
| u.prototype.Query = function (b, e) { |
| if (this.m_root != null) { |
| var f = new Vector, |
| m = 0; |
| for (f[m++] = this.m_root; m > 0;) { |
| var r = f[--m]; |
| if (r.aabb.TestOverlap(e)) |
| if (r.IsLeaf()) { |
| if (!b(r)) break |
| } else { |
| f[m++] = r.child1; |
| f[m++] = r.child2 |
| } |
| } |
| } |
| }; |
| u.prototype.RayCast = function (b, e) { |
| if (this.m_root != null) { |
| var f = e.p1, |
| m = e.p2, |
| r = w.SubtractVV(f, m); |
| r.Normalize(); |
| r = w.CrossFV(1, r); |
| var s = w.AbsV(r), |
| v = e.maxFraction, |
| t = new B, |
| x = 0, |
| C = 0; |
| x = f.x + v * (m.x - f.x); |
| C = f.y + v * (m.y - f.y); |
| t.lowerBound.x = Math.min(f.x, x); |
| t.lowerBound.y = Math.min(f.y, C); |
| t.upperBound.x = Math.max(f.x, x); |
| t.upperBound.y = Math.max(f.y, C); |
| var J = new Vector, |
| T = 0; |
| for (J[T++] = this.m_root; T > 0;) { |
| v = J[--T]; |
| if (v.aabb.TestOverlap(t) != false) { |
| x = v.aabb.GetCenter(); |
| C = v.aabb.GetExtents(); |
| if (!(Math.abs(r.x * (f.x - x.x) + r.y * (f.y - x.y)) - s.x * C.x - s.y * C.y > 0)) |
| if (v.IsLeaf()) { |
| x = new S; |
| x.p1 = e.p1; |
| x.p2 = e.p2; |
| x.maxFraction = e.maxFraction; |
| v = b(x, v); |
| if (v == 0) break; |
| if (v > 0) { |
| x = f.x + v * (m.x - f.x); |
| C = f.y + v * (m.y - f.y); |
| t.lowerBound.x = Math.min(f.x, x); |
| t.lowerBound.y = Math.min(f.y, C); |
| t.upperBound.x = Math.max(f.x, x); |
| t.upperBound.y = Math.max(f.y, C) |
| } |
| } else { |
| J[T++] = v.child1; |
| J[T++] = v.child2 |
| } |
| } |
| } |
| } |
| }; |
| u.prototype.AllocateNode = function () { |
| if (this.m_freeList) { |
| var b = this.m_freeList; |
| this.m_freeList = b.parent; |
| b.parent = null; |
| b.child1 = null; |
| b.child2 = null; |
| return b |
| } |
| return new H |
| }; |
| u.prototype.FreeNode = function (b) { |
| b.parent = this.m_freeList; |
| this.m_freeList = b |
| }; |
| u.prototype.InsertLeaf = function (b) { |
| ++this.m_insertionCount; |
| if (this.m_root == null) { |
| this.m_root = b; |
| this.m_root.parent = null |
| } else { |
| var e = b.aabb.GetCenter(), |
| f = this.m_root; |
| if (f.IsLeaf() == false) { |
| do { |
| var m = f.child1; |
| f = f.child2; |
| f = Math.abs((m.aabb.lowerBound.x + m.aabb.upperBound.x) / 2 - e.x) + Math.abs((m.aabb.lowerBound.y + m.aabb.upperBound.y) / 2 - e.y) < Math.abs((f.aabb.lowerBound.x + f.aabb.upperBound.x) / 2 - e.x) + Math.abs((f.aabb.lowerBound.y + f.aabb.upperBound.y) / 2 - e.y) ? m : f |
| } while (f.IsLeaf() == false) |
| } |
| e = f.parent; |
| m = this.AllocateNode(); |
| m.parent = e; |
| m.userData = null; |
| m.aabb.Combine(b.aabb, f.aabb); |
| if (e) { |
| if (f.parent.child1 == f) e.child1 = m; |
| else e.child2 = m; |
| m.child1 = f; |
| m.child2 = b; |
| f.parent = m; |
| b.parent = m; |
| do { |
| if (e.aabb.Contains(m.aabb)) break; |
| e.aabb.Combine(e.child1.aabb, e.child2.aabb); |
| m = e; |
| e = e.parent |
| } while (e) |
| } else { |
| m.child1 = f; |
| m.child2 = b; |
| f.parent = m; |
| this.m_root = b.parent = m |
| } |
| } |
| }; |
| u.prototype.RemoveLeaf = function (b) { |
| if (b == this.m_root) this.m_root = null; |
| else { |
| var e = b.parent, |
| f = e.parent; |
| b = e.child1 == b ? e.child2 : e.child1; |
| if (f) { |
| if (f.child1 == e) f.child1 = b; |
| else f.child2 = b; |
| b.parent = f; |
| for (this.FreeNode(e); f;) { |
| e = f.aabb; |
| f.aabb = B.Combine(f.child1.aabb, f.child2.aabb); |
| if (e.Contains(f.aabb)) break; |
| f = f.parent |
| } |
| } else { |
| this.m_root = b; |
| b.parent = null; |
| this.FreeNode(e) |
| } |
| } |
| }; |
| D.b2DynamicTreeBroadPhase = function () { |
| this.m_tree = new u; |
| this.m_moveBuffer = new Vector; |
| this.m_pairBuffer = new Vector; |
| this.m_pairCount = 0 |
| }; |
| D.prototype.CreateProxy = function (b, e) { |
| var f = this.m_tree.CreateProxy(b, e); |
| ++this.m_proxyCount; |
| this.BufferMove(f); |
| return f |
| }; |
| D.prototype.DestroyProxy = function (b) { |
| this.UnBufferMove(b); |
| --this.m_proxyCount; |
| this.m_tree.DestroyProxy(b) |
| }; |
| D.prototype.MoveProxy = function (b, e, f) { |
| this.m_tree.MoveProxy(b, e, f) && this.BufferMove(b) |
| }; |
| D.prototype.TestOverlap = function (b, e) { |
| var f = this.m_tree.GetFatAABB(b), |
| m = this.m_tree.GetFatAABB(e); |
| return f.TestOverlap(m) |
| }; |
| D.prototype.GetUserData = function (b) { |
| return this.m_tree.GetUserData(b) |
| }; |
| D.prototype.GetFatAABB = function (b) { |
| return this.m_tree.GetFatAABB(b) |
| }; |
| D.prototype.GetProxyCount = function () { |
| return this.m_proxyCount |
| }; |
| D.prototype.UpdatePairs = function (b) { |
| var e = this; |
| var f = e.m_pairCount = 0, |
| m; |
| for (f = 0; f < e.m_moveBuffer.length; ++f) { |
| m = e.m_moveBuffer[f]; |
| var r = e.m_tree.GetFatAABB(m); |
| e.m_tree.Query(function (t) { |
| if (t == m) return true; |
| if (e.m_pairCount == e.m_pairBuffer.length) e.m_pairBuffer[e.m_pairCount] = new O; |
| var x = e.m_pairBuffer[e.m_pairCount]; |
| x.proxyA = t < m ? t : m; |
| x.proxyB = t >= m ? t : m; |
| ++e.m_pairCount; |
| return true |
| }, |
| r) |
| } |
| for (f = e.m_moveBuffer.length = 0; f < e.m_pairCount;) { |
| r = e.m_pairBuffer[f]; |
| var s = e.m_tree.GetUserData(r.proxyA), |
| v = e.m_tree.GetUserData(r.proxyB); |
| b(s, v); |
| for (++f; f < e.m_pairCount;) { |
| s = e.m_pairBuffer[f]; |
| if (s.proxyA != r.proxyA || s.proxyB != r.proxyB) break; |
| ++f |
| } |
| } |
| }; |
| D.prototype.Query = function (b, e) { |
| this.m_tree.Query(b, e) |
| }; |
| D.prototype.RayCast = function (b, e) { |
| this.m_tree.RayCast(b, e) |
| }; |
| D.prototype.Validate = function () {}; |
| D.prototype.Rebalance = function (b) { |
| if (b === undefined) b = 0; |
| this.m_tree.Rebalance(b) |
| }; |
| D.prototype.BufferMove = function (b) { |
| this.m_moveBuffer[this.m_moveBuffer.length] = b |
| }; |
| D.prototype.UnBufferMove = function (b) { |
| this.m_moveBuffer.splice(parseInt(this.m_moveBuffer.indexOf(b)), 1) |
| }; |
| D.prototype.ComparePairs = function () { |
| return 0 |
| }; |
| D.__implements = {}; |
| D.__implements[g] = true; |
| H.b2DynamicTreeNode = function () { |
| this.aabb = new B |
| }; |
| H.prototype.IsLeaf = function () { |
| return this.child1 == null |
| }; |
| O.b2DynamicTreePair = function () {}; |
| E.b2Manifold = function () { |
| this.m_pointCount = 0 |
| }; |
| E.prototype.b2Manifold = function () { |
| this.m_points = new Vector(y.b2_maxManifoldPoints); |
| for (var b = 0; b < y.b2_maxManifoldPoints; b++) this.m_points[b] = new R; |
| this.m_localPlaneNormal = new p; |
| this.m_localPoint = new p |
| }; |
| E.prototype.Reset = function () { |
| for (var b = 0; b < y.b2_maxManifoldPoints; b++)(this.m_points[b] instanceof R ? this.m_points[b] : null).Reset(); |
| this.m_localPlaneNormal.SetZero(); |
| this.m_localPoint.SetZero(); |
| this.m_pointCount = this.m_type = 0 |
| }; |
| E.prototype.Set = function (b) { |
| this.m_pointCount = b.m_pointCount; |
| for (var e = 0; e < y.b2_maxManifoldPoints; e++)(this.m_points[e] instanceof R ? this.m_points[e] : null).Set(b.m_points[e]); |
| this.m_localPlaneNormal.SetV(b.m_localPlaneNormal); |
| this.m_localPoint.SetV(b.m_localPoint); |
| this.m_type = b.m_type |
| }; |
| E.prototype.Copy = function () { |
| var b = new E; |
| b.Set(this); |
| return b |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Collision.b2Manifold.e_circles = 1; |
| Box2D.Collision.b2Manifold.e_faceA = 2; |
| Box2D.Collision.b2Manifold.e_faceB = 4 |
| }); |
| R.b2ManifoldPoint = function () { |
| this.m_localPoint = new p; |
| this.m_id = new L |
| }; |
| R.prototype.b2ManifoldPoint = function () { |
| this.Reset() |
| }; |
| R.prototype.Reset = function () { |
| this.m_localPoint.SetZero(); |
| this.m_tangentImpulse = this.m_normalImpulse = 0; |
| this.m_id.key = 0 |
| }; |
| R.prototype.Set = function (b) { |
| this.m_localPoint.SetV(b.m_localPoint); |
| this.m_normalImpulse = b.m_normalImpulse; |
| this.m_tangentImpulse = b.m_tangentImpulse; |
| this.m_id.Set(b.m_id) |
| }; |
| N.b2Point = function () { |
| this.p = new p |
| }; |
| N.prototype.Support = function () { |
| return this.p |
| }; |
| N.prototype.GetFirstVertex = function () { |
| return this.p |
| }; |
| S.b2RayCastInput = function () { |
| this.p1 = new p; |
| this.p2 = new p |
| }; |
| S.prototype.b2RayCastInput = function (b, e, f) { |
| if (b === undefined) b = null; |
| if (e === undefined) e = null; |
| if (f === undefined) f = 1; |
| b && this.p1.SetV(b); |
| e && this.p2.SetV(e); |
| this.maxFraction = f |
| }; |
| aa.b2RayCastOutput = function () { |
| this.normal = new p |
| }; |
| Z.b2Segment = function () { |
| this.p1 = new p; |
| this.p2 = new p |
| }; |
| Z.prototype.TestSegment = function (b, e, f, m) { |
| if (m === undefined) m = 0; |
| var r = f.p1, |
| s = f.p2.x - r.x, |
| v = f.p2.y - r.y; |
| f = this.p2.y - this.p1.y; |
| var t = -(this.p2.x - this.p1.x), |
| x = 100 * Number.MIN_VALUE, |
| C = -(s * f + v * t); |
| if (C > x) { |
| var J = r.x - this.p1.x, |
| T = r.y - this.p1.y; |
| r = J * f + T * t; |
| if (0 <= r && r <= m * C) { |
| m = -s * T + v * J; |
| if (-x * C <= m && m <= C * (1 + x)) { |
| r /= C; |
| m = Math.sqrt(f * f + t * t); |
| f /= m; |
| t /= m; |
| b[0] = r; |
| e.Set(f, |
| t); |
| return true |
| } |
| } |
| } |
| return false |
| }; |
| Z.prototype.Extend = function (b) { |
| this.ExtendForward(b); |
| this.ExtendBackward(b) |
| }; |
| Z.prototype.ExtendForward = function (b) { |
| var e = this.p2.x - this.p1.x, |
| f = this.p2.y - this.p1.y; |
| b = Math.min(e > 0 ? (b.upperBound.x - this.p1.x) / e : e < 0 ? (b.lowerBound.x - this.p1.x) / e : Number.POSITIVE_INFINITY, f > 0 ? (b.upperBound.y - this.p1.y) / f : f < 0 ? (b.lowerBound.y - this.p1.y) / f : Number.POSITIVE_INFINITY); |
| this.p2.x = this.p1.x + e * b; |
| this.p2.y = this.p1.y + f * b |
| }; |
| Z.prototype.ExtendBackward = function (b) { |
| var e = -this.p2.x + this.p1.x, |
| f = -this.p2.y + this.p1.y; |
| b = Math.min(e > 0 ? (b.upperBound.x - this.p2.x) / e : e < 0 ? (b.lowerBound.x - this.p2.x) / e : Number.POSITIVE_INFINITY, f > 0 ? (b.upperBound.y - this.p2.y) / f : f < 0 ? (b.lowerBound.y - this.p2.y) / f : Number.POSITIVE_INFINITY); |
| this.p1.x = this.p2.x + e * b; |
| this.p1.y = this.p2.y + f * b |
| }; |
| d.b2SeparationFunction = function () { |
| this.m_localPoint = new p; |
| this.m_axis = new p |
| }; |
| d.prototype.Initialize = function (b, e, f, m, r) { |
| this.m_proxyA = e; |
| this.m_proxyB = m; |
| var s = parseInt(b.count); |
| y.b2Assert(0 < s && s < 3); |
| var v, t, x, C, J = C = x = m = e = 0, |
| T = 0; |
| J = 0; |
| if (s == 1) { |
| this.m_type = d.e_points; |
| v = this.m_proxyA.GetVertex(b.indexA[0]); |
| t = this.m_proxyB.GetVertex(b.indexB[0]); |
| s = v; |
| b = f.R; |
| e = f.position.x + (b.col1.x * s.x + b.col2.x * s.y); |
| m = f.position.y + (b.col1.y * s.x + b.col2.y * s.y); |
| s = t; |
| b = r.R; |
| x = r.position.x + (b.col1.x * s.x + b.col2.x * s.y); |
| C = r.position.y + (b.col1.y * s.x + b.col2.y * s.y); |
| this.m_axis.x = x - e; |
| this.m_axis.y = C - m; |
| this.m_axis.Normalize() |
| } else { |
| if (b.indexB[0] == b.indexB[1]) { |
| this.m_type = d.e_faceA; |
| e = this.m_proxyA.GetVertex(b.indexA[0]); |
| m = this.m_proxyA.GetVertex(b.indexA[1]); |
| t = this.m_proxyB.GetVertex(b.indexB[0]); |
| this.m_localPoint.x = 0.5 * (e.x + m.x); |
| this.m_localPoint.y = 0.5 * (e.y + m.y); |
| this.m_axis = w.CrossVF(w.SubtractVV(m, e), 1); |
| this.m_axis.Normalize(); |
| s = this.m_axis; |
| b = f.R; |
| J = b.col1.x * s.x + b.col2.x * s.y; |
| T = b.col1.y * s.x + b.col2.y * s.y; |
| s = this.m_localPoint; |
| b = f.R; |
| e = f.position.x + (b.col1.x * s.x + b.col2.x * s.y); |
| m = f.position.y + (b.col1.y * s.x + b.col2.y * s.y); |
| s = t; |
| b = r.R; |
| x = r.position.x + (b.col1.x * s.x + b.col2.x * s.y); |
| C = r.position.y + (b.col1.y * s.x + b.col2.y * s.y); |
| J = (x - e) * J + (C - m) * T |
| } else if (b.indexA[0] == b.indexA[0]) { |
| this.m_type = d.e_faceB; |
| x = this.m_proxyB.GetVertex(b.indexB[0]); |
| C = this.m_proxyB.GetVertex(b.indexB[1]); |
| v = this.m_proxyA.GetVertex(b.indexA[0]); |
| this.m_localPoint.x = 0.5 * (x.x + C.x); |
| this.m_localPoint.y = 0.5 * (x.y + C.y); |
| this.m_axis = w.CrossVF(w.SubtractVV(C, x), 1); |
| this.m_axis.Normalize(); |
| s = this.m_axis; |
| b = r.R; |
| J = b.col1.x * s.x + b.col2.x * s.y; |
| T = b.col1.y * s.x + b.col2.y * s.y; |
| s = this.m_localPoint; |
| b = r.R; |
| x = r.position.x + (b.col1.x * s.x + b.col2.x * s.y); |
| C = r.position.y + (b.col1.y * s.x + b.col2.y * s.y); |
| s = v; |
| b = f.R; |
| e = f.position.x + (b.col1.x * s.x + b.col2.x * s.y); |
| m = f.position.y + (b.col1.y * s.x + b.col2.y * s.y); |
| J = (e - x) * J + (m - C) * T |
| } else { |
| e = this.m_proxyA.GetVertex(b.indexA[0]); |
| m = this.m_proxyA.GetVertex(b.indexA[1]); |
| x = this.m_proxyB.GetVertex(b.indexB[0]); |
| C = this.m_proxyB.GetVertex(b.indexB[1]); |
| w.MulX(f, v); |
| v = w.MulMV(f.R, w.SubtractVV(m, e)); |
| w.MulX(r, t); |
| J = w.MulMV(r.R, w.SubtractVV(C, x)); |
| r = v.x * v.x + v.y * v.y; |
| t = J.x * J.x + J.y * J.y; |
| b = w.SubtractVV(J, v); |
| f = v.x * b.x + v.y * b.y; |
| b = J.x * b.x + J.y * b.y; |
| v = v.x * J.x + v.y * J.y; |
| T = r * t - v * v; |
| J = 0; |
| if (T != 0) J = w.Clamp((v * b - f * t) / T, 0, 1); |
| if ((v * J + b) / t < 0) J = w.Clamp((v - f) / r, 0, 1); |
| v = new p; |
| v.x = e.x + J * (m.x - e.x); |
| v.y = e.y + J * (m.y - e.y); |
| t = new p; |
| t.x = x.x + J * (C.x - x.x); |
| t.y = x.y + J * (C.y - x.y); |
| if (J == 0 || J == 1) { |
| this.m_type = d.e_faceB; |
| this.m_axis = w.CrossVF(w.SubtractVV(C, x), 1); |
| this.m_axis.Normalize(); |
| this.m_localPoint = t |
| } else { |
| this.m_type = d.e_faceA; |
| this.m_axis = w.CrossVF(w.SubtractVV(m, e), 1); |
| this.m_localPoint = v |
| } |
| } |
| J < 0 && this.m_axis.NegativeSelf() |
| } |
| }; |
| d.prototype.Evaluate = function (b, e) { |
| var f, m, r = 0; |
| switch (this.m_type) { |
| case d.e_points: |
| f = w.MulTMV(b.R, this.m_axis); |
| m = w.MulTMV(e.R, this.m_axis.GetNegative()); |
| f = this.m_proxyA.GetSupportVertex(f); |
| m = this.m_proxyB.GetSupportVertex(m); |
| f = w.MulX(b, f); |
| m = w.MulX(e, m); |
| return r = (m.x - f.x) * this.m_axis.x + (m.y - f.y) * this.m_axis.y; |
| case d.e_faceA: |
| r = w.MulMV(b.R, this.m_axis); |
| f = w.MulX(b, this.m_localPoint); |
| m = w.MulTMV(e.R, r.GetNegative()); |
| m = this.m_proxyB.GetSupportVertex(m); |
| m = w.MulX(e, m); |
| return r = (m.x - f.x) * r.x + (m.y - f.y) * r.y; |
| case d.e_faceB: |
| r = w.MulMV(e.R, this.m_axis); |
| m = w.MulX(e, this.m_localPoint); |
| f = w.MulTMV(b.R, r.GetNegative()); |
| f = this.m_proxyA.GetSupportVertex(f); |
| f = w.MulX(b, f); |
| return r = (f.x - m.x) * r.x + (f.y - m.y) * r.y; |
| default: |
| y.b2Assert(false); |
| return 0 |
| } |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Collision.b2SeparationFunction.e_points = 1; |
| Box2D.Collision.b2SeparationFunction.e_faceA = 2; |
| Box2D.Collision.b2SeparationFunction.e_faceB = 4 |
| }); |
| h.b2Simplex = function () { |
| this.m_v1 = new j; |
| this.m_v2 = new j; |
| this.m_v3 = new j; |
| this.m_vertices = new Vector(3) |
| }; |
| h.prototype.b2Simplex = function () { |
| this.m_vertices[0] = this.m_v1; |
| this.m_vertices[1] = this.m_v2; |
| this.m_vertices[2] = this.m_v3 |
| }; |
| h.prototype.ReadCache = function (b, e, f, m, r) { |
| y.b2Assert(0 <= b.count && b.count <= 3); |
| var s, v; |
| this.m_count = b.count; |
| for (var t = this.m_vertices, x = 0; x < this.m_count; x++) { |
| var C = t[x]; |
| C.indexA = b.indexA[x]; |
| C.indexB = b.indexB[x]; |
| s = e.GetVertex(C.indexA); |
| v = m.GetVertex(C.indexB); |
| C.wA = w.MulX(f, s); |
| C.wB = w.MulX(r, v); |
| C.w = w.SubtractVV(C.wB, C.wA); |
| C.a = 0 |
| } |
| if (this.m_count > 1) { |
| b = b.metric; |
| s = this.GetMetric(); |
| if (s < 0.5 * b || 2 * b < s || s < Number.MIN_VALUE) this.m_count = 0 |
| } |
| if (this.m_count == 0) { |
| C = t[0]; |
| C.indexA = 0; |
| C.indexB = 0; |
| s = e.GetVertex(0); |
| v = m.GetVertex(0); |
| C.wA = w.MulX(f, s); |
| C.wB = w.MulX(r, v); |
| C.w = w.SubtractVV(C.wB, C.wA); |
| this.m_count = 1 |
| } |
| }; |
| h.prototype.WriteCache = function (b) { |
| b.metric = this.GetMetric(); |
| b.count = Box2D.parseUInt(this.m_count); |
| for (var e = this.m_vertices, f = 0; f < this.m_count; f++) { |
| b.indexA[f] = Box2D.parseUInt(e[f].indexA); |
| b.indexB[f] = Box2D.parseUInt(e[f].indexB) |
| } |
| }; |
| h.prototype.GetSearchDirection = function () { |
| switch (this.m_count) { |
| case 1: |
| return this.m_v1.w.GetNegative(); |
| case 2: |
| var b = w.SubtractVV(this.m_v2.w, this.m_v1.w); |
| return w.CrossVV(b, this.m_v1.w.GetNegative()) > 0 ? w.CrossFV(1, b) : w.CrossVF(b, 1); |
| default: |
| y.b2Assert(false); |
| return new p |
| } |
| }; |
| h.prototype.GetClosestPoint = function () { |
| switch (this.m_count) { |
| case 0: |
| y.b2Assert(false); |
| return new p; |
| case 1: |
| return this.m_v1.w; |
| case 2: |
| return new p(this.m_v1.a * this.m_v1.w.x + this.m_v2.a * this.m_v2.w.x, this.m_v1.a * this.m_v1.w.y + this.m_v2.a * this.m_v2.w.y); |
| default: |
| y.b2Assert(false); |
| return new p |
| } |
| }; |
| h.prototype.GetWitnessPoints = function (b, e) { |
| switch (this.m_count) { |
| case 0: |
| y.b2Assert(false); |
| break; |
| case 1: |
| b.SetV(this.m_v1.wA); |
| e.SetV(this.m_v1.wB); |
| break; |
| case 2: |
| b.x = this.m_v1.a * this.m_v1.wA.x + this.m_v2.a * this.m_v2.wA.x; |
| b.y = this.m_v1.a * this.m_v1.wA.y + this.m_v2.a * this.m_v2.wA.y; |
| e.x = this.m_v1.a * this.m_v1.wB.x + this.m_v2.a * this.m_v2.wB.x; |
| e.y = this.m_v1.a * this.m_v1.wB.y + this.m_v2.a * this.m_v2.wB.y; |
| break; |
| case 3: |
| e.x = b.x = this.m_v1.a * this.m_v1.wA.x + this.m_v2.a * this.m_v2.wA.x + this.m_v3.a * this.m_v3.wA.x; |
| e.y = b.y = this.m_v1.a * this.m_v1.wA.y + this.m_v2.a * this.m_v2.wA.y + this.m_v3.a * this.m_v3.wA.y; |
| break; |
| default: |
| y.b2Assert(false) |
| } |
| }; |
| h.prototype.GetMetric = function () { |
| switch (this.m_count) { |
| case 0: |
| y.b2Assert(false); |
| return 0; |
| case 1: |
| return 0; |
| case 2: |
| return w.SubtractVV(this.m_v1.w, |
| this.m_v2.w).Length(); |
| case 3: |
| return w.CrossVV(w.SubtractVV(this.m_v2.w, this.m_v1.w), w.SubtractVV(this.m_v3.w, this.m_v1.w)); |
| default: |
| y.b2Assert(false); |
| return 0 |
| } |
| }; |
| h.prototype.Solve2 = function () { |
| var b = this.m_v1.w, |
| e = this.m_v2.w, |
| f = w.SubtractVV(e, b); |
| b = -(b.x * f.x + b.y * f.y); |
| if (b <= 0) this.m_count = this.m_v1.a = 1; |
| else { |
| e = e.x * f.x + e.y * f.y; |
| if (e <= 0) { |
| this.m_count = this.m_v2.a = 1; |
| this.m_v1.Set(this.m_v2) |
| } else { |
| f = 1 / (e + b); |
| this.m_v1.a = e * f; |
| this.m_v2.a = b * f; |
| this.m_count = 2 |
| } |
| } |
| }; |
| h.prototype.Solve3 = function () { |
| var b = this.m_v1.w, |
| e = this.m_v2.w, |
| f = this.m_v3.w, |
| m = w.SubtractVV(e, b), |
| r = w.Dot(b, m), |
| s = w.Dot(e, m); |
| r = -r; |
| var v = w.SubtractVV(f, b), |
| t = w.Dot(b, v), |
| x = w.Dot(f, v); |
| t = -t; |
| var C = w.SubtractVV(f, e), |
| J = w.Dot(e, C); |
| C = w.Dot(f, C); |
| J = -J; |
| v = w.CrossVV(m, v); |
| m = v * w.CrossVV(e, f); |
| f = v * w.CrossVV(f, b); |
| b = v * w.CrossVV(b, e); |
| if (r <= 0 && t <= 0) this.m_count = this.m_v1.a = 1; |
| else if (s > 0 && r > 0 && b <= 0) { |
| x = 1 / (s + r); |
| this.m_v1.a = s * x; |
| this.m_v2.a = r * x; |
| this.m_count = 2 |
| } else if (x > 0 && t > 0 && f <= 0) { |
| s = 1 / (x + t); |
| this.m_v1.a = x * s; |
| this.m_v3.a = t * s; |
| this.m_count = 2; |
| this.m_v2.Set(this.m_v3) |
| } else if (s <= 0 && J <= 0) { |
| this.m_count = this.m_v2.a = 1; |
| this.m_v1.Set(this.m_v2) |
| } else if (x <= 0 && C <= 0) { |
| this.m_count = this.m_v3.a = 1; |
| this.m_v1.Set(this.m_v3) |
| } else if (C > 0 && J > 0 && m <= 0) { |
| s = 1 / (C + J); |
| this.m_v2.a = C * s; |
| this.m_v3.a = J * s; |
| this.m_count = 2; |
| this.m_v1.Set(this.m_v3) |
| } else { |
| s = 1 / (m + f + b); |
| this.m_v1.a = m * s; |
| this.m_v2.a = f * s; |
| this.m_v3.a = b * s; |
| this.m_count = 3 |
| } |
| }; |
| l.b2SimplexCache = function () { |
| this.indexA = new Vector_a2j_Number(3); |
| this.indexB = new Vector_a2j_Number(3) |
| }; |
| j.b2SimplexVertex = function () {}; |
| j.prototype.Set = function (b) { |
| this.wA.SetV(b.wA); |
| this.wB.SetV(b.wB); |
| this.w.SetV(b.w); |
| this.a = b.a; |
| this.indexA = b.indexA; |
| this.indexB = b.indexB |
| }; |
| o.b2TimeOfImpact = function () {}; |
| o.TimeOfImpact = function (b) { |
| ++o.b2_toiCalls; |
| var e = b.proxyA, |
| f = b.proxyB, |
| m = b.sweepA, |
| r = b.sweepB; |
| y.b2Assert(m.t0 == r.t0); |
| y.b2Assert(1 - m.t0 > Number.MIN_VALUE); |
| var s = e.m_radius + f.m_radius; |
| b = b.tolerance; |
| var v = 0, |
| t = 0, |
| x = 0; |
| o.s_cache.count = 0; |
| for (o.s_distanceInput.useRadii = false;;) { |
| m.GetTransform(o.s_xfA, v); |
| r.GetTransform(o.s_xfB, v); |
| o.s_distanceInput.proxyA = e; |
| o.s_distanceInput.proxyB = f; |
| o.s_distanceInput.transformA = o.s_xfA; |
| o.s_distanceInput.transformB = o.s_xfB; |
| W.Distance(o.s_distanceOutput, o.s_cache, o.s_distanceInput); |
| if (o.s_distanceOutput.distance <= 0) { |
| v = 1; |
| break |
| } |
| o.s_fcn.Initialize(o.s_cache, e, o.s_xfA, f, o.s_xfB); |
| var C = o.s_fcn.Evaluate(o.s_xfA, o.s_xfB); |
| if (C <= 0) { |
| v = 1; |
| break |
| } |
| if (t == 0) x = C > s ? w.Max(s - b, 0.75 * s) : w.Max(C - b, 0.02 * s); |
| if (C - x < 0.5 * b) { |
| if (t == 0) { |
| v = 1; |
| break |
| } |
| break |
| } |
| var J = v, |
| T = v, |
| P = 1; |
| C = C; |
| m.GetTransform(o.s_xfA, P); |
| r.GetTransform(o.s_xfB, P); |
| var X = o.s_fcn.Evaluate(o.s_xfA, o.s_xfB); |
| if (X >= x) { |
| v = 1; |
| break |
| } |
| for (var $ = 0;;) { |
| var ba = 0; |
| ba = $ & 1 ? T + (x - C) * (P - T) / (X - C) : 0.5 * (T + P); |
| m.GetTransform(o.s_xfA, ba); |
| r.GetTransform(o.s_xfB, ba); |
| var ca = o.s_fcn.Evaluate(o.s_xfA, o.s_xfB); |
| if (w.Abs(ca - x) < 0.025 * b) { |
| J = ba; |
| break |
| } |
| if (ca > x) { |
| T = ba; |
| C = ca |
| } else { |
| P = ba; |
| X = ca |
| }++$; |
| ++o.b2_toiRootIters; |
| if ($ == 50) break |
| } |
| o.b2_toiMaxRootIters = w.Max(o.b2_toiMaxRootIters, $); |
| if (J < (1 + 100 * Number.MIN_VALUE) * v) break; |
| v = J; |
| t++; |
| ++o.b2_toiIters; |
| if (t == 1E3) break |
| } |
| o.b2_toiMaxIters = w.Max(o.b2_toiMaxIters, t); |
| return v |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Collision.b2TimeOfImpact.b2_toiCalls = 0; |
| Box2D.Collision.b2TimeOfImpact.b2_toiIters = 0; |
| Box2D.Collision.b2TimeOfImpact.b2_toiMaxIters = 0; |
| Box2D.Collision.b2TimeOfImpact.b2_toiRootIters = 0; |
| Box2D.Collision.b2TimeOfImpact.b2_toiMaxRootIters = 0; |
| Box2D.Collision.b2TimeOfImpact.s_cache = new l; |
| Box2D.Collision.b2TimeOfImpact.s_distanceInput = new Y; |
| Box2D.Collision.b2TimeOfImpact.s_xfA = new U; |
| Box2D.Collision.b2TimeOfImpact.s_xfB = new U; |
| Box2D.Collision.b2TimeOfImpact.s_fcn = new d; |
| Box2D.Collision.b2TimeOfImpact.s_distanceOutput = new k |
| }); |
| q.b2TOIInput = function () { |
| this.proxyA = new z; |
| this.proxyB = new z; |
| this.sweepA = new A; |
| this.sweepB = new A |
| }; |
| n.b2WorldManifold = function () { |
| this.m_normal = new p |
| }; |
| n.prototype.b2WorldManifold = function () { |
| this.m_points = new Vector(y.b2_maxManifoldPoints); |
| for (var b = 0; b < y.b2_maxManifoldPoints; b++) this.m_points[b] = new p |
| }; |
| n.prototype.Initialize = function (b, e, f, m, r) { |
| if (f === undefined) f = 0; |
| if (r === undefined) r = 0; |
| if (b.m_pointCount != 0) { |
| var s = 0, |
| v, t, x = 0, |
| C = 0, |
| J = 0, |
| T = 0, |
| P = 0; |
| v = 0; |
| switch (b.m_type) { |
| case E.e_circles: |
| t = e.R; |
| v = b.m_localPoint; |
| s = e.position.x + t.col1.x * v.x + t.col2.x * v.y; |
| e = e.position.y + t.col1.y * v.x + t.col2.y * v.y; |
| t = m.R; |
| v = b.m_points[0].m_localPoint; |
| b = m.position.x + t.col1.x * v.x + t.col2.x * v.y; |
| m = m.position.y + t.col1.y * v.x + t.col2.y * v.y; |
| v = b - s; |
| t = m - e; |
| x = v * v + t * t; |
| if (x > Number.MIN_VALUE * Number.MIN_VALUE) { |
| x = Math.sqrt(x); |
| this.m_normal.x = v / x; |
| this.m_normal.y = t / x |
| } else { |
| this.m_normal.x = 1; |
| this.m_normal.y = 0 |
| } |
| v = e + f * this.m_normal.y; |
| m = m - r * this.m_normal.y; |
| this.m_points[0].x = 0.5 * (s + f * this.m_normal.x + (b - r * this.m_normal.x)); |
| this.m_points[0].y = 0.5 * (v + m); |
| break; |
| case E.e_faceA: |
| t = e.R; |
| v = b.m_localPlaneNormal; |
| x = t.col1.x * v.x + t.col2.x * v.y; |
| C = t.col1.y * v.x + t.col2.y * v.y; |
| t = e.R; |
| v = b.m_localPoint; |
| J = e.position.x + t.col1.x * v.x + t.col2.x * v.y; |
| T = e.position.y + t.col1.y * v.x + t.col2.y * v.y; |
| this.m_normal.x = x; |
| this.m_normal.y = C; |
| for (s = 0; s < b.m_pointCount; s++) { |
| t = m.R; |
| v = b.m_points[s].m_localPoint; |
| P = m.position.x + t.col1.x * v.x + t.col2.x * v.y; |
| v = m.position.y + t.col1.y * v.x + t.col2.y * v.y; |
| this.m_points[s].x = P + 0.5 * (f - (P - J) * x - (v - T) * C - r) * x; |
| this.m_points[s].y = v + 0.5 * (f - (P - J) * x - (v - T) * C - r) * C |
| } |
| break; |
| case E.e_faceB: |
| t = m.R; |
| v = b.m_localPlaneNormal; |
| x = t.col1.x * v.x + t.col2.x * v.y; |
| C = t.col1.y * v.x + t.col2.y * v.y; |
| t = m.R; |
| v = b.m_localPoint; |
| J = m.position.x + t.col1.x * v.x + t.col2.x * v.y; |
| T = m.position.y + t.col1.y * v.x + t.col2.y * v.y; |
| this.m_normal.x = -x; |
| this.m_normal.y = -C; |
| for (s = 0; s < b.m_pointCount; s++) { |
| t = e.R; |
| v = b.m_points[s].m_localPoint; |
| P = e.position.x + t.col1.x * v.x + t.col2.x * v.y; |
| v = e.position.y + t.col1.y * v.x + t.col2.y * v.y; |
| this.m_points[s].x = P + 0.5 * (r - (P - J) * x - (v - T) * C - f) * x; |
| this.m_points[s].y = v + 0.5 * (r - (P - J) * x - (v - T) * C - f) * C |
| } |
| } |
| } |
| }; |
| a.ClipVertex = function () { |
| this.v = new p; |
| this.id = new L |
| }; |
| a.prototype.Set = function (b) { |
| this.v.SetV(b.v); |
| this.id.Set(b.id) |
| }; |
| c.Features = function () {}; |
| Object.defineProperty(c.prototype, "referenceEdge", { |
| enumerable: false, |
| configurable: true, |
| get: function () { |
| return this._referenceEdge |
| } |
| }); |
| Object.defineProperty(c.prototype, "referenceEdge", { |
| enumerable: false, |
| configurable: true, |
| set: function (b) { |
| if (b === undefined) b = 0; |
| this._referenceEdge = b; |
| this._m_id._key = this._m_id._key & 4294967040 | this._referenceEdge & 255 |
| } |
| }); |
| Object.defineProperty(c.prototype, "incidentEdge", { |
| enumerable: false, |
| configurable: true, |
| get: function () { |
| return this._incidentEdge |
| } |
| }); |
| Object.defineProperty(c.prototype, |
| "incidentEdge", { |
| enumerable: false, |
| configurable: true, |
| set: function (b) { |
| if (b === undefined) b = 0; |
| this._incidentEdge = b; |
| this._m_id._key = this._m_id._key & 4294902015 | this._incidentEdge << 8 & 65280 |
| } |
| }); |
| Object.defineProperty(c.prototype, "incidentVertex", { |
| enumerable: false, |
| configurable: true, |
| get: function () { |
| return this._incidentVertex |
| } |
| }); |
| Object.defineProperty(c.prototype, "incidentVertex", { |
| enumerable: false, |
| configurable: true, |
| set: function (b) { |
| if (b === undefined) b = 0; |
| this._incidentVertex = b; |
| this._m_id._key = this._m_id._key & 4278255615 | |
| this._incidentVertex << 16 & 16711680 |
| } |
| }); |
| Object.defineProperty(c.prototype, "flip", { |
| enumerable: false, |
| configurable: true, |
| get: function () { |
| return this._flip |
| } |
| }); |
| Object.defineProperty(c.prototype, "flip", { |
| enumerable: false, |
| configurable: true, |
| set: function (b) { |
| if (b === undefined) b = 0; |
| this._flip = b; |
| this._m_id._key = this._m_id._key & 16777215 | this._flip << 24 & 4278190080 |
| } |
| }) |
| })(); |
| (function () { |
| var F = Box2D.Common.b2Settings, |
| G = Box2D.Collision.Shapes.b2CircleShape, |
| K = Box2D.Collision.Shapes.b2EdgeChainDef, |
| y = Box2D.Collision.Shapes.b2EdgeShape, |
| w = Box2D.Collision.Shapes.b2MassData, |
| A = Box2D.Collision.Shapes.b2PolygonShape, |
| U = Box2D.Collision.Shapes.b2Shape, |
| p = Box2D.Common.Math.b2Mat22, |
| B = Box2D.Common.Math.b2Math, |
| Q = Box2D.Common.Math.b2Transform, |
| V = Box2D.Common.Math.b2Vec2, |
| M = Box2D.Collision.b2Distance, |
| L = Box2D.Collision.b2DistanceInput, |
| I = Box2D.Collision.b2DistanceOutput, |
| W = Box2D.Collision.b2DistanceProxy, |
| Y = Box2D.Collision.b2SimplexCache; |
| Box2D.inherit(G, Box2D.Collision.Shapes.b2Shape); |
| G.prototype.__super = Box2D.Collision.Shapes.b2Shape.prototype; |
| G.b2CircleShape = function () { |
| Box2D.Collision.Shapes.b2Shape.b2Shape.apply(this, arguments); |
| this.m_p = new V |
| }; |
| G.prototype.Copy = function () { |
| var k = new G; |
| k.Set(this); |
| return k |
| }; |
| G.prototype.Set = function (k) { |
| this.__super.Set.call(this, k); |
| if (Box2D.is(k, G)) this.m_p.SetV((k instanceof G ? k : null).m_p) |
| }; |
| G.prototype.TestPoint = function (k, z) { |
| var u = k.R, |
| D = k.position.x + (u.col1.x * this.m_p.x + u.col2.x * this.m_p.y); |
| u = k.position.y + (u.col1.y * this.m_p.x + u.col2.y * this.m_p.y); |
| D = z.x - D; |
| u = z.y - u; |
| return D * D + u * u <= this.m_radius * this.m_radius |
| }; |
| G.prototype.RayCast = function (k, z, u) { |
| var D = u.R, |
| H = z.p1.x - (u.position.x + (D.col1.x * this.m_p.x + D.col2.x * this.m_p.y)); |
| u = z.p1.y - (u.position.y + (D.col1.y * this.m_p.x + D.col2.y * this.m_p.y)); |
| D = z.p2.x - z.p1.x; |
| var O = z.p2.y - z.p1.y, |
| E = H * D + u * O, |
| R = D * D + O * O, |
| N = E * E - R * (H * H + u * u - this.m_radius * this.m_radius); |
| if (N < 0 || R < Number.MIN_VALUE) return false; |
| E = -(E + Math.sqrt(N)); |
| if (0 <= E && E <= z.maxFraction * R) { |
| E /= R; |
| k.fraction = E; |
| k.normal.x = H + E * D; |
| k.normal.y = u + E * O; |
| k.normal.Normalize(); |
| return true |
| } |
| return false |
| }; |
| G.prototype.ComputeAABB = function (k, z) { |
| var u = z.R, |
| D = z.position.x + (u.col1.x * this.m_p.x + u.col2.x * this.m_p.y); |
| u = z.position.y + (u.col1.y * this.m_p.x + u.col2.y * this.m_p.y); |
| k.lowerBound.Set(D - this.m_radius, u - this.m_radius); |
| k.upperBound.Set(D + this.m_radius, u + this.m_radius) |
| }; |
| G.prototype.ComputeMass = function (k, z) { |
| if (z === undefined) z = 0; |
| k.mass = z * F.b2_pi * this.m_radius * this.m_radius; |
| k.center.SetV(this.m_p); |
| k.I = k.mass * (0.5 * this.m_radius * this.m_radius + (this.m_p.x * this.m_p.x + this.m_p.y * this.m_p.y)) |
| }; |
| G.prototype.ComputeSubmergedArea = function (k, z, u, D) { |
| if (z === undefined) z = 0; |
| u = B.MulX(u, this.m_p); |
| var H = -(B.Dot(k, u) - z); |
| if (H < -this.m_radius + Number.MIN_VALUE) return 0; |
| if (H > this.m_radius) { |
| D.SetV(u); |
| return Math.PI * this.m_radius * this.m_radius |
| } |
| z = this.m_radius * this.m_radius; |
| var O = H * H; |
| H = z * (Math.asin(H / this.m_radius) + Math.PI / 2) + H * Math.sqrt(z - O); |
| z = -2 / 3 * Math.pow(z - O, 1.5) / H; |
| D.x = u.x + k.x * z; |
| D.y = u.y + k.y * z; |
| return H |
| }; |
| G.prototype.GetLocalPosition = function () { |
| return this.m_p |
| }; |
| G.prototype.SetLocalPosition = function (k) { |
| this.m_p.SetV(k) |
| }; |
| G.prototype.GetRadius = function () { |
| return this.m_radius |
| }; |
| G.prototype.SetRadius = function (k) { |
| if (k === undefined) k = 0; |
| this.m_radius = k |
| }; |
| G.prototype.b2CircleShape = function (k) { |
| if (k === undefined) k = 0; |
| this.__super.b2Shape.call(this); |
| this.m_type = U.e_circleShape; |
| this.m_radius = k |
| }; |
| K.b2EdgeChainDef = function () {}; |
| K.prototype.b2EdgeChainDef = function () { |
| this.vertexCount = 0; |
| this.isALoop = true; |
| this.vertices = [] |
| }; |
| Box2D.inherit(y, Box2D.Collision.Shapes.b2Shape); |
| y.prototype.__super = Box2D.Collision.Shapes.b2Shape.prototype; |
| y.b2EdgeShape = function () { |
| Box2D.Collision.Shapes.b2Shape.b2Shape.apply(this, arguments); |
| this.s_supportVec = new V; |
| this.m_v1 = new V; |
| this.m_v2 = new V; |
| this.m_coreV1 = new V; |
| this.m_coreV2 = new V; |
| this.m_normal = new V; |
| this.m_direction = new V; |
| this.m_cornerDir1 = new V; |
| this.m_cornerDir2 = new V |
| }; |
| y.prototype.TestPoint = function () { |
| return false |
| }; |
| y.prototype.RayCast = function (k, z, u) { |
| var D, H = z.p2.x - z.p1.x, |
| O = z.p2.y - z.p1.y; |
| D = u.R; |
| var E = u.position.x + (D.col1.x * this.m_v1.x + D.col2.x * this.m_v1.y), |
| R = u.position.y + (D.col1.y * this.m_v1.x + D.col2.y * this.m_v1.y), |
| N = u.position.y + (D.col1.y * this.m_v2.x + D.col2.y * this.m_v2.y) - R; |
| u = -(u.position.x + (D.col1.x * this.m_v2.x + D.col2.x * this.m_v2.y) - E); |
| D = 100 * Number.MIN_VALUE; |
| var S = -(H * N + O * u); |
| if (S > D) { |
| E = z.p1.x - E; |
| var aa = z.p1.y - R; |
| R = E * N + aa * u; |
| if (0 <= R && R <= z.maxFraction * S) { |
| z = -H * aa + O * E; |
| if (-D * S <= z && z <= S * (1 + D)) { |
| R /= S; |
| k.fraction = R; |
| z = Math.sqrt(N * N + u * u); |
| k.normal.x = N / z; |
| k.normal.y = u / z; |
| return true |
| } |
| } |
| } |
| return false |
| }; |
| y.prototype.ComputeAABB = function (k, z) { |
| var u = z.R, |
| D = z.position.x + (u.col1.x * this.m_v1.x + u.col2.x * this.m_v1.y), |
| H = z.position.y + (u.col1.y * this.m_v1.x + u.col2.y * this.m_v1.y), |
| O = z.position.x + (u.col1.x * this.m_v2.x + u.col2.x * this.m_v2.y); |
| u = z.position.y + (u.col1.y * this.m_v2.x + u.col2.y * this.m_v2.y); |
| if (D < O) { |
| k.lowerBound.x = D; |
| k.upperBound.x = O |
| } else { |
| k.lowerBound.x = O; |
| k.upperBound.x = D |
| } if (H < u) { |
| k.lowerBound.y = H; |
| k.upperBound.y = u |
| } else { |
| k.lowerBound.y = u; |
| k.upperBound.y = H |
| } |
| }; |
| y.prototype.ComputeMass = function (k) { |
| k.mass = 0; |
| k.center.SetV(this.m_v1); |
| k.I = 0 |
| }; |
| y.prototype.ComputeSubmergedArea = function (k, z, u, D) { |
| if (z === undefined) z = 0; |
| var H = new V(k.x * z, k.y * z), |
| O = B.MulX(u, this.m_v1); |
| u = B.MulX(u, this.m_v2); |
| var E = B.Dot(k, O) - z; |
| k = B.Dot(k, u) - z; |
| if (E > 0) |
| if (k > 0) return 0; |
| else { |
| O.x = -k / (E - k) * O.x + E / (E - k) * u.x; |
| O.y = -k / (E - k) * O.y + E / (E - k) * u.y |
| } else if (k > 0) { |
| u.x = -k / (E - k) * O.x + E / (E - k) * u.x; |
| u.y = -k / (E - k) * O.y + E / (E - k) * u.y |
| } |
| D.x = (H.x + O.x + u.x) / 3; |
| D.y = (H.y + O.y + u.y) / 3; |
| return 0.5 * ((O.x - H.x) * (u.y - H.y) - (O.y - H.y) * (u.x - H.x)) |
| }; |
| y.prototype.GetLength = function () { |
| return this.m_length |
| }; |
| y.prototype.GetVertex1 = function () { |
| return this.m_v1 |
| }; |
| y.prototype.GetVertex2 = function () { |
| return this.m_v2 |
| }; |
| y.prototype.GetCoreVertex1 = function () { |
| return this.m_coreV1 |
| }; |
| y.prototype.GetCoreVertex2 = function () { |
| return this.m_coreV2 |
| }; |
| y.prototype.GetNormalVector = function () { |
| return this.m_normal |
| }; |
| y.prototype.GetDirectionVector = function () { |
| return this.m_direction |
| }; |
| y.prototype.GetCorner1Vector = function () { |
| return this.m_cornerDir1 |
| }; |
| y.prototype.GetCorner2Vector = function () { |
| return this.m_cornerDir2 |
| }; |
| y.prototype.Corner1IsConvex = function () { |
| return this.m_cornerConvex1 |
| }; |
| y.prototype.Corner2IsConvex = function () { |
| return this.m_cornerConvex2 |
| }; |
| y.prototype.GetFirstVertex = function (k) { |
| var z = k.R; |
| return new V(k.position.x + (z.col1.x * this.m_coreV1.x + z.col2.x * this.m_coreV1.y), k.position.y + (z.col1.y * this.m_coreV1.x + z.col2.y * this.m_coreV1.y)) |
| }; |
| y.prototype.GetNextEdge = function () { |
| return this.m_nextEdge |
| }; |
| y.prototype.GetPrevEdge = function () { |
| return this.m_prevEdge |
| }; |
| y.prototype.Support = function (k, z, u) { |
| if (z === undefined) z = 0; |
| if (u === undefined) u = 0; |
| var D = k.R, |
| H = k.position.x + (D.col1.x * this.m_coreV1.x + D.col2.x * this.m_coreV1.y), |
| O = k.position.y + (D.col1.y * this.m_coreV1.x + D.col2.y * this.m_coreV1.y), |
| E = k.position.x + (D.col1.x * this.m_coreV2.x + D.col2.x * this.m_coreV2.y); |
| k = k.position.y + (D.col1.y * this.m_coreV2.x + D.col2.y * this.m_coreV2.y); |
| if (H * z + O * u > E * z + k * u) { |
| this.s_supportVec.x = H; |
| this.s_supportVec.y = O |
| } else { |
| this.s_supportVec.x = E; |
| this.s_supportVec.y = k |
| } |
| return this.s_supportVec |
| }; |
| y.prototype.b2EdgeShape = function (k, z) { |
| this.__super.b2Shape.call(this); |
| this.m_type = U.e_edgeShape; |
| this.m_nextEdge = this.m_prevEdge = null; |
| this.m_v1 = k; |
| this.m_v2 = z; |
| this.m_direction.Set(this.m_v2.x - this.m_v1.x, this.m_v2.y - this.m_v1.y); |
| this.m_length = this.m_direction.Normalize(); |
| this.m_normal.Set(this.m_direction.y, -this.m_direction.x); |
| this.m_coreV1.Set(-F.b2_toiSlop * (this.m_normal.x - this.m_direction.x) + this.m_v1.x, -F.b2_toiSlop * (this.m_normal.y - this.m_direction.y) + this.m_v1.y); |
| this.m_coreV2.Set(-F.b2_toiSlop * (this.m_normal.x + this.m_direction.x) + this.m_v2.x, -F.b2_toiSlop * (this.m_normal.y + this.m_direction.y) + this.m_v2.y); |
| this.m_cornerDir1 = this.m_normal; |
| this.m_cornerDir2.Set(-this.m_normal.x, -this.m_normal.y) |
| }; |
| y.prototype.SetPrevEdge = function (k, z, u, D) { |
| this.m_prevEdge = k; |
| this.m_coreV1 = z; |
| this.m_cornerDir1 = u; |
| this.m_cornerConvex1 = D |
| }; |
| y.prototype.SetNextEdge = function (k, z, u, D) { |
| this.m_nextEdge = k; |
| this.m_coreV2 = z; |
| this.m_cornerDir2 = u; |
| this.m_cornerConvex2 = D |
| }; |
| w.b2MassData = function () { |
| this.mass = 0; |
| this.center = new V(0, 0); |
| this.I = 0 |
| }; |
| Box2D.inherit(A, Box2D.Collision.Shapes.b2Shape); |
| A.prototype.__super = Box2D.Collision.Shapes.b2Shape.prototype; |
| A.b2PolygonShape = function () { |
| Box2D.Collision.Shapes.b2Shape.b2Shape.apply(this, arguments) |
| }; |
| A.prototype.Copy = function () { |
| var k = new A; |
| k.Set(this); |
| return k |
| }; |
| A.prototype.Set = function (k) { |
| this.__super.Set.call(this, k); |
| if (Box2D.is(k, A)) { |
| k = k instanceof A ? k : null; |
| this.m_centroid.SetV(k.m_centroid); |
| this.m_vertexCount = k.m_vertexCount; |
| this.Reserve(this.m_vertexCount); |
| for (var z = 0; z < this.m_vertexCount; z++) { |
| this.m_vertices[z].SetV(k.m_vertices[z]); |
| this.m_normals[z].SetV(k.m_normals[z]) |
| } |
| } |
| }; |
| A.prototype.SetAsArray = function (k, z) { |
| if (z === undefined) z = 0; |
| var u = new Vector, |
| D = 0, |
| H; |
| for (D = 0; D < k.length; ++D) { |
| H = k[D]; |
| u.push(H) |
| } |
| this.SetAsVector(u, |
| z) |
| }; |
| A.AsArray = function (k, z) { |
| if (z === undefined) z = 0; |
| var u = new A; |
| u.SetAsArray(k, z); |
| return u |
| }; |
| A.prototype.SetAsVector = function (k, z) { |
| if (z === undefined) z = 0; |
| if (z == 0) z = k.length; |
| F.b2Assert(2 <= z); |
| this.m_vertexCount = z; |
| this.Reserve(z); |
| var u = 0; |
| for (u = 0; u < this.m_vertexCount; u++) this.m_vertices[u].SetV(k[u]); |
| for (u = 0; u < this.m_vertexCount; ++u) { |
| var D = parseInt(u), |
| H = parseInt(u + 1 < this.m_vertexCount ? u + 1 : 0); |
| D = B.SubtractVV(this.m_vertices[H], this.m_vertices[D]); |
| F.b2Assert(D.LengthSquared() > Number.MIN_VALUE); |
| this.m_normals[u].SetV(B.CrossVF(D, |
| 1)); |
| this.m_normals[u].Normalize() |
| } |
| this.m_centroid = A.ComputeCentroid(this.m_vertices, this.m_vertexCount) |
| }; |
| A.AsVector = function (k, z) { |
| if (z === undefined) z = 0; |
| var u = new A; |
| u.SetAsVector(k, z); |
| return u |
| }; |
| A.prototype.SetAsBox = function (k, z) { |
| if (k === undefined) k = 0; |
| if (z === undefined) z = 0; |
| this.m_vertexCount = 4; |
| this.Reserve(4); |
| this.m_vertices[0].Set(-k, -z); |
| this.m_vertices[1].Set(k, -z); |
| this.m_vertices[2].Set(k, z); |
| this.m_vertices[3].Set(-k, z); |
| this.m_normals[0].Set(0, -1); |
| this.m_normals[1].Set(1, 0); |
| this.m_normals[2].Set(0, |
| 1); |
| this.m_normals[3].Set(-1, 0); |
| this.m_centroid.SetZero() |
| }; |
| A.AsBox = function (k, z) { |
| if (k === undefined) k = 0; |
| if (z === undefined) z = 0; |
| var u = new A; |
| u.SetAsBox(k, z); |
| return u |
| }; |
| A.prototype.SetAsOrientedBox = function (k, z, u, D) { |
| if (k === undefined) k = 0; |
| if (z === undefined) z = 0; |
| if (u === undefined) u = null; |
| if (D === undefined) D = 0; |
| this.m_vertexCount = 4; |
| this.Reserve(4); |
| this.m_vertices[0].Set(-k, -z); |
| this.m_vertices[1].Set(k, -z); |
| this.m_vertices[2].Set(k, z); |
| this.m_vertices[3].Set(-k, z); |
| this.m_normals[0].Set(0, -1); |
| this.m_normals[1].Set(1, 0); |
| this.m_normals[2].Set(0, 1); |
| this.m_normals[3].Set(-1, 0); |
| this.m_centroid = u; |
| k = new Q; |
| k.position = u; |
| k.R.Set(D); |
| for (u = 0; u < this.m_vertexCount; ++u) { |
| this.m_vertices[u] = B.MulX(k, this.m_vertices[u]); |
| this.m_normals[u] = B.MulMV(k.R, this.m_normals[u]) |
| } |
| }; |
| A.AsOrientedBox = function (k, z, u, D) { |
| if (k === undefined) k = 0; |
| if (z === undefined) z = 0; |
| if (u === undefined) u = null; |
| if (D === undefined) D = 0; |
| var H = new A; |
| H.SetAsOrientedBox(k, z, u, D); |
| return H |
| }; |
| A.prototype.SetAsEdge = function (k, z) { |
| this.m_vertexCount = 2; |
| this.Reserve(2); |
| this.m_vertices[0].SetV(k); |
| this.m_vertices[1].SetV(z); |
| this.m_centroid.x = 0.5 * (k.x + z.x); |
| this.m_centroid.y = 0.5 * (k.y + z.y); |
| this.m_normals[0] = B.CrossVF(B.SubtractVV(z, k), 1); |
| this.m_normals[0].Normalize(); |
| this.m_normals[1].x = -this.m_normals[0].x; |
| this.m_normals[1].y = -this.m_normals[0].y |
| }; |
| A.AsEdge = function (k, z) { |
| var u = new A; |
| u.SetAsEdge(k, z); |
| return u |
| }; |
| A.prototype.TestPoint = function (k, z) { |
| var u; |
| u = k.R; |
| for (var D = z.x - k.position.x, H = z.y - k.position.y, O = D * u.col1.x + H * u.col1.y, E = D * u.col2.x + H * u.col2.y, R = 0; R < this.m_vertexCount; ++R) { |
| u = this.m_vertices[R]; |
| D = O - u.x; |
| H = E - u.y; |
| u = this.m_normals[R]; |
| if (u.x * D + u.y * H > 0) return false |
| } |
| return true |
| }; |
| A.prototype.RayCast = function (k, z, u) { |
| var D = 0, |
| H = z.maxFraction, |
| O = 0, |
| E = 0, |
| R, N; |
| O = z.p1.x - u.position.x; |
| E = z.p1.y - u.position.y; |
| R = u.R; |
| var S = O * R.col1.x + E * R.col1.y, |
| aa = O * R.col2.x + E * R.col2.y; |
| O = z.p2.x - u.position.x; |
| E = z.p2.y - u.position.y; |
| R = u.R; |
| z = O * R.col1.x + E * R.col1.y - S; |
| R = O * R.col2.x + E * R.col2.y - aa; |
| for (var Z = parseInt(-1), d = 0; d < this.m_vertexCount; ++d) { |
| N = this.m_vertices[d]; |
| O = N.x - S; |
| E = N.y - aa; |
| N = this.m_normals[d]; |
| O = N.x * O + N.y * E; |
| E = N.x * z + N.y * R; |
| if (E == 0) { |
| if (O < 0) return false |
| } else if (E < 0 && O < D * E) { |
| D = O / E; |
| Z = d |
| } else if (E > 0 && O < H * E) H = O / E; |
| if (H < D - Number.MIN_VALUE) return false |
| } |
| if (Z >= 0) { |
| k.fraction = D; |
| R = u.R; |
| N = this.m_normals[Z]; |
| k.normal.x = R.col1.x * N.x + R.col2.x * N.y; |
| k.normal.y = R.col1.y * N.x + R.col2.y * N.y; |
| return true |
| } |
| return false |
| }; |
| A.prototype.ComputeAABB = function (k, z) { |
| for (var u = z.R, D = this.m_vertices[0], H = z.position.x + (u.col1.x * D.x + u.col2.x * D.y), O = z.position.y + (u.col1.y * D.x + u.col2.y * D.y), E = H, R = O, N = 1; N < this.m_vertexCount; ++N) { |
| D = this.m_vertices[N]; |
| var S = z.position.x + (u.col1.x * D.x + u.col2.x * D.y); |
| D = z.position.y + (u.col1.y * D.x + u.col2.y * D.y); |
| H = H < S ? H : S; |
| O = O < D ? O : D; |
| E = E > S ? E : S; |
| R = R > D ? R : D |
| } |
| k.lowerBound.x = H - this.m_radius; |
| k.lowerBound.y = O - this.m_radius; |
| k.upperBound.x = E + this.m_radius; |
| k.upperBound.y = R + this.m_radius |
| }; |
| A.prototype.ComputeMass = function (k, z) { |
| if (z === undefined) z = 0; |
| if (this.m_vertexCount == 2) { |
| k.center.x = 0.5 * (this.m_vertices[0].x + this.m_vertices[1].x); |
| k.center.y = 0.5 * (this.m_vertices[0].y + this.m_vertices[1].y); |
| k.mass = 0; |
| k.I = 0 |
| } else { |
| for (var u = 0, D = 0, H = 0, O = 0, E = 1 / 3, R = 0; R < this.m_vertexCount; ++R) { |
| var N = this.m_vertices[R], |
| S = R + 1 < this.m_vertexCount ? this.m_vertices[parseInt(R + 1)] : this.m_vertices[0], |
| aa = N.x - 0, |
| Z = N.y - 0, |
| d = S.x - 0, |
| h = S.y - 0, |
| l = aa * h - Z * d, |
| j = 0.5 * l; |
| H += j; |
| u += j * E * (0 + N.x + S.x); |
| D += j * E * (0 + N.y + S.y); |
| N = aa; |
| Z = Z; |
| d = d; |
| h = h; |
| O += l * (E * (0.25 * (N * N + d * N + d * d) + (0 * N + 0 * d)) + 0 + (E * (0.25 * (Z * Z + h * Z + h * h) + (0 * Z + 0 * h)) + 0)) |
| } |
| k.mass = z * H; |
| u *= 1 / H; |
| D *= 1 / H; |
| k.center.Set(u, D); |
| k.I = z * O |
| } |
| }; |
| A.prototype.ComputeSubmergedArea = function (k, z, u, D) { |
| if (z === undefined) z = 0; |
| var H = B.MulTMV(u.R, k), |
| O = z - B.Dot(k, u.position), |
| E = new Vector_a2j_Number, |
| R = 0, |
| N = parseInt(-1); |
| z = parseInt(-1); |
| var S = false; |
| for (k = k = 0; k < this.m_vertexCount; ++k) { |
| E[k] = B.Dot(H, this.m_vertices[k]) - O; |
| var aa = E[k] < -Number.MIN_VALUE; |
| if (k > 0) |
| if (aa) { |
| if (!S) { |
| N = k - 1; |
| R++ |
| } |
| } else if (S) { |
| z = k - 1; |
| R++ |
| } |
| S = aa |
| } |
| switch (R) { |
| case 0: |
| if (S) { |
| k = new w; |
| this.ComputeMass(k, 1); |
| D.SetV(B.MulX(u, k.center)); |
| return k.mass |
| } else return 0; |
| case 1: |
| if (N == -1) N = this.m_vertexCount - 1; |
| else z = this.m_vertexCount - 1 |
| } |
| k = parseInt((N + 1) % this.m_vertexCount); |
| H = parseInt((z + 1) % this.m_vertexCount); |
| O = (0 - E[N]) / (E[k] - E[N]); |
| E = (0 - E[z]) / (E[H] - E[z]); |
| N = new V(this.m_vertices[N].x * (1 - O) + this.m_vertices[k].x * O, this.m_vertices[N].y * (1 - O) + this.m_vertices[k].y * O); |
| z = new V(this.m_vertices[z].x * (1 - E) + this.m_vertices[H].x * E, this.m_vertices[z].y * (1 - E) + this.m_vertices[H].y * E); |
| E = 0; |
| O = new V; |
| R = this.m_vertices[k]; |
| for (k = k; k != H;) { |
| k = (k + 1) % this.m_vertexCount; |
| S = k == H ? z : this.m_vertices[k]; |
| aa = 0.5 * ((R.x - N.x) * (S.y - N.y) - (R.y - N.y) * (S.x - N.x)); |
| E += aa; |
| O.x += aa * (N.x + R.x + S.x) / 3; |
| O.y += aa * (N.y + R.y + S.y) / 3; |
| R = S |
| } |
| O.Multiply(1 / E); |
| D.SetV(B.MulX(u, O)); |
| return E |
| }; |
| A.prototype.GetVertexCount = function () { |
| return this.m_vertexCount |
| }; |
| A.prototype.GetVertices = function () { |
| return this.m_vertices |
| }; |
| A.prototype.GetNormals = function () { |
| return this.m_normals |
| }; |
| A.prototype.GetSupport = function (k) { |
| for (var z = 0, u = this.m_vertices[0].x * k.x + this.m_vertices[0].y * k.y, D = 1; D < this.m_vertexCount; ++D) { |
| var H = this.m_vertices[D].x * k.x + this.m_vertices[D].y * k.y; |
| if (H > u) { |
| z = D; |
| u = H |
| } |
| } |
| return z |
| }; |
| A.prototype.GetSupportVertex = function (k) { |
| for (var z = 0, u = this.m_vertices[0].x * k.x + this.m_vertices[0].y * k.y, D = 1; D < this.m_vertexCount; ++D) { |
| var H = this.m_vertices[D].x * k.x + this.m_vertices[D].y * k.y; |
| if (H > u) { |
| z = D; |
| u = H |
| } |
| } |
| return this.m_vertices[z] |
| }; |
| A.prototype.Validate = function () { |
| return false |
| }; |
| A.prototype.b2PolygonShape = function () { |
| this.__super.b2Shape.call(this); |
| this.m_type = U.e_polygonShape; |
| this.m_centroid = new V; |
| this.m_vertices = new Vector; |
| this.m_normals = new Vector |
| }; |
| A.prototype.Reserve = function (k) { |
| if (k === undefined) k = 0; |
| for (var z = parseInt(this.m_vertices.length); z < k; z++) { |
| this.m_vertices[z] = new V; |
| this.m_normals[z] = new V |
| } |
| }; |
| A.ComputeCentroid = function (k, z) { |
| if (z === undefined) z = 0; |
| for (var u = new V, D = 0, H = 1 / 3, O = 0; O < z; ++O) { |
| var E = k[O], |
| R = O + 1 < z ? k[parseInt(O + 1)] : k[0], |
| N = 0.5 * ((E.x - 0) * (R.y - 0) - (E.y - 0) * (R.x - 0)); |
| D += N; |
| u.x += N * H * (0 + E.x + R.x); |
| u.y += N * H * (0 + E.y + R.y) |
| } |
| u.x *= 1 / D; |
| u.y *= 1 / D; |
| return u |
| }; |
| A.ComputeOBB = function (k, z, u) { |
| if (u === undefined) u = 0; |
| var D = 0, |
| H = new Vector(u + 1); |
| for (D = 0; D < u; ++D) H[D] = z[D]; |
| H[u] = H[0]; |
| z = Number.MAX_VALUE; |
| for (D = 1; D <= u; ++D) { |
| var O = H[parseInt(D - 1)], |
| E = H[D].x - O.x, |
| R = H[D].y - O.y, |
| N = Math.sqrt(E * E + R * R); |
| E /= N; |
| R /= N; |
| for (var S = -R, aa = E, Z = N = Number.MAX_VALUE, d = -Number.MAX_VALUE, h = -Number.MAX_VALUE, l = 0; l < u; ++l) { |
| var j = H[l].x - O.x, |
| o = H[l].y - O.y, |
| q = E * j + R * o; |
| j = S * j + aa * o; |
| if (q < N) N = q; |
| if (j < Z) Z = j; |
| if (q > d) d = q; |
| if (j > h) h = j |
| } |
| l = (d - N) * (h - Z); |
| if (l < 0.95 * z) { |
| z = l; |
| k.R.col1.x = E; |
| k.R.col1.y = R; |
| k.R.col2.x = S; |
| k.R.col2.y = aa; |
| E = 0.5 * (N + d); |
| R = 0.5 * (Z + h); |
| S = k.R; |
| k.center.x = O.x + (S.col1.x * E + S.col2.x * R); |
| k.center.y = O.y + (S.col1.y * E + S.col2.y * R); |
| k.extents.x = 0.5 * (d - N); |
| k.extents.y = 0.5 * (h - Z) |
| } |
| } |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Collision.Shapes.b2PolygonShape.s_mat = new p |
| }); |
| U.b2Shape = function () {}; |
| U.prototype.Copy = function () { |
| return null |
| }; |
| U.prototype.Set = function (k) { |
| this.m_radius = k.m_radius |
| }; |
| U.prototype.GetType = function () { |
| return this.m_type |
| }; |
| U.prototype.TestPoint = function () { |
| return false |
| }; |
| U.prototype.RayCast = function () { |
| return false |
| }; |
| U.prototype.ComputeAABB = function () {}; |
| U.prototype.ComputeMass = function () {}; |
| U.prototype.ComputeSubmergedArea = function () { |
| return 0 |
| }; |
| U.TestOverlap = function (k, z, u, D) { |
| var H = new L; |
| H.proxyA = new W; |
| H.proxyA.Set(k); |
| H.proxyB = new W; |
| H.proxyB.Set(u); |
| H.transformA = z; |
| H.transformB = D; |
| H.useRadii = true; |
| k = new Y; |
| k.count = 0; |
| z = new I; |
| M.Distance(z, k, H); |
| return z.distance < 10 * Number.MIN_VALUE |
| }; |
| U.prototype.b2Shape = function () { |
| this.m_type = U.e_unknownShape; |
| this.m_radius = F.b2_linearSlop |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Collision.Shapes.b2Shape.e_unknownShape = parseInt(-1); |
| Box2D.Collision.Shapes.b2Shape.e_circleShape = 0; |
| Box2D.Collision.Shapes.b2Shape.e_polygonShape = 1; |
| Box2D.Collision.Shapes.b2Shape.e_edgeShape = 2; |
| Box2D.Collision.Shapes.b2Shape.e_shapeTypeCount = 3; |
| Box2D.Collision.Shapes.b2Shape.e_hitCollide = 1; |
| Box2D.Collision.Shapes.b2Shape.e_missCollide = 0; |
| Box2D.Collision.Shapes.b2Shape.e_startsInsideCollide = parseInt(-1) |
| }) |
| })(); |
| (function () { |
| var F = Box2D.Common.b2Color, |
| G = Box2D.Common.b2Settings, |
| K = Box2D.Common.Math.b2Math; |
| F.b2Color = function () { |
| this._b = this._g = this._r = 0 |
| }; |
| F.prototype.b2Color = function (y, w, A) { |
| if (y === undefined) y = 0; |
| if (w === undefined) w = 0; |
| if (A === undefined) A = 0; |
| this._r = Box2D.parseUInt(255 * K.Clamp(y, 0, 1)); |
| this._g = Box2D.parseUInt(255 * K.Clamp(w, 0, 1)); |
| this._b = Box2D.parseUInt(255 * K.Clamp(A, 0, 1)) |
| }; |
| F.prototype.Set = function (y, w, A) { |
| if (y === undefined) y = 0; |
| if (w === undefined) w = 0; |
| if (A === undefined) A = 0; |
| this._r = Box2D.parseUInt(255 * K.Clamp(y, |
| 0, 1)); |
| this._g = Box2D.parseUInt(255 * K.Clamp(w, 0, 1)); |
| this._b = Box2D.parseUInt(255 * K.Clamp(A, 0, 1)) |
| }; |
| Object.defineProperty(F.prototype, "r", { |
| enumerable: false, |
| configurable: true, |
| set: function (y) { |
| if (y === undefined) y = 0; |
| this._r = Box2D.parseUInt(255 * K.Clamp(y, 0, 1)) |
| } |
| }); |
| Object.defineProperty(F.prototype, "g", { |
| enumerable: false, |
| configurable: true, |
| set: function (y) { |
| if (y === undefined) y = 0; |
| this._g = Box2D.parseUInt(255 * K.Clamp(y, 0, 1)) |
| } |
| }); |
| Object.defineProperty(F.prototype, "b", { |
| enumerable: false, |
| configurable: true, |
| set: function (y) { |
| if (y === undefined) y = 0; |
| this._b = Box2D.parseUInt(255 * K.Clamp(y, 0, 1)) |
| } |
| }); |
| Object.defineProperty(F.prototype, "color", { |
| enumerable: false, |
| configurable: true, |
| get: function () { |
| return this._r << 16 | this._g << 8 | this._b |
| } |
| }); |
| G.b2Settings = function () {}; |
| G.b2MixFriction = function (y, w) { |
| if (y === undefined) y = 0; |
| if (w === undefined) w = 0; |
| return Math.sqrt(y * w) |
| }; |
| G.b2MixRestitution = function (y, w) { |
| if (y === undefined) y = 0; |
| if (w === undefined) w = 0; |
| return y > w ? y : w |
| }; |
| G.b2Assert = function (y) { |
| if (!y) throw "Assertion Failed"; |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Common.b2Settings.VERSION = "2.1alpha"; |
| Box2D.Common.b2Settings.USHRT_MAX = 65535; |
| Box2D.Common.b2Settings.b2_pi = Math.PI; |
| Box2D.Common.b2Settings.b2_maxManifoldPoints = 2; |
| Box2D.Common.b2Settings.b2_aabbExtension = 0.1; |
| Box2D.Common.b2Settings.b2_aabbMultiplier = 2; |
| Box2D.Common.b2Settings.b2_polygonRadius = 2 * G.b2_linearSlop; |
| Box2D.Common.b2Settings.b2_linearSlop = 0.0050; |
| Box2D.Common.b2Settings.b2_angularSlop = 2 / 180 * G.b2_pi; |
| Box2D.Common.b2Settings.b2_toiSlop = 8 * G.b2_linearSlop; |
| Box2D.Common.b2Settings.b2_maxTOIContactsPerIsland = 32; |
| Box2D.Common.b2Settings.b2_maxTOIJointsPerIsland = 32; |
| Box2D.Common.b2Settings.b2_velocityThreshold = 1; |
| Box2D.Common.b2Settings.b2_maxLinearCorrection = 0.2; |
| Box2D.Common.b2Settings.b2_maxAngularCorrection = 8 / 180 * G.b2_pi; |
| Box2D.Common.b2Settings.b2_maxTranslation = 2; |
| Box2D.Common.b2Settings.b2_maxTranslationSquared = G.b2_maxTranslation * G.b2_maxTranslation; |
| Box2D.Common.b2Settings.b2_maxRotation = 0.5 * G.b2_pi; |
| Box2D.Common.b2Settings.b2_maxRotationSquared = G.b2_maxRotation * G.b2_maxRotation; |
| Box2D.Common.b2Settings.b2_contactBaumgarte = 0.2; |
| Box2D.Common.b2Settings.b2_timeToSleep = 0.5; |
| Box2D.Common.b2Settings.b2_linearSleepTolerance = 0.01; |
| Box2D.Common.b2Settings.b2_angularSleepTolerance = 2 / 180 * G.b2_pi |
| }) |
| })(); |
| (function () { |
| var F = Box2D.Common.Math.b2Mat22, |
| G = Box2D.Common.Math.b2Mat33, |
| K = Box2D.Common.Math.b2Math, |
| y = Box2D.Common.Math.b2Sweep, |
| w = Box2D.Common.Math.b2Transform, |
| A = Box2D.Common.Math.b2Vec2, |
| U = Box2D.Common.Math.b2Vec3; |
| F.b2Mat22 = function () { |
| this.col1 = new A; |
| this.col2 = new A |
| }; |
| F.prototype.b2Mat22 = function () { |
| this.SetIdentity() |
| }; |
| F.FromAngle = function (p) { |
| if (p === undefined) p = 0; |
| var B = new F; |
| B.Set(p); |
| return B |
| }; |
| F.FromVV = function (p, B) { |
| var Q = new F; |
| Q.SetVV(p, B); |
| return Q |
| }; |
| F.prototype.Set = function (p) { |
| if (p === undefined) p = 0; |
| var B = Math.cos(p); |
| p = Math.sin(p); |
| this.col1.x = B; |
| this.col2.x = -p; |
| this.col1.y = p; |
| this.col2.y = B |
| }; |
| F.prototype.SetVV = function (p, B) { |
| this.col1.SetV(p); |
| this.col2.SetV(B) |
| }; |
| F.prototype.Copy = function () { |
| var p = new F; |
| p.SetM(this); |
| return p |
| }; |
| F.prototype.SetM = function (p) { |
| this.col1.SetV(p.col1); |
| this.col2.SetV(p.col2) |
| }; |
| F.prototype.AddM = function (p) { |
| this.col1.x += p.col1.x; |
| this.col1.y += p.col1.y; |
| this.col2.x += p.col2.x; |
| this.col2.y += p.col2.y |
| }; |
| F.prototype.SetIdentity = function () { |
| this.col1.x = 1; |
| this.col2.x = 0; |
| this.col1.y = 0; |
| this.col2.y = 1 |
| }; |
| F.prototype.SetZero = function () { |
| this.col1.x = 0; |
| this.col2.x = 0; |
| this.col1.y = 0; |
| this.col2.y = 0 |
| }; |
| F.prototype.GetAngle = function () { |
| return Math.atan2(this.col1.y, this.col1.x) |
| }; |
| F.prototype.GetInverse = function (p) { |
| var B = this.col1.x, |
| Q = this.col2.x, |
| V = this.col1.y, |
| M = this.col2.y, |
| L = B * M - Q * V; |
| if (L != 0) L = 1 / L; |
| p.col1.x = L * M; |
| p.col2.x = -L * Q; |
| p.col1.y = -L * V; |
| p.col2.y = L * B; |
| return p |
| }; |
| F.prototype.Solve = function (p, B, Q) { |
| if (B === undefined) B = 0; |
| if (Q === undefined) Q = 0; |
| var V = this.col1.x, |
| M = this.col2.x, |
| L = this.col1.y, |
| I = this.col2.y, |
| W = V * I - M * L; |
| if (W != 0) W = 1 / W; |
| p.x = W * (I * B - M * Q); |
| p.y = W * (V * Q - L * B); |
| return p |
| }; |
| F.prototype.Abs = function () { |
| this.col1.Abs(); |
| this.col2.Abs() |
| }; |
| G.b2Mat33 = function () { |
| this.col1 = new U; |
| this.col2 = new U; |
| this.col3 = new U |
| }; |
| G.prototype.b2Mat33 = function (p, B, Q) { |
| if (p === undefined) p = null; |
| if (B === undefined) B = null; |
| if (Q === undefined) Q = null; |
| if (!p && !B && !Q) { |
| this.col1.SetZero(); |
| this.col2.SetZero(); |
| this.col3.SetZero() |
| } else { |
| this.col1.SetV(p); |
| this.col2.SetV(B); |
| this.col3.SetV(Q) |
| } |
| }; |
| G.prototype.SetVVV = function (p, B, Q) { |
| this.col1.SetV(p); |
| this.col2.SetV(B); |
| this.col3.SetV(Q) |
| }; |
| G.prototype.Copy = function () { |
| return new G(this.col1, this.col2, this.col3) |
| }; |
| G.prototype.SetM = function (p) { |
| this.col1.SetV(p.col1); |
| this.col2.SetV(p.col2); |
| this.col3.SetV(p.col3) |
| }; |
| G.prototype.AddM = function (p) { |
| this.col1.x += p.col1.x; |
| this.col1.y += p.col1.y; |
| this.col1.z += p.col1.z; |
| this.col2.x += p.col2.x; |
| this.col2.y += p.col2.y; |
| this.col2.z += p.col2.z; |
| this.col3.x += p.col3.x; |
| this.col3.y += p.col3.y; |
| this.col3.z += p.col3.z |
| }; |
| G.prototype.SetIdentity = function () { |
| this.col1.x = 1; |
| this.col2.x = 0; |
| this.col3.x = 0; |
| this.col1.y = 0; |
| this.col2.y = 1; |
| this.col3.y = 0; |
| this.col1.z = 0; |
| this.col2.z = 0; |
| this.col3.z = 1 |
| }; |
| G.prototype.SetZero = function () { |
| this.col1.x = 0; |
| this.col2.x = 0; |
| this.col3.x = 0; |
| this.col1.y = 0; |
| this.col2.y = 0; |
| this.col3.y = 0; |
| this.col1.z = 0; |
| this.col2.z = 0; |
| this.col3.z = 0 |
| }; |
| G.prototype.Solve22 = function (p, B, Q) { |
| if (B === undefined) B = 0; |
| if (Q === undefined) Q = 0; |
| var V = this.col1.x, |
| M = this.col2.x, |
| L = this.col1.y, |
| I = this.col2.y, |
| W = V * I - M * L; |
| if (W != 0) W = 1 / W; |
| p.x = W * (I * B - M * Q); |
| p.y = W * (V * Q - L * B); |
| return p |
| }; |
| G.prototype.Solve33 = function (p, B, Q, V) { |
| if (B === undefined) B = 0; |
| if (Q === undefined) Q = 0; |
| if (V === undefined) V = 0; |
| var M = this.col1.x, |
| L = this.col1.y, |
| I = this.col1.z, |
| W = this.col2.x, |
| Y = this.col2.y, |
| k = this.col2.z, |
| z = this.col3.x, |
| u = this.col3.y, |
| D = this.col3.z, |
| H = M * (Y * D - k * u) + L * (k * z - W * D) + I * (W * u - Y * z); |
| if (H != 0) H = 1 / H; |
| p.x = H * (B * (Y * D - k * u) + Q * (k * z - W * D) + V * (W * u - Y * z)); |
| p.y = H * (M * (Q * D - V * u) + L * (V * z - B * D) + I * (B * u - Q * z)); |
| p.z = H * (M * (Y * V - k * Q) + L * (k * B - W * V) + I * (W * Q - Y * B)); |
| return p |
| }; |
| K.b2Math = function () {}; |
| K.IsValid = function (p) { |
| if (p === undefined) p = 0; |
| return isFinite(p) |
| }; |
| K.Dot = function (p, B) { |
| return p.x * B.x + p.y * B.y |
| }; |
| K.CrossVV = function (p, B) { |
| return p.x * B.y - p.y * B.x |
| }; |
| K.CrossVF = function (p, B) { |
| if (B === undefined) B = 0; |
| return new A(B * p.y, -B * p.x) |
| }; |
| K.CrossFV = function (p, B) { |
| if (p === undefined) p = 0; |
| return new A(-p * B.y, p * B.x) |
| }; |
| K.MulMV = function (p, B) { |
| return new A(p.col1.x * B.x + p.col2.x * B.y, p.col1.y * B.x + p.col2.y * B.y) |
| }; |
| K.MulTMV = function (p, B) { |
| return new A(K.Dot(B, p.col1), K.Dot(B, p.col2)) |
| }; |
| K.MulX = function (p, B) { |
| var Q = K.MulMV(p.R, B); |
| Q.x += p.position.x; |
| Q.y += p.position.y; |
| return Q |
| }; |
| K.MulXT = function (p, B) { |
| var Q = K.SubtractVV(B, p.position), |
| V = Q.x * p.R.col1.x + Q.y * p.R.col1.y; |
| Q.y = Q.x * p.R.col2.x + Q.y * p.R.col2.y; |
| Q.x = V; |
| return Q |
| }; |
| K.AddVV = function (p, B) { |
| return new A(p.x + B.x, p.y + B.y) |
| }; |
| K.SubtractVV = function (p, B) { |
| return new A(p.x - B.x, p.y - B.y) |
| }; |
| K.Distance = function (p, B) { |
| var Q = p.x - B.x, |
| V = p.y - B.y; |
| return Math.sqrt(Q * Q + V * V) |
| }; |
| K.DistanceSquared = function (p, B) { |
| var Q = p.x - B.x, |
| V = p.y - B.y; |
| return Q * Q + V * V |
| }; |
| K.MulFV = function (p, B) { |
| if (p === undefined) p = 0; |
| return new A(p * B.x, p * B.y) |
| }; |
| K.AddMM = function (p, B) { |
| return F.FromVV(K.AddVV(p.col1, B.col1), K.AddVV(p.col2, B.col2)) |
| }; |
| K.MulMM = function (p, B) { |
| return F.FromVV(K.MulMV(p, |
| B.col1), K.MulMV(p, B.col2)) |
| }; |
| K.MulTMM = function (p, B) { |
| var Q = new A(K.Dot(p.col1, B.col1), K.Dot(p.col2, B.col1)), |
| V = new A(K.Dot(p.col1, B.col2), K.Dot(p.col2, B.col2)); |
| return F.FromVV(Q, V) |
| }; |
| K.Abs = function (p) { |
| if (p === undefined) p = 0; |
| return p > 0 ? p : -p |
| }; |
| K.AbsV = function (p) { |
| return new A(K.Abs(p.x), K.Abs(p.y)) |
| }; |
| K.AbsM = function (p) { |
| return F.FromVV(K.AbsV(p.col1), K.AbsV(p.col2)) |
| }; |
| K.Min = function (p, B) { |
| if (p === undefined) p = 0; |
| if (B === undefined) B = 0; |
| return p < B ? p : B |
| }; |
| K.MinV = function (p, B) { |
| return new A(K.Min(p.x, B.x), K.Min(p.y, B.y)) |
| }; |
| K.Max = function (p, B) { |
| if (p === undefined) p = 0; |
| if (B === undefined) B = 0; |
| return p > B ? p : B |
| }; |
| K.MaxV = function (p, B) { |
| return new A(K.Max(p.x, B.x), K.Max(p.y, B.y)) |
| }; |
| K.Clamp = function (p, B, Q) { |
| if (p === undefined) p = 0; |
| if (B === undefined) B = 0; |
| if (Q === undefined) Q = 0; |
| return p < B ? B : p > Q ? Q : p |
| }; |
| K.ClampV = function (p, B, Q) { |
| return K.MaxV(B, K.MinV(p, Q)) |
| }; |
| K.Swap = function (p, B) { |
| var Q = p[0]; |
| p[0] = B[0]; |
| B[0] = Q |
| }; |
| K.Random = function () { |
| return Math.random() * 2 - 1 |
| }; |
| K.RandomRange = function (p, B) { |
| if (p === undefined) p = 0; |
| if (B === undefined) B = 0; |
| var Q = Math.random(); |
| return Q = (B - p) * Q + p |
| }; |
| K.NextPowerOfTwo = function (p) { |
| if (p === undefined) p = 0; |
| p |= p >> 1 & 2147483647; |
| p |= p >> 2 & 1073741823; |
| p |= p >> 4 & 268435455; |
| p |= p >> 8 & 16777215; |
| p |= p >> 16 & 65535; |
| return p + 1 |
| }; |
| K.IsPowerOfTwo = function (p) { |
| if (p === undefined) p = 0; |
| return p > 0 && (p & p - 1) == 0 |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Common.Math.b2Math.b2Vec2_zero = new A(0, 0); |
| Box2D.Common.Math.b2Math.b2Mat22_identity = F.FromVV(new A(1, 0), new A(0, 1)); |
| Box2D.Common.Math.b2Math.b2Transform_identity = new w(K.b2Vec2_zero, K.b2Mat22_identity) |
| }); |
| y.b2Sweep = function () { |
| this.localCenter = new A; |
| this.c0 = new A; |
| this.c = new A |
| }; |
| y.prototype.Set = function (p) { |
| this.localCenter.SetV(p.localCenter); |
| this.c0.SetV(p.c0); |
| this.c.SetV(p.c); |
| this.a0 = p.a0; |
| this.a = p.a; |
| this.t0 = p.t0 |
| }; |
| y.prototype.Copy = function () { |
| var p = new y; |
| p.localCenter.SetV(this.localCenter); |
| p.c0.SetV(this.c0); |
| p.c.SetV(this.c); |
| p.a0 = this.a0; |
| p.a = this.a; |
| p.t0 = this.t0; |
| return p |
| }; |
| y.prototype.GetTransform = function (p, B) { |
| if (B === undefined) B = 0; |
| p.position.x = (1 - B) * this.c0.x + B * this.c.x; |
| p.position.y = (1 - B) * this.c0.y + B * this.c.y; |
| p.R.Set((1 - B) * this.a0 + B * this.a); |
| var Q = p.R; |
| p.position.x -= Q.col1.x * this.localCenter.x + Q.col2.x * this.localCenter.y; |
| p.position.y -= Q.col1.y * this.localCenter.x + Q.col2.y * this.localCenter.y |
| }; |
| y.prototype.Advance = function (p) { |
| if (p === undefined) p = 0; |
| if (this.t0 < p && 1 - this.t0 > Number.MIN_VALUE) { |
| var B = (p - this.t0) / (1 - this.t0); |
| this.c0.x = (1 - B) * this.c0.x + B * this.c.x; |
| this.c0.y = (1 - B) * this.c0.y + B * this.c.y; |
| this.a0 = (1 - B) * this.a0 + B * this.a; |
| this.t0 = p |
| } |
| }; |
| w.b2Transform = function () { |
| this.position = new A; |
| this.R = new F |
| }; |
| w.prototype.b2Transform = function (p, B) { |
| if (p === undefined) p = null; |
| if (B === undefined) B = null; |
| if (p) { |
| this.position.SetV(p); |
| this.R.SetM(B) |
| } |
| }; |
| w.prototype.Initialize = function (p, B) { |
| this.position.SetV(p); |
| this.R.SetM(B) |
| }; |
| w.prototype.SetIdentity = function () { |
| this.position.SetZero(); |
| this.R.SetIdentity() |
| }; |
| w.prototype.Set = function (p) { |
| this.position.SetV(p.position); |
| this.R.SetM(p.R) |
| }; |
| w.prototype.GetAngle = function () { |
| return Math.atan2(this.R.col1.y, this.R.col1.x) |
| }; |
| A.b2Vec2 = function () {}; |
| A.prototype.b2Vec2 = function (p, B) { |
| if (p === undefined) p = 0; |
| if (B === undefined) B = 0; |
| this.x = p; |
| this.y = B |
| }; |
| A.prototype.SetZero = function () { |
| this.y = this.x = 0 |
| }; |
| A.prototype.Set = function (p, B) { |
| if (p === undefined) p = 0; |
| if (B === undefined) B = 0; |
| this.x = p; |
| this.y = B |
| }; |
| A.prototype.SetV = function (p) { |
| this.x = p.x; |
| this.y = p.y |
| }; |
| A.prototype.GetNegative = function () { |
| return new A(-this.x, -this.y) |
| }; |
| A.prototype.NegativeSelf = function () { |
| this.x = -this.x; |
| this.y = -this.y |
| }; |
| A.Make = function (p, B) { |
| if (p === undefined) p = 0; |
| if (B === undefined) B = 0; |
| return new A(p, B) |
| }; |
| A.prototype.Copy = function () { |
| return new A(this.x, this.y) |
| }; |
| A.prototype.Add = function (p) { |
| this.x += p.x; |
| this.y += p.y |
| }; |
| A.prototype.Subtract = function (p) { |
| this.x -= p.x; |
| this.y -= p.y |
| }; |
| A.prototype.Multiply = function (p) { |
| if (p === undefined) p = 0; |
| this.x *= p; |
| this.y *= p |
| }; |
| A.prototype.MulM = function (p) { |
| var B = this.x; |
| this.x = p.col1.x * B + p.col2.x * this.y; |
| this.y = p.col1.y * B + p.col2.y * this.y |
| }; |
| A.prototype.MulTM = function (p) { |
| var B = K.Dot(this, p.col1); |
| this.y = K.Dot(this, p.col2); |
| this.x = B |
| }; |
| A.prototype.CrossVF = function (p) { |
| if (p === undefined) p = 0; |
| var B = this.x; |
| this.x = p * this.y; |
| this.y = -p * B |
| }; |
| A.prototype.CrossFV = function (p) { |
| if (p === undefined) p = 0; |
| var B = this.x; |
| this.x = -p * this.y; |
| this.y = p * B |
| }; |
| A.prototype.MinV = function (p) { |
| this.x = this.x < p.x ? this.x : p.x; |
| this.y = this.y < p.y ? this.y : p.y |
| }; |
| A.prototype.MaxV = function (p) { |
| this.x = this.x > p.x ? this.x : p.x; |
| this.y = this.y > p.y ? this.y : p.y |
| }; |
| A.prototype.Abs = function () { |
| if (this.x < 0) this.x = -this.x; |
| if (this.y < 0) this.y = -this.y |
| }; |
| A.prototype.Length = function () { |
| return Math.sqrt(this.x * this.x + this.y * this.y) |
| }; |
| A.prototype.LengthSquared = function () { |
| return this.x * this.x + this.y * this.y |
| }; |
| A.prototype.Normalize = function () { |
| var p = Math.sqrt(this.x * this.x + this.y * this.y); |
| if (p < Number.MIN_VALUE) return 0; |
| var B = 1 / p; |
| this.x *= B; |
| this.y *= B; |
| return p |
| }; |
| A.prototype.IsValid = function () { |
| return K.IsValid(this.x) && K.IsValid(this.y) |
| }; |
| U.b2Vec3 = function () {}; |
| U.prototype.b2Vec3 = function (p, B, Q) { |
| if (p === undefined) p = 0; |
| if (B === undefined) B = 0; |
| if (Q === undefined) Q = 0; |
| this.x = p; |
| this.y = B; |
| this.z = Q |
| }; |
| U.prototype.SetZero = function () { |
| this.x = this.y = this.z = 0 |
| }; |
| U.prototype.Set = function (p, B, Q) { |
| if (p === undefined) p = 0; |
| if (B === undefined) B = 0; |
| if (Q === undefined) Q = 0; |
| this.x = p; |
| this.y = B; |
| this.z = Q |
| }; |
| U.prototype.SetV = function (p) { |
| this.x = p.x; |
| this.y = p.y; |
| this.z = p.z |
| }; |
| U.prototype.GetNegative = function () { |
| return new U(-this.x, -this.y, -this.z) |
| }; |
| U.prototype.NegativeSelf = function () { |
| this.x = -this.x; |
| this.y = -this.y; |
| this.z = -this.z |
| }; |
| U.prototype.Copy = function () { |
| return new U(this.x, this.y, this.z) |
| }; |
| U.prototype.Add = function (p) { |
| this.x += p.x; |
| this.y += p.y; |
| this.z += p.z |
| }; |
| U.prototype.Subtract = function (p) { |
| this.x -= p.x; |
| this.y -= p.y; |
| this.z -= p.z |
| }; |
| U.prototype.Multiply = function (p) { |
| if (p === undefined) p = 0; |
| this.x *= p; |
| this.y *= p; |
| this.z *= p |
| } |
| })(); |
| (function () { |
| var F = Box2D.Common.Math.b2Math, |
| G = Box2D.Common.Math.b2Sweep, |
| K = Box2D.Common.Math.b2Transform, |
| y = Box2D.Common.Math.b2Vec2, |
| w = Box2D.Common.b2Color, |
| A = Box2D.Common.b2Settings, |
| U = Box2D.Collision.b2AABB, |
| p = Box2D.Collision.b2ContactPoint, |
| B = Box2D.Collision.b2DynamicTreeBroadPhase, |
| Q = Box2D.Collision.b2RayCastInput, |
| V = Box2D.Collision.b2RayCastOutput, |
| M = Box2D.Collision.Shapes.b2CircleShape, |
| L = Box2D.Collision.Shapes.b2EdgeShape, |
| I = Box2D.Collision.Shapes.b2MassData, |
| W = Box2D.Collision.Shapes.b2PolygonShape, |
| Y = Box2D.Collision.Shapes.b2Shape, |
| k = Box2D.Dynamics.b2Body, |
| z = Box2D.Dynamics.b2BodyDef, |
| u = Box2D.Dynamics.b2ContactFilter, |
| D = Box2D.Dynamics.b2ContactImpulse, |
| H = Box2D.Dynamics.b2ContactListener, |
| O = Box2D.Dynamics.b2ContactManager, |
| E = Box2D.Dynamics.b2DebugDraw, |
| R = Box2D.Dynamics.b2DestructionListener, |
| N = Box2D.Dynamics.b2FilterData, |
| S = Box2D.Dynamics.b2Fixture, |
| aa = Box2D.Dynamics.b2FixtureDef, |
| Z = Box2D.Dynamics.b2Island, |
| d = Box2D.Dynamics.b2TimeStep, |
| h = Box2D.Dynamics.b2World, |
| l = Box2D.Dynamics.Contacts.b2Contact, |
| j = Box2D.Dynamics.Contacts.b2ContactFactory, |
| o = Box2D.Dynamics.Contacts.b2ContactSolver, |
| q = Box2D.Dynamics.Joints.b2Joint, |
| n = Box2D.Dynamics.Joints.b2PulleyJoint; |
| k.b2Body = function () { |
| this.m_xf = new K; |
| this.m_sweep = new G; |
| this.m_linearVelocity = new y; |
| this.m_force = new y |
| }; |
| k.prototype.connectEdges = function (a, c, g) { |
| if (g === undefined) g = 0; |
| var b = Math.atan2(c.GetDirectionVector().y, c.GetDirectionVector().x); |
| g = F.MulFV(Math.tan((b - g) * 0.5), c.GetDirectionVector()); |
| g = F.SubtractVV(g, c.GetNormalVector()); |
| g = F.MulFV(A.b2_toiSlop, g); |
| g = F.AddVV(g, c.GetVertex1()); |
| var e = F.AddVV(a.GetDirectionVector(), |
| c.GetDirectionVector()); |
| e.Normalize(); |
| var f = F.Dot(a.GetDirectionVector(), c.GetNormalVector()) > 0; |
| a.SetNextEdge(c, g, e, f); |
| c.SetPrevEdge(a, g, e, f); |
| return b |
| }; |
| k.prototype.CreateFixture = function (a) { |
| if (this.m_world.IsLocked() == true) return null; |
| var c = new S; |
| c.Create(this, this.m_xf, a); |
| this.m_flags & k.e_activeFlag && c.CreateProxy(this.m_world.m_contactManager.m_broadPhase, this.m_xf); |
| c.m_next = this.m_fixtureList; |
| this.m_fixtureList = c; |
| ++this.m_fixtureCount; |
| c.m_body = this; |
| c.m_density > 0 && this.ResetMassData(); |
| this.m_world.m_flags |= h.e_newFixture; |
| return c |
| }; |
| k.prototype.CreateFixture2 = function (a, c) { |
| if (c === undefined) c = 0; |
| var g = new aa; |
| g.shape = a; |
| g.density = c; |
| return this.CreateFixture(g) |
| }; |
| k.prototype.DestroyFixture = function (a) { |
| if (this.m_world.IsLocked() != true) { |
| for (var c = this.m_fixtureList, g = null; c != null;) { |
| if (c == a) { |
| if (g) g.m_next = a.m_next; |
| else this.m_fixtureList = a.m_next; |
| break |
| } |
| g = c; |
| c = c.m_next |
| } |
| for (c = this.m_contactList; c;) { |
| g = c.contact; |
| c = c.next; |
| var b = g.GetFixtureA(), |
| e = g.GetFixtureB(); |
| if (a == b || a == e) this.m_world.m_contactManager.Destroy(g) |
| } |
| this.m_flags & |
| k.e_activeFlag && a.DestroyProxy(this.m_world.m_contactManager.m_broadPhase); |
| a.Destroy(); |
| a.m_body = null; |
| a.m_next = null; |
| --this.m_fixtureCount; |
| this.ResetMassData() |
| } |
| }; |
| k.prototype.SetPositionAndAngle = function (a, c) { |
| if (c === undefined) c = 0; |
| var g; |
| if (this.m_world.IsLocked() != true) { |
| this.m_xf.R.Set(c); |
| this.m_xf.position.SetV(a); |
| g = this.m_xf.R; |
| var b = this.m_sweep.localCenter; |
| this.m_sweep.c.x = g.col1.x * b.x + g.col2.x * b.y; |
| this.m_sweep.c.y = g.col1.y * b.x + g.col2.y * b.y; |
| this.m_sweep.c.x += this.m_xf.position.x; |
| this.m_sweep.c.y += this.m_xf.position.y; |
| this.m_sweep.c0.SetV(this.m_sweep.c); |
| this.m_sweep.a0 = this.m_sweep.a = c; |
| b = this.m_world.m_contactManager.m_broadPhase; |
| for (g = this.m_fixtureList; g; g = g.m_next) g.Synchronize(b, this.m_xf, this.m_xf); |
| this.m_world.m_contactManager.FindNewContacts() |
| } |
| }; |
| k.prototype.SetTransform = function (a) { |
| this.SetPositionAndAngle(a.position, a.GetAngle()) |
| }; |
| k.prototype.GetTransform = function () { |
| return this.m_xf |
| }; |
| k.prototype.GetPosition = function () { |
| return this.m_xf.position |
| }; |
| k.prototype.SetPosition = function (a) { |
| this.SetPositionAndAngle(a, |
| this.GetAngle()) |
| }; |
| k.prototype.GetAngle = function () { |
| return this.m_sweep.a |
| }; |
| k.prototype.SetAngle = function (a) { |
| if (a === undefined) a = 0; |
| this.SetPositionAndAngle(this.GetPosition(), a) |
| }; |
| k.prototype.GetWorldCenter = function () { |
| return this.m_sweep.c |
| }; |
| k.prototype.GetLocalCenter = function () { |
| return this.m_sweep.localCenter |
| }; |
| k.prototype.SetLinearVelocity = function (a) { |
| this.m_type != k.b2_staticBody && this.m_linearVelocity.SetV(a) |
| }; |
| k.prototype.GetLinearVelocity = function () { |
| return this.m_linearVelocity |
| }; |
| k.prototype.SetAngularVelocity = function (a) { |
| if (a === undefined) a = 0; |
| if (this.m_type != k.b2_staticBody) this.m_angularVelocity = a |
| }; |
| k.prototype.GetAngularVelocity = function () { |
| return this.m_angularVelocity |
| }; |
| k.prototype.GetDefinition = function () { |
| var a = new z; |
| a.type = this.GetType(); |
| a.allowSleep = (this.m_flags & k.e_allowSleepFlag) == k.e_allowSleepFlag; |
| a.angle = this.GetAngle(); |
| a.angularDamping = this.m_angularDamping; |
| a.angularVelocity = this.m_angularVelocity; |
| a.fixedRotation = (this.m_flags & k.e_fixedRotationFlag) == k.e_fixedRotationFlag; |
| a.bullet = (this.m_flags & |
| k.e_bulletFlag) == k.e_bulletFlag; |
| a.awake = (this.m_flags & k.e_awakeFlag) == k.e_awakeFlag; |
| a.linearDamping = this.m_linearDamping; |
| a.linearVelocity.SetV(this.GetLinearVelocity()); |
| a.position = this.GetPosition(); |
| a.userData = this.GetUserData(); |
| return a |
| }; |
| k.prototype.ApplyForce = function (a, c) { |
| if (this.m_type == k.b2_dynamicBody) { |
| this.IsAwake() == false && this.SetAwake(true); |
| this.m_force.x += a.x; |
| this.m_force.y += a.y; |
| this.m_torque += (c.x - this.m_sweep.c.x) * a.y - (c.y - this.m_sweep.c.y) * a.x |
| } |
| }; |
| k.prototype.ApplyTorque = function (a) { |
| if (a === undefined) a = 0; |
| if (this.m_type == k.b2_dynamicBody) { |
| this.IsAwake() == false && this.SetAwake(true); |
| this.m_torque += a |
| } |
| }; |
| k.prototype.ApplyImpulse = function (a, c) { |
| if (this.m_type == k.b2_dynamicBody) { |
| this.IsAwake() == false && this.SetAwake(true); |
| this.m_linearVelocity.x += this.m_invMass * a.x; |
| this.m_linearVelocity.y += this.m_invMass * a.y; |
| this.m_angularVelocity += this.m_invI * ((c.x - this.m_sweep.c.x) * a.y - (c.y - this.m_sweep.c.y) * a.x) |
| } |
| }; |
| k.prototype.Split = function (a) { |
| for (var c = this.GetLinearVelocity().Copy(), g = this.GetAngularVelocity(), |
| b = this.GetWorldCenter(), e = this.m_world.CreateBody(this.GetDefinition()), f, m = this.m_fixtureList; m;) |
| if (a(m)) { |
| var r = m.m_next; |
| if (f) f.m_next = r; |
| else this.m_fixtureList = r; |
| this.m_fixtureCount--; |
| m.m_next = e.m_fixtureList; |
| e.m_fixtureList = m; |
| e.m_fixtureCount++; |
| m.m_body = e; |
| m = r |
| } else { |
| f = m; |
| m = m.m_next |
| } |
| this.ResetMassData(); |
| e.ResetMassData(); |
| f = this.GetWorldCenter(); |
| a = e.GetWorldCenter(); |
| f = F.AddVV(c, F.CrossFV(g, F.SubtractVV(f, b))); |
| c = F.AddVV(c, F.CrossFV(g, F.SubtractVV(a, b))); |
| this.SetLinearVelocity(f); |
| e.SetLinearVelocity(c); |
| this.SetAngularVelocity(g); |
| e.SetAngularVelocity(g); |
| this.SynchronizeFixtures(); |
| e.SynchronizeFixtures(); |
| return e |
| }; |
| k.prototype.Merge = function (a) { |
| var c; |
| for (c = a.m_fixtureList; c;) { |
| var g = c.m_next; |
| a.m_fixtureCount--; |
| c.m_next = this.m_fixtureList; |
| this.m_fixtureList = c; |
| this.m_fixtureCount++; |
| c.m_body = e; |
| c = g |
| } |
| b.m_fixtureCount = 0; |
| var b = this, |
| e = a; |
| b.GetWorldCenter(); |
| e.GetWorldCenter(); |
| b.GetLinearVelocity().Copy(); |
| e.GetLinearVelocity().Copy(); |
| b.GetAngularVelocity(); |
| e.GetAngularVelocity(); |
| b.ResetMassData(); |
| this.SynchronizeFixtures() |
| }; |
| k.prototype.GetMass = function () { |
| return this.m_mass |
| }; |
| k.prototype.GetInertia = function () { |
| return this.m_I |
| }; |
| k.prototype.GetMassData = function (a) { |
| a.mass = this.m_mass; |
| a.I = this.m_I; |
| a.center.SetV(this.m_sweep.localCenter) |
| }; |
| k.prototype.SetMassData = function (a) { |
| A.b2Assert(this.m_world.IsLocked() == false); |
| if (this.m_world.IsLocked() != true) |
| if (this.m_type == k.b2_dynamicBody) { |
| this.m_invI = this.m_I = this.m_invMass = 0; |
| this.m_mass = a.mass; |
| if (this.m_mass <= 0) this.m_mass = 1; |
| this.m_invMass = 1 / this.m_mass; |
| if (a.I > 0 && (this.m_flags & k.e_fixedRotationFlag) == 0) { |
| this.m_I = a.I - this.m_mass * (a.center.x * a.center.x + a.center.y * a.center.y); |
| this.m_invI = 1 / this.m_I |
| } |
| var c = this.m_sweep.c.Copy(); |
| this.m_sweep.localCenter.SetV(a.center); |
| this.m_sweep.c0.SetV(F.MulX(this.m_xf, this.m_sweep.localCenter)); |
| this.m_sweep.c.SetV(this.m_sweep.c0); |
| this.m_linearVelocity.x += this.m_angularVelocity * -(this.m_sweep.c.y - c.y); |
| this.m_linearVelocity.y += this.m_angularVelocity * +(this.m_sweep.c.x - c.x) |
| } |
| }; |
| k.prototype.ResetMassData = function () { |
| this.m_invI = this.m_I = this.m_invMass = this.m_mass = 0; |
| this.m_sweep.localCenter.SetZero(); |
| if (!(this.m_type == k.b2_staticBody || this.m_type == k.b2_kinematicBody)) { |
| for (var a = y.Make(0, 0), c = this.m_fixtureList; c; c = c.m_next) |
| if (c.m_density != 0) { |
| var g = c.GetMassData(); |
| this.m_mass += g.mass; |
| a.x += g.center.x * g.mass; |
| a.y += g.center.y * g.mass; |
| this.m_I += g.I |
| } |
| if (this.m_mass > 0) { |
| this.m_invMass = 1 / this.m_mass; |
| a.x *= this.m_invMass; |
| a.y *= this.m_invMass |
| } else this.m_invMass = this.m_mass = 1; if (this.m_I > 0 && (this.m_flags & k.e_fixedRotationFlag) == 0) { |
| this.m_I -= this.m_mass * (a.x * a.x + a.y * a.y); |
| this.m_I *= this.m_inertiaScale; |
| A.b2Assert(this.m_I > 0); |
| this.m_invI = 1 / this.m_I |
| } else this.m_invI = this.m_I = 0; |
| c = this.m_sweep.c.Copy(); |
| this.m_sweep.localCenter.SetV(a); |
| this.m_sweep.c0.SetV(F.MulX(this.m_xf, this.m_sweep.localCenter)); |
| this.m_sweep.c.SetV(this.m_sweep.c0); |
| this.m_linearVelocity.x += this.m_angularVelocity * -(this.m_sweep.c.y - c.y); |
| this.m_linearVelocity.y += this.m_angularVelocity * +(this.m_sweep.c.x - c.x) |
| } |
| }; |
| k.prototype.GetWorldPoint = function (a) { |
| var c = this.m_xf.R; |
| a = new y(c.col1.x * a.x + c.col2.x * a.y, c.col1.y * a.x + c.col2.y * a.y); |
| a.x += this.m_xf.position.x; |
| a.y += this.m_xf.position.y; |
| return a |
| }; |
| k.prototype.GetWorldVector = function (a) { |
| return F.MulMV(this.m_xf.R, a) |
| }; |
| k.prototype.GetLocalPoint = function (a) { |
| return F.MulXT(this.m_xf, a) |
| }; |
| k.prototype.GetLocalVector = function (a) { |
| return F.MulTMV(this.m_xf.R, a) |
| }; |
| k.prototype.GetLinearVelocityFromWorldPoint = function (a) { |
| return new y(this.m_linearVelocity.x - this.m_angularVelocity * (a.y - this.m_sweep.c.y), this.m_linearVelocity.y + this.m_angularVelocity * (a.x - this.m_sweep.c.x)) |
| }; |
| k.prototype.GetLinearVelocityFromLocalPoint = function (a) { |
| var c = this.m_xf.R; |
| a = new y(c.col1.x * a.x + c.col2.x * a.y, c.col1.y * a.x + c.col2.y * a.y); |
| a.x += this.m_xf.position.x; |
| a.y += this.m_xf.position.y; |
| return new y(this.m_linearVelocity.x - this.m_angularVelocity * (a.y - this.m_sweep.c.y), this.m_linearVelocity.y + this.m_angularVelocity * (a.x - this.m_sweep.c.x)) |
| }; |
| k.prototype.GetLinearDamping = function () { |
| return this.m_linearDamping |
| }; |
| k.prototype.SetLinearDamping = function (a) { |
| if (a === undefined) a = 0; |
| this.m_linearDamping = a |
| }; |
| k.prototype.GetAngularDamping = function () { |
| return this.m_angularDamping |
| }; |
| k.prototype.SetAngularDamping = function (a) { |
| if (a === undefined) a = 0; |
| this.m_angularDamping = a |
| }; |
| k.prototype.SetType = function (a) { |
| if (a === undefined) a = 0; |
| if (this.m_type != a) { |
| this.m_type = a; |
| this.ResetMassData(); |
| if (this.m_type == k.b2_staticBody) { |
| this.m_linearVelocity.SetZero(); |
| this.m_angularVelocity = 0 |
| } |
| this.SetAwake(true); |
| this.m_force.SetZero(); |
| this.m_torque = 0; |
| for (a = this.m_contactList; a; a = a.next) a.contact.FlagForFiltering() |
| } |
| }; |
| k.prototype.GetType = function () { |
| return this.m_type |
| }; |
| k.prototype.SetBullet = function (a) { |
| if (a) this.m_flags |= k.e_bulletFlag; |
| else this.m_flags &= ~k.e_bulletFlag |
| }; |
| k.prototype.IsBullet = function () { |
| return (this.m_flags & k.e_bulletFlag) == k.e_bulletFlag |
| }; |
| k.prototype.SetSleepingAllowed = function (a) { |
| if (a) this.m_flags |= k.e_allowSleepFlag; |
| else { |
| this.m_flags &= ~k.e_allowSleepFlag; |
| this.SetAwake(true) |
| } |
| }; |
| k.prototype.SetAwake = function (a) { |
| if (a) { |
| this.m_flags |= k.e_awakeFlag; |
| this.m_sleepTime = 0 |
| } else { |
| this.m_flags &= ~k.e_awakeFlag; |
| this.m_sleepTime = 0; |
| this.m_linearVelocity.SetZero(); |
| this.m_angularVelocity = 0; |
| this.m_force.SetZero(); |
| this.m_torque = 0 |
| } |
| }; |
| k.prototype.IsAwake = function () { |
| return (this.m_flags & k.e_awakeFlag) == k.e_awakeFlag |
| }; |
| k.prototype.SetFixedRotation = function (a) { |
| if (a) this.m_flags |= k.e_fixedRotationFlag; |
| else this.m_flags &= ~k.e_fixedRotationFlag; |
| this.ResetMassData() |
| }; |
| k.prototype.IsFixedRotation = function () { |
| return (this.m_flags & k.e_fixedRotationFlag) == k.e_fixedRotationFlag |
| }; |
| k.prototype.SetActive = function (a) { |
| if (a != this.IsActive()) { |
| var c; |
| if (a) { |
| this.m_flags |= k.e_activeFlag; |
| a = this.m_world.m_contactManager.m_broadPhase; |
| for (c = this.m_fixtureList; c; c = c.m_next) c.CreateProxy(a, this.m_xf) |
| } else { |
| this.m_flags &= ~k.e_activeFlag; |
| a = this.m_world.m_contactManager.m_broadPhase; |
| for (c = this.m_fixtureList; c; c = c.m_next) c.DestroyProxy(a); |
| for (a = this.m_contactList; a;) { |
| c = a; |
| a = a.next; |
| this.m_world.m_contactManager.Destroy(c.contact) |
| } |
| this.m_contactList = null |
| } |
| } |
| }; |
| k.prototype.IsActive = function () { |
| return (this.m_flags & k.e_activeFlag) == k.e_activeFlag |
| }; |
| k.prototype.IsSleepingAllowed = function () { |
| return (this.m_flags & k.e_allowSleepFlag) == k.e_allowSleepFlag |
| }; |
| k.prototype.GetFixtureList = function () { |
| return this.m_fixtureList |
| }; |
| k.prototype.GetJointList = function () { |
| return this.m_jointList |
| }; |
| k.prototype.GetControllerList = function () { |
| return this.m_controllerList |
| }; |
| k.prototype.GetContactList = function () { |
| return this.m_contactList |
| }; |
| k.prototype.GetNext = function () { |
| return this.m_next |
| }; |
| k.prototype.GetUserData = function () { |
| return this.m_userData |
| }; |
| k.prototype.SetUserData = function (a) { |
| this.m_userData = a |
| }; |
| k.prototype.GetWorld = function () { |
| return this.m_world |
| }; |
| k.prototype.b2Body = function (a, c) { |
| this.m_flags = 0; |
| if (a.bullet) this.m_flags |= k.e_bulletFlag; |
| if (a.fixedRotation) this.m_flags |= k.e_fixedRotationFlag; |
| if (a.allowSleep) this.m_flags |= k.e_allowSleepFlag; |
| if (a.awake) this.m_flags |= k.e_awakeFlag; |
| if (a.active) this.m_flags |= k.e_activeFlag; |
| this.m_world = c; |
| this.m_xf.position.SetV(a.position); |
| this.m_xf.R.Set(a.angle); |
| this.m_sweep.localCenter.SetZero(); |
| this.m_sweep.t0 = 1; |
| this.m_sweep.a0 = this.m_sweep.a = a.angle; |
| var g = this.m_xf.R, |
| b = this.m_sweep.localCenter; |
| this.m_sweep.c.x = g.col1.x * b.x + g.col2.x * b.y; |
| this.m_sweep.c.y = g.col1.y * b.x + g.col2.y * b.y; |
| this.m_sweep.c.x += this.m_xf.position.x; |
| this.m_sweep.c.y += this.m_xf.position.y; |
| this.m_sweep.c0.SetV(this.m_sweep.c); |
| this.m_contactList = this.m_controllerList = this.m_jointList = null; |
| this.m_controllerCount = 0; |
| this.m_next = this.m_prev = null; |
| this.m_linearVelocity.SetV(a.linearVelocity); |
| this.m_angularVelocity = a.angularVelocity; |
| this.m_linearDamping = a.linearDamping; |
| this.m_angularDamping = a.angularDamping; |
| this.m_force.Set(0, 0); |
| this.m_sleepTime = this.m_torque = 0; |
| this.m_type = a.type; |
| if (this.m_type == k.b2_dynamicBody) this.m_invMass = this.m_mass = 1; |
| else this.m_invMass = this.m_mass = 0; |
| this.m_invI = this.m_I = 0; |
| this.m_inertiaScale = a.inertiaScale; |
| this.m_userData = a.userData; |
| this.m_fixtureList = null; |
| this.m_fixtureCount = 0 |
| }; |
| k.prototype.SynchronizeFixtures = function () { |
| var a = k.s_xf1; |
| a.R.Set(this.m_sweep.a0); |
| var c = a.R, |
| g = this.m_sweep.localCenter; |
| a.position.x = this.m_sweep.c0.x - (c.col1.x * g.x + c.col2.x * g.y); |
| a.position.y = this.m_sweep.c0.y - (c.col1.y * g.x + c.col2.y * g.y); |
| g = this.m_world.m_contactManager.m_broadPhase; |
| for (c = this.m_fixtureList; c; c = c.m_next) c.Synchronize(g, a, this.m_xf) |
| }; |
| k.prototype.SynchronizeTransform = function () { |
| this.m_xf.R.Set(this.m_sweep.a); |
| var a = this.m_xf.R, |
| c = this.m_sweep.localCenter; |
| this.m_xf.position.x = this.m_sweep.c.x - (a.col1.x * c.x + a.col2.x * c.y); |
| this.m_xf.position.y = this.m_sweep.c.y - (a.col1.y * c.x + a.col2.y * c.y) |
| }; |
| k.prototype.ShouldCollide = function (a) { |
| if (this.m_type != k.b2_dynamicBody && a.m_type != k.b2_dynamicBody) return false; |
| for (var c = this.m_jointList; c; c = c.next) |
| if (c.other == a) |
| if (c.joint.m_collideConnected == false) return false; |
| return true |
| }; |
| k.prototype.Advance = function (a) { |
| if (a === undefined) a = 0; |
| this.m_sweep.Advance(a); |
| this.m_sweep.c.SetV(this.m_sweep.c0); |
| this.m_sweep.a = this.m_sweep.a0; |
| this.SynchronizeTransform() |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Dynamics.b2Body.s_xf1 = new K; |
| Box2D.Dynamics.b2Body.e_islandFlag = 1; |
| Box2D.Dynamics.b2Body.e_awakeFlag = 2; |
| Box2D.Dynamics.b2Body.e_allowSleepFlag = 4; |
| Box2D.Dynamics.b2Body.e_bulletFlag = 8; |
| Box2D.Dynamics.b2Body.e_fixedRotationFlag = 16; |
| Box2D.Dynamics.b2Body.e_activeFlag = 32; |
| Box2D.Dynamics.b2Body.b2_staticBody = 0; |
| Box2D.Dynamics.b2Body.b2_kinematicBody = 1; |
| Box2D.Dynamics.b2Body.b2_dynamicBody = 2 |
| }); |
| z.b2BodyDef = function () { |
| this.position = new y; |
| this.linearVelocity = new y |
| }; |
| z.prototype.b2BodyDef = function () { |
| this.userData = null; |
| this.position.Set(0, 0); |
| this.angle = 0; |
| this.linearVelocity.Set(0, 0); |
| this.angularDamping = this.linearDamping = this.angularVelocity = 0; |
| this.awake = this.allowSleep = true; |
| this.bullet = this.fixedRotation = false; |
| this.type = k.b2_staticBody; |
| this.active = true; |
| this.inertiaScale = 1 |
| }; |
| u.b2ContactFilter = function () {}; |
| u.prototype.ShouldCollide = function (a, c) { |
| var g = a.GetFilterData(), |
| b = c.GetFilterData(); |
| if (g.groupIndex == b.groupIndex && g.groupIndex != 0) return g.groupIndex > 0; |
| return (g.maskBits & b.categoryBits) != 0 && (g.categoryBits & b.maskBits) != 0 |
| }; |
| u.prototype.RayCollide = function (a, c) { |
| if (!a) return true; |
| return this.ShouldCollide(a instanceof S ? a : null, c) |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Dynamics.b2ContactFilter.b2_defaultFilter = new u |
| }); |
| D.b2ContactImpulse = function () { |
| this.normalImpulses = new Vector_a2j_Number(A.b2_maxManifoldPoints); |
| this.tangentImpulses = new Vector_a2j_Number(A.b2_maxManifoldPoints) |
| }; |
| H.b2ContactListener = function () {}; |
| H.prototype.BeginContact = function () {}; |
| H.prototype.EndContact = function () {}; |
| H.prototype.PreSolve = function () {}; |
| H.prototype.PostSolve = function () {}; |
| Box2D.postDefs.push(function () { |
| Box2D.Dynamics.b2ContactListener.b2_defaultListener = new H |
| }); |
| O.b2ContactManager = function () {}; |
| O.prototype.b2ContactManager = function () { |
| this.m_world = null; |
| this.m_contactCount = 0; |
| this.m_contactFilter = u.b2_defaultFilter; |
| this.m_contactListener = H.b2_defaultListener; |
| this.m_contactFactory = new j(this.m_allocator); |
| this.m_broadPhase = new B |
| }; |
| O.prototype.AddPair = function (a, c) { |
| var g = a instanceof S ? a : null, |
| b = c instanceof S ? c : null, |
| e = g.GetBody(), |
| f = b.GetBody(); |
| if (e != f) { |
| for (var m = f.GetContactList(); m;) { |
| if (m.other == e) { |
| var r = m.contact.GetFixtureA(), |
| s = m.contact.GetFixtureB(); |
| if (r == g && s == b) return; |
| if (r == b && s == g) return |
| } |
| m = m.next |
| } |
| if (f.ShouldCollide(e) != false) |
| if (this.m_contactFilter.ShouldCollide(g, b) != false) { |
| m = this.m_contactFactory.Create(g, b); |
| g = m.GetFixtureA(); |
| b = m.GetFixtureB(); |
| e = g.m_body; |
| f = b.m_body; |
| m.m_prev = null; |
| m.m_next = this.m_world.m_contactList; |
| if (this.m_world.m_contactList != null) this.m_world.m_contactList.m_prev = m; |
| this.m_world.m_contactList = m; |
| m.m_nodeA.contact = m; |
| m.m_nodeA.other = f; |
| m.m_nodeA.prev = null; |
| m.m_nodeA.next = e.m_contactList; |
| if (e.m_contactList != null) e.m_contactList.prev = m.m_nodeA; |
| e.m_contactList = m.m_nodeA; |
| m.m_nodeB.contact = m; |
| m.m_nodeB.other = e; |
| m.m_nodeB.prev = null; |
| m.m_nodeB.next = f.m_contactList; |
| if (f.m_contactList != null) f.m_contactList.prev = m.m_nodeB; |
| f.m_contactList = m.m_nodeB; |
| ++this.m_world.m_contactCount |
| } |
| } |
| }; |
| O.prototype.FindNewContacts = function () { |
| this.m_broadPhase.UpdatePairs(Box2D.generateCallback(this, this.AddPair)) |
| }; |
| O.prototype.Destroy = function (a) { |
| var c = a.GetFixtureA(), |
| g = a.GetFixtureB(); |
| c = c.GetBody(); |
| g = g.GetBody(); |
| a.IsTouching() && this.m_contactListener.EndContact(a); |
| if (a.m_prev) a.m_prev.m_next = a.m_next; |
| if (a.m_next) a.m_next.m_prev = a.m_prev; |
| if (a == this.m_world.m_contactList) this.m_world.m_contactList = a.m_next; |
| if (a.m_nodeA.prev) a.m_nodeA.prev.next = a.m_nodeA.next; |
| if (a.m_nodeA.next) a.m_nodeA.next.prev = a.m_nodeA.prev; |
| if (a.m_nodeA == c.m_contactList) c.m_contactList = a.m_nodeA.next; |
| if (a.m_nodeB.prev) a.m_nodeB.prev.next = a.m_nodeB.next; |
| if (a.m_nodeB.next) a.m_nodeB.next.prev = a.m_nodeB.prev; |
| if (a.m_nodeB == g.m_contactList) g.m_contactList = a.m_nodeB.next; |
| this.m_contactFactory.Destroy(a); |
| --this.m_contactCount |
| }; |
| O.prototype.Collide = function () { |
| for (var a = this.m_world.m_contactList; a;) { |
| var c = a.GetFixtureA(), |
| g = a.GetFixtureB(), |
| b = c.GetBody(), |
| e = g.GetBody(); |
| if (b.IsAwake() == false && e.IsAwake() == false) a = a.GetNext(); |
| else { |
| if (a.m_flags & l.e_filterFlag) { |
| if (e.ShouldCollide(b) == false) { |
| c = a; |
| a = c.GetNext(); |
| this.Destroy(c); |
| continue |
| } |
| if (this.m_contactFilter.ShouldCollide(c, g) == false) { |
| c = a; |
| a = c.GetNext(); |
| this.Destroy(c); |
| continue |
| } |
| a.m_flags &= ~l.e_filterFlag |
| } |
| if (this.m_broadPhase.TestOverlap(c.m_proxy, g.m_proxy) == false) { |
| c = a; |
| a = c.GetNext(); |
| this.Destroy(c) |
| } else { |
| a.Update(this.m_contactListener); |
| a = a.GetNext() |
| } |
| } |
| } |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Dynamics.b2ContactManager.s_evalCP = new p |
| }); |
| E.b2DebugDraw = function () {}; |
| E.prototype.b2DebugDraw = function () {}; |
| E.prototype.SetFlags = function () {}; |
| E.prototype.GetFlags = function () {}; |
| E.prototype.AppendFlags = function () {}; |
| E.prototype.ClearFlags = function () {}; |
| E.prototype.SetSprite = function () {}; |
| E.prototype.GetSprite = function () {}; |
| E.prototype.SetDrawScale = function () {}; |
| E.prototype.GetDrawScale = function () {}; |
| E.prototype.SetLineThickness = function () {}; |
| E.prototype.GetLineThickness = function () {}; |
| E.prototype.SetAlpha = function () {}; |
| E.prototype.GetAlpha = function () {}; |
| E.prototype.SetFillAlpha = function () {}; |
| E.prototype.GetFillAlpha = function () {}; |
| E.prototype.SetXFormScale = function () {}; |
| E.prototype.GetXFormScale = function () {}; |
| E.prototype.DrawPolygon = function () {}; |
| E.prototype.DrawSolidPolygon = function () {}; |
| E.prototype.DrawCircle = function () {}; |
| E.prototype.DrawSolidCircle = function () {}; |
| E.prototype.DrawSegment = function () {}; |
| E.prototype.DrawTransform = function () {}; |
| Box2D.postDefs.push(function () { |
| Box2D.Dynamics.b2DebugDraw.e_shapeBit = 1; |
| Box2D.Dynamics.b2DebugDraw.e_jointBit = 2; |
| Box2D.Dynamics.b2DebugDraw.e_aabbBit = 4; |
| Box2D.Dynamics.b2DebugDraw.e_pairBit = 8; |
| Box2D.Dynamics.b2DebugDraw.e_centerOfMassBit = 16; |
| Box2D.Dynamics.b2DebugDraw.e_controllerBit = 32 |
| }); |
| R.b2DestructionListener = function () {}; |
| R.prototype.SayGoodbyeJoint = function () {}; |
| R.prototype.SayGoodbyeFixture = function () {}; |
| N.b2FilterData = function () { |
| this.categoryBits = 1; |
| this.maskBits = 65535; |
| this.groupIndex = 0 |
| }; |
| N.prototype.Copy = function () { |
| var a = new N; |
| a.categoryBits = this.categoryBits; |
| a.maskBits = this.maskBits; |
| a.groupIndex = this.groupIndex; |
| return a |
| }; |
| S.b2Fixture = function () { |
| this.m_filter = new N |
| }; |
| S.prototype.GetType = function () { |
| return this.m_shape.GetType() |
| }; |
| S.prototype.GetShape = function () { |
| return this.m_shape |
| }; |
| S.prototype.SetSensor = function (a) { |
| if (this.m_isSensor != a) { |
| this.m_isSensor = a; |
| if (this.m_body != null) for (a = this.m_body.GetContactList(); a;) { |
| var c = a.contact, |
| g = c.GetFixtureA(), |
| b = c.GetFixtureB(); |
| if (g == this || b == this) c.SetSensor(g.IsSensor() || b.IsSensor()); |
| a = a.next |
| } |
| } |
| }; |
| S.prototype.IsSensor = function () { |
| return this.m_isSensor |
| }; |
| S.prototype.SetFilterData = function (a) { |
| this.m_filter = a.Copy(); |
| if (!this.m_body) for (a = this.m_body.GetContactList(); a;) { |
| var c = a.contact, |
| g = c.GetFixtureA(), |
| b = c.GetFixtureB(); |
| if (g == this || b == this) c.FlagForFiltering(); |
| a = a.next |
| } |
| }; |
| S.prototype.GetFilterData = function () { |
| return this.m_filter.Copy() |
| }; |
| S.prototype.GetBody = function () { |
| return this.m_body |
| }; |
| S.prototype.GetNext = function () { |
| return this.m_next |
| }; |
| S.prototype.GetUserData = function () { |
| return this.m_userData |
| }; |
| S.prototype.SetUserData = function (a) { |
| this.m_userData = a |
| }; |
| S.prototype.TestPoint = function (a) { |
| return this.m_shape.TestPoint(this.m_body.GetTransform(), |
| a) |
| }; |
| S.prototype.RayCast = function (a, c) { |
| return this.m_shape.RayCast(a, c, this.m_body.GetTransform()) |
| }; |
| S.prototype.GetMassData = function (a) { |
| if (a === undefined) a = null; |
| if (a == null) a = new I; |
| this.m_shape.ComputeMass(a, this.m_density); |
| return a |
| }; |
| S.prototype.SetDensity = function (a) { |
| if (a === undefined) a = 0; |
| this.m_density = a |
| }; |
| S.prototype.GetDensity = function () { |
| return this.m_density |
| }; |
| S.prototype.GetFriction = function () { |
| return this.m_friction |
| }; |
| S.prototype.SetFriction = function (a) { |
| if (a === undefined) a = 0; |
| this.m_friction = a |
| }; |
| S.prototype.GetRestitution = function () { |
| return this.m_restitution |
| }; |
| S.prototype.SetRestitution = function (a) { |
| if (a === undefined) a = 0; |
| this.m_restitution = a |
| }; |
| S.prototype.GetAABB = function () { |
| return this.m_aabb |
| }; |
| S.prototype.b2Fixture = function () { |
| this.m_aabb = new U; |
| this.m_shape = this.m_next = this.m_body = this.m_userData = null; |
| this.m_restitution = this.m_friction = this.m_density = 0 |
| }; |
| S.prototype.Create = function (a, c, g) { |
| this.m_userData = g.userData; |
| this.m_friction = g.friction; |
| this.m_restitution = g.restitution; |
| this.m_body = a; |
| this.m_next = null; |
| this.m_filter = g.filter.Copy(); |
| this.m_isSensor = g.isSensor; |
| this.m_shape = g.shape.Copy(); |
| this.m_density = g.density |
| }; |
| S.prototype.Destroy = function () { |
| this.m_shape = null |
| }; |
| S.prototype.CreateProxy = function (a, c) { |
| this.m_shape.ComputeAABB(this.m_aabb, c); |
| this.m_proxy = a.CreateProxy(this.m_aabb, this) |
| }; |
| S.prototype.DestroyProxy = function (a) { |
| if (this.m_proxy != null) { |
| a.DestroyProxy(this.m_proxy); |
| this.m_proxy = null |
| } |
| }; |
| S.prototype.Synchronize = function (a, c, g) { |
| if (this.m_proxy) { |
| var b = new U, |
| e = new U; |
| this.m_shape.ComputeAABB(b, c); |
| this.m_shape.ComputeAABB(e, g); |
| this.m_aabb.Combine(b, e); |
| c = F.SubtractVV(g.position, c.position); |
| a.MoveProxy(this.m_proxy, this.m_aabb, c) |
| } |
| }; |
| aa.b2FixtureDef = function () { |
| this.filter = new N |
| }; |
| aa.prototype.b2FixtureDef = function () { |
| this.userData = this.shape = null; |
| this.friction = 0.2; |
| this.density = this.restitution = 0; |
| this.filter.categoryBits = 1; |
| this.filter.maskBits = 65535; |
| this.filter.groupIndex = 0; |
| this.isSensor = false |
| }; |
| Z.b2Island = function () {}; |
| Z.prototype.b2Island = function () { |
| this.m_bodies = new Vector; |
| this.m_contacts = new Vector; |
| this.m_joints = new Vector |
| }; |
| Z.prototype.Initialize = function (a, c, g, b, e, f) { |
| if (a === undefined) a = 0; |
| if (c === undefined) c = 0; |
| if (g === undefined) g = 0; |
| var m = 0; |
| this.m_bodyCapacity = a; |
| this.m_contactCapacity = c; |
| this.m_jointCapacity = g; |
| this.m_jointCount = this.m_contactCount = this.m_bodyCount = 0; |
| this.m_allocator = b; |
| this.m_listener = e; |
| this.m_contactSolver = f; |
| for (m = this.m_bodies.length; m < a; m++) this.m_bodies[m] = null; |
| for (m = this.m_contacts.length; m < c; m++) this.m_contacts[m] = null; |
| for (m = this.m_joints.length; m < g; m++) this.m_joints[m] = null |
| }; |
| Z.prototype.Clear = function () { |
| this.m_jointCount = this.m_contactCount = this.m_bodyCount = 0 |
| }; |
| Z.prototype.Solve = function (a, c, g) { |
| var b = 0, |
| e = 0, |
| f; |
| for (b = 0; b < this.m_bodyCount; ++b) { |
| e = this.m_bodies[b]; |
| if (e.GetType() == k.b2_dynamicBody) { |
| e.m_linearVelocity.x += a.dt * (c.x + e.m_invMass * e.m_force.x); |
| e.m_linearVelocity.y += a.dt * (c.y + e.m_invMass * e.m_force.y); |
| e.m_angularVelocity += a.dt * e.m_invI * e.m_torque; |
| e.m_linearVelocity.Multiply(F.Clamp(1 - a.dt * e.m_linearDamping, 0, 1)); |
| e.m_angularVelocity *= F.Clamp(1 - a.dt * e.m_angularDamping, 0, 1) |
| } |
| } |
| this.m_contactSolver.Initialize(a, this.m_contacts, |
| this.m_contactCount, this.m_allocator); |
| c = this.m_contactSolver; |
| c.InitVelocityConstraints(a); |
| for (b = 0; b < this.m_jointCount; ++b) { |
| f = this.m_joints[b]; |
| f.InitVelocityConstraints(a) |
| } |
| for (b = 0; b < a.velocityIterations; ++b) { |
| for (e = 0; e < this.m_jointCount; ++e) { |
| f = this.m_joints[e]; |
| f.SolveVelocityConstraints(a) |
| } |
| c.SolveVelocityConstraints() |
| } |
| for (b = 0; b < this.m_jointCount; ++b) { |
| f = this.m_joints[b]; |
| f.FinalizeVelocityConstraints() |
| } |
| c.FinalizeVelocityConstraints(); |
| for (b = 0; b < this.m_bodyCount; ++b) { |
| e = this.m_bodies[b]; |
| if (e.GetType() != k.b2_staticBody) { |
| var m = a.dt * e.m_linearVelocity.x, |
| r = a.dt * e.m_linearVelocity.y; |
| if (m * m + r * r > A.b2_maxTranslationSquared) { |
| e.m_linearVelocity.Normalize(); |
| e.m_linearVelocity.x *= A.b2_maxTranslation * a.inv_dt; |
| e.m_linearVelocity.y *= A.b2_maxTranslation * a.inv_dt |
| } |
| m = a.dt * e.m_angularVelocity; |
| if (m * m > A.b2_maxRotationSquared) e.m_angularVelocity = e.m_angularVelocity < 0 ? -A.b2_maxRotation * a.inv_dt : A.b2_maxRotation * a.inv_dt; |
| e.m_sweep.c0.SetV(e.m_sweep.c); |
| e.m_sweep.a0 = e.m_sweep.a; |
| e.m_sweep.c.x += a.dt * e.m_linearVelocity.x; |
| e.m_sweep.c.y += a.dt * e.m_linearVelocity.y; |
| e.m_sweep.a += a.dt * e.m_angularVelocity; |
| e.SynchronizeTransform() |
| } |
| } |
| for (b = 0; b < a.positionIterations; ++b) { |
| m = c.SolvePositionConstraints(A.b2_contactBaumgarte); |
| r = true; |
| for (e = 0; e < this.m_jointCount; ++e) { |
| f = this.m_joints[e]; |
| f = f.SolvePositionConstraints(A.b2_contactBaumgarte); |
| r = r && f |
| } |
| if (m && r) break |
| } |
| this.Report(c.m_constraints); |
| if (g) { |
| g = Number.MAX_VALUE; |
| c = A.b2_linearSleepTolerance * A.b2_linearSleepTolerance; |
| m = A.b2_angularSleepTolerance * A.b2_angularSleepTolerance; |
| for (b = 0; b < this.m_bodyCount; ++b) { |
| e = this.m_bodies[b]; |
| if (e.GetType() != k.b2_staticBody) { |
| if ((e.m_flags & k.e_allowSleepFlag) == 0) g = e.m_sleepTime = 0; |
| if ((e.m_flags & k.e_allowSleepFlag) == 0 || e.m_angularVelocity * e.m_angularVelocity > m || F.Dot(e.m_linearVelocity, e.m_linearVelocity) > c) g = e.m_sleepTime = 0; |
| else { |
| e.m_sleepTime += a.dt; |
| g = F.Min(g, e.m_sleepTime) |
| } |
| } |
| } |
| if (g >= A.b2_timeToSleep) |
| for (b = 0; b < this.m_bodyCount; ++b) { |
| e = this.m_bodies[b]; |
| e.SetAwake(false) |
| } |
| } |
| }; |
| Z.prototype.SolveTOI = function (a) { |
| var c = 0, |
| g = 0; |
| this.m_contactSolver.Initialize(a, this.m_contacts, this.m_contactCount, |
| this.m_allocator); |
| var b = this.m_contactSolver; |
| for (c = 0; c < this.m_jointCount; ++c) this.m_joints[c].InitVelocityConstraints(a); |
| for (c = 0; c < a.velocityIterations; ++c) { |
| b.SolveVelocityConstraints(); |
| for (g = 0; g < this.m_jointCount; ++g) this.m_joints[g].SolveVelocityConstraints(a) |
| } |
| for (c = 0; c < this.m_bodyCount; ++c) { |
| g = this.m_bodies[c]; |
| if (g.GetType() != k.b2_staticBody) { |
| var e = a.dt * g.m_linearVelocity.x, |
| f = a.dt * g.m_linearVelocity.y; |
| if (e * e + f * f > A.b2_maxTranslationSquared) { |
| g.m_linearVelocity.Normalize(); |
| g.m_linearVelocity.x *= A.b2_maxTranslation * a.inv_dt; |
| g.m_linearVelocity.y *= A.b2_maxTranslation * a.inv_dt |
| } |
| e = a.dt * g.m_angularVelocity; |
| if (e * e > A.b2_maxRotationSquared) g.m_angularVelocity = g.m_angularVelocity < 0 ? -A.b2_maxRotation * a.inv_dt : A.b2_maxRotation * a.inv_dt; |
| g.m_sweep.c0.SetV(g.m_sweep.c); |
| g.m_sweep.a0 = g.m_sweep.a; |
| g.m_sweep.c.x += a.dt * g.m_linearVelocity.x; |
| g.m_sweep.c.y += a.dt * g.m_linearVelocity.y; |
| g.m_sweep.a += a.dt * g.m_angularVelocity; |
| g.SynchronizeTransform() |
| } |
| } |
| for (c = 0; c < a.positionIterations; ++c) { |
| e = b.SolvePositionConstraints(0.75); |
| f = true; |
| for (g = 0; g < |
| this.m_jointCount; ++g) { |
| var m = this.m_joints[g].SolvePositionConstraints(A.b2_contactBaumgarte); |
| f = f && m |
| } |
| if (e && f) break |
| } |
| this.Report(b.m_constraints) |
| }; |
| Z.prototype.Report = function (a) { |
| if (this.m_listener != null) |
| for (var c = 0; c < this.m_contactCount; ++c) { |
| for (var g = this.m_contacts[c], b = a[c], e = 0; e < b.pointCount; ++e) { |
| Z.s_impulse.normalImpulses[e] = b.points[e].normalImpulse; |
| Z.s_impulse.tangentImpulses[e] = b.points[e].tangentImpulse |
| } |
| this.m_listener.PostSolve(g, Z.s_impulse) |
| } |
| }; |
| Z.prototype.AddBody = function (a) { |
| a.m_islandIndex = this.m_bodyCount; |
| this.m_bodies[this.m_bodyCount++] = a |
| }; |
| Z.prototype.AddContact = function (a) { |
| this.m_contacts[this.m_contactCount++] = a |
| }; |
| Z.prototype.AddJoint = function (a) { |
| this.m_joints[this.m_jointCount++] = a |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Dynamics.b2Island.s_impulse = new D |
| }); |
| d.b2TimeStep = function () {}; |
| d.prototype.Set = function (a) { |
| this.dt = a.dt; |
| this.inv_dt = a.inv_dt; |
| this.positionIterations = a.positionIterations; |
| this.velocityIterations = a.velocityIterations; |
| this.warmStarting = a.warmStarting |
| }; |
| h.b2World = function () { |
| this.s_stack = new Vector; |
| this.m_contactManager = new O; |
| this.m_contactSolver = new o; |
| this.m_island = new Z |
| }; |
| h.prototype.b2World = function (a, c) { |
| this.m_controllerList = this.m_jointList = this.m_contactList = this.m_bodyList = this.m_debugDraw = this.m_destructionListener = null; |
| this.m_controllerCount = this.m_jointCount = this.m_contactCount = this.m_bodyCount = 0; |
| h.m_warmStarting = true; |
| h.m_continuousPhysics = true; |
| this.m_allowSleep = c; |
| this.m_gravity = a; |
| this.m_inv_dt0 = 0; |
| this.m_contactManager.m_world = this; |
| this.m_groundBody = this.CreateBody(new z) |
| }; |
| h.prototype.SetDestructionListener = function (a) { |
| this.m_destructionListener = a |
| }; |
| h.prototype.SetContactFilter = function (a) { |
| this.m_contactManager.m_contactFilter = a |
| }; |
| h.prototype.SetContactListener = function (a) { |
| this.m_contactManager.m_contactListener = a |
| }; |
| h.prototype.SetDebugDraw = function (a) { |
| this.m_debugDraw = a |
| }; |
| h.prototype.SetBroadPhase = function (a) { |
| var c = this.m_contactManager.m_broadPhase; |
| this.m_contactManager.m_broadPhase = a; |
| for (var g = this.m_bodyList; g; g = g.m_next) |
| for (var b = g.m_fixtureList; b; b = b.m_next) b.m_proxy = a.CreateProxy(c.GetFatAABB(b.m_proxy), b) |
| }; |
| h.prototype.Validate = function () { |
| this.m_contactManager.m_broadPhase.Validate() |
| }; |
| h.prototype.GetProxyCount = function () { |
| return this.m_contactManager.m_broadPhase.GetProxyCount() |
| }; |
| h.prototype.CreateBody = function (a) { |
| if (this.IsLocked() == true) return null; |
| a = new k(a, this); |
| a.m_prev = null; |
| if (a.m_next = this.m_bodyList) this.m_bodyList.m_prev = a; |
| this.m_bodyList = a; |
| ++this.m_bodyCount; |
| return a |
| }; |
| h.prototype.DestroyBody = function (a) { |
| if (this.IsLocked() != true) { |
| for (var c = a.m_jointList; c;) { |
| var g = c; |
| c = c.next; |
| this.m_destructionListener && this.m_destructionListener.SayGoodbyeJoint(g.joint); |
| this.DestroyJoint(g.joint) |
| } |
| for (c = a.m_controllerList; c;) { |
| g = c; |
| c = c.nextController; |
| g.controller.RemoveBody(a) |
| } |
| for (c = a.m_contactList; c;) { |
| g = c; |
| c = c.next; |
| this.m_contactManager.Destroy(g.contact) |
| } |
| a.m_contactList = null; |
| for (c = a.m_fixtureList; c;) { |
| g = c; |
| c = c.m_next; |
| this.m_destructionListener && this.m_destructionListener.SayGoodbyeFixture(g); |
| g.DestroyProxy(this.m_contactManager.m_broadPhase); |
| g.Destroy() |
| } |
| a.m_fixtureList = null; |
| a.m_fixtureCount = 0; |
| if (a.m_prev) a.m_prev.m_next = a.m_next; |
| if (a.m_next) a.m_next.m_prev = a.m_prev; |
| if (a == this.m_bodyList) this.m_bodyList = a.m_next; |
| --this.m_bodyCount |
| } |
| }; |
| h.prototype.CreateJoint = function (a) { |
| var c = q.Create(a, null); |
| c.m_prev = null; |
| if (c.m_next = this.m_jointList) this.m_jointList.m_prev = c; |
| this.m_jointList = c; |
| ++this.m_jointCount; |
| c.m_edgeA.joint = c; |
| c.m_edgeA.other = c.m_bodyB; |
| c.m_edgeA.prev = null; |
| if (c.m_edgeA.next = c.m_bodyA.m_jointList) c.m_bodyA.m_jointList.prev = c.m_edgeA; |
| c.m_bodyA.m_jointList = c.m_edgeA; |
| c.m_edgeB.joint = c; |
| c.m_edgeB.other = c.m_bodyA; |
| c.m_edgeB.prev = null; |
| if (c.m_edgeB.next = c.m_bodyB.m_jointList) c.m_bodyB.m_jointList.prev = c.m_edgeB; |
| c.m_bodyB.m_jointList = c.m_edgeB; |
| var g = a.bodyA, |
| b = a.bodyB; |
| if (a.collideConnected == false) |
| for (a = b.GetContactList(); a;) { |
| a.other == g && a.contact.FlagForFiltering(); |
| a = a.next |
| } |
| return c |
| }; |
| h.prototype.DestroyJoint = function (a) { |
| var c = a.m_collideConnected; |
| if (a.m_prev) a.m_prev.m_next = a.m_next; |
| if (a.m_next) a.m_next.m_prev = a.m_prev; |
| if (a == this.m_jointList) this.m_jointList = a.m_next; |
| var g = a.m_bodyA, |
| b = a.m_bodyB; |
| g.SetAwake(true); |
| b.SetAwake(true); |
| if (a.m_edgeA.prev) a.m_edgeA.prev.next = a.m_edgeA.next; |
| if (a.m_edgeA.next) a.m_edgeA.next.prev = a.m_edgeA.prev; |
| if (a.m_edgeA == g.m_jointList) g.m_jointList = a.m_edgeA.next; |
| a.m_edgeA.prev = null; |
| a.m_edgeA.next = null; |
| if (a.m_edgeB.prev) a.m_edgeB.prev.next = a.m_edgeB.next; |
| if (a.m_edgeB.next) a.m_edgeB.next.prev = a.m_edgeB.prev; |
| if (a.m_edgeB == b.m_jointList) b.m_jointList = a.m_edgeB.next; |
| a.m_edgeB.prev = null; |
| a.m_edgeB.next = null; |
| q.Destroy(a, null); |
| --this.m_jointCount; |
| if (c == false) |
| for (a = b.GetContactList(); a;) { |
| a.other == g && a.contact.FlagForFiltering(); |
| a = a.next |
| } |
| }; |
| h.prototype.AddController = function (a) { |
| a.m_next = this.m_controllerList; |
| a.m_prev = null; |
| this.m_controllerList = a; |
| a.m_world = this; |
| this.m_controllerCount++; |
| return a |
| }; |
| h.prototype.RemoveController = function (a) { |
| if (a.m_prev) a.m_prev.m_next = a.m_next; |
| if (a.m_next) a.m_next.m_prev = a.m_prev; |
| if (this.m_controllerList == a) this.m_controllerList = a.m_next; |
| this.m_controllerCount-- |
| }; |
| h.prototype.CreateController = function (a) { |
| if (a.m_world != this) throw Error("Controller can only be a member of one world"); |
| a.m_next = this.m_controllerList; |
| a.m_prev = null; |
| if (this.m_controllerList) this.m_controllerList.m_prev = a; |
| this.m_controllerList = a; |
| ++this.m_controllerCount; |
| a.m_world = this; |
| return a |
| }; |
| h.prototype.DestroyController = function (a) { |
| a.Clear(); |
| if (a.m_next) a.m_next.m_prev = a.m_prev; |
| if (a.m_prev) a.m_prev.m_next = a.m_next; |
| if (a == this.m_controllerList) this.m_controllerList = a.m_next; |
| --this.m_controllerCount |
| }; |
| h.prototype.SetWarmStarting = function (a) { |
| h.m_warmStarting = a |
| }; |
| h.prototype.SetContinuousPhysics = function (a) { |
| h.m_continuousPhysics = a |
| }; |
| h.prototype.GetBodyCount = function () { |
| return this.m_bodyCount |
| }; |
| h.prototype.GetJointCount = function () { |
| return this.m_jointCount |
| }; |
| h.prototype.GetContactCount = function () { |
| return this.m_contactCount |
| }; |
| h.prototype.SetGravity = function (a) { |
| this.m_gravity = a |
| }; |
| h.prototype.GetGravity = function () { |
| return this.m_gravity |
| }; |
| h.prototype.GetGroundBody = function () { |
| return this.m_groundBody |
| }; |
| h.prototype.Step = function (a, c, g) { |
| if (a === undefined) a = 0; |
| if (c === undefined) c = 0; |
| if (g === undefined) g = 0; |
| if (this.m_flags & h.e_newFixture) { |
| this.m_contactManager.FindNewContacts(); |
| this.m_flags &= ~h.e_newFixture |
| } |
| this.m_flags |= h.e_locked; |
| var b = h.s_timestep2; |
| b.dt = a; |
| b.velocityIterations = c; |
| b.positionIterations = g; |
| b.inv_dt = a > 0 ? 1 / a : 0; |
| b.dtRatio = this.m_inv_dt0 * a; |
| b.warmStarting = h.m_warmStarting; |
| this.m_contactManager.Collide(); |
| b.dt > 0 && this.Solve(b); |
| h.m_continuousPhysics && b.dt > 0 && this.SolveTOI(b); |
| if (b.dt > 0) this.m_inv_dt0 = b.inv_dt; |
| this.m_flags &= ~h.e_locked |
| }; |
| h.prototype.ClearForces = function () { |
| for (var a = this.m_bodyList; a; a = a.m_next) { |
| a.m_force.SetZero(); |
| a.m_torque = 0 |
| } |
| }; |
| h.prototype.DrawDebugData = function () { |
| if (this.m_debugDraw != null) { |
| this.m_debugDraw.m_sprite.graphics.clear(); |
| var a = this.m_debugDraw.GetFlags(), |
| c, g, b; |
| new y; |
| new y; |
| new y; |
| var e; |
| new U; |
| new U; |
| e = [new y, new y, new y, new y]; |
| var f = new w(0, 0, 0); |
| if (a & E.e_shapeBit) |
| for (c = this.m_bodyList; c; c = c.m_next) { |
| e = c.m_xf; |
| for (g = c.GetFixtureList(); g; g = g.m_next) { |
| b = g.GetShape(); |
| if (c.IsActive() == false) f.Set(0.5, 0.5, 0.3); |
| else if (c.GetType() == k.b2_staticBody) f.Set(0.5, 0.9, 0.5); |
| else if (c.GetType() == k.b2_kinematicBody) f.Set(0.5, 0.5, 0.9); |
| else c.IsAwake() == false ? |
| f.Set(0.6, 0.6, 0.6) : f.Set(0.9, 0.7, 0.7); |
| this.DrawShape(b, e, f) |
| } |
| } |
| if (a & E.e_jointBit) |
| for (c = this.m_jointList; c; c = c.m_next) this.DrawJoint(c); |
| if (a & E.e_controllerBit) |
| for (c = this.m_controllerList; c; c = c.m_next) c.Draw(this.m_debugDraw); |
| if (a & E.e_pairBit) { |
| f.Set(0.3, 0.9, 0.9); |
| for (c = this.m_contactManager.m_contactList; c; c = c.GetNext()) { |
| b = c.GetFixtureA(); |
| g = c.GetFixtureB(); |
| b = b.GetAABB().GetCenter(); |
| g = g.GetAABB().GetCenter(); |
| this.m_debugDraw.DrawSegment(b, g, f) |
| } |
| } |
| if (a & E.e_aabbBit) { |
| b = this.m_contactManager.m_broadPhase; |
| e = [new y, |
| new y, new y, new y |
| ]; |
| for (c = this.m_bodyList; c; c = c.GetNext()) |
| if (c.IsActive() != false) |
| for (g = c.GetFixtureList(); g; g = g.GetNext()) { |
| var m = b.GetFatAABB(g.m_proxy); |
| e[0].Set(m.lowerBound.x, m.lowerBound.y); |
| e[1].Set(m.upperBound.x, m.lowerBound.y); |
| e[2].Set(m.upperBound.x, m.upperBound.y); |
| e[3].Set(m.lowerBound.x, m.upperBound.y); |
| this.m_debugDraw.DrawPolygon(e, 4, f) |
| } |
| } |
| if (a & E.e_centerOfMassBit) |
| for (c = this.m_bodyList; c; c = c.m_next) { |
| e = h.s_xf; |
| e.R = c.m_xf.R; |
| e.position = c.GetWorldCenter(); |
| this.m_debugDraw.DrawTransform(e) |
| } |
| } |
| }; |
| h.prototype.QueryAABB = function (a, c) { |
| var g = this.m_contactManager.m_broadPhase; |
| g.Query(function (b) { |
| return a(g.GetUserData(b)) |
| }, c) |
| }; |
| h.prototype.QueryShape = function (a, c, g) { |
| if (g === undefined) g = null; |
| if (g == null) { |
| g = new K; |
| g.SetIdentity() |
| } |
| var b = this.m_contactManager.m_broadPhase, |
| e = new U; |
| c.ComputeAABB(e, g); |
| b.Query(function (f) { |
| f = b.GetUserData(f) instanceof S ? b.GetUserData(f) : null; |
| if (Y.TestOverlap(c, g, f.GetShape(), f.GetBody().GetTransform())) return a(f); |
| return true |
| }, e) |
| }; |
| h.prototype.QueryPoint = function (a, c) { |
| var g = this.m_contactManager.m_broadPhase, |
| b = new U; |
| b.lowerBound.Set(c.x - A.b2_linearSlop, c.y - A.b2_linearSlop); |
| b.upperBound.Set(c.x + A.b2_linearSlop, c.y + A.b2_linearSlop); |
| g.Query(function (e) { |
| e = g.GetUserData(e) instanceof S ? g.GetUserData(e) : null; |
| if (e.TestPoint(c)) return a(e); |
| return true |
| }, b) |
| }; |
| h.prototype.RayCast = function (a, c, g) { |
| var b = this.m_contactManager.m_broadPhase, |
| e = new V, |
| f = new Q(c, g); |
| b.RayCast(function (m, r) { |
| var s = b.GetUserData(r); |
| s = s instanceof S ? s : null; |
| if (s.RayCast(e, m)) { |
| var v = e.fraction, |
| t = new y((1 - v) * c.x + v * g.x, (1 - v) * c.y + v * g.y); |
| return a(s, |
| t, e.normal, v) |
| } |
| return m.maxFraction |
| }, f) |
| }; |
| h.prototype.RayCastOne = function (a, c) { |
| var g; |
| this.RayCast(function (b, e, f, m) { |
| if (m === undefined) m = 0; |
| g = b; |
| return m |
| }, a, c); |
| return g |
| }; |
| h.prototype.RayCastAll = function (a, c) { |
| var g = new Vector; |
| this.RayCast(function (b) { |
| g[g.length] = b; |
| return 1 |
| }, a, c); |
| return g |
| }; |
| h.prototype.GetBodyList = function () { |
| return this.m_bodyList |
| }; |
| h.prototype.GetJointList = function () { |
| return this.m_jointList |
| }; |
| h.prototype.GetContactList = function () { |
| return this.m_contactList |
| }; |
| h.prototype.IsLocked = function () { |
| return (this.m_flags & |
| h.e_locked) > 0 |
| }; |
| h.prototype.Solve = function (a) { |
| for (var c, g = this.m_controllerList; g; g = g.m_next) g.Step(a); |
| g = this.m_island; |
| g.Initialize(this.m_bodyCount, this.m_contactCount, this.m_jointCount, null, this.m_contactManager.m_contactListener, this.m_contactSolver); |
| for (c = this.m_bodyList; c; c = c.m_next) c.m_flags &= ~k.e_islandFlag; |
| for (var b = this.m_contactList; b; b = b.m_next) b.m_flags &= ~l.e_islandFlag; |
| for (b = this.m_jointList; b; b = b.m_next) b.m_islandFlag = false; |
| parseInt(this.m_bodyCount); |
| b = this.s_stack; |
| for (var e = this.m_bodyList; e; e = e.m_next) |
| if (!(e.m_flags & k.e_islandFlag)) |
| if (!(e.IsAwake() == false || e.IsActive() == false)) |
| if (e.GetType() != k.b2_staticBody) { |
| g.Clear(); |
| var f = 0; |
| b[f++] = e; |
| for (e.m_flags |= k.e_islandFlag; f > 0;) { |
| c = b[--f]; |
| g.AddBody(c); |
| c.IsAwake() == false && c.SetAwake(true); |
| if (c.GetType() != k.b2_staticBody) { |
| for (var m, r = c.m_contactList; r; r = r.next) |
| if (!(r.contact.m_flags & l.e_islandFlag)) |
| if (!(r.contact.IsSensor() == true || r.contact.IsEnabled() == false || r.contact.IsTouching() == false)) { |
| g.AddContact(r.contact); |
| r.contact.m_flags |= l.e_islandFlag; |
| m = r.other; |
| if (!(m.m_flags & k.e_islandFlag)) { |
| b[f++] = m; |
| m.m_flags |= k.e_islandFlag |
| } |
| } |
| for (c = c.m_jointList; c; c = c.next) |
| if (c.joint.m_islandFlag != true) { |
| m = c.other; |
| if (m.IsActive() != false) { |
| g.AddJoint(c.joint); |
| c.joint.m_islandFlag = true; |
| if (!(m.m_flags & k.e_islandFlag)) { |
| b[f++] = m; |
| m.m_flags |= k.e_islandFlag |
| } |
| } |
| } |
| } |
| } |
| g.Solve(a, this.m_gravity, this.m_allowSleep); |
| for (f = 0; f < g.m_bodyCount; ++f) { |
| c = g.m_bodies[f]; |
| if (c.GetType() == k.b2_staticBody) c.m_flags &= ~k.e_islandFlag |
| } |
| } |
| for (f = 0; f < b.length; ++f) { |
| if (!b[f]) break; |
| b[f] = null |
| } |
| for (c = this.m_bodyList; c; c = c.m_next) c.IsAwake() == false || c.IsActive() == false || c.GetType() != k.b2_staticBody && c.SynchronizeFixtures(); |
| this.m_contactManager.FindNewContacts() |
| }; |
| h.prototype.SolveTOI = function (a) { |
| var c, g, b, e = this.m_island; |
| e.Initialize(this.m_bodyCount, A.b2_maxTOIContactsPerIsland, A.b2_maxTOIJointsPerIsland, null, this.m_contactManager.m_contactListener, this.m_contactSolver); |
| var f = h.s_queue; |
| for (c = this.m_bodyList; c; c = c.m_next) { |
| c.m_flags &= ~k.e_islandFlag; |
| c.m_sweep.t0 = 0 |
| } |
| for (b = this.m_contactList; b; b = b.m_next) b.m_flags &= ~(l.e_toiFlag | |
| l.e_islandFlag); |
| for (b = this.m_jointList; b; b = b.m_next) b.m_islandFlag = false; |
| for (;;) { |
| var m = null, |
| r = 1; |
| for (b = this.m_contactList; b; b = b.m_next) |
| if (!(b.IsSensor() == true || b.IsEnabled() == false || b.IsContinuous() == false)) { |
| c = 1; |
| if (b.m_flags & l.e_toiFlag) c = b.m_toi; |
| else { |
| c = b.m_fixtureA; |
| g = b.m_fixtureB; |
| c = c.m_body; |
| g = g.m_body; |
| if ((c.GetType() != k.b2_dynamicBody || c.IsAwake() == false) && (g.GetType() != k.b2_dynamicBody || g.IsAwake() == false)) continue; |
| var s = c.m_sweep.t0; |
| if (c.m_sweep.t0 < g.m_sweep.t0) { |
| s = g.m_sweep.t0; |
| c.m_sweep.Advance(s) |
| } else if (g.m_sweep.t0 < |
| c.m_sweep.t0) { |
| s = c.m_sweep.t0; |
| g.m_sweep.Advance(s) |
| } |
| c = b.ComputeTOI(c.m_sweep, g.m_sweep); |
| A.b2Assert(0 <= c && c <= 1); |
| if (c > 0 && c < 1) { |
| c = (1 - c) * s + c; |
| if (c > 1) c = 1 |
| } |
| b.m_toi = c; |
| b.m_flags |= l.e_toiFlag |
| } if (Number.MIN_VALUE < c && c < r) { |
| m = b; |
| r = c |
| } |
| } |
| if (m == null || 1 - 100 * Number.MIN_VALUE < r) break; |
| c = m.m_fixtureA; |
| g = m.m_fixtureB; |
| c = c.m_body; |
| g = g.m_body; |
| h.s_backupA.Set(c.m_sweep); |
| h.s_backupB.Set(g.m_sweep); |
| c.Advance(r); |
| g.Advance(r); |
| m.Update(this.m_contactManager.m_contactListener); |
| m.m_flags &= ~l.e_toiFlag; |
| if (m.IsSensor() == true || m.IsEnabled() == false) { |
| c.m_sweep.Set(h.s_backupA); |
| g.m_sweep.Set(h.s_backupB); |
| c.SynchronizeTransform(); |
| g.SynchronizeTransform() |
| } else if (m.IsTouching() != false) { |
| c = c; |
| if (c.GetType() != k.b2_dynamicBody) c = g; |
| e.Clear(); |
| m = b = 0; |
| f[b + m++] = c; |
| for (c.m_flags |= k.e_islandFlag; m > 0;) { |
| c = f[b++]; |
| --m; |
| e.AddBody(c); |
| c.IsAwake() == false && c.SetAwake(true); |
| if (c.GetType() == k.b2_dynamicBody) { |
| for (g = c.m_contactList; g; g = g.next) { |
| if (e.m_contactCount == e.m_contactCapacity) break; |
| if (!(g.contact.m_flags & l.e_islandFlag)) |
| if (!(g.contact.IsSensor() == true || g.contact.IsEnabled() == false || g.contact.IsTouching() == false)) { |
| e.AddContact(g.contact); |
| g.contact.m_flags |= l.e_islandFlag; |
| s = g.other; |
| if (!(s.m_flags & k.e_islandFlag)) { |
| if (s.GetType() != k.b2_staticBody) { |
| s.Advance(r); |
| s.SetAwake(true) |
| } |
| f[b + m] = s; |
| ++m; |
| s.m_flags |= k.e_islandFlag |
| } |
| } |
| } |
| for (c = c.m_jointList; c; c = c.next) |
| if (e.m_jointCount != e.m_jointCapacity) |
| if (c.joint.m_islandFlag != true) { |
| s = c.other; |
| if (s.IsActive() != false) { |
| e.AddJoint(c.joint); |
| c.joint.m_islandFlag = true; |
| if (!(s.m_flags & k.e_islandFlag)) { |
| if (s.GetType() != k.b2_staticBody) { |
| s.Advance(r); |
| s.SetAwake(true) |
| } |
| f[b + m] = s; |
| ++m; |
| s.m_flags |= k.e_islandFlag |
| } |
| } |
| } |
| } |
| } |
| b = h.s_timestep; |
| b.warmStarting = false; |
| b.dt = (1 - r) * a.dt; |
| b.inv_dt = 1 / b.dt; |
| b.dtRatio = 0; |
| b.velocityIterations = a.velocityIterations; |
| b.positionIterations = a.positionIterations; |
| e.SolveTOI(b); |
| for (r = r = 0; r < e.m_bodyCount; ++r) { |
| c = e.m_bodies[r]; |
| c.m_flags &= ~k.e_islandFlag; |
| if (c.IsAwake() != false) |
| if (c.GetType() == k.b2_dynamicBody) { |
| c.SynchronizeFixtures(); |
| for (g = c.m_contactList; g; g = g.next) g.contact.m_flags &= ~l.e_toiFlag |
| } |
| } |
| for (r = 0; r < e.m_contactCount; ++r) { |
| b = e.m_contacts[r]; |
| b.m_flags &= ~(l.e_toiFlag | |
| l.e_islandFlag) |
| } |
| for (r = 0; r < e.m_jointCount; ++r) { |
| b = e.m_joints[r]; |
| b.m_islandFlag = false |
| } |
| this.m_contactManager.FindNewContacts() |
| } |
| } |
| }; |
| h.prototype.DrawJoint = function (a) { |
| var c = a.GetBodyA(), |
| g = a.GetBodyB(), |
| b = c.m_xf.position, |
| e = g.m_xf.position, |
| f = a.GetAnchorA(), |
| m = a.GetAnchorB(), |
| r = h.s_jointColor; |
| switch (a.m_type) { |
| case q.e_distanceJoint: |
| this.m_debugDraw.DrawSegment(f, m, r); |
| break; |
| case q.e_pulleyJoint: |
| c = a instanceof n ? a : null; |
| a = c.GetGroundAnchorA(); |
| c = c.GetGroundAnchorB(); |
| this.m_debugDraw.DrawSegment(a, f, r); |
| this.m_debugDraw.DrawSegment(c, |
| m, r); |
| this.m_debugDraw.DrawSegment(a, c, r); |
| break; |
| case q.e_mouseJoint: |
| this.m_debugDraw.DrawSegment(f, m, r); |
| break; |
| default: |
| c != this.m_groundBody && this.m_debugDraw.DrawSegment(b, f, r); |
| this.m_debugDraw.DrawSegment(f, m, r); |
| g != this.m_groundBody && this.m_debugDraw.DrawSegment(e, m, r) |
| } |
| }; |
| h.prototype.DrawShape = function (a, c, g) { |
| switch (a.m_type) { |
| case Y.e_circleShape: |
| var b = a instanceof M ? a : null; |
| this.m_debugDraw.DrawSolidCircle(F.MulX(c, b.m_p), b.m_radius, c.R.col1, g); |
| break; |
| case Y.e_polygonShape: |
| b = 0; |
| b = a instanceof W ? a : null; |
| a = parseInt(b.GetVertexCount()); |
| var e = b.GetVertices(), |
| f = new Vector(a); |
| for (b = 0; b < a; ++b) f[b] = F.MulX(c, e[b]); |
| this.m_debugDraw.DrawSolidPolygon(f, a, g); |
| break; |
| case Y.e_edgeShape: |
| b = a instanceof L ? a : null; |
| this.m_debugDraw.DrawSegment(F.MulX(c, b.GetVertex1()), F.MulX(c, b.GetVertex2()), g) |
| } |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Dynamics.b2World.s_timestep2 = new d; |
| Box2D.Dynamics.b2World.s_xf = new K; |
| Box2D.Dynamics.b2World.s_backupA = new G; |
| Box2D.Dynamics.b2World.s_backupB = new G; |
| Box2D.Dynamics.b2World.s_timestep = new d; |
| Box2D.Dynamics.b2World.s_queue = new Vector; |
| Box2D.Dynamics.b2World.s_jointColor = new w(0.5, 0.8, 0.8); |
| Box2D.Dynamics.b2World.e_newFixture = 1; |
| Box2D.Dynamics.b2World.e_locked = 2 |
| }) |
| })(); |
| (function () { |
| var F = Box2D.Collision.Shapes.b2CircleShape, |
| G = Box2D.Collision.Shapes.b2EdgeShape, |
| K = Box2D.Collision.Shapes.b2PolygonShape, |
| y = Box2D.Collision.Shapes.b2Shape, |
| w = Box2D.Dynamics.Contacts.b2CircleContact, |
| A = Box2D.Dynamics.Contacts.b2Contact, |
| U = Box2D.Dynamics.Contacts.b2ContactConstraint, |
| p = Box2D.Dynamics.Contacts.b2ContactConstraintPoint, |
| B = Box2D.Dynamics.Contacts.b2ContactEdge, |
| Q = Box2D.Dynamics.Contacts.b2ContactFactory, |
| V = Box2D.Dynamics.Contacts.b2ContactRegister, |
| M = Box2D.Dynamics.Contacts.b2ContactResult, |
| L = Box2D.Dynamics.Contacts.b2ContactSolver, |
| I = Box2D.Dynamics.Contacts.b2EdgeAndCircleContact, |
| W = Box2D.Dynamics.Contacts.b2NullContact, |
| Y = Box2D.Dynamics.Contacts.b2PolyAndCircleContact, |
| k = Box2D.Dynamics.Contacts.b2PolyAndEdgeContact, |
| z = Box2D.Dynamics.Contacts.b2PolygonContact, |
| u = Box2D.Dynamics.Contacts.b2PositionSolverManifold, |
| D = Box2D.Dynamics.b2Body, |
| H = Box2D.Dynamics.b2TimeStep, |
| O = Box2D.Common.b2Settings, |
| E = Box2D.Common.Math.b2Mat22, |
| R = Box2D.Common.Math.b2Math, |
| N = Box2D.Common.Math.b2Vec2, |
| S = Box2D.Collision.b2Collision, |
| aa = Box2D.Collision.b2ContactID, |
| Z = Box2D.Collision.b2Manifold, |
| d = Box2D.Collision.b2TimeOfImpact, |
| h = Box2D.Collision.b2TOIInput, |
| l = Box2D.Collision.b2WorldManifold; |
| Box2D.inherit(w, Box2D.Dynamics.Contacts.b2Contact); |
| w.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype; |
| w.b2CircleContact = function () { |
| Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments) |
| }; |
| w.Create = function () { |
| return new w |
| }; |
| w.Destroy = function () {}; |
| w.prototype.Reset = function (j, o) { |
| this.__super.Reset.call(this, j, o) |
| }; |
| w.prototype.Evaluate = function () { |
| var j = this.m_fixtureA.GetBody(), |
| o = this.m_fixtureB.GetBody(); |
| S.CollideCircles(this.m_manifold, this.m_fixtureA.GetShape() instanceof F ? this.m_fixtureA.GetShape() : null, j.m_xf, this.m_fixtureB.GetShape() instanceof F ? this.m_fixtureB.GetShape() : null, o.m_xf) |
| }; |
| A.b2Contact = function () { |
| this.m_nodeA = new B; |
| this.m_nodeB = new B; |
| this.m_manifold = new Z; |
| this.m_oldManifold = new Z |
| }; |
| A.prototype.GetManifold = function () { |
| return this.m_manifold |
| }; |
| A.prototype.GetWorldManifold = function (j) { |
| var o = this.m_fixtureA.GetBody(), |
| q = this.m_fixtureB.GetBody(), |
| n = this.m_fixtureA.GetShape(), |
| a = this.m_fixtureB.GetShape(); |
| j.Initialize(this.m_manifold, o.GetTransform(), n.m_radius, q.GetTransform(), a.m_radius) |
| }; |
| A.prototype.IsTouching = function () { |
| return (this.m_flags & A.e_touchingFlag) == A.e_touchingFlag |
| }; |
| A.prototype.IsContinuous = function () { |
| return (this.m_flags & A.e_continuousFlag) == A.e_continuousFlag |
| }; |
| A.prototype.SetSensor = function (j) { |
| if (j) this.m_flags |= A.e_sensorFlag; |
| else this.m_flags &= ~A.e_sensorFlag |
| }; |
| A.prototype.IsSensor = function () { |
| return (this.m_flags & |
| A.e_sensorFlag) == A.e_sensorFlag |
| }; |
| A.prototype.SetEnabled = function (j) { |
| if (j) this.m_flags |= A.e_enabledFlag; |
| else this.m_flags &= ~A.e_enabledFlag |
| }; |
| A.prototype.IsEnabled = function () { |
| return (this.m_flags & A.e_enabledFlag) == A.e_enabledFlag |
| }; |
| A.prototype.GetNext = function () { |
| return this.m_next |
| }; |
| A.prototype.GetFixtureA = function () { |
| return this.m_fixtureA |
| }; |
| A.prototype.GetFixtureB = function () { |
| return this.m_fixtureB |
| }; |
| A.prototype.FlagForFiltering = function () { |
| this.m_flags |= A.e_filterFlag |
| }; |
| A.prototype.b2Contact = function () {}; |
| A.prototype.Reset = function (j, o) { |
| if (j === undefined) j = null; |
| if (o === undefined) o = null; |
| this.m_flags = A.e_enabledFlag; |
| if (!j || !o) this.m_fixtureB = this.m_fixtureA = null; |
| else { |
| if (j.IsSensor() || o.IsSensor()) this.m_flags |= A.e_sensorFlag; |
| var q = j.GetBody(), |
| n = o.GetBody(); |
| if (q.GetType() != D.b2_dynamicBody || q.IsBullet() || n.GetType() != D.b2_dynamicBody || n.IsBullet()) this.m_flags |= A.e_continuousFlag; |
| this.m_fixtureA = j; |
| this.m_fixtureB = o; |
| this.m_manifold.m_pointCount = 0; |
| this.m_next = this.m_prev = 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 |
| } |
| }; |
| A.prototype.Update = function (j) { |
| var o = this.m_oldManifold; |
| this.m_oldManifold = this.m_manifold; |
| this.m_manifold = o; |
| this.m_flags |= A.e_enabledFlag; |
| var q = false; |
| o = (this.m_flags & A.e_touchingFlag) == A.e_touchingFlag; |
| var n = this.m_fixtureA.m_body, |
| a = this.m_fixtureB.m_body, |
| c = this.m_fixtureA.m_aabb.TestOverlap(this.m_fixtureB.m_aabb); |
| if (this.m_flags & A.e_sensorFlag) { |
| if (c) { |
| q = this.m_fixtureA.GetShape(); |
| c = this.m_fixtureB.GetShape(); |
| n = n.GetTransform(); |
| a = a.GetTransform(); |
| q = y.TestOverlap(q, n, c, a) |
| } |
| this.m_manifold.m_pointCount = 0 |
| } else { |
| if (n.GetType() != D.b2_dynamicBody || n.IsBullet() || a.GetType() != D.b2_dynamicBody || a.IsBullet()) this.m_flags |= A.e_continuousFlag; |
| else this.m_flags &= ~A.e_continuousFlag; if (c) { |
| this.Evaluate(); |
| q = this.m_manifold.m_pointCount > 0; |
| for (c = 0; c < this.m_manifold.m_pointCount; ++c) { |
| var g = this.m_manifold.m_points[c]; |
| g.m_normalImpulse = 0; |
| g.m_tangentImpulse = 0; |
| for (var b = g.m_id, e = 0; e < this.m_oldManifold.m_pointCount; ++e) { |
| var f = this.m_oldManifold.m_points[e]; |
| if (f.m_id.key == b.key) { |
| g.m_normalImpulse = f.m_normalImpulse; |
| g.m_tangentImpulse = f.m_tangentImpulse; |
| break |
| } |
| } |
| } |
| } else this.m_manifold.m_pointCount = 0; if (q != o) { |
| n.SetAwake(true); |
| a.SetAwake(true) |
| } |
| } if (q) this.m_flags |= A.e_touchingFlag; |
| else this.m_flags &= ~A.e_touchingFlag; |
| o == false && q == true && j.BeginContact(this); |
| o == true && q == false && j.EndContact(this); |
| (this.m_flags & A.e_sensorFlag) == 0 && j.PreSolve(this, this.m_oldManifold) |
| }; |
| A.prototype.Evaluate = function () {}; |
| A.prototype.ComputeTOI = function (j, o) { |
| A.s_input.proxyA.Set(this.m_fixtureA.GetShape()); |
| A.s_input.proxyB.Set(this.m_fixtureB.GetShape()); |
| A.s_input.sweepA = j; |
| A.s_input.sweepB = o; |
| A.s_input.tolerance = O.b2_linearSlop; |
| return d.TimeOfImpact(A.s_input) |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Dynamics.Contacts.b2Contact.e_sensorFlag = 1; |
| Box2D.Dynamics.Contacts.b2Contact.e_continuousFlag = 2; |
| Box2D.Dynamics.Contacts.b2Contact.e_islandFlag = 4; |
| Box2D.Dynamics.Contacts.b2Contact.e_toiFlag = 8; |
| Box2D.Dynamics.Contacts.b2Contact.e_touchingFlag = 16; |
| Box2D.Dynamics.Contacts.b2Contact.e_enabledFlag = 32; |
| Box2D.Dynamics.Contacts.b2Contact.e_filterFlag = 64; |
| Box2D.Dynamics.Contacts.b2Contact.s_input = new h |
| }); |
| U.b2ContactConstraint = function () { |
| this.localPlaneNormal = new N; |
| this.localPoint = new N; |
| this.normal = new N; |
| this.normalMass = new E; |
| this.K = new E |
| }; |
| U.prototype.b2ContactConstraint = function () { |
| this.points = new Vector(O.b2_maxManifoldPoints); |
| for (var j = 0; j < O.b2_maxManifoldPoints; j++) this.points[j] = new p |
| }; |
| p.b2ContactConstraintPoint = function () { |
| this.localPoint = new N; |
| this.rA = new N; |
| this.rB = new N |
| }; |
| B.b2ContactEdge = function () {}; |
| Q.b2ContactFactory = function () {}; |
| Q.prototype.b2ContactFactory = function (j) { |
| this.m_allocator = j; |
| this.InitializeRegisters() |
| }; |
| Q.prototype.AddType = function (j, o, q, n) { |
| if (q === undefined) q = 0; |
| if (n === undefined) n = 0; |
| this.m_registers[q][n].createFcn = j; |
| this.m_registers[q][n].destroyFcn = o; |
| this.m_registers[q][n].primary = true; |
| if (q != n) { |
| this.m_registers[n][q].createFcn = j; |
| this.m_registers[n][q].destroyFcn = o; |
| this.m_registers[n][q].primary = false |
| } |
| }; |
| Q.prototype.InitializeRegisters = function () { |
| this.m_registers = new Vector(y.e_shapeTypeCount); |
| for (var j = 0; j < y.e_shapeTypeCount; j++) { |
| this.m_registers[j] = new Vector(y.e_shapeTypeCount); |
| for (var o = 0; o < y.e_shapeTypeCount; o++) this.m_registers[j][o] = new V |
| } |
| this.AddType(w.Create, w.Destroy, y.e_circleShape, y.e_circleShape); |
| this.AddType(Y.Create, Y.Destroy, y.e_polygonShape, y.e_circleShape); |
| this.AddType(z.Create, z.Destroy, y.e_polygonShape, y.e_polygonShape); |
| this.AddType(I.Create, I.Destroy, y.e_edgeShape, y.e_circleShape); |
| this.AddType(k.Create, k.Destroy, |
| y.e_polygonShape, y.e_edgeShape) |
| }; |
| Q.prototype.Create = function (j, o) { |
| var q = parseInt(j.GetType()), |
| n = parseInt(o.GetType()); |
| q = this.m_registers[q][n]; |
| if (q.pool) { |
| n = q.pool; |
| q.pool = n.m_next; |
| q.poolCount--; |
| n.Reset(j, o); |
| return n |
| } |
| n = q.createFcn; |
| if (n != null) { |
| if (q.primary) { |
| n = n(this.m_allocator); |
| n.Reset(j, o) |
| } else { |
| n = n(this.m_allocator); |
| n.Reset(o, j) |
| } |
| return n |
| } else return null |
| }; |
| Q.prototype.Destroy = function (j) { |
| if (j.m_manifold.m_pointCount > 0) { |
| j.m_fixtureA.m_body.SetAwake(true); |
| j.m_fixtureB.m_body.SetAwake(true) |
| } |
| var o = parseInt(j.m_fixtureA.GetType()), |
| q = parseInt(j.m_fixtureB.GetType()); |
| o = this.m_registers[o][q]; |
| o.poolCount++; |
| j.m_next = o.pool; |
| o.pool = j; |
| o = o.destroyFcn; |
| o(j, this.m_allocator) |
| }; |
| V.b2ContactRegister = function () {}; |
| M.b2ContactResult = function () { |
| this.position = new N; |
| this.normal = new N; |
| this.id = new aa |
| }; |
| L.b2ContactSolver = function () { |
| this.m_step = new H; |
| this.m_constraints = new Vector |
| }; |
| L.prototype.b2ContactSolver = function () {}; |
| L.prototype.Initialize = function (j, o, q, n) { |
| if (q === undefined) q = 0; |
| var a; |
| this.m_step.Set(j); |
| this.m_allocator = n; |
| j = 0; |
| for (this.m_constraintCount = q; this.m_constraints.length < this.m_constraintCount;) this.m_constraints[this.m_constraints.length] = new U; |
| for (j = 0; j < q; ++j) { |
| a = o[j]; |
| n = a.m_fixtureA; |
| var c = a.m_fixtureB, |
| g = n.m_shape.m_radius, |
| b = c.m_shape.m_radius, |
| e = n.m_body, |
| f = c.m_body, |
| m = a.GetManifold(), |
| r = O.b2MixFriction(n.GetFriction(), c.GetFriction()), |
| s = O.b2MixRestitution(n.GetRestitution(), c.GetRestitution()), |
| v = e.m_linearVelocity.x, |
| t = e.m_linearVelocity.y, |
| x = f.m_linearVelocity.x, |
| C = f.m_linearVelocity.y, |
| J = e.m_angularVelocity, |
| T = f.m_angularVelocity; |
| O.b2Assert(m.m_pointCount > 0); |
| L.s_worldManifold.Initialize(m, e.m_xf, g, f.m_xf, b); |
| c = L.s_worldManifold.m_normal.x; |
| a = L.s_worldManifold.m_normal.y; |
| n = this.m_constraints[j]; |
| n.bodyA = e; |
| n.bodyB = f; |
| n.manifold = m; |
| n.normal.x = c; |
| n.normal.y = a; |
| n.pointCount = m.m_pointCount; |
| n.friction = r; |
| n.restitution = s; |
| n.localPlaneNormal.x = m.m_localPlaneNormal.x; |
| n.localPlaneNormal.y = m.m_localPlaneNormal.y; |
| n.localPoint.x = m.m_localPoint.x; |
| n.localPoint.y = m.m_localPoint.y; |
| n.radius = g + b; |
| n.type = m.m_type; |
| for (g = 0; g < n.pointCount; ++g) { |
| r = m.m_points[g]; |
| b = n.points[g]; |
| b.normalImpulse = r.m_normalImpulse; |
| b.tangentImpulse = r.m_tangentImpulse; |
| b.localPoint.SetV(r.m_localPoint); |
| r = b.rA.x = L.s_worldManifold.m_points[g].x - e.m_sweep.c.x; |
| s = b.rA.y = L.s_worldManifold.m_points[g].y - e.m_sweep.c.y; |
| var P = b.rB.x = L.s_worldManifold.m_points[g].x - f.m_sweep.c.x, |
| X = b.rB.y = L.s_worldManifold.m_points[g].y - f.m_sweep.c.y, |
| $ = r * a - s * c, |
| ba = P * a - X * c; |
| $ *= $; |
| ba *= ba; |
| b.normalMass = 1 / (e.m_invMass + f.m_invMass + e.m_invI * $ + f.m_invI * ba); |
| var ca = e.m_mass * e.m_invMass + f.m_mass * f.m_invMass; |
| ca += e.m_mass * e.m_invI * $ + f.m_mass * f.m_invI * ba; |
| b.equalizedMass = 1 / ca; |
| ba = a; |
| ca = -c; |
| $ = r * ca - s * ba; |
| ba = P * ca - X * ba; |
| $ *= $; |
| ba *= ba; |
| b.tangentMass = 1 / (e.m_invMass + f.m_invMass + e.m_invI * $ + f.m_invI * ba); |
| b.velocityBias = 0; |
| r = n.normal.x * (x + -T * X - v - -J * s) + n.normal.y * (C + T * P - t - J * r); |
| if (r < -O.b2_velocityThreshold) b.velocityBias += -n.restitution * r |
| } |
| if (n.pointCount == 2) { |
| C = n.points[0]; |
| x = n.points[1]; |
| m = e.m_invMass; |
| e = e.m_invI; |
| v = f.m_invMass; |
| f = f.m_invI; |
| t = C.rA.x * a - C.rA.y * c; |
| C = C.rB.x * a - C.rB.y * c; |
| J = x.rA.x * a - x.rA.y * c; |
| x = x.rB.x * a - x.rB.y * c; |
| c = m + v + e * t * t + f * C * C; |
| a = m + v + e * J * J + f * x * x; |
| f = m + v + e * t * J + f * C * x; |
| if (c * c < 100 * (c * a - f * f)) { |
| n.K.col1.Set(c, f); |
| n.K.col2.Set(f, a); |
| n.K.GetInverse(n.normalMass) |
| } else n.pointCount = 1 |
| } |
| } |
| }; |
| L.prototype.InitVelocityConstraints = function (j) { |
| for (var o = 0; o < this.m_constraintCount; ++o) { |
| var q = this.m_constraints[o], |
| n = q.bodyA, |
| a = q.bodyB, |
| c = n.m_invMass, |
| g = n.m_invI, |
| b = a.m_invMass, |
| e = a.m_invI, |
| f = q.normal.x, |
| m = q.normal.y, |
| r = m, |
| s = -f, |
| v = 0, |
| t = 0; |
| if (j.warmStarting) { |
| t = q.pointCount; |
| for (v = 0; v < t; ++v) { |
| var x = q.points[v]; |
| x.normalImpulse *= j.dtRatio; |
| x.tangentImpulse *= j.dtRatio; |
| var C = x.normalImpulse * f + x.tangentImpulse * r, |
| J = x.normalImpulse * m + x.tangentImpulse * s; |
| n.m_angularVelocity -= g * (x.rA.x * J - x.rA.y * C); |
| n.m_linearVelocity.x -= c * C; |
| n.m_linearVelocity.y -= c * J; |
| a.m_angularVelocity += e * (x.rB.x * J - x.rB.y * C); |
| a.m_linearVelocity.x += b * C; |
| a.m_linearVelocity.y += b * J |
| } |
| } else { |
| t = q.pointCount; |
| for (v = 0; v < t; ++v) { |
| n = q.points[v]; |
| n.normalImpulse = 0; |
| n.tangentImpulse = 0 |
| } |
| } |
| } |
| }; |
| L.prototype.SolveVelocityConstraints = function () { |
| for (var j = 0, o, q = 0, n = 0, a = 0, c = n = n = q = q = 0, g = q = q = 0, b = q = a = 0, e = 0, f, m = 0; m < this.m_constraintCount; ++m) { |
| a = this.m_constraints[m]; |
| var r = a.bodyA, |
| s = a.bodyB, |
| v = r.m_angularVelocity, |
| t = s.m_angularVelocity, |
| x = r.m_linearVelocity, |
| C = s.m_linearVelocity, |
| J = r.m_invMass, |
| T = r.m_invI, |
| P = s.m_invMass, |
| X = s.m_invI; |
| b = a.normal.x; |
| var $ = e = a.normal.y; |
| f = -b; |
| g = a.friction; |
| for (j = 0; j < a.pointCount; j++) { |
| o = a.points[j]; |
| q = C.x - t * o.rB.y - x.x + v * o.rA.y; |
| n = C.y + t * o.rB.x - x.y - v * o.rA.x; |
| q = q * $ + n * f; |
| q = o.tangentMass * -q; |
| n = g * o.normalImpulse; |
| n = R.Clamp(o.tangentImpulse + q, -n, n); |
| q = n - o.tangentImpulse; |
| c = q * $; |
| q = q * f; |
| x.x -= J * c; |
| x.y -= J * q; |
| v -= T * (o.rA.x * q - o.rA.y * c); |
| C.x += P * c; |
| C.y += P * q; |
| t += X * (o.rB.x * q - o.rB.y * c); |
| o.tangentImpulse = n |
| } |
| parseInt(a.pointCount); |
| if (a.pointCount == 1) { |
| o = a.points[0]; |
| q = C.x + -t * o.rB.y - x.x - -v * o.rA.y; |
| n = C.y + t * o.rB.x - x.y - v * o.rA.x; |
| a = q * b + n * e; |
| q = -o.normalMass * (a - o.velocityBias); |
| n = o.normalImpulse + q; |
| n = n > 0 ? n : 0; |
| q = n - o.normalImpulse; |
| c = q * b; |
| q = q * e; |
| x.x -= J * c; |
| x.y -= J * q; |
| v -= T * (o.rA.x * q - o.rA.y * c); |
| C.x += P * c; |
| C.y += P * q; |
| t += X * (o.rB.x * q - o.rB.y * c); |
| o.normalImpulse = n |
| } else { |
| o = a.points[0]; |
| j = a.points[1]; |
| q = o.normalImpulse; |
| g = j.normalImpulse; |
| var ba = (C.x - t * o.rB.y - x.x + v * o.rA.y) * b + (C.y + t * o.rB.x - x.y - v * o.rA.x) * e, |
| ca = (C.x - t * j.rB.y - x.x + v * j.rA.y) * b + (C.y + t * j.rB.x - x.y - v * j.rA.x) * e; |
| n = ba - o.velocityBias; |
| c = ca - j.velocityBias; |
| f = a.K; |
| n -= f.col1.x * q + f.col2.x * g; |
| for (c -= f.col1.y * q + f.col2.y * g;;) { |
| f = a.normalMass; |
| $ = -(f.col1.x * n + f.col2.x * c); |
| f = -(f.col1.y * n + f.col2.y * c); |
| if ($ >= 0 && f >= 0) { |
| q = $ - q; |
| g = f - g; |
| a = q * b; |
| q = q * e; |
| b = g * b; |
| e = g * e; |
| x.x -= J * (a + b); |
| x.y -= J * (q + e); |
| v -= T * (o.rA.x * q - o.rA.y * a + j.rA.x * e - j.rA.y * b); |
| C.x += P * (a + b); |
| C.y += P * (q + e); |
| t += X * (o.rB.x * q - o.rB.y * a + j.rB.x * e - j.rB.y * b); |
| o.normalImpulse = $; |
| j.normalImpulse = f; |
| break |
| } |
| $ = -o.normalMass * n; |
| f = 0; |
| ca = a.K.col1.y * $ + c; |
| if ($ >= 0 && ca >= 0) { |
| q = $ - q; |
| g = f - g; |
| a = q * b; |
| q = q * e; |
| b = g * b; |
| e = g * e; |
| x.x -= J * (a + b); |
| x.y -= J * (q + e); |
| v -= T * (o.rA.x * q - o.rA.y * a + j.rA.x * e - j.rA.y * b); |
| C.x += P * (a + b); |
| C.y += P * (q + e); |
| t += X * (o.rB.x * q - o.rB.y * a + j.rB.x * e - j.rB.y * b); |
| o.normalImpulse = $; |
| j.normalImpulse = f; |
| break |
| } |
| $ = 0; |
| f = -j.normalMass * c; |
| ba = a.K.col2.x * f + n; |
| if (f >= 0 && ba >= 0) { |
| q = $ - q; |
| g = f - g; |
| a = q * b; |
| q = q * e; |
| b = g * b; |
| e = g * e; |
| x.x -= J * (a + b); |
| x.y -= J * (q + e); |
| v -= T * (o.rA.x * q - o.rA.y * a + j.rA.x * e - j.rA.y * b); |
| C.x += P * (a + b); |
| C.y += P * (q + e); |
| t += X * (o.rB.x * q - o.rB.y * a + j.rB.x * e - j.rB.y * b); |
| o.normalImpulse = $; |
| j.normalImpulse = f; |
| break |
| } |
| f = $ = 0; |
| ba = n; |
| ca = c; |
| if (ba >= 0 && ca >= 0) { |
| q = $ - q; |
| g = f - g; |
| a = q * b; |
| q = q * e; |
| b = g * b; |
| e = g * e; |
| x.x -= J * (a + b); |
| x.y -= J * (q + e); |
| v -= T * (o.rA.x * q - o.rA.y * a + j.rA.x * e - j.rA.y * b); |
| C.x += P * (a + b); |
| C.y += P * (q + e); |
| t += X * (o.rB.x * q - o.rB.y * a + j.rB.x * e - j.rB.y * b); |
| o.normalImpulse = $; |
| j.normalImpulse = f; |
| break |
| } |
| break |
| } |
| } |
| r.m_angularVelocity = v; |
| s.m_angularVelocity = t |
| } |
| }; |
| L.prototype.FinalizeVelocityConstraints = function () { |
| for (var j = 0; j < this.m_constraintCount; ++j) for (var o = this.m_constraints[j], q = o.manifold, n = 0; n < o.pointCount; ++n) { |
| var a = q.m_points[n], |
| c = o.points[n]; |
| a.m_normalImpulse = c.normalImpulse; |
| a.m_tangentImpulse = c.tangentImpulse |
| } |
| }; |
| L.prototype.SolvePositionConstraints = function (j) { |
| if (j === undefined) j = 0; |
| for (var o = 0, q = 0; q < this.m_constraintCount; q++) { |
| var n = this.m_constraints[q], |
| a = n.bodyA, |
| c = n.bodyB, |
| g = a.m_mass * a.m_invMass, |
| b = a.m_mass * a.m_invI, |
| e = c.m_mass * c.m_invMass, |
| f = c.m_mass * c.m_invI; |
| L.s_psm.Initialize(n); |
| for (var m = L.s_psm.m_normal, r = 0; r < n.pointCount; r++) { |
| var s = n.points[r], |
| v = L.s_psm.m_points[r], |
| t = L.s_psm.m_separations[r], |
| x = v.x - a.m_sweep.c.x, |
| C = v.y - a.m_sweep.c.y, |
| J = v.x - c.m_sweep.c.x; |
| v = v.y - c.m_sweep.c.y; |
| o = o < t ? o : t; |
| t = R.Clamp(j * (t + O.b2_linearSlop), -O.b2_maxLinearCorrection, 0); |
| t = -s.equalizedMass * t; |
| s = t * m.x; |
| t = t * m.y; |
| a.m_sweep.c.x -= g * s; |
| a.m_sweep.c.y -= g * t; |
| a.m_sweep.a -= b * (x * t - C * s); |
| a.SynchronizeTransform(); |
| c.m_sweep.c.x += e * s; |
| c.m_sweep.c.y += e * t; |
| c.m_sweep.a += f * (J * t - v * s); |
| c.SynchronizeTransform() |
| } |
| } |
| return o > -1.5 * O.b2_linearSlop |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Dynamics.Contacts.b2ContactSolver.s_worldManifold = new l; |
| Box2D.Dynamics.Contacts.b2ContactSolver.s_psm = new u |
| }); |
| Box2D.inherit(I, Box2D.Dynamics.Contacts.b2Contact); |
| I.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype; |
| I.b2EdgeAndCircleContact = function () { |
| Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments) |
| }; |
| I.Create = function () { |
| return new I |
| }; |
| I.Destroy = function () {}; |
| I.prototype.Reset = function (j, o) { |
| this.__super.Reset.call(this, j, o) |
| }; |
| I.prototype.Evaluate = function () { |
| var j = this.m_fixtureA.GetBody(), |
| o = this.m_fixtureB.GetBody(); |
| this.b2CollideEdgeAndCircle(this.m_manifold, this.m_fixtureA.GetShape() instanceof G ? this.m_fixtureA.GetShape() : null, j.m_xf, |
| this.m_fixtureB.GetShape() instanceof F ? this.m_fixtureB.GetShape() : null, o.m_xf) |
| }; |
| I.prototype.b2CollideEdgeAndCircle = function () {}; |
| Box2D.inherit(W, Box2D.Dynamics.Contacts.b2Contact); |
| W.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype; |
| W.b2NullContact = function () { |
| Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments) |
| }; |
| W.prototype.b2NullContact = function () { |
| this.__super.b2Contact.call(this) |
| }; |
| W.prototype.Evaluate = function () {}; |
| Box2D.inherit(Y, Box2D.Dynamics.Contacts.b2Contact); |
| Y.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype; |
| Y.b2PolyAndCircleContact = function () { |
| Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments) |
| }; |
| Y.Create = function () { |
| return new Y |
| }; |
| Y.Destroy = function () {}; |
| Y.prototype.Reset = function (j, o) { |
| this.__super.Reset.call(this, j, o); |
| O.b2Assert(j.GetType() == y.e_polygonShape); |
| O.b2Assert(o.GetType() == y.e_circleShape) |
| }; |
| Y.prototype.Evaluate = function () { |
| var j = this.m_fixtureA.m_body, |
| o = this.m_fixtureB.m_body; |
| S.CollidePolygonAndCircle(this.m_manifold, this.m_fixtureA.GetShape() instanceof K ? this.m_fixtureA.GetShape() : null, j.m_xf, this.m_fixtureB.GetShape() instanceof F ? this.m_fixtureB.GetShape() : null, o.m_xf) |
| }; |
| Box2D.inherit(k, Box2D.Dynamics.Contacts.b2Contact); |
| k.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype; |
| k.b2PolyAndEdgeContact = function () { |
| Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments) |
| }; |
| k.Create = function () { |
| return new k |
| }; |
| k.Destroy = function () {}; |
| k.prototype.Reset = function (j, o) { |
| this.__super.Reset.call(this, j, o); |
| O.b2Assert(j.GetType() == y.e_polygonShape); |
| O.b2Assert(o.GetType() == y.e_edgeShape) |
| }; |
| k.prototype.Evaluate = function () { |
| var j = this.m_fixtureA.GetBody(), |
| o = this.m_fixtureB.GetBody(); |
| this.b2CollidePolyAndEdge(this.m_manifold, this.m_fixtureA.GetShape() instanceof K ? this.m_fixtureA.GetShape() : null, j.m_xf, this.m_fixtureB.GetShape() instanceof G ? this.m_fixtureB.GetShape() : null, o.m_xf) |
| }; |
| k.prototype.b2CollidePolyAndEdge = function () {}; |
| Box2D.inherit(z, Box2D.Dynamics.Contacts.b2Contact); |
| z.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype; |
| z.b2PolygonContact = function () { |
| Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments) |
| }; |
| z.Create = function () { |
| return new z |
| }; |
| z.Destroy = function () {}; |
| z.prototype.Reset = function (j, o) { |
| this.__super.Reset.call(this, j, o) |
| }; |
| z.prototype.Evaluate = function () { |
| var j = this.m_fixtureA.GetBody(), |
| o = this.m_fixtureB.GetBody(); |
| S.CollidePolygons(this.m_manifold, this.m_fixtureA.GetShape() instanceof K ? this.m_fixtureA.GetShape() : null, j.m_xf, this.m_fixtureB.GetShape() instanceof K ? this.m_fixtureB.GetShape() : null, o.m_xf) |
| }; |
| u.b2PositionSolverManifold = function () {}; |
| u.prototype.b2PositionSolverManifold = function () { |
| this.m_normal = new N; |
| this.m_separations = new Vector_a2j_Number(O.b2_maxManifoldPoints); |
| this.m_points = new Vector(O.b2_maxManifoldPoints); |
| for (var j = 0; j < O.b2_maxManifoldPoints; j++) this.m_points[j] = new N |
| }; |
| u.prototype.Initialize = function (j) { |
| O.b2Assert(j.pointCount > 0); |
| var o = 0, |
| q = 0, |
| n = 0, |
| a, c = 0, |
| g = 0; |
| switch (j.type) { |
| case Z.e_circles: |
| a = j.bodyA.m_xf.R; |
| n = j.localPoint; |
| o = j.bodyA.m_xf.position.x + (a.col1.x * n.x + a.col2.x * n.y); |
| q = j.bodyA.m_xf.position.y + (a.col1.y * n.x + a.col2.y * n.y); |
| a = j.bodyB.m_xf.R; |
| n = j.points[0].localPoint; |
| c = j.bodyB.m_xf.position.x + (a.col1.x * n.x + a.col2.x * n.y); |
| a = j.bodyB.m_xf.position.y + (a.col1.y * n.x + a.col2.y * n.y); |
| n = c - o; |
| g = a - q; |
| var b = n * n + g * g; |
| if (b > Number.MIN_VALUE * Number.MIN_VALUE) { |
| b = Math.sqrt(b); |
| this.m_normal.x = n / b; |
| this.m_normal.y = g / b |
| } else { |
| this.m_normal.x = 1; |
| this.m_normal.y = 0 |
| } |
| this.m_points[0].x = 0.5 * (o + c); |
| this.m_points[0].y = 0.5 * (q + a); |
| this.m_separations[0] = n * this.m_normal.x + g * this.m_normal.y - j.radius; |
| break; |
| case Z.e_faceA: |
| a = j.bodyA.m_xf.R; |
| n = j.localPlaneNormal; |
| this.m_normal.x = a.col1.x * n.x + a.col2.x * n.y; |
| this.m_normal.y = a.col1.y * n.x + a.col2.y * n.y; |
| a = j.bodyA.m_xf.R; |
| n = j.localPoint; |
| c = j.bodyA.m_xf.position.x + (a.col1.x * n.x + a.col2.x * n.y); |
| g = j.bodyA.m_xf.position.y + (a.col1.y * n.x + a.col2.y * n.y); |
| a = j.bodyB.m_xf.R; |
| for (o = 0; o < j.pointCount; ++o) { |
| n = j.points[o].localPoint; |
| q = j.bodyB.m_xf.position.x + (a.col1.x * n.x + a.col2.x * n.y); |
| n = j.bodyB.m_xf.position.y + (a.col1.y * n.x + a.col2.y * n.y); |
| this.m_separations[o] = (q - c) * this.m_normal.x + (n - g) * this.m_normal.y - j.radius; |
| this.m_points[o].x = q; |
| this.m_points[o].y = n |
| } |
| break; |
| case Z.e_faceB: |
| a = j.bodyB.m_xf.R; |
| n = j.localPlaneNormal; |
| this.m_normal.x = a.col1.x * n.x + a.col2.x * n.y; |
| this.m_normal.y = a.col1.y * n.x + a.col2.y * n.y; |
| a = j.bodyB.m_xf.R; |
| n = j.localPoint; |
| c = j.bodyB.m_xf.position.x + (a.col1.x * n.x + a.col2.x * n.y); |
| g = j.bodyB.m_xf.position.y + (a.col1.y * n.x + a.col2.y * n.y); |
| a = j.bodyA.m_xf.R; |
| for (o = 0; o < j.pointCount; ++o) { |
| n = j.points[o].localPoint; |
| q = j.bodyA.m_xf.position.x + (a.col1.x * n.x + a.col2.x * n.y); |
| n = j.bodyA.m_xf.position.y + (a.col1.y * n.x + a.col2.y * n.y); |
| this.m_separations[o] = (q - c) * this.m_normal.x + (n - g) * this.m_normal.y - j.radius; |
| this.m_points[o].Set(q, n) |
| } |
| this.m_normal.x *= -1; |
| this.m_normal.y *= -1 |
| } |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Dynamics.Contacts.b2PositionSolverManifold.circlePointA = new N; |
| Box2D.Dynamics.Contacts.b2PositionSolverManifold.circlePointB = new N |
| }) |
| })(); |
| (function () { |
| var F = Box2D.Common.Math.b2Mat22, |
| G = Box2D.Common.Math.b2Math, |
| K = Box2D.Common.Math.b2Vec2, |
| y = Box2D.Common.b2Color, |
| w = Box2D.Dynamics.Controllers.b2BuoyancyController, |
| A = Box2D.Dynamics.Controllers.b2ConstantAccelController, |
| U = Box2D.Dynamics.Controllers.b2ConstantForceController, |
| p = Box2D.Dynamics.Controllers.b2Controller, |
| B = Box2D.Dynamics.Controllers.b2ControllerEdge, |
| Q = Box2D.Dynamics.Controllers.b2GravityController, |
| V = Box2D.Dynamics.Controllers.b2TensorDampingController; |
| Box2D.inherit(w, Box2D.Dynamics.Controllers.b2Controller); |
| w.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype; |
| w.b2BuoyancyController = function () { |
| Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments); |
| this.normal = new K(0, -1); |
| this.density = this.offset = 0; |
| this.velocity = new K(0, 0); |
| this.linearDrag = 2; |
| this.angularDrag = 1; |
| this.useDensity = false; |
| this.useWorldGravity = true; |
| this.gravity = null |
| }; |
| w.prototype.Step = function () { |
| if (this.m_bodyList) { |
| if (this.useWorldGravity) this.gravity = this.GetWorld().GetGravity().Copy(); |
| for (var M = this.m_bodyList; M; M = M.nextBody) { |
| var L = M.body; |
| if (L.IsAwake() != false) { |
| for (var I = new K, W = new K, Y = 0, k = 0, z = L.GetFixtureList(); z; z = z.GetNext()) { |
| var u = new K, |
| D = z.GetShape().ComputeSubmergedArea(this.normal, this.offset, L.GetTransform(), u); |
| Y += D; |
| I.x += D * u.x; |
| I.y += D * u.y; |
| var H = 0; |
| H = 1; |
| k += D * H; |
| W.x += D * u.x * H; |
| W.y += D * u.y * H |
| } |
| I.x /= Y; |
| I.y /= Y; |
| W.x /= k; |
| W.y /= k; |
| if (!(Y < Number.MIN_VALUE)) { |
| k = this.gravity.GetNegative(); |
| k.Multiply(this.density * Y); |
| L.ApplyForce(k, W); |
| W = L.GetLinearVelocityFromWorldPoint(I); |
| W.Subtract(this.velocity); |
| W.Multiply(-this.linearDrag * Y); |
| L.ApplyForce(W, I); |
| L.ApplyTorque(-L.GetInertia() / L.GetMass() * Y * L.GetAngularVelocity() * this.angularDrag) |
| } |
| } |
| } |
| } |
| }; |
| w.prototype.Draw = function (M) { |
| var L = new K, |
| I = new K; |
| L.x = this.normal.x * this.offset + this.normal.y * 1E3; |
| L.y = this.normal.y * this.offset - this.normal.x * 1E3; |
| I.x = this.normal.x * this.offset - this.normal.y * 1E3; |
| I.y = this.normal.y * this.offset + this.normal.x * 1E3; |
| var W = new y(0, 0, 1); |
| M.DrawSegment(L, I, W) |
| }; |
| Box2D.inherit(A, Box2D.Dynamics.Controllers.b2Controller); |
| A.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype; |
| A.b2ConstantAccelController = function () { |
| Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments); |
| this.A = new K(0, 0) |
| }; |
| A.prototype.Step = function (M) { |
| M = new K(this.A.x * M.dt, this.A.y * M.dt); |
| for (var L = this.m_bodyList; L; L = L.nextBody) { |
| var I = L.body; |
| I.IsAwake() && I.SetLinearVelocity(new K(I.GetLinearVelocity().x + M.x, I.GetLinearVelocity().y + M.y)) |
| } |
| }; |
| Box2D.inherit(U, Box2D.Dynamics.Controllers.b2Controller); |
| U.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype; |
| U.b2ConstantForceController = function () { |
| Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments); |
| this.F = new K(0, 0) |
| }; |
| U.prototype.Step = function () { |
| for (var M = this.m_bodyList; M; M = M.nextBody) { |
| var L = M.body; |
| L.IsAwake() && L.ApplyForce(this.F, L.GetWorldCenter()) |
| } |
| }; |
| p.b2Controller = function () {}; |
| p.prototype.Step = function () {}; |
| p.prototype.Draw = function () {}; |
| p.prototype.AddBody = function (M) { |
| var L = new B; |
| L.controller = this; |
| L.body = M; |
| L.nextBody = this.m_bodyList; |
| L.prevBody = null; |
| this.m_bodyList = L; |
| if (L.nextBody) L.nextBody.prevBody = L; |
| this.m_bodyCount++; |
| L.nextController = M.m_controllerList; |
| L.prevController = null; |
| M.m_controllerList = L; |
| if (L.nextController) L.nextController.prevController = L; |
| M.m_controllerCount++ |
| }; |
| p.prototype.RemoveBody = function (M) { |
| for (var L = M.m_controllerList; L && L.controller != this;) L = L.nextController; |
| if (L.prevBody) L.prevBody.nextBody = L.nextBody; |
| if (L.nextBody) L.nextBody.prevBody = L.prevBody; |
| if (L.nextController) L.nextController.prevController = L.prevController; |
| if (L.prevController) L.prevController.nextController = L.nextController; |
| if (this.m_bodyList == L) this.m_bodyList = L.nextBody; |
| if (M.m_controllerList == L) M.m_controllerList = L.nextController; |
| M.m_controllerCount--; |
| this.m_bodyCount-- |
| }; |
| p.prototype.Clear = function () { |
| for (; this.m_bodyList;) this.RemoveBody(this.m_bodyList.body) |
| }; |
| p.prototype.GetNext = function () { |
| return this.m_next |
| }; |
| p.prototype.GetWorld = function () { |
| return this.m_world |
| }; |
| p.prototype.GetBodyList = function () { |
| return this.m_bodyList |
| }; |
| B.b2ControllerEdge = function () {}; |
| Box2D.inherit(Q, Box2D.Dynamics.Controllers.b2Controller); |
| Q.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype; |
| Q.b2GravityController = function () { |
| Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments); |
| this.G = 1; |
| this.invSqr = true |
| }; |
| Q.prototype.Step = function () { |
| var M = null, |
| L = null, |
| I = null, |
| W = 0, |
| Y = null, |
| k = null, |
| z = null, |
| u = 0, |
| D = 0, |
| H = 0; |
| u = null; |
| if (this.invSqr) for (M = this.m_bodyList; M; M = M.nextBody) { |
| L = M.body; |
| I = L.GetWorldCenter(); |
| W = L.GetMass(); |
| for (Y = this.m_bodyList; Y != M; Y = Y.nextBody) { |
| k = Y.body; |
| z = k.GetWorldCenter(); |
| u = z.x - I.x; |
| D = z.y - I.y; |
| H = u * u + D * D; |
| if (!(H < Number.MIN_VALUE)) { |
| u = new K(u, D); |
| u.Multiply(this.G / H / Math.sqrt(H) * W * k.GetMass()); |
| L.IsAwake() && L.ApplyForce(u, I); |
| u.Multiply(-1); |
| k.IsAwake() && k.ApplyForce(u, z) |
| } |
| } |
| } else |
| for (M = this.m_bodyList; M; M = M.nextBody) { |
| L = M.body; |
| I = L.GetWorldCenter(); |
| W = L.GetMass(); |
| for (Y = this.m_bodyList; Y != M; Y = Y.nextBody) { |
| k = Y.body; |
| z = k.GetWorldCenter(); |
| u = z.x - I.x; |
| D = z.y - I.y; |
| H = u * u + D * D; |
| if (!(H < Number.MIN_VALUE)) { |
| u = new K(u, D); |
| u.Multiply(this.G / H * W * k.GetMass()); |
| L.IsAwake() && L.ApplyForce(u, I); |
| u.Multiply(-1); |
| k.IsAwake() && k.ApplyForce(u, z) |
| } |
| } |
| } |
| }; |
| Box2D.inherit(V, Box2D.Dynamics.Controllers.b2Controller); |
| V.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype; |
| V.b2TensorDampingController = function () { |
| Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments); |
| this.T = new F; |
| this.maxTimestep = 0 |
| }; |
| V.prototype.SetAxisAligned = function (M, L) { |
| if (M === undefined) M = 0; |
| if (L === undefined) L = 0; |
| this.T.col1.x = -M; |
| this.T.col1.y = 0; |
| this.T.col2.x = 0; |
| this.T.col2.y = -L; |
| this.maxTimestep = M > 0 || L > 0 ? 1 / Math.max(M, L) : 0 |
| }; |
| V.prototype.Step = function (M) { |
| M = M.dt; |
| if (!(M <= Number.MIN_VALUE)) { |
| if (M > this.maxTimestep && this.maxTimestep > 0) M = this.maxTimestep; |
| for (var L = this.m_bodyList; L; L = L.nextBody) { |
| var I = L.body; |
| if (I.IsAwake()) { |
| var W = I.GetWorldVector(G.MulMV(this.T, I.GetLocalVector(I.GetLinearVelocity()))); |
| I.SetLinearVelocity(new K(I.GetLinearVelocity().x + W.x * M, I.GetLinearVelocity().y + W.y * M)) |
| } |
| } |
| } |
| } |
| })(); |
| (function () { |
| var F = Box2D.Common.b2Settings, |
| G = Box2D.Common.Math.b2Mat22, |
| K = Box2D.Common.Math.b2Mat33, |
| y = Box2D.Common.Math.b2Math, |
| w = Box2D.Common.Math.b2Vec2, |
| A = Box2D.Common.Math.b2Vec3, |
| U = Box2D.Dynamics.Joints.b2DistanceJoint, |
| p = Box2D.Dynamics.Joints.b2DistanceJointDef, |
| B = Box2D.Dynamics.Joints.b2FrictionJoint, |
| Q = Box2D.Dynamics.Joints.b2FrictionJointDef, |
| V = Box2D.Dynamics.Joints.b2GearJoint, |
| M = Box2D.Dynamics.Joints.b2GearJointDef, |
| L = Box2D.Dynamics.Joints.b2Jacobian, |
| I = Box2D.Dynamics.Joints.b2Joint, |
| W = Box2D.Dynamics.Joints.b2JointDef, |
| Y = Box2D.Dynamics.Joints.b2JointEdge, |
| k = Box2D.Dynamics.Joints.b2LineJoint, |
| z = Box2D.Dynamics.Joints.b2LineJointDef, |
| u = Box2D.Dynamics.Joints.b2MouseJoint, |
| D = Box2D.Dynamics.Joints.b2MouseJointDef, |
| H = Box2D.Dynamics.Joints.b2PrismaticJoint, |
| O = Box2D.Dynamics.Joints.b2PrismaticJointDef, |
| E = Box2D.Dynamics.Joints.b2PulleyJoint, |
| R = Box2D.Dynamics.Joints.b2PulleyJointDef, |
| N = Box2D.Dynamics.Joints.b2RevoluteJoint, |
| S = Box2D.Dynamics.Joints.b2RevoluteJointDef, |
| aa = Box2D.Dynamics.Joints.b2WeldJoint, |
| Z = Box2D.Dynamics.Joints.b2WeldJointDef; |
| Box2D.inherit(U, Box2D.Dynamics.Joints.b2Joint); |
| U.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype; |
| U.b2DistanceJoint = function () { |
| Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments); |
| this.m_localAnchor1 = new w; |
| this.m_localAnchor2 = new w; |
| this.m_u = new w |
| }; |
| U.prototype.GetAnchorA = function () { |
| return this.m_bodyA.GetWorldPoint(this.m_localAnchor1) |
| }; |
| U.prototype.GetAnchorB = function () { |
| return this.m_bodyB.GetWorldPoint(this.m_localAnchor2) |
| }; |
| U.prototype.GetReactionForce = function (d) { |
| if (d === undefined) d = 0; |
| return new w(d * this.m_impulse * this.m_u.x, d * this.m_impulse * this.m_u.y) |
| }; |
| U.prototype.GetReactionTorque = function () { |
| return 0 |
| }; |
| U.prototype.GetLength = function () { |
| return this.m_length |
| }; |
| U.prototype.SetLength = function (d) { |
| if (d === undefined) d = 0; |
| this.m_length = d |
| }; |
| U.prototype.GetFrequency = function () { |
| return this.m_frequencyHz |
| }; |
| U.prototype.SetFrequency = function (d) { |
| if (d === undefined) d = 0; |
| this.m_frequencyHz = d |
| }; |
| U.prototype.GetDampingRatio = function () { |
| return this.m_dampingRatio |
| }; |
| U.prototype.SetDampingRatio = function (d) { |
| if (d === undefined) d = 0; |
| this.m_dampingRatio = d |
| }; |
| U.prototype.b2DistanceJoint = function (d) { |
| this.__super.b2Joint.call(this, d); |
| this.m_localAnchor1.SetV(d.localAnchorA); |
| this.m_localAnchor2.SetV(d.localAnchorB); |
| this.m_length = d.length; |
| this.m_frequencyHz = d.frequencyHz; |
| this.m_dampingRatio = d.dampingRatio; |
| this.m_bias = this.m_gamma = this.m_impulse = 0 |
| }; |
| U.prototype.InitVelocityConstraints = function (d) { |
| var h, l = 0, |
| j = this.m_bodyA, |
| o = this.m_bodyB; |
| h = j.m_xf.R; |
| var q = this.m_localAnchor1.x - j.m_sweep.localCenter.x, |
| n = this.m_localAnchor1.y - j.m_sweep.localCenter.y; |
| l = h.col1.x * q + h.col2.x * n; |
| n = h.col1.y * q + h.col2.y * n; |
| q = l; |
| h = o.m_xf.R; |
| var a = this.m_localAnchor2.x - o.m_sweep.localCenter.x, |
| c = this.m_localAnchor2.y - o.m_sweep.localCenter.y; |
| l = h.col1.x * a + h.col2.x * c; |
| c = h.col1.y * a + h.col2.y * c; |
| a = l; |
| this.m_u.x = o.m_sweep.c.x + a - j.m_sweep.c.x - q; |
| this.m_u.y = o.m_sweep.c.y + c - j.m_sweep.c.y - n; |
| l = Math.sqrt(this.m_u.x * this.m_u.x + this.m_u.y * this.m_u.y); |
| l > F.b2_linearSlop ? this.m_u.Multiply(1 / l) : this.m_u.SetZero(); |
| h = q * this.m_u.y - n * this.m_u.x; |
| var g = a * this.m_u.y - c * this.m_u.x; |
| h = j.m_invMass + j.m_invI * h * h + o.m_invMass + o.m_invI * g * g; |
| this.m_mass = h != 0 ? 1 / h : 0; |
| if (this.m_frequencyHz > 0) { |
| l = l - this.m_length; |
| g = 2 * Math.PI * this.m_frequencyHz; |
| var b = this.m_mass * g * g; |
| this.m_gamma = d.dt * (2 * this.m_mass * this.m_dampingRatio * g + d.dt * b); |
| this.m_gamma = this.m_gamma != 0 ? 1 / this.m_gamma : 0; |
| this.m_bias = l * d.dt * b * this.m_gamma; |
| this.m_mass = h + this.m_gamma; |
| this.m_mass = this.m_mass != 0 ? 1 / this.m_mass : 0 |
| } |
| if (d.warmStarting) { |
| this.m_impulse *= d.dtRatio; |
| d = this.m_impulse * this.m_u.x; |
| h = this.m_impulse * this.m_u.y; |
| j.m_linearVelocity.x -= j.m_invMass * d; |
| j.m_linearVelocity.y -= j.m_invMass * h; |
| j.m_angularVelocity -= j.m_invI * (q * h - n * d); |
| o.m_linearVelocity.x += o.m_invMass * d; |
| o.m_linearVelocity.y += o.m_invMass * h; |
| o.m_angularVelocity += o.m_invI * (a * h - c * d) |
| } else this.m_impulse = 0 |
| }; |
| U.prototype.SolveVelocityConstraints = function () { |
| var d, h = this.m_bodyA, |
| l = this.m_bodyB; |
| d = h.m_xf.R; |
| var j = this.m_localAnchor1.x - h.m_sweep.localCenter.x, |
| o = this.m_localAnchor1.y - h.m_sweep.localCenter.y, |
| q = d.col1.x * j + d.col2.x * o; |
| o = d.col1.y * j + d.col2.y * o; |
| j = q; |
| d = l.m_xf.R; |
| var n = this.m_localAnchor2.x - l.m_sweep.localCenter.x, |
| a = this.m_localAnchor2.y - l.m_sweep.localCenter.y; |
| q = d.col1.x * n + d.col2.x * a; |
| a = d.col1.y * n + d.col2.y * a; |
| n = q; |
| q = -this.m_mass * (this.m_u.x * (l.m_linearVelocity.x + -l.m_angularVelocity * a - (h.m_linearVelocity.x + -h.m_angularVelocity * o)) + this.m_u.y * (l.m_linearVelocity.y + l.m_angularVelocity * n - (h.m_linearVelocity.y + h.m_angularVelocity * j)) + this.m_bias + this.m_gamma * this.m_impulse); |
| this.m_impulse += q; |
| d = q * this.m_u.x; |
| q = q * this.m_u.y; |
| h.m_linearVelocity.x -= h.m_invMass * d; |
| h.m_linearVelocity.y -= h.m_invMass * q; |
| h.m_angularVelocity -= h.m_invI * (j * q - o * d); |
| l.m_linearVelocity.x += l.m_invMass * d; |
| l.m_linearVelocity.y += l.m_invMass * q; |
| l.m_angularVelocity += l.m_invI * (n * q - a * d) |
| }; |
| U.prototype.SolvePositionConstraints = function () { |
| var d; |
| if (this.m_frequencyHz > 0) return true; |
| var h = this.m_bodyA, |
| l = this.m_bodyB; |
| d = h.m_xf.R; |
| var j = this.m_localAnchor1.x - h.m_sweep.localCenter.x, |
| o = this.m_localAnchor1.y - h.m_sweep.localCenter.y, |
| q = d.col1.x * j + d.col2.x * o; |
| o = d.col1.y * j + d.col2.y * o; |
| j = q; |
| d = l.m_xf.R; |
| var n = this.m_localAnchor2.x - l.m_sweep.localCenter.x, |
| a = this.m_localAnchor2.y - l.m_sweep.localCenter.y; |
| q = d.col1.x * n + d.col2.x * a; |
| a = d.col1.y * n + d.col2.y * a; |
| n = q; |
| q = l.m_sweep.c.x + n - h.m_sweep.c.x - j; |
| var c = l.m_sweep.c.y + a - h.m_sweep.c.y - o; |
| d = Math.sqrt(q * q + c * c); |
| q /= d; |
| c /= d; |
| d = d - this.m_length; |
| d = y.Clamp(d, -F.b2_maxLinearCorrection, F.b2_maxLinearCorrection); |
| var g = -this.m_mass * d; |
| this.m_u.Set(q, c); |
| q = g * this.m_u.x; |
| c = g * this.m_u.y; |
| h.m_sweep.c.x -= h.m_invMass * q; |
| h.m_sweep.c.y -= h.m_invMass * c; |
| h.m_sweep.a -= h.m_invI * (j * c - o * q); |
| l.m_sweep.c.x += l.m_invMass * q; |
| l.m_sweep.c.y += l.m_invMass * c; |
| l.m_sweep.a += l.m_invI * (n * c - a * q); |
| h.SynchronizeTransform(); |
| l.SynchronizeTransform(); |
| return y.Abs(d) < F.b2_linearSlop |
| }; |
| Box2D.inherit(p, Box2D.Dynamics.Joints.b2JointDef); |
| p.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype; |
| p.b2DistanceJointDef = function () { |
| Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments); |
| this.localAnchorA = new w; |
| this.localAnchorB = new w |
| }; |
| p.prototype.b2DistanceJointDef = function () { |
| this.__super.b2JointDef.call(this); |
| this.type = I.e_distanceJoint; |
| this.length = 1; |
| this.dampingRatio = this.frequencyHz = 0 |
| }; |
| p.prototype.Initialize = function (d, h, l, j) { |
| this.bodyA = d; |
| this.bodyB = h; |
| this.localAnchorA.SetV(this.bodyA.GetLocalPoint(l)); |
| this.localAnchorB.SetV(this.bodyB.GetLocalPoint(j)); |
| d = j.x - l.x; |
| l = j.y - l.y; |
| this.length = Math.sqrt(d * d + l * l); |
| this.dampingRatio = this.frequencyHz = 0 |
| }; |
| Box2D.inherit(B, Box2D.Dynamics.Joints.b2Joint); |
| B.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype; |
| B.b2FrictionJoint = function () { |
| Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments); |
| this.m_localAnchorA = new w; |
| this.m_localAnchorB = new w; |
| this.m_linearMass = new G; |
| this.m_linearImpulse = new w |
| }; |
| B.prototype.GetAnchorA = function () { |
| return this.m_bodyA.GetWorldPoint(this.m_localAnchorA) |
| }; |
| B.prototype.GetAnchorB = function () { |
| return this.m_bodyB.GetWorldPoint(this.m_localAnchorB) |
| }; |
| B.prototype.GetReactionForce = function (d) { |
| if (d === undefined) d = 0; |
| return new w(d * this.m_linearImpulse.x, d * this.m_linearImpulse.y) |
| }; |
| B.prototype.GetReactionTorque = function (d) { |
| if (d === undefined) d = 0; |
| return d * this.m_angularImpulse |
| }; |
| B.prototype.SetMaxForce = function (d) { |
| if (d === undefined) d = 0; |
| this.m_maxForce = d |
| }; |
| B.prototype.GetMaxForce = function () { |
| return this.m_maxForce |
| }; |
| B.prototype.SetMaxTorque = function (d) { |
| if (d === undefined) d = 0; |
| this.m_maxTorque = d |
| }; |
| B.prototype.GetMaxTorque = function () { |
| return this.m_maxTorque |
| }; |
| B.prototype.b2FrictionJoint = function (d) { |
| this.__super.b2Joint.call(this, d); |
| this.m_localAnchorA.SetV(d.localAnchorA); |
| this.m_localAnchorB.SetV(d.localAnchorB); |
| this.m_linearMass.SetZero(); |
| this.m_angularMass = 0; |
| this.m_linearImpulse.SetZero(); |
| this.m_angularImpulse = 0; |
| this.m_maxForce = d.maxForce; |
| this.m_maxTorque = d.maxTorque |
| }; |
| B.prototype.InitVelocityConstraints = function (d) { |
| var h, l = 0, |
| j = this.m_bodyA, |
| o = this.m_bodyB; |
| h = j.m_xf.R; |
| var q = this.m_localAnchorA.x - j.m_sweep.localCenter.x, |
| n = this.m_localAnchorA.y - j.m_sweep.localCenter.y; |
| l = h.col1.x * q + h.col2.x * n; |
| n = h.col1.y * q + h.col2.y * n; |
| q = l; |
| h = o.m_xf.R; |
| var a = this.m_localAnchorB.x - o.m_sweep.localCenter.x, |
| c = this.m_localAnchorB.y - o.m_sweep.localCenter.y; |
| l = h.col1.x * a + h.col2.x * c; |
| c = h.col1.y * a + h.col2.y * c; |
| a = l; |
| h = j.m_invMass; |
| l = o.m_invMass; |
| var g = j.m_invI, |
| b = o.m_invI, |
| e = new G; |
| e.col1.x = h + l; |
| e.col2.x = 0; |
| e.col1.y = 0; |
| e.col2.y = h + l; |
| e.col1.x += g * n * n; |
| e.col2.x += -g * q * n; |
| e.col1.y += -g * q * n; |
| e.col2.y += g * q * q; |
| e.col1.x += b * c * c; |
| e.col2.x += -b * a * c; |
| e.col1.y += -b * a * c; |
| e.col2.y += b * a * a; |
| e.GetInverse(this.m_linearMass); |
| this.m_angularMass = g + b; |
| if (this.m_angularMass > 0) this.m_angularMass = 1 / this.m_angularMass; |
| if (d.warmStarting) { |
| this.m_linearImpulse.x *= d.dtRatio; |
| this.m_linearImpulse.y *= d.dtRatio; |
| this.m_angularImpulse *= d.dtRatio; |
| d = this.m_linearImpulse; |
| j.m_linearVelocity.x -= h * d.x; |
| j.m_linearVelocity.y -= h * d.y; |
| j.m_angularVelocity -= g * (q * d.y - n * d.x + this.m_angularImpulse); |
| o.m_linearVelocity.x += l * d.x; |
| o.m_linearVelocity.y += l * d.y; |
| o.m_angularVelocity += b * (a * d.y - c * d.x + this.m_angularImpulse) |
| } else { |
| this.m_linearImpulse.SetZero(); |
| this.m_angularImpulse = 0 |
| } |
| }; |
| B.prototype.SolveVelocityConstraints = function (d) { |
| var h, l = 0, |
| j = this.m_bodyA, |
| o = this.m_bodyB, |
| q = j.m_linearVelocity, |
| n = j.m_angularVelocity, |
| a = o.m_linearVelocity, |
| c = o.m_angularVelocity, |
| g = j.m_invMass, |
| b = o.m_invMass, |
| e = j.m_invI, |
| f = o.m_invI; |
| h = j.m_xf.R; |
| var m = this.m_localAnchorA.x - j.m_sweep.localCenter.x, |
| r = this.m_localAnchorA.y - j.m_sweep.localCenter.y; |
| l = h.col1.x * m + h.col2.x * r; |
| r = h.col1.y * m + h.col2.y * r; |
| m = l; |
| h = o.m_xf.R; |
| var s = this.m_localAnchorB.x - o.m_sweep.localCenter.x, |
| v = this.m_localAnchorB.y - o.m_sweep.localCenter.y; |
| l = h.col1.x * s + h.col2.x * v; |
| v = h.col1.y * s + h.col2.y * v; |
| s = l; |
| h = 0; |
| l = -this.m_angularMass * (c - n); |
| var t = this.m_angularImpulse; |
| h = d.dt * this.m_maxTorque; |
| this.m_angularImpulse = y.Clamp(this.m_angularImpulse + l, -h, h); |
| l = this.m_angularImpulse - t; |
| n -= e * l; |
| c += f * l; |
| h = y.MulMV(this.m_linearMass, |
| new w(-(a.x - c * v - q.x + n * r), -(a.y + c * s - q.y - n * m))); |
| l = this.m_linearImpulse.Copy(); |
| this.m_linearImpulse.Add(h); |
| h = d.dt * this.m_maxForce; |
| if (this.m_linearImpulse.LengthSquared() > h * h) { |
| this.m_linearImpulse.Normalize(); |
| this.m_linearImpulse.Multiply(h) |
| } |
| h = y.SubtractVV(this.m_linearImpulse, l); |
| q.x -= g * h.x; |
| q.y -= g * h.y; |
| n -= e * (m * h.y - r * h.x); |
| a.x += b * h.x; |
| a.y += b * h.y; |
| c += f * (s * h.y - v * h.x); |
| j.m_angularVelocity = n; |
| o.m_angularVelocity = c |
| }; |
| B.prototype.SolvePositionConstraints = function () { |
| return true |
| }; |
| Box2D.inherit(Q, Box2D.Dynamics.Joints.b2JointDef); |
| Q.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype; |
| Q.b2FrictionJointDef = function () { |
| Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments); |
| this.localAnchorA = new w; |
| this.localAnchorB = new w |
| }; |
| Q.prototype.b2FrictionJointDef = function () { |
| this.__super.b2JointDef.call(this); |
| this.type = I.e_frictionJoint; |
| this.maxTorque = this.maxForce = 0 |
| }; |
| Q.prototype.Initialize = function (d, h, l) { |
| this.bodyA = d; |
| this.bodyB = h; |
| this.localAnchorA.SetV(this.bodyA.GetLocalPoint(l)); |
| this.localAnchorB.SetV(this.bodyB.GetLocalPoint(l)) |
| }; |
| Box2D.inherit(V, Box2D.Dynamics.Joints.b2Joint); |
| V.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype; |
| V.b2GearJoint = function () { |
| Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments); |
| this.m_groundAnchor1 = new w; |
| this.m_groundAnchor2 = new w; |
| this.m_localAnchor1 = new w; |
| this.m_localAnchor2 = new w; |
| this.m_J = new L |
| }; |
| V.prototype.GetAnchorA = function () { |
| return this.m_bodyA.GetWorldPoint(this.m_localAnchor1) |
| }; |
| V.prototype.GetAnchorB = function () { |
| return this.m_bodyB.GetWorldPoint(this.m_localAnchor2) |
| }; |
| V.prototype.GetReactionForce = function (d) { |
| if (d === undefined) d = 0; |
| return new w(d * this.m_impulse * this.m_J.linearB.x, d * this.m_impulse * this.m_J.linearB.y) |
| }; |
| V.prototype.GetReactionTorque = function (d) { |
| if (d === undefined) d = 0; |
| var h = this.m_bodyB.m_xf.R, |
| l = this.m_localAnchor1.x - this.m_bodyB.m_sweep.localCenter.x, |
| j = this.m_localAnchor1.y - this.m_bodyB.m_sweep.localCenter.y, |
| o = h.col1.x * l + h.col2.x * j; |
| j = h.col1.y * l + h.col2.y * j; |
| l = o; |
| return d * (this.m_impulse * this.m_J.angularB - l * this.m_impulse * this.m_J.linearB.y + j * this.m_impulse * this.m_J.linearB.x) |
| }; |
| V.prototype.GetRatio = function () { |
| return this.m_ratio |
| }; |
| V.prototype.SetRatio = function (d) { |
| if (d === undefined) d = 0; |
| this.m_ratio = d |
| }; |
| V.prototype.b2GearJoint = function (d) { |
| this.__super.b2Joint.call(this, d); |
| var h = parseInt(d.joint1.m_type), |
| l = parseInt(d.joint2.m_type); |
| this.m_prismatic2 = this.m_revolute2 = this.m_prismatic1 = this.m_revolute1 = null; |
| var j = 0, |
| o = 0; |
| this.m_ground1 = d.joint1.GetBodyA(); |
| this.m_bodyA = d.joint1.GetBodyB(); |
| if (h == I.e_revoluteJoint) { |
| this.m_revolute1 = d.joint1 instanceof N ? d.joint1 : null; |
| this.m_groundAnchor1.SetV(this.m_revolute1.m_localAnchor1); |
| this.m_localAnchor1.SetV(this.m_revolute1.m_localAnchor2); |
| j = this.m_revolute1.GetJointAngle() |
| } else { |
| this.m_prismatic1 = d.joint1 instanceof H ? d.joint1 : null; |
| this.m_groundAnchor1.SetV(this.m_prismatic1.m_localAnchor1); |
| this.m_localAnchor1.SetV(this.m_prismatic1.m_localAnchor2); |
| j = this.m_prismatic1.GetJointTranslation() |
| } |
| this.m_ground2 = d.joint2.GetBodyA(); |
| this.m_bodyB = d.joint2.GetBodyB(); |
| if (l == I.e_revoluteJoint) { |
| this.m_revolute2 = d.joint2 instanceof N ? d.joint2 : null; |
| this.m_groundAnchor2.SetV(this.m_revolute2.m_localAnchor1); |
| this.m_localAnchor2.SetV(this.m_revolute2.m_localAnchor2); |
| o = this.m_revolute2.GetJointAngle() |
| } else { |
| this.m_prismatic2 = d.joint2 instanceof H ? d.joint2 : null; |
| this.m_groundAnchor2.SetV(this.m_prismatic2.m_localAnchor1); |
| this.m_localAnchor2.SetV(this.m_prismatic2.m_localAnchor2); |
| o = this.m_prismatic2.GetJointTranslation() |
| } |
| this.m_ratio = d.ratio; |
| this.m_constant = j + this.m_ratio * o; |
| this.m_impulse = 0 |
| }; |
| V.prototype.InitVelocityConstraints = function (d) { |
| var h = this.m_ground1, |
| l = this.m_ground2, |
| j = this.m_bodyA, |
| o = this.m_bodyB, |
| q = 0, |
| n = 0, |
| a = 0, |
| c = 0, |
| g = a = 0, |
| b = 0; |
| this.m_J.SetZero(); |
| if (this.m_revolute1) { |
| this.m_J.angularA = -1; |
| b += j.m_invI |
| } else { |
| h = h.m_xf.R; |
| n = this.m_prismatic1.m_localXAxis1; |
| q = h.col1.x * n.x + h.col2.x * n.y; |
| n = h.col1.y * n.x + h.col2.y * n.y; |
| h = j.m_xf.R; |
| a = this.m_localAnchor1.x - j.m_sweep.localCenter.x; |
| c = this.m_localAnchor1.y - j.m_sweep.localCenter.y; |
| g = h.col1.x * a + h.col2.x * c; |
| c = h.col1.y * a + h.col2.y * c; |
| a = g; |
| a = a * n - c * q; |
| this.m_J.linearA.Set(-q, -n); |
| this.m_J.angularA = -a; |
| b += j.m_invMass + j.m_invI * a * a |
| } if (this.m_revolute2) { |
| this.m_J.angularB = -this.m_ratio; |
| b += this.m_ratio * this.m_ratio * o.m_invI |
| } else { |
| h = l.m_xf.R; |
| n = this.m_prismatic2.m_localXAxis1; |
| q = h.col1.x * n.x + h.col2.x * n.y; |
| n = h.col1.y * n.x + h.col2.y * n.y; |
| h = o.m_xf.R; |
| a = this.m_localAnchor2.x - o.m_sweep.localCenter.x; |
| c = this.m_localAnchor2.y - o.m_sweep.localCenter.y; |
| g = h.col1.x * a + h.col2.x * c; |
| c = h.col1.y * a + h.col2.y * c; |
| a = g; |
| a = a * n - c * q; |
| this.m_J.linearB.Set(-this.m_ratio * q, -this.m_ratio * n); |
| this.m_J.angularB = -this.m_ratio * a; |
| b += this.m_ratio * this.m_ratio * (o.m_invMass + o.m_invI * a * a) |
| } |
| this.m_mass = b > 0 ? 1 / b : 0; |
| if (d.warmStarting) { |
| j.m_linearVelocity.x += j.m_invMass * this.m_impulse * this.m_J.linearA.x; |
| j.m_linearVelocity.y += j.m_invMass * this.m_impulse * this.m_J.linearA.y; |
| j.m_angularVelocity += j.m_invI * this.m_impulse * this.m_J.angularA; |
| o.m_linearVelocity.x += o.m_invMass * this.m_impulse * this.m_J.linearB.x; |
| o.m_linearVelocity.y += o.m_invMass * this.m_impulse * this.m_J.linearB.y; |
| o.m_angularVelocity += o.m_invI * this.m_impulse * this.m_J.angularB |
| } else this.m_impulse = 0 |
| }; |
| V.prototype.SolveVelocityConstraints = function () { |
| var d = this.m_bodyA, |
| h = this.m_bodyB, |
| l = -this.m_mass * this.m_J.Compute(d.m_linearVelocity, |
| d.m_angularVelocity, h.m_linearVelocity, h.m_angularVelocity); |
| this.m_impulse += l; |
| d.m_linearVelocity.x += d.m_invMass * l * this.m_J.linearA.x; |
| d.m_linearVelocity.y += d.m_invMass * l * this.m_J.linearA.y; |
| d.m_angularVelocity += d.m_invI * l * this.m_J.angularA; |
| h.m_linearVelocity.x += h.m_invMass * l * this.m_J.linearB.x; |
| h.m_linearVelocity.y += h.m_invMass * l * this.m_J.linearB.y; |
| h.m_angularVelocity += h.m_invI * l * this.m_J.angularB |
| }; |
| V.prototype.SolvePositionConstraints = function () { |
| var d = this.m_bodyA, |
| h = this.m_bodyB, |
| l = 0, |
| j = 0; |
| l = this.m_revolute1 ? |
| this.m_revolute1.GetJointAngle() : this.m_prismatic1.GetJointTranslation(); |
| j = this.m_revolute2 ? this.m_revolute2.GetJointAngle() : this.m_prismatic2.GetJointTranslation(); |
| l = -this.m_mass * (this.m_constant - (l + this.m_ratio * j)); |
| d.m_sweep.c.x += d.m_invMass * l * this.m_J.linearA.x; |
| d.m_sweep.c.y += d.m_invMass * l * this.m_J.linearA.y; |
| d.m_sweep.a += d.m_invI * l * this.m_J.angularA; |
| h.m_sweep.c.x += h.m_invMass * l * this.m_J.linearB.x; |
| h.m_sweep.c.y += h.m_invMass * l * this.m_J.linearB.y; |
| h.m_sweep.a += h.m_invI * l * this.m_J.angularB; |
| d.SynchronizeTransform(); |
| h.SynchronizeTransform(); |
| return 0 < F.b2_linearSlop |
| }; |
| Box2D.inherit(M, Box2D.Dynamics.Joints.b2JointDef); |
| M.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype; |
| M.b2GearJointDef = function () { |
| Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments) |
| }; |
| M.prototype.b2GearJointDef = function () { |
| this.__super.b2JointDef.call(this); |
| this.type = I.e_gearJoint; |
| this.joint2 = this.joint1 = null; |
| this.ratio = 1 |
| }; |
| L.b2Jacobian = function () { |
| this.linearA = new w; |
| this.linearB = new w |
| }; |
| L.prototype.SetZero = function () { |
| this.linearA.SetZero(); |
| this.angularA = 0; |
| this.linearB.SetZero(); |
| this.angularB = 0 |
| }; |
| L.prototype.Set = function (d, h, l, j) { |
| if (h === undefined) h = 0; |
| if (j === undefined) j = 0; |
| this.linearA.SetV(d); |
| this.angularA = h; |
| this.linearB.SetV(l); |
| this.angularB = j |
| }; |
| L.prototype.Compute = function (d, h, l, j) { |
| if (h === undefined) h = 0; |
| if (j === undefined) j = 0; |
| return this.linearA.x * d.x + this.linearA.y * d.y + this.angularA * h + (this.linearB.x * l.x + this.linearB.y * l.y) + this.angularB * j |
| }; |
| I.b2Joint = function () { |
| this.m_edgeA = new Y; |
| this.m_edgeB = new Y; |
| this.m_localCenterA = new w; |
| this.m_localCenterB = new w |
| }; |
| I.prototype.GetType = function () { |
| return this.m_type |
| }; |
| I.prototype.GetAnchorA = function () { |
| return null |
| }; |
| I.prototype.GetAnchorB = function () { |
| return null |
| }; |
| I.prototype.GetReactionForce = function () { |
| return null |
| }; |
| I.prototype.GetReactionTorque = function () { |
| return 0 |
| }; |
| I.prototype.GetBodyA = function () { |
| return this.m_bodyA |
| }; |
| I.prototype.GetBodyB = function () { |
| return this.m_bodyB |
| }; |
| I.prototype.GetNext = function () { |
| return this.m_next |
| }; |
| I.prototype.GetUserData = function () { |
| return this.m_userData |
| }; |
| I.prototype.SetUserData = function (d) { |
| this.m_userData = d |
| }; |
| I.prototype.IsActive = function () { |
| return this.m_bodyA.IsActive() && this.m_bodyB.IsActive() |
| }; |
| I.Create = function (d) { |
| var h = null; |
| switch (d.type) { |
| case I.e_distanceJoint: |
| h = new U(d instanceof p ? d : null); |
| break; |
| case I.e_mouseJoint: |
| h = new u(d instanceof D ? d : null); |
| break; |
| case I.e_prismaticJoint: |
| h = new H(d instanceof O ? d : null); |
| break; |
| case I.e_revoluteJoint: |
| h = new N(d instanceof S ? d : null); |
| break; |
| case I.e_pulleyJoint: |
| h = new E(d instanceof R ? d : null); |
| break; |
| case I.e_gearJoint: |
| h = new V(d instanceof M ? d : null); |
| break; |
| case I.e_lineJoint: |
| h = new k(d instanceof z ? d : null); |
| break; |
| case I.e_weldJoint: |
| h = new aa(d instanceof Z ? d : null); |
| break; |
| case I.e_frictionJoint: |
| h = new B(d instanceof Q ? d : null) |
| } |
| return h |
| }; |
| I.Destroy = function () {}; |
| I.prototype.b2Joint = function (d) { |
| F.b2Assert(d.bodyA != d.bodyB); |
| this.m_type = d.type; |
| this.m_next = this.m_prev = null; |
| this.m_bodyA = d.bodyA; |
| this.m_bodyB = d.bodyB; |
| this.m_collideConnected = d.collideConnected; |
| this.m_islandFlag = false; |
| this.m_userData = d.userData |
| }; |
| I.prototype.InitVelocityConstraints = function () {}; |
| I.prototype.SolveVelocityConstraints = function () {}; |
| I.prototype.FinalizeVelocityConstraints = function () {}; |
| I.prototype.SolvePositionConstraints = function () { |
| return false |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Dynamics.Joints.b2Joint.e_unknownJoint = 0; |
| Box2D.Dynamics.Joints.b2Joint.e_revoluteJoint = 1; |
| Box2D.Dynamics.Joints.b2Joint.e_prismaticJoint = 2; |
| Box2D.Dynamics.Joints.b2Joint.e_distanceJoint = 3; |
| Box2D.Dynamics.Joints.b2Joint.e_pulleyJoint = 4; |
| Box2D.Dynamics.Joints.b2Joint.e_mouseJoint = 5; |
| Box2D.Dynamics.Joints.b2Joint.e_gearJoint = 6; |
| Box2D.Dynamics.Joints.b2Joint.e_lineJoint = 7; |
| Box2D.Dynamics.Joints.b2Joint.e_weldJoint = 8; |
| Box2D.Dynamics.Joints.b2Joint.e_frictionJoint = 9; |
| Box2D.Dynamics.Joints.b2Joint.e_inactiveLimit = 0; |
| Box2D.Dynamics.Joints.b2Joint.e_atLowerLimit = 1; |
| Box2D.Dynamics.Joints.b2Joint.e_atUpperLimit = 2; |
| Box2D.Dynamics.Joints.b2Joint.e_equalLimits = 3 |
| }); |
| W.b2JointDef = function () {}; |
| W.prototype.b2JointDef = function () { |
| this.type = I.e_unknownJoint; |
| this.bodyB = this.bodyA = this.userData = null; |
| this.collideConnected = false |
| }; |
| Y.b2JointEdge = function () {}; |
| Box2D.inherit(k, Box2D.Dynamics.Joints.b2Joint); |
| k.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype; |
| k.b2LineJoint = function () { |
| Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments); |
| this.m_localAnchor1 = new w; |
| this.m_localAnchor2 = new w; |
| this.m_localXAxis1 = new w; |
| this.m_localYAxis1 = new w; |
| this.m_axis = new w; |
| this.m_perp = new w; |
| this.m_K = new G; |
| this.m_impulse = new w |
| }; |
| k.prototype.GetAnchorA = function () { |
| return this.m_bodyA.GetWorldPoint(this.m_localAnchor1) |
| }; |
| k.prototype.GetAnchorB = function () { |
| return this.m_bodyB.GetWorldPoint(this.m_localAnchor2) |
| }; |
| k.prototype.GetReactionForce = function (d) { |
| if (d === undefined) d = 0; |
| return new w(d * (this.m_impulse.x * this.m_perp.x + (this.m_motorImpulse + this.m_impulse.y) * this.m_axis.x), d * (this.m_impulse.x * this.m_perp.y + (this.m_motorImpulse + this.m_impulse.y) * this.m_axis.y)) |
| }; |
| k.prototype.GetReactionTorque = function (d) { |
| if (d === undefined) d = 0; |
| return d * this.m_impulse.y |
| }; |
| k.prototype.GetJointTranslation = function () { |
| var d = this.m_bodyA, |
| h = this.m_bodyB, |
| l = d.GetWorldPoint(this.m_localAnchor1), |
| j = h.GetWorldPoint(this.m_localAnchor2); |
| h = j.x - l.x; |
| l = j.y - l.y; |
| d = d.GetWorldVector(this.m_localXAxis1); |
| return d.x * h + d.y * l |
| }; |
| k.prototype.GetJointSpeed = function () { |
| var d = this.m_bodyA, |
| h = this.m_bodyB, |
| l; |
| l = d.m_xf.R; |
| var j = this.m_localAnchor1.x - d.m_sweep.localCenter.x, |
| o = this.m_localAnchor1.y - d.m_sweep.localCenter.y, |
| q = l.col1.x * j + l.col2.x * o; |
| o = l.col1.y * j + l.col2.y * o; |
| j = q; |
| l = h.m_xf.R; |
| var n = this.m_localAnchor2.x - h.m_sweep.localCenter.x, |
| a = this.m_localAnchor2.y - h.m_sweep.localCenter.y; |
| q = l.col1.x * n + l.col2.x * a; |
| a = l.col1.y * n + l.col2.y * a; |
| n = q; |
| l = h.m_sweep.c.x + n - (d.m_sweep.c.x + j); |
| q = h.m_sweep.c.y + a - (d.m_sweep.c.y + o); |
| var c = d.GetWorldVector(this.m_localXAxis1), |
| g = d.m_linearVelocity, |
| b = h.m_linearVelocity; |
| d = d.m_angularVelocity; |
| h = h.m_angularVelocity; |
| return l * -d * c.y + q * d * c.x + (c.x * (b.x + -h * a - g.x - -d * o) + c.y * (b.y + h * n - g.y - d * j)) |
| }; |
| k.prototype.IsLimitEnabled = function () { |
| return this.m_enableLimit |
| }; |
| k.prototype.EnableLimit = function (d) { |
| this.m_bodyA.SetAwake(true); |
| this.m_bodyB.SetAwake(true); |
| this.m_enableLimit = d |
| }; |
| k.prototype.GetLowerLimit = function () { |
| return this.m_lowerTranslation |
| }; |
| k.prototype.GetUpperLimit = function () { |
| return this.m_upperTranslation |
| }; |
| k.prototype.SetLimits = function (d, |
| h) { |
| if (d === undefined) d = 0; |
| if (h === undefined) h = 0; |
| this.m_bodyA.SetAwake(true); |
| this.m_bodyB.SetAwake(true); |
| this.m_lowerTranslation = d; |
| this.m_upperTranslation = h |
| }; |
| k.prototype.IsMotorEnabled = function () { |
| return this.m_enableMotor |
| }; |
| k.prototype.EnableMotor = function (d) { |
| this.m_bodyA.SetAwake(true); |
| this.m_bodyB.SetAwake(true); |
| this.m_enableMotor = d |
| }; |
| k.prototype.SetMotorSpeed = function (d) { |
| if (d === undefined) d = 0; |
| this.m_bodyA.SetAwake(true); |
| this.m_bodyB.SetAwake(true); |
| this.m_motorSpeed = d |
| }; |
| k.prototype.GetMotorSpeed = function () { |
| return this.m_motorSpeed |
| }; |
| k.prototype.SetMaxMotorForce = function (d) { |
| if (d === undefined) d = 0; |
| this.m_bodyA.SetAwake(true); |
| this.m_bodyB.SetAwake(true); |
| this.m_maxMotorForce = d |
| }; |
| k.prototype.GetMaxMotorForce = function () { |
| return this.m_maxMotorForce |
| }; |
| k.prototype.GetMotorForce = function () { |
| return this.m_motorImpulse |
| }; |
| k.prototype.b2LineJoint = function (d) { |
| this.__super.b2Joint.call(this, d); |
| this.m_localAnchor1.SetV(d.localAnchorA); |
| this.m_localAnchor2.SetV(d.localAnchorB); |
| this.m_localXAxis1.SetV(d.localAxisA); |
| this.m_localYAxis1.x = -this.m_localXAxis1.y; |
| this.m_localYAxis1.y = this.m_localXAxis1.x; |
| this.m_impulse.SetZero(); |
| this.m_motorImpulse = this.m_motorMass = 0; |
| this.m_lowerTranslation = d.lowerTranslation; |
| this.m_upperTranslation = d.upperTranslation; |
| this.m_maxMotorForce = d.maxMotorForce; |
| this.m_motorSpeed = d.motorSpeed; |
| this.m_enableLimit = d.enableLimit; |
| this.m_enableMotor = d.enableMotor; |
| this.m_limitState = I.e_inactiveLimit; |
| this.m_axis.SetZero(); |
| this.m_perp.SetZero() |
| }; |
| k.prototype.InitVelocityConstraints = function (d) { |
| var h = this.m_bodyA, |
| l = this.m_bodyB, |
| j, o = 0; |
| this.m_localCenterA.SetV(h.GetLocalCenter()); |
| this.m_localCenterB.SetV(l.GetLocalCenter()); |
| var q = h.GetTransform(); |
| l.GetTransform(); |
| j = h.m_xf.R; |
| var n = this.m_localAnchor1.x - this.m_localCenterA.x, |
| a = this.m_localAnchor1.y - this.m_localCenterA.y; |
| o = j.col1.x * n + j.col2.x * a; |
| a = j.col1.y * n + j.col2.y * a; |
| n = o; |
| j = l.m_xf.R; |
| var c = this.m_localAnchor2.x - this.m_localCenterB.x, |
| g = this.m_localAnchor2.y - this.m_localCenterB.y; |
| o = j.col1.x * c + j.col2.x * g; |
| g = j.col1.y * c + j.col2.y * g; |
| c = o; |
| j = l.m_sweep.c.x + c - h.m_sweep.c.x - n; |
| o = l.m_sweep.c.y + g - h.m_sweep.c.y - a; |
| this.m_invMassA = h.m_invMass; |
| this.m_invMassB = l.m_invMass; |
| this.m_invIA = h.m_invI; |
| this.m_invIB = l.m_invI; |
| this.m_axis.SetV(y.MulMV(q.R, this.m_localXAxis1)); |
| this.m_a1 = (j + n) * this.m_axis.y - (o + a) * this.m_axis.x; |
| this.m_a2 = c * this.m_axis.y - g * this.m_axis.x; |
| this.m_motorMass = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_a1 * this.m_a1 + this.m_invIB * this.m_a2 * this.m_a2; |
| this.m_motorMass = this.m_motorMass > Number.MIN_VALUE ? 1 / this.m_motorMass : 0; |
| this.m_perp.SetV(y.MulMV(q.R, this.m_localYAxis1)); |
| this.m_s1 = (j + n) * this.m_perp.y - (o + a) * this.m_perp.x; |
| this.m_s2 = c * this.m_perp.y - g * this.m_perp.x; |
| q = this.m_invMassA; |
| n = this.m_invMassB; |
| a = this.m_invIA; |
| c = this.m_invIB; |
| this.m_K.col1.x = q + n + a * this.m_s1 * this.m_s1 + c * this.m_s2 * this.m_s2; |
| this.m_K.col1.y = a * this.m_s1 * this.m_a1 + c * this.m_s2 * this.m_a2; |
| this.m_K.col2.x = this.m_K.col1.y; |
| this.m_K.col2.y = q + n + a * this.m_a1 * this.m_a1 + c * this.m_a2 * this.m_a2; |
| if (this.m_enableLimit) { |
| j = this.m_axis.x * j + this.m_axis.y * o; |
| if (y.Abs(this.m_upperTranslation - this.m_lowerTranslation) < 2 * F.b2_linearSlop) this.m_limitState = I.e_equalLimits; |
| else if (j <= this.m_lowerTranslation) { |
| if (this.m_limitState != I.e_atLowerLimit) { |
| this.m_limitState = I.e_atLowerLimit; |
| this.m_impulse.y = 0 |
| } |
| } else if (j >= this.m_upperTranslation) { |
| if (this.m_limitState != I.e_atUpperLimit) { |
| this.m_limitState = I.e_atUpperLimit; |
| this.m_impulse.y = 0 |
| } |
| } else { |
| this.m_limitState = I.e_inactiveLimit; |
| this.m_impulse.y = 0 |
| } |
| } else this.m_limitState = I.e_inactiveLimit; if (this.m_enableMotor == false) this.m_motorImpulse = 0; |
| if (d.warmStarting) { |
| this.m_impulse.x *= d.dtRatio; |
| this.m_impulse.y *= d.dtRatio; |
| this.m_motorImpulse *= d.dtRatio; |
| d = this.m_impulse.x * this.m_perp.x + (this.m_motorImpulse + this.m_impulse.y) * this.m_axis.x; |
| j = this.m_impulse.x * this.m_perp.y + (this.m_motorImpulse + this.m_impulse.y) * this.m_axis.y; |
| o = this.m_impulse.x * this.m_s1 + (this.m_motorImpulse + this.m_impulse.y) * this.m_a1; |
| q = this.m_impulse.x * this.m_s2 + (this.m_motorImpulse + this.m_impulse.y) * this.m_a2; |
| h.m_linearVelocity.x -= this.m_invMassA * d; |
| h.m_linearVelocity.y -= this.m_invMassA * j; |
| h.m_angularVelocity -= this.m_invIA * o; |
| l.m_linearVelocity.x += this.m_invMassB * d; |
| l.m_linearVelocity.y += this.m_invMassB * j; |
| l.m_angularVelocity += this.m_invIB * q |
| } else { |
| this.m_impulse.SetZero(); |
| this.m_motorImpulse = 0 |
| } |
| }; |
| k.prototype.SolveVelocityConstraints = function (d) { |
| var h = this.m_bodyA, |
| l = this.m_bodyB, |
| j = h.m_linearVelocity, |
| o = h.m_angularVelocity, |
| q = l.m_linearVelocity, |
| n = l.m_angularVelocity, |
| a = 0, |
| c = 0, |
| g = 0, |
| b = 0; |
| if (this.m_enableMotor && this.m_limitState != I.e_equalLimits) { |
| b = this.m_motorMass * (this.m_motorSpeed - (this.m_axis.x * (q.x - j.x) + this.m_axis.y * (q.y - j.y) + this.m_a2 * n - this.m_a1 * o)); |
| a = this.m_motorImpulse; |
| c = d.dt * this.m_maxMotorForce; |
| this.m_motorImpulse = y.Clamp(this.m_motorImpulse + b, -c, c); |
| b = this.m_motorImpulse - a; |
| a = b * this.m_axis.x; |
| c = b * this.m_axis.y; |
| g = b * this.m_a1; |
| b = b * this.m_a2; |
| j.x -= this.m_invMassA * a; |
| j.y -= this.m_invMassA * c; |
| o -= this.m_invIA * g; |
| q.x += this.m_invMassB * a; |
| q.y += this.m_invMassB * c; |
| n += this.m_invIB * b |
| } |
| c = this.m_perp.x * (q.x - j.x) + this.m_perp.y * (q.y - j.y) + this.m_s2 * n - this.m_s1 * o; |
| if (this.m_enableLimit && this.m_limitState != I.e_inactiveLimit) { |
| g = this.m_axis.x * (q.x - j.x) + this.m_axis.y * (q.y - j.y) + this.m_a2 * n - this.m_a1 * o; |
| a = this.m_impulse.Copy(); |
| d = this.m_K.Solve(new w, -c, -g); |
| this.m_impulse.Add(d); |
| if (this.m_limitState == I.e_atLowerLimit) this.m_impulse.y = y.Max(this.m_impulse.y, 0); |
| else if (this.m_limitState == I.e_atUpperLimit) this.m_impulse.y = y.Min(this.m_impulse.y, 0); |
| c = -c - (this.m_impulse.y - a.y) * this.m_K.col2.x; |
| g = 0; |
| g = this.m_K.col1.x != 0 ? c / this.m_K.col1.x + a.x : a.x; |
| this.m_impulse.x = g; |
| d.x = this.m_impulse.x - a.x; |
| d.y = this.m_impulse.y - a.y; |
| a = d.x * this.m_perp.x + d.y * this.m_axis.x; |
| c = d.x * this.m_perp.y + d.y * this.m_axis.y; |
| g = d.x * this.m_s1 + d.y * this.m_a1; |
| b = d.x * this.m_s2 + d.y * this.m_a2 |
| } else { |
| d = 0; |
| d = this.m_K.col1.x != 0 ? -c / this.m_K.col1.x : 0; |
| this.m_impulse.x += d; |
| a = d * this.m_perp.x; |
| c = d * this.m_perp.y; |
| g = d * this.m_s1; |
| b = d * this.m_s2 |
| } |
| j.x -= this.m_invMassA * a; |
| j.y -= this.m_invMassA * c; |
| o -= this.m_invIA * g; |
| q.x += this.m_invMassB * a; |
| q.y += this.m_invMassB * c; |
| n += this.m_invIB * b; |
| h.m_linearVelocity.SetV(j); |
| h.m_angularVelocity = o; |
| l.m_linearVelocity.SetV(q); |
| l.m_angularVelocity = n |
| }; |
| k.prototype.SolvePositionConstraints = function () { |
| var d = this.m_bodyA, |
| h = this.m_bodyB, |
| l = d.m_sweep.c, |
| j = d.m_sweep.a, |
| o = h.m_sweep.c, |
| q = h.m_sweep.a, |
| n, a = 0, |
| c = 0, |
| g = 0, |
| b = 0, |
| e = n = 0, |
| f = 0; |
| c = false; |
| var m = 0, |
| r = G.FromAngle(j); |
| g = G.FromAngle(q); |
| n = r; |
| f = this.m_localAnchor1.x - this.m_localCenterA.x; |
| var s = this.m_localAnchor1.y - this.m_localCenterA.y; |
| a = n.col1.x * f + n.col2.x * s; |
| s = n.col1.y * f + n.col2.y * s; |
| f = a; |
| n = g; |
| g = this.m_localAnchor2.x - this.m_localCenterB.x; |
| b = this.m_localAnchor2.y - this.m_localCenterB.y; |
| a = n.col1.x * g + n.col2.x * b; |
| b = n.col1.y * g + n.col2.y * b; |
| g = a; |
| n = o.x + g - l.x - f; |
| a = o.y + b - l.y - s; |
| if (this.m_enableLimit) { |
| this.m_axis = y.MulMV(r, this.m_localXAxis1); |
| this.m_a1 = (n + f) * this.m_axis.y - (a + s) * this.m_axis.x; |
| this.m_a2 = g * this.m_axis.y - b * this.m_axis.x; |
| var v = this.m_axis.x * n + this.m_axis.y * a; |
| if (y.Abs(this.m_upperTranslation - this.m_lowerTranslation) < 2 * F.b2_linearSlop) { |
| m = y.Clamp(v, -F.b2_maxLinearCorrection, F.b2_maxLinearCorrection); |
| e = y.Abs(v); |
| c = true |
| } else if (v <= this.m_lowerTranslation) { |
| m = y.Clamp(v - this.m_lowerTranslation + F.b2_linearSlop, -F.b2_maxLinearCorrection, 0); |
| e = this.m_lowerTranslation - v; |
| c = true |
| } else if (v >= this.m_upperTranslation) { |
| m = y.Clamp(v - this.m_upperTranslation + F.b2_linearSlop, 0, F.b2_maxLinearCorrection); |
| e = v - this.m_upperTranslation; |
| c = true |
| } |
| } |
| this.m_perp = y.MulMV(r, this.m_localYAxis1); |
| this.m_s1 = (n + f) * this.m_perp.y - (a + s) * this.m_perp.x; |
| this.m_s2 = g * this.m_perp.y - b * this.m_perp.x; |
| r = new w; |
| s = this.m_perp.x * n + this.m_perp.y * a; |
| e = y.Max(e, y.Abs(s)); |
| f = 0; |
| if (c) { |
| c = this.m_invMassA; |
| g = this.m_invMassB; |
| b = this.m_invIA; |
| n = this.m_invIB; |
| this.m_K.col1.x = c + g + b * this.m_s1 * this.m_s1 + n * this.m_s2 * this.m_s2; |
| this.m_K.col1.y = b * this.m_s1 * this.m_a1 + n * this.m_s2 * this.m_a2; |
| this.m_K.col2.x = this.m_K.col1.y; |
| this.m_K.col2.y = c + g + b * this.m_a1 * this.m_a1 + n * this.m_a2 * this.m_a2; |
| this.m_K.Solve(r, -s, -m) |
| } else { |
| c = this.m_invMassA; |
| g = this.m_invMassB; |
| b = this.m_invIA; |
| n = this.m_invIB; |
| m = c + g + b * this.m_s1 * this.m_s1 + n * this.m_s2 * this.m_s2; |
| c = 0; |
| c = m != 0 ? -s / m : 0; |
| r.x = c; |
| r.y = 0 |
| } |
| m = r.x * this.m_perp.x + r.y * this.m_axis.x; |
| c = r.x * this.m_perp.y + r.y * this.m_axis.y; |
| s = r.x * this.m_s1 + r.y * this.m_a1; |
| r = r.x * this.m_s2 + r.y * this.m_a2; |
| l.x -= this.m_invMassA * m; |
| l.y -= this.m_invMassA * c; |
| j -= this.m_invIA * s; |
| o.x += this.m_invMassB * m; |
| o.y += this.m_invMassB * c; |
| q += this.m_invIB * r; |
| d.m_sweep.a = j; |
| h.m_sweep.a = q; |
| d.SynchronizeTransform(); |
| h.SynchronizeTransform(); |
| return e <= F.b2_linearSlop && f <= F.b2_angularSlop |
| }; |
| Box2D.inherit(z, Box2D.Dynamics.Joints.b2JointDef); |
| z.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype; |
| z.b2LineJointDef = function () { |
| Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments); |
| this.localAnchorA = new w; |
| this.localAnchorB = new w; |
| this.localAxisA = new w |
| }; |
| z.prototype.b2LineJointDef = function () { |
| this.__super.b2JointDef.call(this); |
| this.type = I.e_lineJoint; |
| this.localAxisA.Set(1, 0); |
| this.enableLimit = false; |
| this.upperTranslation = this.lowerTranslation = 0; |
| this.enableMotor = false; |
| this.motorSpeed = this.maxMotorForce = 0 |
| }; |
| z.prototype.Initialize = function (d, h, l, j) { |
| this.bodyA = d; |
| this.bodyB = h; |
| this.localAnchorA = this.bodyA.GetLocalPoint(l); |
| this.localAnchorB = this.bodyB.GetLocalPoint(l); |
| this.localAxisA = this.bodyA.GetLocalVector(j) |
| }; |
| Box2D.inherit(u, Box2D.Dynamics.Joints.b2Joint); |
| u.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype; |
| u.b2MouseJoint = function () { |
| Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments); |
| this.K = new G; |
| this.K1 = new G; |
| this.K2 = new G; |
| this.m_localAnchor = new w; |
| this.m_target = new w; |
| this.m_impulse = new w; |
| this.m_mass = new G; |
| this.m_C = new w |
| }; |
| u.prototype.GetAnchorA = function () { |
| return this.m_target |
| }; |
| u.prototype.GetAnchorB = function () { |
| return this.m_bodyB.GetWorldPoint(this.m_localAnchor) |
| }; |
| u.prototype.GetReactionForce = function (d) { |
| if (d === undefined) d = 0; |
| return new w(d * this.m_impulse.x, d * this.m_impulse.y) |
| }; |
| u.prototype.GetReactionTorque = function () { |
| return 0 |
| }; |
| u.prototype.GetTarget = function () { |
| return this.m_target |
| }; |
| u.prototype.SetTarget = function (d) { |
| this.m_bodyB.IsAwake() == false && this.m_bodyB.SetAwake(true); |
| this.m_target = d |
| }; |
| u.prototype.GetMaxForce = function () { |
| return this.m_maxForce |
| }; |
| u.prototype.SetMaxForce = function (d) { |
| if (d === undefined) d = 0; |
| this.m_maxForce = d |
| }; |
| u.prototype.GetFrequency = function () { |
| return this.m_frequencyHz |
| }; |
| u.prototype.SetFrequency = function (d) { |
| if (d === undefined) d = 0; |
| this.m_frequencyHz = d |
| }; |
| u.prototype.GetDampingRatio = function () { |
| return this.m_dampingRatio |
| }; |
| u.prototype.SetDampingRatio = function (d) { |
| if (d === undefined) d = 0; |
| this.m_dampingRatio = d |
| }; |
| u.prototype.b2MouseJoint = function (d) { |
| this.__super.b2Joint.call(this, d); |
| this.m_target.SetV(d.target); |
| var h = this.m_target.x - this.m_bodyB.m_xf.position.x, |
| l = this.m_target.y - this.m_bodyB.m_xf.position.y, |
| j = this.m_bodyB.m_xf.R; |
| this.m_localAnchor.x = h * j.col1.x + l * j.col1.y; |
| this.m_localAnchor.y = h * j.col2.x + l * j.col2.y; |
| this.m_maxForce = d.maxForce; |
| this.m_impulse.SetZero(); |
| this.m_frequencyHz = d.frequencyHz; |
| this.m_dampingRatio = d.dampingRatio; |
| this.m_gamma = this.m_beta = 0 |
| }; |
| u.prototype.InitVelocityConstraints = function (d) { |
| var h = this.m_bodyB, |
| l = h.GetMass(), |
| j = 2 * Math.PI * this.m_frequencyHz, |
| o = l * j * j; |
| this.m_gamma = d.dt * (2 * l * this.m_dampingRatio * j + d.dt * o); |
| this.m_gamma = this.m_gamma != 0 ? 1 / this.m_gamma : 0; |
| this.m_beta = d.dt * o * this.m_gamma; |
| o = h.m_xf.R; |
| l = this.m_localAnchor.x - h.m_sweep.localCenter.x; |
| j = this.m_localAnchor.y - h.m_sweep.localCenter.y; |
| var q = o.col1.x * l + o.col2.x * j; |
| j = o.col1.y * l + o.col2.y * j; |
| l = q; |
| o = h.m_invMass; |
| q = h.m_invI; |
| this.K1.col1.x = o; |
| this.K1.col2.x = 0; |
| this.K1.col1.y = 0; |
| this.K1.col2.y = o; |
| this.K2.col1.x = q * j * j; |
| this.K2.col2.x = -q * l * j; |
| this.K2.col1.y = -q * l * j; |
| this.K2.col2.y = q * l * l; |
| this.K.SetM(this.K1); |
| this.K.AddM(this.K2); |
| this.K.col1.x += this.m_gamma; |
| this.K.col2.y += this.m_gamma; |
| this.K.GetInverse(this.m_mass); |
| this.m_C.x = h.m_sweep.c.x + l - this.m_target.x; |
| this.m_C.y = h.m_sweep.c.y + j - this.m_target.y; |
| h.m_angularVelocity *= 0.98; |
| this.m_impulse.x *= d.dtRatio; |
| this.m_impulse.y *= d.dtRatio; |
| h.m_linearVelocity.x += o * this.m_impulse.x; |
| h.m_linearVelocity.y += o * this.m_impulse.y; |
| h.m_angularVelocity += q * (l * this.m_impulse.y - j * this.m_impulse.x) |
| }; |
| u.prototype.SolveVelocityConstraints = function (d) { |
| var h = this.m_bodyB, |
| l, j = 0, |
| o = 0; |
| l = h.m_xf.R; |
| var q = this.m_localAnchor.x - h.m_sweep.localCenter.x, |
| n = this.m_localAnchor.y - h.m_sweep.localCenter.y; |
| j = l.col1.x * q + l.col2.x * n; |
| n = l.col1.y * q + l.col2.y * n; |
| q = j; |
| j = h.m_linearVelocity.x + -h.m_angularVelocity * n; |
| var a = h.m_linearVelocity.y + h.m_angularVelocity * q; |
| l = this.m_mass; |
| j = j + this.m_beta * this.m_C.x + this.m_gamma * this.m_impulse.x; |
| o = a + this.m_beta * this.m_C.y + this.m_gamma * this.m_impulse.y; |
| a = -(l.col1.x * j + l.col2.x * o); |
| o = -(l.col1.y * j + l.col2.y * o); |
| l = this.m_impulse.x; |
| j = this.m_impulse.y; |
| this.m_impulse.x += a; |
| this.m_impulse.y += o; |
| d = d.dt * this.m_maxForce; |
| this.m_impulse.LengthSquared() > d * d && this.m_impulse.Multiply(d / this.m_impulse.Length()); |
| a = this.m_impulse.x - l; |
| o = this.m_impulse.y - j; |
| h.m_linearVelocity.x += h.m_invMass * a; |
| h.m_linearVelocity.y += h.m_invMass * o; |
| h.m_angularVelocity += h.m_invI * (q * o - n * a) |
| }; |
| u.prototype.SolvePositionConstraints = function () { |
| return true |
| }; |
| Box2D.inherit(D, Box2D.Dynamics.Joints.b2JointDef); |
| D.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype; |
| D.b2MouseJointDef = function () { |
| Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, |
| arguments); |
| this.target = new w |
| }; |
| D.prototype.b2MouseJointDef = function () { |
| this.__super.b2JointDef.call(this); |
| this.type = I.e_mouseJoint; |
| this.maxForce = 0; |
| this.frequencyHz = 5; |
| this.dampingRatio = 0.7 |
| }; |
| Box2D.inherit(H, Box2D.Dynamics.Joints.b2Joint); |
| H.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype; |
| H.b2PrismaticJoint = function () { |
| Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments); |
| this.m_localAnchor1 = new w; |
| this.m_localAnchor2 = new w; |
| this.m_localXAxis1 = new w; |
| this.m_localYAxis1 = new w; |
| this.m_axis = new w; |
| this.m_perp = new w; |
| this.m_K = new K; |
| this.m_impulse = new A |
| }; |
| H.prototype.GetAnchorA = function () { |
| return this.m_bodyA.GetWorldPoint(this.m_localAnchor1) |
| }; |
| H.prototype.GetAnchorB = function () { |
| return this.m_bodyB.GetWorldPoint(this.m_localAnchor2) |
| }; |
| H.prototype.GetReactionForce = function (d) { |
| if (d === undefined) d = 0; |
| return new w(d * (this.m_impulse.x * this.m_perp.x + (this.m_motorImpulse + this.m_impulse.z) * this.m_axis.x), d * (this.m_impulse.x * this.m_perp.y + (this.m_motorImpulse + this.m_impulse.z) * this.m_axis.y)) |
| }; |
| H.prototype.GetReactionTorque = function (d) { |
| if (d === undefined) d = 0; |
| return d * this.m_impulse.y |
| }; |
| H.prototype.GetJointTranslation = function () { |
| var d = this.m_bodyA, |
| h = this.m_bodyB, |
| l = d.GetWorldPoint(this.m_localAnchor1), |
| j = h.GetWorldPoint(this.m_localAnchor2); |
| h = j.x - l.x; |
| l = j.y - l.y; |
| d = d.GetWorldVector(this.m_localXAxis1); |
| return d.x * h + d.y * l |
| }; |
| H.prototype.GetJointSpeed = function () { |
| var d = this.m_bodyA, |
| h = this.m_bodyB, |
| l; |
| l = d.m_xf.R; |
| var j = this.m_localAnchor1.x - d.m_sweep.localCenter.x, |
| o = this.m_localAnchor1.y - d.m_sweep.localCenter.y, |
| q = l.col1.x * j + l.col2.x * o; |
| o = l.col1.y * j + l.col2.y * o; |
| j = q; |
| l = h.m_xf.R; |
| var n = this.m_localAnchor2.x - h.m_sweep.localCenter.x, |
| a = this.m_localAnchor2.y - h.m_sweep.localCenter.y; |
| q = l.col1.x * n + l.col2.x * a; |
| a = l.col1.y * n + l.col2.y * a; |
| n = q; |
| l = h.m_sweep.c.x + n - (d.m_sweep.c.x + j); |
| q = h.m_sweep.c.y + a - (d.m_sweep.c.y + o); |
| var c = d.GetWorldVector(this.m_localXAxis1), |
| g = d.m_linearVelocity, |
| b = h.m_linearVelocity; |
| d = d.m_angularVelocity; |
| h = h.m_angularVelocity; |
| return l * -d * c.y + q * d * c.x + (c.x * (b.x + -h * a - g.x - -d * o) + c.y * (b.y + h * n - g.y - d * j)) |
| }; |
| H.prototype.IsLimitEnabled = function () { |
| return this.m_enableLimit |
| }; |
| H.prototype.EnableLimit = function (d) { |
| this.m_bodyA.SetAwake(true); |
| this.m_bodyB.SetAwake(true); |
| this.m_enableLimit = d |
| }; |
| H.prototype.GetLowerLimit = function () { |
| return this.m_lowerTranslation |
| }; |
| H.prototype.GetUpperLimit = function () { |
| return this.m_upperTranslation |
| }; |
| H.prototype.SetLimits = function (d, h) { |
| if (d === undefined) d = 0; |
| if (h === undefined) h = 0; |
| this.m_bodyA.SetAwake(true); |
| this.m_bodyB.SetAwake(true); |
| this.m_lowerTranslation = d; |
| this.m_upperTranslation = h |
| }; |
| H.prototype.IsMotorEnabled = function () { |
| return this.m_enableMotor |
| }; |
| H.prototype.EnableMotor = function (d) { |
| this.m_bodyA.SetAwake(true); |
| this.m_bodyB.SetAwake(true); |
| this.m_enableMotor = d |
| }; |
| H.prototype.SetMotorSpeed = function (d) { |
| if (d === undefined) d = 0; |
| this.m_bodyA.SetAwake(true); |
| this.m_bodyB.SetAwake(true); |
| this.m_motorSpeed = d |
| }; |
| H.prototype.GetMotorSpeed = function () { |
| return this.m_motorSpeed |
| }; |
| H.prototype.SetMaxMotorForce = function (d) { |
| if (d === undefined) d = 0; |
| this.m_bodyA.SetAwake(true); |
| this.m_bodyB.SetAwake(true); |
| this.m_maxMotorForce = d |
| }; |
| H.prototype.GetMotorForce = function () { |
| return this.m_motorImpulse |
| }; |
| H.prototype.b2PrismaticJoint = function (d) { |
| this.__super.b2Joint.call(this, d); |
| this.m_localAnchor1.SetV(d.localAnchorA); |
| this.m_localAnchor2.SetV(d.localAnchorB); |
| this.m_localXAxis1.SetV(d.localAxisA); |
| this.m_localYAxis1.x = -this.m_localXAxis1.y; |
| this.m_localYAxis1.y = this.m_localXAxis1.x; |
| this.m_refAngle = d.referenceAngle; |
| this.m_impulse.SetZero(); |
| this.m_motorImpulse = this.m_motorMass = 0; |
| this.m_lowerTranslation = d.lowerTranslation; |
| this.m_upperTranslation = d.upperTranslation; |
| this.m_maxMotorForce = d.maxMotorForce; |
| this.m_motorSpeed = d.motorSpeed; |
| this.m_enableLimit = d.enableLimit; |
| this.m_enableMotor = d.enableMotor; |
| this.m_limitState = I.e_inactiveLimit; |
| this.m_axis.SetZero(); |
| this.m_perp.SetZero() |
| }; |
| H.prototype.InitVelocityConstraints = function (d) { |
| var h = this.m_bodyA, |
| l = this.m_bodyB, |
| j, o = 0; |
| this.m_localCenterA.SetV(h.GetLocalCenter()); |
| this.m_localCenterB.SetV(l.GetLocalCenter()); |
| var q = h.GetTransform(); |
| l.GetTransform(); |
| j = h.m_xf.R; |
| var n = this.m_localAnchor1.x - this.m_localCenterA.x, |
| a = this.m_localAnchor1.y - this.m_localCenterA.y; |
| o = j.col1.x * n + j.col2.x * a; |
| a = j.col1.y * n + j.col2.y * a; |
| n = o; |
| j = l.m_xf.R; |
| var c = this.m_localAnchor2.x - this.m_localCenterB.x, |
| g = this.m_localAnchor2.y - this.m_localCenterB.y; |
| o = j.col1.x * c + j.col2.x * g; |
| g = j.col1.y * c + j.col2.y * g; |
| c = o; |
| j = l.m_sweep.c.x + c - h.m_sweep.c.x - n; |
| o = l.m_sweep.c.y + g - h.m_sweep.c.y - a; |
| this.m_invMassA = h.m_invMass; |
| this.m_invMassB = l.m_invMass; |
| this.m_invIA = h.m_invI; |
| this.m_invIB = l.m_invI; |
| this.m_axis.SetV(y.MulMV(q.R, this.m_localXAxis1)); |
| this.m_a1 = (j + n) * this.m_axis.y - (o + a) * this.m_axis.x; |
| this.m_a2 = c * this.m_axis.y - g * this.m_axis.x; |
| this.m_motorMass = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_a1 * this.m_a1 + this.m_invIB * this.m_a2 * this.m_a2; |
| if (this.m_motorMass > Number.MIN_VALUE) this.m_motorMass = 1 / this.m_motorMass; |
| this.m_perp.SetV(y.MulMV(q.R, this.m_localYAxis1)); |
| this.m_s1 = (j + n) * this.m_perp.y - (o + a) * this.m_perp.x; |
| this.m_s2 = c * this.m_perp.y - g * this.m_perp.x; |
| q = this.m_invMassA; |
| n = this.m_invMassB; |
| a = this.m_invIA; |
| c = this.m_invIB; |
| this.m_K.col1.x = q + n + a * this.m_s1 * this.m_s1 + c * this.m_s2 * this.m_s2; |
| this.m_K.col1.y = a * this.m_s1 + c * this.m_s2; |
| this.m_K.col1.z = a * this.m_s1 * this.m_a1 + c * this.m_s2 * this.m_a2; |
| this.m_K.col2.x = this.m_K.col1.y; |
| this.m_K.col2.y = a + c; |
| this.m_K.col2.z = a * this.m_a1 + c * this.m_a2; |
| this.m_K.col3.x = this.m_K.col1.z; |
| this.m_K.col3.y = this.m_K.col2.z; |
| this.m_K.col3.z = q + n + a * this.m_a1 * this.m_a1 + c * this.m_a2 * this.m_a2; |
| if (this.m_enableLimit) { |
| j = this.m_axis.x * j + this.m_axis.y * o; |
| if (y.Abs(this.m_upperTranslation - this.m_lowerTranslation) < 2 * F.b2_linearSlop) this.m_limitState = I.e_equalLimits; |
| else if (j <= this.m_lowerTranslation) { |
| if (this.m_limitState != I.e_atLowerLimit) { |
| this.m_limitState = I.e_atLowerLimit; |
| this.m_impulse.z = 0 |
| } |
| } else if (j >= this.m_upperTranslation) { |
| if (this.m_limitState != I.e_atUpperLimit) { |
| this.m_limitState = I.e_atUpperLimit; |
| this.m_impulse.z = 0 |
| } |
| } else { |
| this.m_limitState = I.e_inactiveLimit; |
| this.m_impulse.z = 0 |
| } |
| } else this.m_limitState = I.e_inactiveLimit; if (this.m_enableMotor == false) this.m_motorImpulse = 0; |
| if (d.warmStarting) { |
| this.m_impulse.x *= d.dtRatio; |
| this.m_impulse.y *= d.dtRatio; |
| this.m_motorImpulse *= d.dtRatio; |
| d = this.m_impulse.x * this.m_perp.x + (this.m_motorImpulse + this.m_impulse.z) * this.m_axis.x; |
| j = this.m_impulse.x * this.m_perp.y + (this.m_motorImpulse + this.m_impulse.z) * this.m_axis.y; |
| o = this.m_impulse.x * this.m_s1 + this.m_impulse.y + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1; |
| q = this.m_impulse.x * this.m_s2 + this.m_impulse.y + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2; |
| h.m_linearVelocity.x -= this.m_invMassA * d; |
| h.m_linearVelocity.y -= this.m_invMassA * j; |
| h.m_angularVelocity -= this.m_invIA * o; |
| l.m_linearVelocity.x += this.m_invMassB * d; |
| l.m_linearVelocity.y += this.m_invMassB * j; |
| l.m_angularVelocity += this.m_invIB * q |
| } else { |
| this.m_impulse.SetZero(); |
| this.m_motorImpulse = 0 |
| } |
| }; |
| H.prototype.SolveVelocityConstraints = function (d) { |
| var h = this.m_bodyA, |
| l = this.m_bodyB, |
| j = h.m_linearVelocity, |
| o = h.m_angularVelocity, |
| q = l.m_linearVelocity, |
| n = l.m_angularVelocity, |
| a = 0, |
| c = 0, |
| g = 0, |
| b = 0; |
| if (this.m_enableMotor && this.m_limitState != I.e_equalLimits) { |
| b = this.m_motorMass * (this.m_motorSpeed - (this.m_axis.x * (q.x - j.x) + this.m_axis.y * (q.y - j.y) + this.m_a2 * n - this.m_a1 * o)); |
| a = this.m_motorImpulse; |
| d = d.dt * this.m_maxMotorForce; |
| this.m_motorImpulse = y.Clamp(this.m_motorImpulse + b, -d, d); |
| b = this.m_motorImpulse - a; |
| a = b * this.m_axis.x; |
| c = b * this.m_axis.y; |
| g = b * this.m_a1; |
| b = b * this.m_a2; |
| j.x -= this.m_invMassA * a; |
| j.y -= this.m_invMassA * c; |
| o -= this.m_invIA * g; |
| q.x += this.m_invMassB * a; |
| q.y += this.m_invMassB * c; |
| n += this.m_invIB * b |
| } |
| g = this.m_perp.x * (q.x - j.x) + this.m_perp.y * (q.y - j.y) + this.m_s2 * n - this.m_s1 * o; |
| c = n - o; |
| if (this.m_enableLimit && this.m_limitState != I.e_inactiveLimit) { |
| d = this.m_axis.x * (q.x - j.x) + this.m_axis.y * (q.y - j.y) + this.m_a2 * n - this.m_a1 * o; |
| a = this.m_impulse.Copy(); |
| d = this.m_K.Solve33(new A, -g, -c, -d); |
| this.m_impulse.Add(d); |
| if (this.m_limitState == I.e_atLowerLimit) this.m_impulse.z = y.Max(this.m_impulse.z, 0); |
| else if (this.m_limitState == I.e_atUpperLimit) this.m_impulse.z = y.Min(this.m_impulse.z, 0); |
| g = -g - (this.m_impulse.z - a.z) * this.m_K.col3.x; |
| c = -c - (this.m_impulse.z - a.z) * this.m_K.col3.y; |
| c = this.m_K.Solve22(new w, g, c); |
| c.x += a.x; |
| c.y += a.y; |
| this.m_impulse.x = c.x; |
| this.m_impulse.y = c.y; |
| d.x = this.m_impulse.x - a.x; |
| d.y = this.m_impulse.y - a.y; |
| d.z = this.m_impulse.z - a.z; |
| a = d.x * this.m_perp.x + d.z * this.m_axis.x; |
| c = d.x * this.m_perp.y + d.z * this.m_axis.y; |
| g = d.x * this.m_s1 + d.y + d.z * this.m_a1; |
| b = d.x * this.m_s2 + d.y + d.z * this.m_a2 |
| } else { |
| d = this.m_K.Solve22(new w, -g, -c); |
| this.m_impulse.x += d.x; |
| this.m_impulse.y += d.y; |
| a = d.x * this.m_perp.x; |
| c = d.x * this.m_perp.y; |
| g = d.x * this.m_s1 + d.y; |
| b = d.x * this.m_s2 + d.y |
| } |
| j.x -= this.m_invMassA * a; |
| j.y -= this.m_invMassA * c; |
| o -= this.m_invIA * g; |
| q.x += this.m_invMassB * a; |
| q.y += this.m_invMassB * c; |
| n += this.m_invIB * b; |
| h.m_linearVelocity.SetV(j); |
| h.m_angularVelocity = o; |
| l.m_linearVelocity.SetV(q); |
| l.m_angularVelocity = n |
| }; |
| H.prototype.SolvePositionConstraints = function () { |
| var d = this.m_bodyA, |
| h = this.m_bodyB, |
| l = d.m_sweep.c, |
| j = d.m_sweep.a, |
| o = h.m_sweep.c, |
| q = h.m_sweep.a, |
| n, a = 0, |
| c = 0, |
| g = 0, |
| b = a = n = 0, |
| e = 0; |
| c = false; |
| var f = 0, |
| m = G.FromAngle(j), |
| r = G.FromAngle(q); |
| n = m; |
| e = this.m_localAnchor1.x - this.m_localCenterA.x; |
| var s = this.m_localAnchor1.y - this.m_localCenterA.y; |
| a = n.col1.x * e + n.col2.x * s; |
| s = n.col1.y * e + n.col2.y * s; |
| e = a; |
| n = r; |
| r = this.m_localAnchor2.x - this.m_localCenterB.x; |
| g = this.m_localAnchor2.y - this.m_localCenterB.y; |
| a = n.col1.x * r + n.col2.x * g; |
| g = n.col1.y * r + n.col2.y * g; |
| r = a; |
| n = o.x + r - l.x - e; |
| a = o.y + g - l.y - s; |
| if (this.m_enableLimit) { |
| this.m_axis = y.MulMV(m, this.m_localXAxis1); |
| this.m_a1 = (n + e) * this.m_axis.y - (a + s) * this.m_axis.x; |
| this.m_a2 = r * this.m_axis.y - g * this.m_axis.x; |
| var v = this.m_axis.x * n + this.m_axis.y * a; |
| if (y.Abs(this.m_upperTranslation - this.m_lowerTranslation) < 2 * F.b2_linearSlop) { |
| f = y.Clamp(v, -F.b2_maxLinearCorrection, F.b2_maxLinearCorrection); |
| b = y.Abs(v); |
| c = true |
| } else if (v <= this.m_lowerTranslation) { |
| f = y.Clamp(v - this.m_lowerTranslation + F.b2_linearSlop, -F.b2_maxLinearCorrection, 0); |
| b = this.m_lowerTranslation - v; |
| c = true |
| } else if (v >= this.m_upperTranslation) { |
| f = y.Clamp(v - this.m_upperTranslation + F.b2_linearSlop, 0, F.b2_maxLinearCorrection); |
| b = v - this.m_upperTranslation; |
| c = true |
| } |
| } |
| this.m_perp = y.MulMV(m, this.m_localYAxis1); |
| this.m_s1 = (n + e) * this.m_perp.y - (a + s) * this.m_perp.x; |
| this.m_s2 = r * this.m_perp.y - g * this.m_perp.x; |
| m = new A; |
| s = this.m_perp.x * n + this.m_perp.y * a; |
| r = q - j - this.m_refAngle; |
| b = y.Max(b, y.Abs(s)); |
| e = y.Abs(r); |
| if (c) { |
| c = this.m_invMassA; |
| g = this.m_invMassB; |
| n = this.m_invIA; |
| a = this.m_invIB; |
| this.m_K.col1.x = c + g + n * this.m_s1 * this.m_s1 + a * this.m_s2 * this.m_s2; |
| this.m_K.col1.y = n * this.m_s1 + a * this.m_s2; |
| this.m_K.col1.z = n * this.m_s1 * this.m_a1 + a * this.m_s2 * this.m_a2; |
| this.m_K.col2.x = this.m_K.col1.y; |
| this.m_K.col2.y = n + a; |
| this.m_K.col2.z = n * this.m_a1 + a * this.m_a2; |
| this.m_K.col3.x = this.m_K.col1.z; |
| this.m_K.col3.y = this.m_K.col2.z; |
| this.m_K.col3.z = c + g + n * this.m_a1 * this.m_a1 + a * this.m_a2 * this.m_a2; |
| this.m_K.Solve33(m, -s, -r, -f) |
| } else { |
| c = this.m_invMassA; |
| g = this.m_invMassB; |
| n = this.m_invIA; |
| a = this.m_invIB; |
| f = n * this.m_s1 + a * this.m_s2; |
| v = n + a; |
| this.m_K.col1.Set(c + g + n * this.m_s1 * this.m_s1 + a * this.m_s2 * this.m_s2, f, 0); |
| this.m_K.col2.Set(f, |
| v, 0); |
| f = this.m_K.Solve22(new w, -s, -r); |
| m.x = f.x; |
| m.y = f.y; |
| m.z = 0 |
| } |
| f = m.x * this.m_perp.x + m.z * this.m_axis.x; |
| c = m.x * this.m_perp.y + m.z * this.m_axis.y; |
| s = m.x * this.m_s1 + m.y + m.z * this.m_a1; |
| m = m.x * this.m_s2 + m.y + m.z * this.m_a2; |
| l.x -= this.m_invMassA * f; |
| l.y -= this.m_invMassA * c; |
| j -= this.m_invIA * s; |
| o.x += this.m_invMassB * f; |
| o.y += this.m_invMassB * c; |
| q += this.m_invIB * m; |
| d.m_sweep.a = j; |
| h.m_sweep.a = q; |
| d.SynchronizeTransform(); |
| h.SynchronizeTransform(); |
| return b <= F.b2_linearSlop && e <= F.b2_angularSlop |
| }; |
| Box2D.inherit(O, Box2D.Dynamics.Joints.b2JointDef); |
| O.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype; |
| O.b2PrismaticJointDef = function () { |
| Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments); |
| this.localAnchorA = new w; |
| this.localAnchorB = new w; |
| this.localAxisA = new w |
| }; |
| O.prototype.b2PrismaticJointDef = function () { |
| this.__super.b2JointDef.call(this); |
| this.type = I.e_prismaticJoint; |
| this.localAxisA.Set(1, 0); |
| this.referenceAngle = 0; |
| this.enableLimit = false; |
| this.upperTranslation = this.lowerTranslation = 0; |
| this.enableMotor = false; |
| this.motorSpeed = this.maxMotorForce = 0 |
| }; |
| O.prototype.Initialize = function (d, h, l, j) { |
| this.bodyA = d; |
| this.bodyB = h; |
| this.localAnchorA = this.bodyA.GetLocalPoint(l); |
| this.localAnchorB = this.bodyB.GetLocalPoint(l); |
| this.localAxisA = this.bodyA.GetLocalVector(j); |
| this.referenceAngle = this.bodyB.GetAngle() - this.bodyA.GetAngle() |
| }; |
| Box2D.inherit(E, Box2D.Dynamics.Joints.b2Joint); |
| E.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype; |
| E.b2PulleyJoint = function () { |
| Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments); |
| this.m_groundAnchor1 = new w; |
| this.m_groundAnchor2 = new w; |
| this.m_localAnchor1 = new w; |
| this.m_localAnchor2 = new w; |
| this.m_u1 = new w; |
| this.m_u2 = new w |
| }; |
| E.prototype.GetAnchorA = function () { |
| return this.m_bodyA.GetWorldPoint(this.m_localAnchor1) |
| }; |
| E.prototype.GetAnchorB = function () { |
| return this.m_bodyB.GetWorldPoint(this.m_localAnchor2) |
| }; |
| E.prototype.GetReactionForce = function (d) { |
| if (d === undefined) d = 0; |
| return new w(d * this.m_impulse * this.m_u2.x, d * this.m_impulse * this.m_u2.y) |
| }; |
| E.prototype.GetReactionTorque = function () { |
| return 0 |
| }; |
| E.prototype.GetGroundAnchorA = function () { |
| var d = this.m_ground.m_xf.position.Copy(); |
| d.Add(this.m_groundAnchor1); |
| return d |
| }; |
| E.prototype.GetGroundAnchorB = function () { |
| var d = this.m_ground.m_xf.position.Copy(); |
| d.Add(this.m_groundAnchor2); |
| return d |
| }; |
| E.prototype.GetLength1 = function () { |
| var d = this.m_bodyA.GetWorldPoint(this.m_localAnchor1), |
| h = d.x - (this.m_ground.m_xf.position.x + this.m_groundAnchor1.x); |
| d = d.y - (this.m_ground.m_xf.position.y + this.m_groundAnchor1.y); |
| return Math.sqrt(h * h + d * d) |
| }; |
| E.prototype.GetLength2 = function () { |
| var d = this.m_bodyB.GetWorldPoint(this.m_localAnchor2), |
| h = d.x - (this.m_ground.m_xf.position.x + this.m_groundAnchor2.x); |
| d = d.y - (this.m_ground.m_xf.position.y + this.m_groundAnchor2.y); |
| return Math.sqrt(h * h + d * d) |
| }; |
| E.prototype.GetRatio = function () { |
| return this.m_ratio |
| }; |
| E.prototype.b2PulleyJoint = function (d) { |
| this.__super.b2Joint.call(this, d); |
| this.m_ground = this.m_bodyA.m_world.m_groundBody; |
| this.m_groundAnchor1.x = d.groundAnchorA.x - this.m_ground.m_xf.position.x; |
| this.m_groundAnchor1.y = d.groundAnchorA.y - this.m_ground.m_xf.position.y; |
| this.m_groundAnchor2.x = d.groundAnchorB.x - this.m_ground.m_xf.position.x; |
| this.m_groundAnchor2.y = d.groundAnchorB.y - this.m_ground.m_xf.position.y; |
| this.m_localAnchor1.SetV(d.localAnchorA); |
| this.m_localAnchor2.SetV(d.localAnchorB); |
| this.m_ratio = d.ratio; |
| this.m_constant = d.lengthA + this.m_ratio * d.lengthB; |
| this.m_maxLength1 = y.Min(d.maxLengthA, this.m_constant - this.m_ratio * E.b2_minPulleyLength); |
| this.m_maxLength2 = y.Min(d.maxLengthB, (this.m_constant - E.b2_minPulleyLength) / this.m_ratio); |
| this.m_limitImpulse2 = this.m_limitImpulse1 = this.m_impulse = 0 |
| }; |
| E.prototype.InitVelocityConstraints = function (d) { |
| var h = this.m_bodyA, |
| l = this.m_bodyB, |
| j; |
| j = h.m_xf.R; |
| var o = this.m_localAnchor1.x - h.m_sweep.localCenter.x, |
| q = this.m_localAnchor1.y - h.m_sweep.localCenter.y, |
| n = j.col1.x * o + j.col2.x * q; |
| q = j.col1.y * o + j.col2.y * q; |
| o = n; |
| j = l.m_xf.R; |
| var a = this.m_localAnchor2.x - l.m_sweep.localCenter.x, |
| c = this.m_localAnchor2.y - l.m_sweep.localCenter.y; |
| n = j.col1.x * a + j.col2.x * c; |
| c = j.col1.y * a + j.col2.y * c; |
| a = n; |
| j = l.m_sweep.c.x + a; |
| n = l.m_sweep.c.y + c; |
| var g = this.m_ground.m_xf.position.x + this.m_groundAnchor2.x, |
| b = this.m_ground.m_xf.position.y + this.m_groundAnchor2.y; |
| this.m_u1.Set(h.m_sweep.c.x + o - (this.m_ground.m_xf.position.x + this.m_groundAnchor1.x), h.m_sweep.c.y + q - (this.m_ground.m_xf.position.y + this.m_groundAnchor1.y)); |
| this.m_u2.Set(j - g, n - b); |
| j = this.m_u1.Length(); |
| n = this.m_u2.Length(); |
| j > F.b2_linearSlop ? this.m_u1.Multiply(1 / j) : this.m_u1.SetZero(); |
| n > F.b2_linearSlop ? this.m_u2.Multiply(1 / n) : this.m_u2.SetZero(); |
| if (this.m_constant - j - this.m_ratio * n > 0) { |
| this.m_state = I.e_inactiveLimit; |
| this.m_impulse = 0 |
| } else this.m_state = I.e_atUpperLimit; if (j < this.m_maxLength1) { |
| this.m_limitState1 = I.e_inactiveLimit; |
| this.m_limitImpulse1 = 0 |
| } else this.m_limitState1 = I.e_atUpperLimit; if (n < this.m_maxLength2) { |
| this.m_limitState2 = I.e_inactiveLimit; |
| this.m_limitImpulse2 = 0 |
| } else this.m_limitState2 = I.e_atUpperLimit; |
| j = o * this.m_u1.y - q * this.m_u1.x; |
| n = a * this.m_u2.y - c * this.m_u2.x; |
| this.m_limitMass1 = h.m_invMass + h.m_invI * j * j; |
| this.m_limitMass2 = l.m_invMass + l.m_invI * n * n; |
| this.m_pulleyMass = this.m_limitMass1 + this.m_ratio * this.m_ratio * this.m_limitMass2; |
| this.m_limitMass1 = 1 / this.m_limitMass1; |
| this.m_limitMass2 = 1 / this.m_limitMass2; |
| this.m_pulleyMass = 1 / this.m_pulleyMass; |
| if (d.warmStarting) { |
| this.m_impulse *= d.dtRatio; |
| this.m_limitImpulse1 *= d.dtRatio; |
| this.m_limitImpulse2 *= d.dtRatio; |
| d = (-this.m_impulse - this.m_limitImpulse1) * this.m_u1.x; |
| j = (-this.m_impulse - this.m_limitImpulse1) * this.m_u1.y; |
| n = (-this.m_ratio * this.m_impulse - this.m_limitImpulse2) * this.m_u2.x; |
| g = (-this.m_ratio * this.m_impulse - this.m_limitImpulse2) * this.m_u2.y; |
| h.m_linearVelocity.x += h.m_invMass * d; |
| h.m_linearVelocity.y += h.m_invMass * j; |
| h.m_angularVelocity += h.m_invI * (o * j - q * d); |
| l.m_linearVelocity.x += l.m_invMass * n; |
| l.m_linearVelocity.y += l.m_invMass * g; |
| l.m_angularVelocity += l.m_invI * (a * g - c * n) |
| } else this.m_limitImpulse2 = this.m_limitImpulse1 = this.m_impulse = 0 |
| }; |
| E.prototype.SolveVelocityConstraints = function () { |
| var d = this.m_bodyA, |
| h = this.m_bodyB, |
| l; |
| l = d.m_xf.R; |
| var j = this.m_localAnchor1.x - d.m_sweep.localCenter.x, |
| o = this.m_localAnchor1.y - d.m_sweep.localCenter.y, |
| q = l.col1.x * j + l.col2.x * o; |
| o = l.col1.y * j + l.col2.y * o; |
| j = q; |
| l = h.m_xf.R; |
| var n = this.m_localAnchor2.x - h.m_sweep.localCenter.x, |
| a = this.m_localAnchor2.y - h.m_sweep.localCenter.y; |
| q = l.col1.x * n + l.col2.x * a; |
| a = l.col1.y * n + l.col2.y * a; |
| n = q; |
| var c = q = l = 0, |
| g = 0; |
| l = g = l = g = c = q = l = 0; |
| if (this.m_state == I.e_atUpperLimit) { |
| l = d.m_linearVelocity.x + -d.m_angularVelocity * o; |
| q = d.m_linearVelocity.y + d.m_angularVelocity * j; |
| c = h.m_linearVelocity.x + -h.m_angularVelocity * a; |
| g = h.m_linearVelocity.y + h.m_angularVelocity * n; |
| l = -(this.m_u1.x * l + this.m_u1.y * q) - this.m_ratio * (this.m_u2.x * c + this.m_u2.y * g); |
| g = this.m_pulleyMass * -l; |
| l = this.m_impulse; |
| this.m_impulse = y.Max(0, this.m_impulse + g); |
| g = this.m_impulse - l; |
| l = -g * this.m_u1.x; |
| q = -g * this.m_u1.y; |
| c = -this.m_ratio * g * this.m_u2.x; |
| g = -this.m_ratio * g * this.m_u2.y; |
| d.m_linearVelocity.x += d.m_invMass * l; |
| d.m_linearVelocity.y += d.m_invMass * q; |
| d.m_angularVelocity += d.m_invI * (j * q - o * l); |
| h.m_linearVelocity.x += h.m_invMass * c; |
| h.m_linearVelocity.y += h.m_invMass * g; |
| h.m_angularVelocity += h.m_invI * (n * g - a * c) |
| } |
| if (this.m_limitState1 == I.e_atUpperLimit) { |
| l = d.m_linearVelocity.x + -d.m_angularVelocity * o; |
| q = d.m_linearVelocity.y + d.m_angularVelocity * j; |
| l = -(this.m_u1.x * l + this.m_u1.y * q); |
| g = -this.m_limitMass1 * l; |
| l = this.m_limitImpulse1; |
| this.m_limitImpulse1 = y.Max(0, this.m_limitImpulse1 + g); |
| g = this.m_limitImpulse1 - l; |
| l = -g * this.m_u1.x; |
| q = -g * this.m_u1.y; |
| d.m_linearVelocity.x += d.m_invMass * l; |
| d.m_linearVelocity.y += d.m_invMass * q; |
| d.m_angularVelocity += d.m_invI * (j * q - o * l) |
| } |
| if (this.m_limitState2 == I.e_atUpperLimit) { |
| c = h.m_linearVelocity.x + -h.m_angularVelocity * a; |
| g = h.m_linearVelocity.y + h.m_angularVelocity * n; |
| l = -(this.m_u2.x * c + this.m_u2.y * g); |
| g = -this.m_limitMass2 * l; |
| l = this.m_limitImpulse2; |
| this.m_limitImpulse2 = y.Max(0, this.m_limitImpulse2 + g); |
| g = this.m_limitImpulse2 - l; |
| c = -g * this.m_u2.x; |
| g = -g * this.m_u2.y; |
| h.m_linearVelocity.x += h.m_invMass * c; |
| h.m_linearVelocity.y += h.m_invMass * g; |
| h.m_angularVelocity += h.m_invI * (n * g - a * c) |
| } |
| }; |
| E.prototype.SolvePositionConstraints = function () { |
| var d = this.m_bodyA, |
| h = this.m_bodyB, |
| l, j = this.m_ground.m_xf.position.x + this.m_groundAnchor1.x, |
| o = this.m_ground.m_xf.position.y + this.m_groundAnchor1.y, |
| q = this.m_ground.m_xf.position.x + this.m_groundAnchor2.x, |
| n = this.m_ground.m_xf.position.y + this.m_groundAnchor2.y, |
| a = 0, |
| c = 0, |
| g = 0, |
| b = 0, |
| e = l = 0, |
| f = 0, |
| m = 0, |
| r = e = m = l = e = l = 0; |
| if (this.m_state == I.e_atUpperLimit) { |
| l = d.m_xf.R; |
| a = this.m_localAnchor1.x - d.m_sweep.localCenter.x; |
| c = this.m_localAnchor1.y - d.m_sweep.localCenter.y; |
| e = l.col1.x * a + l.col2.x * c; |
| c = l.col1.y * a + l.col2.y * c; |
| a = e; |
| l = h.m_xf.R; |
| g = this.m_localAnchor2.x - h.m_sweep.localCenter.x; |
| b = this.m_localAnchor2.y - h.m_sweep.localCenter.y; |
| e = l.col1.x * g + l.col2.x * b; |
| b = l.col1.y * g + l.col2.y * b; |
| g = e; |
| l = d.m_sweep.c.x + a; |
| e = d.m_sweep.c.y + c; |
| f = h.m_sweep.c.x + g; |
| m = h.m_sweep.c.y + b; |
| this.m_u1.Set(l - j, e - o); |
| this.m_u2.Set(f - q, m - n); |
| l = this.m_u1.Length(); |
| e = this.m_u2.Length(); |
| l > F.b2_linearSlop ? this.m_u1.Multiply(1 / l) : this.m_u1.SetZero(); |
| e > F.b2_linearSlop ? this.m_u2.Multiply(1 / e) : this.m_u2.SetZero(); |
| l = this.m_constant - l - this.m_ratio * e; |
| r = y.Max(r, -l); |
| l = y.Clamp(l + F.b2_linearSlop, -F.b2_maxLinearCorrection, 0); |
| m = -this.m_pulleyMass * l; |
| l = -m * this.m_u1.x; |
| e = -m * this.m_u1.y; |
| f = -this.m_ratio * m * this.m_u2.x; |
| m = -this.m_ratio * m * this.m_u2.y; |
| d.m_sweep.c.x += d.m_invMass * l; |
| d.m_sweep.c.y += d.m_invMass * e; |
| d.m_sweep.a += d.m_invI * (a * e - c * l); |
| h.m_sweep.c.x += h.m_invMass * f; |
| h.m_sweep.c.y += h.m_invMass * m; |
| h.m_sweep.a += h.m_invI * (g * m - b * f); |
| d.SynchronizeTransform(); |
| h.SynchronizeTransform() |
| } |
| if (this.m_limitState1 == I.e_atUpperLimit) { |
| l = d.m_xf.R; |
| a = this.m_localAnchor1.x - d.m_sweep.localCenter.x; |
| c = this.m_localAnchor1.y - d.m_sweep.localCenter.y; |
| e = l.col1.x * a + l.col2.x * c; |
| c = l.col1.y * a + l.col2.y * c; |
| a = e; |
| l = d.m_sweep.c.x + a; |
| e = d.m_sweep.c.y + c; |
| this.m_u1.Set(l - j, e - o); |
| l = this.m_u1.Length(); |
| if (l > F.b2_linearSlop) { |
| this.m_u1.x *= 1 / l; |
| this.m_u1.y *= 1 / l |
| } else this.m_u1.SetZero(); |
| l = this.m_maxLength1 - l; |
| r = y.Max(r, -l); |
| l = y.Clamp(l + F.b2_linearSlop, -F.b2_maxLinearCorrection, 0); |
| m = -this.m_limitMass1 * l; |
| l = -m * this.m_u1.x; |
| e = -m * this.m_u1.y; |
| d.m_sweep.c.x += d.m_invMass * l; |
| d.m_sweep.c.y += d.m_invMass * e; |
| d.m_sweep.a += d.m_invI * (a * e - c * l); |
| d.SynchronizeTransform() |
| } |
| if (this.m_limitState2 == I.e_atUpperLimit) { |
| l = h.m_xf.R; |
| g = this.m_localAnchor2.x - h.m_sweep.localCenter.x; |
| b = this.m_localAnchor2.y - h.m_sweep.localCenter.y; |
| e = l.col1.x * g + l.col2.x * b; |
| b = l.col1.y * g + l.col2.y * b; |
| g = e; |
| f = h.m_sweep.c.x + g; |
| m = h.m_sweep.c.y + b; |
| this.m_u2.Set(f - q, m - n); |
| e = this.m_u2.Length(); |
| if (e > F.b2_linearSlop) { |
| this.m_u2.x *= 1 / e; |
| this.m_u2.y *= 1 / e |
| } else this.m_u2.SetZero(); |
| l = this.m_maxLength2 - e; |
| r = y.Max(r, -l); |
| l = y.Clamp(l + F.b2_linearSlop, -F.b2_maxLinearCorrection, 0); |
| m = -this.m_limitMass2 * l; |
| f = -m * this.m_u2.x; |
| m = -m * this.m_u2.y; |
| h.m_sweep.c.x += h.m_invMass * f; |
| h.m_sweep.c.y += h.m_invMass * m; |
| h.m_sweep.a += h.m_invI * (g * m - b * f); |
| h.SynchronizeTransform() |
| } |
| return r < F.b2_linearSlop |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Dynamics.Joints.b2PulleyJoint.b2_minPulleyLength = 2 |
| }); |
| Box2D.inherit(R, Box2D.Dynamics.Joints.b2JointDef); |
| R.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype; |
| R.b2PulleyJointDef = function () { |
| Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments); |
| this.groundAnchorA = new w; |
| this.groundAnchorB = new w; |
| this.localAnchorA = new w; |
| this.localAnchorB = new w |
| }; |
| R.prototype.b2PulleyJointDef = function () { |
| this.__super.b2JointDef.call(this); |
| this.type = I.e_pulleyJoint; |
| this.groundAnchorA.Set(-1, 1); |
| this.groundAnchorB.Set(1, 1); |
| this.localAnchorA.Set(-1, 0); |
| this.localAnchorB.Set(1, 0); |
| this.maxLengthB = this.lengthB = this.maxLengthA = this.lengthA = 0; |
| this.ratio = 1; |
| this.collideConnected = true |
| }; |
| R.prototype.Initialize = function (d, h, l, j, o, q, n) { |
| if (n === undefined) n = 0; |
| this.bodyA = d; |
| this.bodyB = h; |
| this.groundAnchorA.SetV(l); |
| this.groundAnchorB.SetV(j); |
| this.localAnchorA = this.bodyA.GetLocalPoint(o); |
| this.localAnchorB = this.bodyB.GetLocalPoint(q); |
| d = o.x - l.x; |
| l = o.y - l.y; |
| this.lengthA = Math.sqrt(d * d + l * l); |
| l = q.x - j.x; |
| j = q.y - j.y; |
| this.lengthB = Math.sqrt(l * l + j * j); |
| this.ratio = n; |
| n = this.lengthA + this.ratio * this.lengthB; |
| this.maxLengthA = n - this.ratio * E.b2_minPulleyLength; |
| this.maxLengthB = (n - E.b2_minPulleyLength) / this.ratio |
| }; |
| Box2D.inherit(N, Box2D.Dynamics.Joints.b2Joint); |
| N.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype; |
| N.b2RevoluteJoint = function () { |
| Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments); |
| this.K = new G; |
| this.K1 = new G; |
| this.K2 = new G; |
| this.K3 = new G; |
| this.impulse3 = new A; |
| this.impulse2 = new w; |
| this.reduced = new w; |
| this.m_localAnchor1 = new w; |
| this.m_localAnchor2 = new w; |
| this.m_impulse = new A; |
| this.m_mass = new K |
| }; |
| N.prototype.GetAnchorA = function () { |
| return this.m_bodyA.GetWorldPoint(this.m_localAnchor1) |
| }; |
| N.prototype.GetAnchorB = function () { |
| return this.m_bodyB.GetWorldPoint(this.m_localAnchor2) |
| }; |
| N.prototype.GetReactionForce = function (d) { |
| if (d === undefined) d = 0; |
| return new w(d * this.m_impulse.x, d * this.m_impulse.y) |
| }; |
| N.prototype.GetReactionTorque = function (d) { |
| if (d === undefined) d = 0; |
| return d * this.m_impulse.z |
| }; |
| N.prototype.GetJointAngle = function () { |
| return this.m_bodyB.m_sweep.a - this.m_bodyA.m_sweep.a - this.m_referenceAngle |
| }; |
| N.prototype.GetJointSpeed = function () { |
| return this.m_bodyB.m_angularVelocity - this.m_bodyA.m_angularVelocity |
| }; |
| N.prototype.IsLimitEnabled = function () { |
| return this.m_enableLimit |
| }; |
| N.prototype.EnableLimit = function (d) { |
| this.m_enableLimit = d |
| }; |
| N.prototype.GetLowerLimit = function () { |
| return this.m_lowerAngle |
| }; |
| N.prototype.GetUpperLimit = function () { |
| return this.m_upperAngle |
| }; |
| N.prototype.SetLimits = function (d, h) { |
| if (d === undefined) d = 0; |
| if (h === undefined) h = 0; |
| this.m_lowerAngle = d; |
| this.m_upperAngle = h |
| }; |
| N.prototype.IsMotorEnabled = function () { |
| this.m_bodyA.SetAwake(true); |
| this.m_bodyB.SetAwake(true); |
| return this.m_enableMotor |
| }; |
| N.prototype.EnableMotor = function (d) { |
| this.m_enableMotor = d |
| }; |
| N.prototype.SetMotorSpeed = function (d) { |
| if (d === undefined) d = 0; |
| this.m_bodyA.SetAwake(true); |
| this.m_bodyB.SetAwake(true); |
| this.m_motorSpeed = d |
| }; |
| N.prototype.GetMotorSpeed = function () { |
| return this.m_motorSpeed |
| }; |
| N.prototype.SetMaxMotorTorque = function (d) { |
| if (d === undefined) d = 0; |
| this.m_maxMotorTorque = d |
| }; |
| N.prototype.GetMotorTorque = function () { |
| return this.m_maxMotorTorque |
| }; |
| N.prototype.b2RevoluteJoint = function (d) { |
| this.__super.b2Joint.call(this, d); |
| this.m_localAnchor1.SetV(d.localAnchorA); |
| this.m_localAnchor2.SetV(d.localAnchorB); |
| this.m_referenceAngle = d.referenceAngle; |
| this.m_impulse.SetZero(); |
| this.m_motorImpulse = 0; |
| this.m_lowerAngle = d.lowerAngle; |
| this.m_upperAngle = d.upperAngle; |
| this.m_maxMotorTorque = d.maxMotorTorque; |
| this.m_motorSpeed = d.motorSpeed; |
| this.m_enableLimit = d.enableLimit; |
| this.m_enableMotor = d.enableMotor; |
| this.m_limitState = I.e_inactiveLimit |
| }; |
| N.prototype.InitVelocityConstraints = function (d) { |
| var h = this.m_bodyA, |
| l = this.m_bodyB, |
| j, o = 0; |
| j = h.m_xf.R; |
| var q = this.m_localAnchor1.x - h.m_sweep.localCenter.x, |
| n = this.m_localAnchor1.y - h.m_sweep.localCenter.y; |
| o = j.col1.x * q + j.col2.x * n; |
| n = j.col1.y * q + j.col2.y * n; |
| q = o; |
| j = l.m_xf.R; |
| var a = this.m_localAnchor2.x - l.m_sweep.localCenter.x, |
| c = this.m_localAnchor2.y - l.m_sweep.localCenter.y; |
| o = j.col1.x * a + j.col2.x * c; |
| c = j.col1.y * a + j.col2.y * c; |
| a = o; |
| j = h.m_invMass; |
| o = l.m_invMass; |
| var g = h.m_invI, |
| b = l.m_invI; |
| this.m_mass.col1.x = j + o + n * n * g + c * c * b; |
| this.m_mass.col2.x = -n * q * g - c * a * b; |
| this.m_mass.col3.x = -n * g - c * b; |
| this.m_mass.col1.y = this.m_mass.col2.x; |
| this.m_mass.col2.y = j + o + q * q * g + a * a * b; |
| this.m_mass.col3.y = q * g + a * b; |
| this.m_mass.col1.z = this.m_mass.col3.x; |
| this.m_mass.col2.z = this.m_mass.col3.y; |
| this.m_mass.col3.z = g + b; |
| this.m_motorMass = 1 / (g + b); |
| if (this.m_enableMotor == false) this.m_motorImpulse = 0; |
| if (this.m_enableLimit) { |
| var e = l.m_sweep.a - h.m_sweep.a - this.m_referenceAngle; |
| if (y.Abs(this.m_upperAngle - this.m_lowerAngle) < 2 * F.b2_angularSlop) this.m_limitState = I.e_equalLimits; |
| else if (e <= this.m_lowerAngle) { |
| if (this.m_limitState != I.e_atLowerLimit) this.m_impulse.z = 0; |
| this.m_limitState = I.e_atLowerLimit |
| } else if (e >= this.m_upperAngle) { |
| if (this.m_limitState != I.e_atUpperLimit) this.m_impulse.z = 0; |
| this.m_limitState = I.e_atUpperLimit |
| } else { |
| this.m_limitState = I.e_inactiveLimit; |
| this.m_impulse.z = 0 |
| } |
| } else this.m_limitState = I.e_inactiveLimit; if (d.warmStarting) { |
| this.m_impulse.x *= d.dtRatio; |
| this.m_impulse.y *= d.dtRatio; |
| this.m_motorImpulse *= d.dtRatio; |
| d = this.m_impulse.x; |
| e = this.m_impulse.y; |
| h.m_linearVelocity.x -= j * d; |
| h.m_linearVelocity.y -= j * e; |
| h.m_angularVelocity -= g * (q * e - n * d + this.m_motorImpulse + this.m_impulse.z); |
| l.m_linearVelocity.x += o * d; |
| l.m_linearVelocity.y += o * e; |
| l.m_angularVelocity += b * (a * e - c * d + this.m_motorImpulse + this.m_impulse.z) |
| } else { |
| this.m_impulse.SetZero(); |
| this.m_motorImpulse = 0 |
| } |
| }; |
| N.prototype.SolveVelocityConstraints = function (d) { |
| var h = this.m_bodyA, |
| l = this.m_bodyB, |
| j = 0, |
| o = j = 0, |
| q = 0, |
| n = 0, |
| a = 0, |
| c = h.m_linearVelocity, |
| g = h.m_angularVelocity, |
| b = l.m_linearVelocity, |
| e = l.m_angularVelocity, |
| f = h.m_invMass, |
| m = l.m_invMass, |
| r = h.m_invI, |
| s = l.m_invI; |
| if (this.m_enableMotor && this.m_limitState != I.e_equalLimits) { |
| o = this.m_motorMass * -(e - g - this.m_motorSpeed); |
| q = this.m_motorImpulse; |
| n = d.dt * this.m_maxMotorTorque; |
| this.m_motorImpulse = y.Clamp(this.m_motorImpulse + o, -n, n); |
| o = this.m_motorImpulse - q; |
| g -= r * o; |
| e += s * o |
| } |
| if (this.m_enableLimit && this.m_limitState != I.e_inactiveLimit) { |
| d = h.m_xf.R; |
| o = this.m_localAnchor1.x - h.m_sweep.localCenter.x; |
| q = this.m_localAnchor1.y - h.m_sweep.localCenter.y; |
| j = d.col1.x * o + d.col2.x * q; |
| q = d.col1.y * o + d.col2.y * q; |
| o = j; |
| d = l.m_xf.R; |
| n = this.m_localAnchor2.x - l.m_sweep.localCenter.x; |
| a = this.m_localAnchor2.y - l.m_sweep.localCenter.y; |
| j = d.col1.x * n + d.col2.x * a; |
| a = d.col1.y * n + d.col2.y * a; |
| n = j; |
| d = b.x + -e * a - c.x - -g * q; |
| var v = b.y + e * n - c.y - g * o; |
| this.m_mass.Solve33(this.impulse3, -d, -v, -(e - g)); |
| if (this.m_limitState == I.e_equalLimits) this.m_impulse.Add(this.impulse3); |
| else if (this.m_limitState == I.e_atLowerLimit) { |
| j = this.m_impulse.z + this.impulse3.z; |
| if (j < 0) { |
| this.m_mass.Solve22(this.reduced, -d, -v); |
| this.impulse3.x = this.reduced.x; |
| this.impulse3.y = this.reduced.y; |
| this.impulse3.z = -this.m_impulse.z; |
| this.m_impulse.x += this.reduced.x; |
| this.m_impulse.y += this.reduced.y; |
| this.m_impulse.z = 0 |
| } |
| } else if (this.m_limitState == I.e_atUpperLimit) { |
| j = this.m_impulse.z + this.impulse3.z; |
| if (j > 0) { |
| this.m_mass.Solve22(this.reduced, -d, -v); |
| this.impulse3.x = this.reduced.x; |
| this.impulse3.y = this.reduced.y; |
| this.impulse3.z = -this.m_impulse.z; |
| this.m_impulse.x += this.reduced.x; |
| this.m_impulse.y += this.reduced.y; |
| this.m_impulse.z = 0 |
| } |
| } |
| c.x -= f * this.impulse3.x; |
| c.y -= f * this.impulse3.y; |
| g -= r * (o * this.impulse3.y - q * this.impulse3.x + this.impulse3.z); |
| b.x += m * this.impulse3.x; |
| b.y += m * this.impulse3.y; |
| e += s * (n * this.impulse3.y - a * this.impulse3.x + this.impulse3.z) |
| } else { |
| d = h.m_xf.R; |
| o = this.m_localAnchor1.x - h.m_sweep.localCenter.x; |
| q = this.m_localAnchor1.y - h.m_sweep.localCenter.y; |
| j = d.col1.x * o + d.col2.x * q; |
| q = d.col1.y * o + d.col2.y * q; |
| o = j; |
| d = l.m_xf.R; |
| n = this.m_localAnchor2.x - l.m_sweep.localCenter.x; |
| a = this.m_localAnchor2.y - l.m_sweep.localCenter.y; |
| j = d.col1.x * n + d.col2.x * a; |
| a = d.col1.y * n + d.col2.y * a; |
| n = j; |
| this.m_mass.Solve22(this.impulse2, -(b.x + -e * a - c.x - -g * q), -(b.y + e * n - c.y - g * o)); |
| this.m_impulse.x += this.impulse2.x; |
| this.m_impulse.y += this.impulse2.y; |
| c.x -= f * this.impulse2.x; |
| c.y -= f * this.impulse2.y; |
| g -= r * (o * this.impulse2.y - q * this.impulse2.x); |
| b.x += m * this.impulse2.x; |
| b.y += m * this.impulse2.y; |
| e += s * (n * this.impulse2.y - a * this.impulse2.x) |
| } |
| h.m_linearVelocity.SetV(c); |
| h.m_angularVelocity = g; |
| l.m_linearVelocity.SetV(b); |
| l.m_angularVelocity = e |
| }; |
| N.prototype.SolvePositionConstraints = function () { |
| var d = 0, |
| h, l = this.m_bodyA, |
| j = this.m_bodyB, |
| o = 0, |
| q = h = 0, |
| n = 0, |
| a = 0; |
| if (this.m_enableLimit && this.m_limitState != I.e_inactiveLimit) { |
| d = j.m_sweep.a - l.m_sweep.a - this.m_referenceAngle; |
| var c = 0; |
| if (this.m_limitState == I.e_equalLimits) { |
| d = y.Clamp(d - this.m_lowerAngle, -F.b2_maxAngularCorrection, F.b2_maxAngularCorrection); |
| c = -this.m_motorMass * d; |
| o = y.Abs(d) |
| } else if (this.m_limitState == I.e_atLowerLimit) { |
| d = d - this.m_lowerAngle; |
| o = -d; |
| d = y.Clamp(d + F.b2_angularSlop, -F.b2_maxAngularCorrection, 0); |
| c = -this.m_motorMass * d |
| } else if (this.m_limitState == I.e_atUpperLimit) { |
| o = d = d - this.m_upperAngle; |
| d = y.Clamp(d - F.b2_angularSlop, 0, F.b2_maxAngularCorrection); |
| c = -this.m_motorMass * d |
| } |
| l.m_sweep.a -= l.m_invI * c; |
| j.m_sweep.a += j.m_invI * c; |
| l.SynchronizeTransform(); |
| j.SynchronizeTransform() |
| } |
| h = l.m_xf.R; |
| c = this.m_localAnchor1.x - l.m_sweep.localCenter.x; |
| d = this.m_localAnchor1.y - l.m_sweep.localCenter.y; |
| q = h.col1.x * c + h.col2.x * d; |
| d = h.col1.y * c + h.col2.y * d; |
| c = q; |
| h = j.m_xf.R; |
| var g = this.m_localAnchor2.x - j.m_sweep.localCenter.x, |
| b = this.m_localAnchor2.y - j.m_sweep.localCenter.y; |
| q = h.col1.x * g + h.col2.x * b; |
| b = h.col1.y * g + h.col2.y * b; |
| g = q; |
| n = j.m_sweep.c.x + g - l.m_sweep.c.x - c; |
| a = j.m_sweep.c.y + b - l.m_sweep.c.y - d; |
| var e = n * n + a * a; |
| h = Math.sqrt(e); |
| q = l.m_invMass; |
| var f = j.m_invMass, |
| m = l.m_invI, |
| r = j.m_invI, |
| s = 10 * F.b2_linearSlop; |
| if (e > s * s) { |
| e = 1 / (q + f); |
| n = e * -n; |
| a = e * -a; |
| l.m_sweep.c.x -= 0.5 * q * n; |
| l.m_sweep.c.y -= 0.5 * q * a; |
| j.m_sweep.c.x += 0.5 * f * n; |
| j.m_sweep.c.y += 0.5 * f * a; |
| n = j.m_sweep.c.x + g - l.m_sweep.c.x - c; |
| a = j.m_sweep.c.y + b - l.m_sweep.c.y - d |
| } |
| this.K1.col1.x = q + f; |
| this.K1.col2.x = 0; |
| this.K1.col1.y = 0; |
| this.K1.col2.y = q + f; |
| this.K2.col1.x = m * d * d; |
| this.K2.col2.x = -m * c * d; |
| this.K2.col1.y = -m * c * d; |
| this.K2.col2.y = m * c * c; |
| this.K3.col1.x = r * b * b; |
| this.K3.col2.x = -r * g * b; |
| this.K3.col1.y = -r * g * b; |
| this.K3.col2.y = r * g * g; |
| this.K.SetM(this.K1); |
| this.K.AddM(this.K2); |
| this.K.AddM(this.K3); |
| this.K.Solve(N.tImpulse, -n, -a); |
| n = N.tImpulse.x; |
| a = N.tImpulse.y; |
| l.m_sweep.c.x -= l.m_invMass * n; |
| l.m_sweep.c.y -= l.m_invMass * a; |
| l.m_sweep.a -= l.m_invI * (c * a - d * n); |
| j.m_sweep.c.x += j.m_invMass * n; |
| j.m_sweep.c.y += j.m_invMass * a; |
| j.m_sweep.a += j.m_invI * (g * a - b * n); |
| l.SynchronizeTransform(); |
| j.SynchronizeTransform(); |
| return h <= F.b2_linearSlop && o <= F.b2_angularSlop |
| }; |
| Box2D.postDefs.push(function () { |
| Box2D.Dynamics.Joints.b2RevoluteJoint.tImpulse = new w |
| }); |
| Box2D.inherit(S, Box2D.Dynamics.Joints.b2JointDef); |
| S.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype; |
| S.b2RevoluteJointDef = function () { |
| Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments); |
| this.localAnchorA = new w; |
| this.localAnchorB = new w |
| }; |
| S.prototype.b2RevoluteJointDef = function () { |
| this.__super.b2JointDef.call(this); |
| this.type = I.e_revoluteJoint; |
| this.localAnchorA.Set(0, 0); |
| this.localAnchorB.Set(0, 0); |
| this.motorSpeed = this.maxMotorTorque = this.upperAngle = this.lowerAngle = this.referenceAngle = 0; |
| this.enableMotor = this.enableLimit = false |
| }; |
| S.prototype.Initialize = function (d, h, l) { |
| this.bodyA = d; |
| this.bodyB = h; |
| this.localAnchorA = this.bodyA.GetLocalPoint(l); |
| this.localAnchorB = this.bodyB.GetLocalPoint(l); |
| this.referenceAngle = this.bodyB.GetAngle() - this.bodyA.GetAngle() |
| }; |
| Box2D.inherit(aa, Box2D.Dynamics.Joints.b2Joint); |
| aa.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype; |
| aa.b2WeldJoint = function () { |
| Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments); |
| this.m_localAnchorA = new w; |
| this.m_localAnchorB = new w; |
| this.m_impulse = new A; |
| this.m_mass = new K |
| }; |
| aa.prototype.GetAnchorA = function () { |
| return this.m_bodyA.GetWorldPoint(this.m_localAnchorA) |
| }; |
| aa.prototype.GetAnchorB = function () { |
| return this.m_bodyB.GetWorldPoint(this.m_localAnchorB) |
| }; |
| aa.prototype.GetReactionForce = function (d) { |
| if (d === undefined) d = 0; |
| return new w(d * this.m_impulse.x, d * this.m_impulse.y) |
| }; |
| aa.prototype.GetReactionTorque = function (d) { |
| if (d === undefined) d = 0; |
| return d * this.m_impulse.z |
| }; |
| aa.prototype.b2WeldJoint = function (d) { |
| this.__super.b2Joint.call(this, d); |
| this.m_localAnchorA.SetV(d.localAnchorA); |
| this.m_localAnchorB.SetV(d.localAnchorB); |
| this.m_referenceAngle = d.referenceAngle; |
| this.m_impulse.SetZero(); |
| this.m_mass = new K |
| }; |
| aa.prototype.InitVelocityConstraints = function (d) { |
| var h, l = 0, |
| j = this.m_bodyA, |
| o = this.m_bodyB; |
| h = j.m_xf.R; |
| var q = this.m_localAnchorA.x - j.m_sweep.localCenter.x, |
| n = this.m_localAnchorA.y - j.m_sweep.localCenter.y; |
| l = h.col1.x * q + h.col2.x * n; |
| n = h.col1.y * q + h.col2.y * n; |
| q = l; |
| h = o.m_xf.R; |
| var a = this.m_localAnchorB.x - o.m_sweep.localCenter.x, |
| c = this.m_localAnchorB.y - o.m_sweep.localCenter.y; |
| l = h.col1.x * a + h.col2.x * c; |
| c = h.col1.y * a + h.col2.y * c; |
| a = l; |
| h = j.m_invMass; |
| l = o.m_invMass; |
| var g = j.m_invI, |
| b = o.m_invI; |
| this.m_mass.col1.x = h + l + n * n * g + c * c * b; |
| this.m_mass.col2.x = -n * q * g - c * a * b; |
| this.m_mass.col3.x = -n * g - c * b; |
| this.m_mass.col1.y = this.m_mass.col2.x; |
| this.m_mass.col2.y = h + l + q * q * g + a * a * b; |
| this.m_mass.col3.y = q * g + a * b; |
| this.m_mass.col1.z = this.m_mass.col3.x; |
| this.m_mass.col2.z = this.m_mass.col3.y; |
| this.m_mass.col3.z = g + b; |
| if (d.warmStarting) { |
| this.m_impulse.x *= d.dtRatio; |
| this.m_impulse.y *= d.dtRatio; |
| this.m_impulse.z *= d.dtRatio; |
| j.m_linearVelocity.x -= h * this.m_impulse.x; |
| j.m_linearVelocity.y -= h * this.m_impulse.y; |
| j.m_angularVelocity -= g * (q * this.m_impulse.y - n * this.m_impulse.x + this.m_impulse.z); |
| o.m_linearVelocity.x += l * this.m_impulse.x; |
| o.m_linearVelocity.y += l * this.m_impulse.y; |
| o.m_angularVelocity += b * (a * this.m_impulse.y - c * this.m_impulse.x + this.m_impulse.z) |
| } else this.m_impulse.SetZero() |
| }; |
| aa.prototype.SolveVelocityConstraints = function () { |
| var d, h = 0, |
| l = this.m_bodyA, |
| j = this.m_bodyB, |
| o = l.m_linearVelocity, |
| q = l.m_angularVelocity, |
| n = j.m_linearVelocity, |
| a = j.m_angularVelocity, |
| c = l.m_invMass, |
| g = j.m_invMass, |
| b = l.m_invI, |
| e = j.m_invI; |
| d = l.m_xf.R; |
| var f = this.m_localAnchorA.x - l.m_sweep.localCenter.x, |
| m = this.m_localAnchorA.y - l.m_sweep.localCenter.y; |
| h = d.col1.x * f + d.col2.x * m; |
| m = d.col1.y * f + d.col2.y * m; |
| f = h; |
| d = j.m_xf.R; |
| var r = this.m_localAnchorB.x - j.m_sweep.localCenter.x, |
| s = this.m_localAnchorB.y - j.m_sweep.localCenter.y; |
| h = d.col1.x * r + d.col2.x * s; |
| s = d.col1.y * r + d.col2.y * s; |
| r = h; |
| d = n.x - a * s - o.x + q * m; |
| h = n.y + a * r - o.y - q * f; |
| var v = a - q, |
| t = new A; |
| this.m_mass.Solve33(t, -d, -h, -v); |
| this.m_impulse.Add(t); |
| o.x -= c * t.x; |
| o.y -= c * t.y; |
| q -= b * (f * t.y - m * t.x + t.z); |
| n.x += g * t.x; |
| n.y += g * t.y; |
| a += e * (r * t.y - s * t.x + t.z); |
| l.m_angularVelocity = q; |
| j.m_angularVelocity = a |
| }; |
| aa.prototype.SolvePositionConstraints = function () { |
| var d, h = 0, |
| l = this.m_bodyA, |
| j = this.m_bodyB; |
| d = l.m_xf.R; |
| var o = this.m_localAnchorA.x - l.m_sweep.localCenter.x, |
| q = this.m_localAnchorA.y - l.m_sweep.localCenter.y; |
| h = d.col1.x * o + d.col2.x * q; |
| q = d.col1.y * o + d.col2.y * q; |
| o = h; |
| d = j.m_xf.R; |
| var n = this.m_localAnchorB.x - j.m_sweep.localCenter.x, |
| a = this.m_localAnchorB.y - j.m_sweep.localCenter.y; |
| h = d.col1.x * n + d.col2.x * a; |
| a = d.col1.y * n + d.col2.y * a; |
| n = h; |
| d = l.m_invMass; |
| h = j.m_invMass; |
| var c = l.m_invI, |
| g = j.m_invI, |
| b = j.m_sweep.c.x + n - l.m_sweep.c.x - o, |
| e = j.m_sweep.c.y + a - l.m_sweep.c.y - q, |
| f = j.m_sweep.a - l.m_sweep.a - this.m_referenceAngle, |
| m = 10 * F.b2_linearSlop, |
| r = Math.sqrt(b * b + e * e), |
| s = y.Abs(f); |
| if (r > m) { |
| c *= 1; |
| g *= 1 |
| } |
| this.m_mass.col1.x = d + h + q * q * c + a * a * g; |
| this.m_mass.col2.x = -q * o * c - a * n * g; |
| this.m_mass.col3.x = -q * c - a * g; |
| this.m_mass.col1.y = this.m_mass.col2.x; |
| this.m_mass.col2.y = d + h + o * o * c + n * n * g; |
| this.m_mass.col3.y = o * c + n * g; |
| this.m_mass.col1.z = this.m_mass.col3.x; |
| this.m_mass.col2.z = this.m_mass.col3.y; |
| this.m_mass.col3.z = c + g; |
| m = new A; |
| this.m_mass.Solve33(m, -b, -e, -f); |
| l.m_sweep.c.x -= d * m.x; |
| l.m_sweep.c.y -= d * m.y; |
| l.m_sweep.a -= c * (o * m.y - q * m.x + m.z); |
| j.m_sweep.c.x += h * m.x; |
| j.m_sweep.c.y += h * m.y; |
| j.m_sweep.a += g * (n * m.y - a * m.x + m.z); |
| l.SynchronizeTransform(); |
| j.SynchronizeTransform(); |
| return r <= F.b2_linearSlop && s <= F.b2_angularSlop |
| }; |
| Box2D.inherit(Z, Box2D.Dynamics.Joints.b2JointDef); |
| Z.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype; |
| Z.b2WeldJointDef = function () { |
| Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments); |
| this.localAnchorA = new w; |
| this.localAnchorB = new w |
| }; |
| Z.prototype.b2WeldJointDef = function () { |
| this.__super.b2JointDef.call(this); |
| this.type = I.e_weldJoint; |
| this.referenceAngle = 0 |
| }; |
| Z.prototype.Initialize = function (d, h, l) { |
| this.bodyA = d; |
| this.bodyB = h; |
| this.localAnchorA.SetV(this.bodyA.GetLocalPoint(l)); |
| this.localAnchorB.SetV(this.bodyB.GetLocalPoint(l)); |
| this.referenceAngle = this.bodyB.GetAngle() - this.bodyA.GetAngle() |
| } |
| })(); |
| (function () { |
| var F = Box2D.Dynamics.b2DebugDraw; |
| F.b2DebugDraw = function () { |
| this.m_xformScale = this.m_fillAlpha = this.m_alpha = this.m_lineThickness = this.m_drawScale = 1; |
| var G = this; |
| this.m_sprite = { |
| graphics: { |
| clear: function () { |
| G.m_ctx.clearRect(0, 0, G.m_ctx.canvas.width, G.m_ctx.canvas.height) |
| } |
| } |
| } |
| }; |
| F.prototype._color = function (G, K) { |
| return "rgba(" + ((G & 16711680) >> 16) + "," + ((G & 65280) >> 8) + "," + (G & 255) + "," + K + ")" |
| }; |
| F.prototype.b2DebugDraw = function () { |
| this.m_drawFlags = 0 |
| }; |
| F.prototype.SetFlags = function (G) { |
| if (G === undefined) G = 0; |
| this.m_drawFlags = G |
| }; |
| F.prototype.GetFlags = function () { |
| return this.m_drawFlags |
| }; |
| F.prototype.AppendFlags = function (G) { |
| if (G === undefined) G = 0; |
| this.m_drawFlags |= G |
| }; |
| F.prototype.ClearFlags = function (G) { |
| if (G === undefined) G = 0; |
| this.m_drawFlags &= ~G |
| }; |
| F.prototype.SetSprite = function (G) { |
| this.m_ctx = G |
| }; |
| F.prototype.GetSprite = function () { |
| return this.m_ctx |
| }; |
| F.prototype.SetDrawScale = function (G) { |
| if (G === undefined) G = 0; |
| this.m_drawScale = G |
| }; |
| F.prototype.GetDrawScale = function () { |
| return this.m_drawScale |
| }; |
| F.prototype.SetLineThickness = function (G) { |
| if (G === undefined) G = 0; |
| this.m_lineThickness = G; |
| this.m_ctx.strokeWidth = G |
| }; |
| F.prototype.GetLineThickness = function () { |
| return this.m_lineThickness |
| }; |
| F.prototype.SetAlpha = function (G) { |
| if (G === undefined) G = 0; |
| this.m_alpha = G |
| }; |
| F.prototype.GetAlpha = function () { |
| return this.m_alpha |
| }; |
| F.prototype.SetFillAlpha = function (G) { |
| if (G === undefined) G = 0; |
| this.m_fillAlpha = G |
| }; |
| F.prototype.GetFillAlpha = function () { |
| return this.m_fillAlpha |
| }; |
| F.prototype.SetXFormScale = function (G) { |
| if (G === undefined) G = 0; |
| this.m_xformScale = G |
| }; |
| F.prototype.GetXFormScale = function () { |
| return this.m_xformScale |
| }; |
| F.prototype.DrawPolygon = function (G, K, y) { |
| if (K) { |
| var w = this.m_ctx, |
| A = this.m_drawScale; |
| w.beginPath(); |
| w.strokeStyle = this._color(y.color, this.m_alpha); |
| w.moveTo(G[0].x * A, G[0].y * A); |
| for (y = 1; y < K; y++) w.lineTo(G[y].x * A, G[y].y * A); |
| w.lineTo(G[0].x * A, G[0].y * A); |
| w.closePath(); |
| w.stroke() |
| } |
| }; |
| F.prototype.DrawSolidPolygon = function (G, K, y) { |
| if (K) { |
| var w = this.m_ctx, |
| A = this.m_drawScale; |
| w.beginPath(); |
| w.strokeStyle = this._color(y.color, this.m_alpha); |
| w.fillStyle = this._color(y.color, this.m_fillAlpha); |
| w.moveTo(G[0].x * A, G[0].y * A); |
| for (y = 1; y < K; y++) w.lineTo(G[y].x * A, G[y].y * A); |
| w.lineTo(G[0].x * A, G[0].y * A); |
| w.closePath(); |
| w.fill(); |
| w.stroke() |
| } |
| }; |
| F.prototype.DrawCircle = function (G, K, y) { |
| if (K) { |
| var w = this.m_ctx, |
| A = this.m_drawScale; |
| w.beginPath(); |
| w.strokeStyle = this._color(y.color, this.m_alpha); |
| w.arc(G.x * A, G.y * A, K * A, 0, Math.PI * 2, true); |
| w.closePath(); |
| w.stroke() |
| } |
| }; |
| F.prototype.DrawSolidCircle = function (G, K, y, w) { |
| if (K) { |
| var A = this.m_ctx, |
| U = this.m_drawScale, |
| p = G.x * U, |
| B = G.y * U; |
| A.moveTo(0, 0); |
| A.beginPath(); |
| A.strokeStyle = this._color(w.color, this.m_alpha); |
| A.fillStyle = this._color(w.color, this.m_fillAlpha); |
| A.arc(p, B, K * U, 0, Math.PI * 2, true); |
| A.moveTo(p, B); |
| A.lineTo((G.x + y.x * K) * U, (G.y + y.y * K) * U); |
| A.closePath(); |
| A.fill(); |
| A.stroke() |
| } |
| }; |
| F.prototype.DrawSegment = function (G, K, y) { |
| var w = this.m_ctx, |
| A = this.m_drawScale; |
| w.strokeStyle = this._color(y.color, this.m_alpha); |
| w.beginPath(); |
| w.moveTo(G.x * A, G.y * A); |
| w.lineTo(K.x * A, K.y * A); |
| w.closePath(); |
| w.stroke() |
| }; |
| F.prototype.DrawTransform = function (G) { |
| var K = this.m_ctx, |
| y = this.m_drawScale; |
| K.beginPath(); |
| K.strokeStyle = this._color(16711680, this.m_alpha); |
| K.moveTo(G.position.x * y, G.position.y * y); |
| K.lineTo((G.position.x + this.m_xformScale * G.R.col1.x) * y, (G.position.y + this.m_xformScale * G.R.col1.y) * y); |
| K.strokeStyle = this._color(65280, this.m_alpha); |
| K.moveTo(G.position.x * y, G.position.y * y); |
| K.lineTo((G.position.x + this.m_xformScale * G.R.col2.x) * y, (G.position.y + this.m_xformScale * G.R.col2.y) * y); |
| K.closePath(); |
| K.stroke() |
| } |
| })(); |
| var i; |
| for (i = 0; i < Box2D.postDefs.length; ++i) Box2D.postDefs[i](); |
| delete Box2D.postDefs; |
| |
| // Copyright 2013 the V8 project authors. All rights reserved. |
| |
| // This program is free software; you can redistribute it and/or modify |
| // it under the terms of the GNU General Public License as published by |
| // the Free Software Foundation; either version 2 of the License, or |
| // (at your option) any later version. |
| // |
| // This program is distributed in the hope that it will be useful, |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| // GNU General Public License for more details. |
| // |
| // You should have received a copy of the GNU General Public License |
| // along with this program; if not, write to the Free Software |
| // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| |
| function MakeNewWorld () { |
| var Vec2 = Box2D.Common.Math.b2Vec2, |
| BodyDef = Box2D.Dynamics.b2BodyDef, |
| Body = Box2D.Dynamics.b2Body, |
| FixtureDef = Box2D.Dynamics.b2FixtureDef, |
| Fixture = Box2D.Dynamics.b2Fixture, |
| World = Box2D.Dynamics.b2World, |
| MassData = Box2D.Collision.Shapes.b2MassData, |
| PolygonShape = Box2D.Collision.Shapes.b2PolygonShape, |
| CircleShape = Box2D.Collision.Shapes.b2CircleShape; |
| |
| var gravity = new Vec2(0, -10); |
| var world = new World(gravity, true); |
| |
| var shape = new PolygonShape(); |
| shape.SetAsEdge(new Vec2(-40.0, 0), new Vec2(40.0, 0)); |
| |
| var fd = new FixtureDef(); |
| fd.density = 0.0; |
| fd.shape = shape; |
| var bd = new BodyDef(); |
| var ground = world.CreateBody(bd); |
| ground.CreateFixture(fd); |
| |
| var a = .5; |
| var shape = new PolygonShape(); |
| shape.SetAsBox(a, a); |
| |
| var x = new Vec2(-7.0, 0.75); |
| var y = new Vec2(); |
| var deltaX = new Vec2(0.5625, 1); |
| var deltaY = new Vec2(1.125, 0.0); |
| |
| for (var i = 0; i < 10; ++i) { |
| y.Set(x.x, x.y); |
| |
| for (var j = 0; j < 5; ++j) { |
| var fd = new FixtureDef(); |
| fd.density = 5.0; |
| fd.shape = shape; |
| |
| var bd = new BodyDef(); |
| bd.type = Body.b2_dynamicBody; |
| bd.position.Set(y.x, y.y); |
| var body = world.CreateBody(bd); |
| body.CreateFixture(fd); |
| y.Add(deltaY); |
| } |
| |
| x.Add(deltaX); |
| } |
| |
| return world; |
| } |
| |
| var world = null; |
| |
| var Box2DBenchmark = new BenchmarkSuite('Box2D', [5432788], |
| [new Benchmark('Box2D', |
| false, |
| false, |
| 60, |
| runBox2D, |
| setupBox2D, |
| tearDownBox2D, |
| null, |
| 8)]); |
| |
| function runBox2D() { |
| var world = MakeNewWorld(); |
| for (var i = 0; i < 20; i++) { |
| world.Step(1 / 60, 10, 3); |
| } |
| } |
| |
| function setupBox2D() { |
| } |
| |
| function tearDownBox2D() { |
| world = null; |
| Box2D = null; |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // Runner |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| var success = true; |
| |
| function NotifyStart(name) { |
| } |
| |
| function NotifyError(name, error) { |
| WScript.Echo(name + " : ERROR : " +error.stack); |
| success = false; |
| } |
| |
| function NotifyResult(name, score) { |
| if (success) { |
| WScript.Echo("### SCORE:", score); |
| } |
| } |
| |
| function NotifyScore(score) { |
| } |
| |
| BenchmarkSuite.RunSuites({ |
| NotifyStart : NotifyStart, |
| NotifyError : NotifyError, |
| NotifyResult : NotifyResult, |
| NotifyScore : NotifyScore |
| }); |
| |