@@ -12,7 +12,6 @@ module.exports = Detector;
1212
1313var SAT = require ( './SAT' ) ;
1414var 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