updateContacts method

void updateContacts({
  1. bool excludeZombies = true,
})

Implementation

void updateContacts({bool excludeZombies = true}) {
  for (final proxy in proxyBuffer) {
    final pos = proxy.particle.position;
    proxy.tag = computeTag(inverseDiameter * pos.x, inverseDiameter * pos.y);
  }
  proxyBuffer.sort();
  contactBuffer.clear();
  var cIndex = 0;
  for (var i = 0; i < proxyBuffer.length; i++) {
    final proxyA = proxyBuffer[i];
    final rightTag = computeRelativeTag(proxyA.tag, 1, 0);
    for (var j = i + 1; j < proxyBuffer.length; j++) {
      final proxyB = proxyBuffer[j];
      if (rightTag < proxyB.tag) {
        break;
      }
      addContact(proxyA.particle, proxyB.particle);
    }
    final bottomLeftTag = computeRelativeTag(proxyA.tag, -1, 1);
    for (; cIndex < proxyBuffer.length; cIndex++) {
      final c = proxyBuffer[cIndex];
      if (bottomLeftTag <= c.tag) {
        break;
      }
    }
    final bottomRightTag = computeRelativeTag(proxyA.tag, 1, 1);

    for (var bIndex = cIndex; bIndex < proxyBuffer.length; bIndex++) {
      final proxyB = proxyBuffer[bIndex];
      if (bottomRightTag < proxyB.tag) {
        break;
      }
      addContact(proxyA.particle, proxyB.particle);
    }
  }
  if (excludeZombies) {
    var j = contactBuffer.length;
    for (var i = 0; i < j; i++) {
      if ((contactBuffer[i].flags & ParticleType.zombieParticle) != 0) {
        --j;
        final temp = contactBuffer[j];
        contactBuffer[j] = contactBuffer[i];
        contactBuffer[i] = temp;
        --i;
      }
    }
  }
}