solvePowder method

void solvePowder(
  1. TimeStep step
)

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