0
0
Fork 0
mirror of https://github.com/liabru/matter-js.git synced 2025-03-14 00:38:41 -04:00

Merge branch 'optim-pair-object' into optim-sat-collides-3

This commit is contained in:
Brice Chevalier 2018-01-30 11:45:26 +09:00
commit d3d72b11c8
5 changed files with 48 additions and 10 deletions

View file

@ -44,6 +44,7 @@ var Projections = require('../geometry/Projections');
type: 'body',
label: 'Body',
pairs: [],
region: null,
parts: [],
plugin: {},
angle: 0,

View file

@ -16,6 +16,7 @@ module.exports = Composite;
var Events = require('../core/Events');
var Common = require('../core/Common');
var Body = require('./Body');
var Grid = require('../collision/Grid');
(function() {
@ -206,6 +207,7 @@ var Body = require('./Body');
composite.bodies.push(body);
Composite.setModified(composite, true, true, false);
Composite.addBodies(composite, [body]);
return composite;
};
@ -248,6 +250,10 @@ var Body = require('./Body');
return bodyA.id - bodyB.id;
});
if (composite.grid) {
Grid.addBodies(composite.grid, bodies, composite);
}
if (composite.parent && composite.parent.type === 'composite') {
composite.parent.addBodies(composite.parent, bodies);
}
@ -268,6 +274,10 @@ var Body = require('./Body');
allBodies.splice(position, 1);
}
if (composite.grid) {
Grid.removeBodies(composite.grid, bodies);
}
if (composite.parent && composite.parent.type === 'composite') {
composite.parent.removeBodies(composite.parent, bodies);
}

View file

@ -34,6 +34,7 @@ var Common = require('../core/Common');
var defaults = {
label: 'World',
grid: null,
gravity: {
x: 0,
y: 1,

View file

@ -8,7 +8,6 @@ var Grid = {};
module.exports = Grid;
var Detector = require('./Detector');
var Projections = require('../geometry/Projections');
var Common = require('../core/Common');
@ -23,7 +22,6 @@ var Common = require('../core/Common');
Grid.create = function(options) {
var defaults = {
controller: Grid,
detector: Detector.collisions,
buckets: [],
bucketWidth: 48,
bucketHeight: 48
@ -142,12 +140,39 @@ var Common = require('../core/Common');
}
};
Grid.reset = function(grid, bodies, engine) {
Grid.clear = function(grid, bodies) {
grid.buckets = [];
for (var i = 0; i < bodies.length; i++) {
bodies.pairs.length = 0;
}
};
Grid.removeBodies = function (grid, bodies) {
var i, col, row,
buckets = grid.buckets;
for (i = 0; i < bodies.length; i++) {
var body = bodies[i],
region = body.region,
startCol = region.startCol,
endCol = region.endCol,
startRow = region.startRow,
endRow = region.endRow;
for (col = startCol; col <= endCol; col++) {
for (row = startRow; row <= endRow; row++) {
Grid._bucketRemoveBody(grid, body, buckets[col][row]);
}
}
body.region = null;
body.pairs.length = 0;
}
};
Grid.addBodies = function(grid, bodies, world) {
var i, col, row,
buckets = grid.buckets,
world = engine.world,
worldMinX = world.bounds.min.x,
worldMaxX = world.bounds.max.x,
worldMinY = world.bounds.min.y,
@ -159,7 +184,6 @@ var Common = require('../core/Common');
for (i = 0; i < bodies.length; i++) {
var body = bodies[i];
// don't update out of world bodies
var bounds = body.bounds;
if (worldBounded && (bounds.max.x < worldMinX || bounds.min.x > worldMaxX

View file

@ -19,6 +19,7 @@ var Render = require('../render/Render');
var Pairs = require('../collision/Pairs');
var Metrics = require('./Metrics');
var Grid = require('../collision/Grid');
var Detector = require('../collision/Detector');
var Events = require('./Events');
var Composite = require('../body/Composite');
var Constraint = require('../constraint/Constraint');
@ -88,6 +89,8 @@ var Body = require('../body/Body');
engine.broadphase = engine.broadphase.controller.create(engine.broadphase);
engine.metrics = engine.metrics || { extended: false };
engine.world.grid = engine.broadphase;
// @if DEBUG
engine.metrics = Metrics.create(engine.metrics);
// @endif
@ -159,8 +162,8 @@ var Body = require('../body/Body');
// broadphase pass: find potential collision pairs
if (broadphase.controller) {
// if world is dirty, we must flush the whole grid
if (world.isModified)
broadphase.controller.reset(broadphase, allBodies, engine);
// if (world.isModified)
// broadphase.controller.reset(broadphase, allBodies, engine);
// update the grid buckets based on current bodies
broadphase.controller.update(broadphase, allBodies, engine);
@ -173,7 +176,7 @@ var Body = require('../body/Body');
// narrowphase pass: find actual collisions, then create or update collision pairs
// var timestamp = timing.timestamp;
broadphase.detector(allBodies, engine);
Detector.collisions(allBodies, engine);
// update collision pairs
var pairs = engine.pairs;
@ -263,8 +266,7 @@ var Body = require('../body/Body');
var broadphase = engine.broadphase;
if (broadphase.controller) {
var bodies = Composite.allBodies(world);
broadphase.controller.reset(broadphase, bodies, engine);
broadphase.controller.update(broadphase, bodies, engine);
broadphase.controller.clear(broadphase, bodies);
}
};