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:
commit
d3d72b11c8
5 changed files with 48 additions and 10 deletions
|
@ -44,6 +44,7 @@ var Projections = require('../geometry/Projections');
|
|||
type: 'body',
|
||||
label: 'Body',
|
||||
pairs: [],
|
||||
region: null,
|
||||
parts: [],
|
||||
plugin: {},
|
||||
angle: 0,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -34,6 +34,7 @@ var Common = require('../core/Common');
|
|||
|
||||
var defaults = {
|
||||
label: 'World',
|
||||
grid: null,
|
||||
gravity: {
|
||||
x: 0,
|
||||
y: 1,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue