Skip to content

Commit caeb07e

Browse files
committed
optimised Detector.collisions
1 parent b3a8aa3 commit caeb07e

File tree

1 file changed

+39
-19
lines changed

1 file changed

+39
-19
lines changed

src/collision/Detector.js

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ module.exports = Detector;
1212

1313
var SAT = require('./SAT');
1414
var Pair = require('./Pair');
15-
var Bounds = require('../geometry/Bounds');
1615

1716
(function() {
1817

@@ -28,40 +27,61 @@ var Bounds = require('../geometry/Bounds');
2827
pairsTable = engine.pairs.table,
2928
broadphasePairsLength = broadphasePairs.length,
3029
canCollide = Detector.canCollide,
31-
overlaps = Bounds.overlaps,
3230
collides = SAT.collides,
3331
pairId = Pair.id,
3432
i;
3533

3634
for (i = 0; i < broadphasePairsLength; i++) {
37-
var bodyA = broadphasePairs[i][0],
38-
bodyB = broadphasePairs[i][1];
35+
var broadphasePair = broadphasePairs[i],
36+
bodyA = broadphasePair[0],
37+
bodyB = broadphasePair[1];
3938

4039
if ((bodyA.isStatic || bodyA.isSleeping) && (bodyB.isStatic || bodyB.isSleeping))
4140
continue;
4241

4342
if (!canCollide(bodyA.collisionFilter, bodyB.collisionFilter))
4443
continue;
4544

46-
// mid phase
47-
if (overlaps(bodyA.bounds, bodyB.bounds)) {
48-
var partsALength = bodyA.parts.length,
49-
partsBLength = bodyB.parts.length;
45+
var boundsA = bodyA.bounds,
46+
boundsB = bodyB.bounds;
47+
48+
if (boundsA.min.x > boundsB.max.x || boundsA.max.x < boundsB.min.x
49+
|| boundsA.max.y < boundsB.min.y || boundsA.min.y > boundsB.max.y) {
50+
continue;
51+
}
52+
53+
var partsALength = bodyA.parts.length,
54+
partsBLength = bodyB.parts.length;
55+
56+
if (partsALength === 1 && partsBLength === 1) {
57+
var pair = pairsTable[pairId(bodyA, bodyB)];
58+
var collision = collides(bodyA, bodyB, pair && pair.collision, pair && pair.isActive);
59+
60+
if (collision.collided) {
61+
collisions.push(collision);
62+
}
63+
} else {
64+
var partsAStart = partsALength > 1 ? 1 : 0,
65+
partsBStart = partsBLength > 1 ? 1 : 0;
5066

51-
for (var j = partsALength > 1 ? 1 : 0; j < partsALength; j++) {
52-
var partA = bodyA.parts[j];
67+
for (var j = partsAStart; j < partsALength; j++) {
68+
var partA = bodyA.parts[j],
69+
boundsA = partA.bounds;
5370

54-
for (var k = partsBLength > 1 ? 1 : 0; k < partsBLength; k++) {
55-
var partB = bodyB.parts[k];
71+
for (var k = partsBStart; k < partsBLength; k++) {
72+
var partB = bodyB.parts[k],
73+
boundsB = partB.bounds;
74+
75+
if (boundsA.min.x > boundsB.max.x || boundsA.max.x < boundsB.min.x
76+
|| boundsA.max.y < boundsB.min.y || boundsA.min.y > boundsB.max.y) {
77+
continue;
78+
}
5679

57-
if ((partA === bodyA && partB === bodyB) || overlaps(partA.bounds, partB.bounds)) {
58-
// narrow phase
59-
var pair = pairsTable[pairId(partA, partB)];
60-
var collision = collides(partA, partB, pair && pair.collision, pair && pair.isActive);
80+
var pair = pairsTable[pairId(partA, partB)];
81+
var collision = collides(partA, partB, pair && pair.collision, pair && pair.isActive);
6182

62-
if (collision.collided) {
63-
collisions.push(collision);
64-
}
83+
if (collision.collided) {
84+
collisions.push(collision);
6585
}
6686
}
6787
}

0 commit comments

Comments
 (0)