solve method

void solve(
  1. TimeStep step
)

Implementation

void solve(TimeStep step) {
  ++timestamp;
  if (_particles.isEmpty) {
    return;
  }
  allParticleFlags = 0;
  for (final particle in _particles) {
    allParticleFlags |= particle.flags;
  }
  if ((allParticleFlags & ParticleType.zombieParticle) != 0) {
    solveZombie();
  }
  if (_particles.isEmpty) {
    return;
  }
  allGroupFlags = 0;
  for (final group in groupBuffer) {
    allGroupFlags |= group.groupFlags;
  }
  final gravityX = step.dt * gravityScale * world.gravity.x;
  final gravityY = step.dt * gravityScale * world.gravity.y;
  final criticalVelocitySquared = getCriticalVelocitySquared(step);
  for (final particle in _particles) {
    final v = particle.velocity;
    v.x += gravityX;
    v.y += gravityY;
    final v2 = v.x * v.x + v.y * v.y;
    if (v2 > criticalVelocitySquared) {
      final a =
          v2 == 0 ? double.maxFinite : sqrt(criticalVelocitySquared / v2);
      v.x *= a;
      v.y *= a;
    }
  }
  solveCollision(step);
  if ((allGroupFlags & ParticleGroupType.rigidParticleGroup) != 0) {
    solveRigid(step);
  }
  if ((allParticleFlags & ParticleType.wallParticle) != 0) {
    solveWall(step);
  }
  for (final particle in _particles) {
    particle.position.setFrom(
      particle.position + (particle.velocity * step.dt),
    );
  }
  updateBodyContacts();
  updateContacts(excludeZombies: false);
  if ((allParticleFlags & ParticleType.viscousParticle) != 0) {
    solveViscous(step);
  }
  if ((allParticleFlags & ParticleType.powderParticle) != 0) {
    solvePowder(step);
  }
  if ((allParticleFlags & ParticleType.tensileParticle) != 0) {
    solveTensile(step);
  }
  if ((allParticleFlags & ParticleType.elasticParticle) != 0) {
    solveElastic(step);
  }
  if ((allParticleFlags & ParticleType.springParticle) != 0) {
    solveSpring(step);
  }
  if ((allGroupFlags & ParticleGroupType.solidParticleGroup) != 0) {
    solveSolid(step);
  }
  if ((allParticleFlags & ParticleType.colorMixingParticle) != 0) {
    solveColorMixing(step);
  }
  solvePressure(step);
  solveDamping(step);
}