joinParticleGroups method

void joinParticleGroups(
  1. ParticleGroup groupA,
  2. ParticleGroup groupB
)

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);
  }
}