planck-js
Version:
2D JavaScript physics engine for cross-platform HTML5 game development
112 lines (93 loc) • 3.26 kB
JavaScript
/*
* MIT License
* Copyright (c) 2019 Erin Catto
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
// This stress tests the dynamic tree broad-phase. This also shows that tile
// based collision is _not_ smooth due to Box2D not knowing about adjacency.
planck.testbed('Tiles', function(testbed) {
var pl = planck, Vec2 = pl.Vec2;
var world = pl.World(Vec2(0, -10));
var COUNT = 20;
var fixtureCount = 0;
var a = 0.5;
var ground = world.createBody(Vec2(0, -a));
if (1) {
var N = 200;
var M = 10;
var position = Vec2();
position.y = 0.0;
for (var j = 0; j < M; ++j) {
position.x = -N * a;
for (var i = 0; i < N; ++i) {
ground.createFixture(pl.Box(a, a, position, 0.0), 0.0);
++fixtureCount;
position.x += 2.0 * a;
}
position.y -= 2.0 * a;
}
} else {
var N = 200;
var M = 10;
var position = Vec2();
position.x = -N * a;
for (var i = 0; i < N; ++i) {
position.y = 0.0;
for (var j = 0; j < M; ++j) {
ground.createFixture(pl.Box(a, a, position, 0.0), 0.0);
position.y -= 2.0 * a;
}
position.x += 2.0 * a;
}
}
var a = 0.5;
var shape = pl.Box(a, a);
var x = Vec2(-7.0, 0.75);
var y = Vec2();
var deltaX = Vec2(0.5625, 1.25);
var deltaY = Vec2(1.125, 0.0);
for (var i = 0; i < COUNT; ++i) {
y.set(x);
for (var j = i; j < COUNT; ++j) {
// bd.allowSleep = !(i == 0 && j == 0)
var body = world.createDynamicBody(y);
body.createFixture(shape, 5.0);
++fixtureCount;
y.add(deltaY);
}
x.add(deltaX);
}
var createTime = Date.now();
testbed.step = function() {
var height = world.getTreeHeight();
var leafCount = world.getProxyCount();
var minimumNodeCount = 2 * leafCount - 1;
var minimumHeight = Math.ceil(Math.log(minimumNodeCount) / Math.log(2.0));
testbed.status("dynamic tree height", height);
testbed.status("min", minimumHeight);
testbed.status("create time", createTime + "ms");
testbed.status("fixture count", fixtureCount);
// var tree = world.m_broadPhase.m_tree;
// if (stepCount++ == 400) {
// tree.rebuildBottomUp();
// }
};
return world;
});