updateContacts method
void
updateContacts(
{ - 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;
}
}
}
}