solvePowder method
Implementation
void solvePowder(TimeStep step) {
final powderStrength = this.powderStrength * getCriticalVelocity(step);
final minWeight = 1.0 - settings.particleStride;
for (final contact in bodyContactBuffer) {
final particle = contact.particle;
if ((particle.flags & ParticleType.powderParticle) != 0) {
final w = contact.weight;
if (w > minWeight) {
final b = contact.body;
final m = contact.mass;
final p = particle.position;
final n = contact.normal;
final f = _tempVec;
final va = particle.velocity;
final inter = powderStrength * m * (w - minWeight);
final pInvMass = particleInverseMass;
f.x = inter * n.x;
f.y = inter * n.y;
va.x -= pInvMass * f.x;
va.y -= pInvMass * f.y;
b.applyLinearImpulse(f, point: p);
}
}
}
for (final contact in contactBuffer) {
if ((contact.flags & ParticleType.powderParticle) != 0) {
final w = contact.weight;
if (w > minWeight) {
final particleA = contact.particleA;
final particleB = contact.particleB;
final n = contact.normal;
final va = particleA.velocity;
final vb = particleB.velocity;
final inter = powderStrength * (w - minWeight);
final fx = inter * n.x;
final fy = inter * n.y;
va.x -= fx;
va.y -= fy;
vb.x += fx;
vb.y += fy;
}
}
}
}