joinParticleGroups method
Implementation
void joinParticleGroups(ParticleGroup groupA, ParticleGroup groupB) {
var particleFlags = 0;
final joinedParticles = groupA.particles + groupB.particles;
for (final particle in joinedParticles) {
particleFlags |= particle.flags;
}
updateContacts();
if ((particleFlags & pairFlags) != 0) {
for (final contact in contactBuffer) {
final particleA = contact.particleA;
final particleB = contact.particleB;
if (groupA.particles.contains(particleA) &&
groupB.particles.contains(particleB)) {
final pair = PsPair(particleA, particleB)
..flags = contact.flags
..strength = min(groupA.strength, groupB.strength)
..distance = particleA.position.distanceTo(particleB.position);
pairBuffer.add(pair);
}
}
}
if ((particleFlags & triadFlags) != 0) {
final diagram = VoronoiDiagram();
for (final particle in joinedParticles) {
if ((particle.flags & ParticleType.zombieParticle) == 0) {
diagram.addGenerator(particle.position, particle);
}
}
diagram.generate(particleStride / 2);
final callback = JoinParticleGroupsCallback(this, groupA, groupB);
diagram.nodes(callback);
}
for (final particle in groupB.particles) {
groupA.add(particle);
particle.group = groupA;
}
final groupFlags = groupA.groupFlags | groupB.groupFlags;
groupA.groupFlags = groupFlags;
// Remove group b, since all its particles are in group a now
world.particleDestroyListener?.onDestroyParticleGroup(groupB);
groupBuffer.remove(groupB);
if ((groupFlags & ParticleGroupType.solidParticleGroup) != 0) {
computeDepthForGroup(groupA);
}
}