diff --git a/lib/src/collision/broadphase/default_broadphase_buffer.dart b/lib/src/collision/broadphase/default_broadphase_buffer.dart index 93fba17..957289c 100644 --- a/lib/src/collision/broadphase/default_broadphase_buffer.dart +++ b/lib/src/collision/broadphase/default_broadphase_buffer.dart @@ -5,6 +5,7 @@ part of box2d; /// client to consume the new pairs and to track subsequent overlap. class DefaultBroadPhaseBuffer implements TreeCallback, BroadPhase { final BroadPhaseStrategy _tree; + final int _mask32Bits = 4294967295; // 2^32-1 int _proxyCount = 0; @@ -12,16 +13,16 @@ class DefaultBroadPhaseBuffer implements TreeCallback, BroadPhase { int _moveCapacity = 16; int _moveCount = 0; - List _pairBuffer; + List _pairBuffer; int _pairCapacity = 16; int _pairCount = 0; int _queryProxyId = BroadPhase.NULL_PROXY; DefaultBroadPhaseBuffer(BroadPhaseStrategy strategy) : _tree = strategy { - _pairBuffer = List(_pairCapacity); + _pairBuffer = List(_pairCapacity); for (int i = 0; i < _pairCapacity; i++) { - _pairBuffer[i] = Pair(); + _pairBuffer[i] = 0; } _moveBuffer = BufferUtils.intList(_moveCapacity); } @@ -110,18 +111,17 @@ class DefaultBroadPhaseBuffer implements TreeCallback, BroadPhase { // Send the pairs back to the client. int i = 0; while (i < _pairCount) { - Pair primaryPair = _pairBuffer[i]; - Object userDataA = _tree.getUserData(primaryPair.proxyIdA); - Object userDataB = _tree.getUserData(primaryPair.proxyIdB); + int primaryPair = _pairBuffer[i]; + Object userDataA = _tree.getUserData(primaryPair >> 32); + Object userDataB = _tree.getUserData(primaryPair & _mask32Bits); callback.addPair(userDataA, userDataB); ++i; // Skip any duplicate pairs. while (i < _pairCount) { - Pair pair = _pairBuffer[i]; - if (pair.proxyIdA != primaryPair.proxyIdA || - pair.proxyIdB != primaryPair.proxyIdB) { + int pair = _pairBuffer[i]; + if (pair != primaryPair) { break; } ++i; @@ -178,21 +178,19 @@ class DefaultBroadPhaseBuffer implements TreeCallback, BroadPhase { // Grow the pair buffer as needed. if (_pairCount == _pairCapacity) { - List oldBuffer = _pairBuffer; + List oldBuffer = _pairBuffer; _pairCapacity *= 2; - _pairBuffer = List(_pairCapacity); + _pairBuffer = List(_pairCapacity); BufferUtils.arrayCopy(oldBuffer, 0, _pairBuffer, 0, oldBuffer.length); for (int i = oldBuffer.length; i < _pairCapacity; i++) { - _pairBuffer[i] = Pair(); + _pairBuffer[i] = 0; } } if (proxyId < _queryProxyId) { - _pairBuffer[_pairCount].proxyIdA = proxyId; - _pairBuffer[_pairCount].proxyIdB = _queryProxyId; + _pairBuffer[_pairCount] = (proxyId << 32) | _queryProxyId; } else { - _pairBuffer[_pairCount].proxyIdA = _queryProxyId; - _pairBuffer[_pairCount].proxyIdB = proxyId; + _pairBuffer[_pairCount] = (_queryProxyId << 32) | proxyId; } ++_pairCount;