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