init method

void init(
  1. ContactSolverDef def
)

Implementation

void init(ContactSolverDef def) {
  _step = def.step;
  _positions = def.positions;
  _velocities = def.velocities;
  _contacts = def.contacts;

  for (final contact in _contacts) {
    final fixtureA = contact.fixtureA;
    final fixtureB = contact.fixtureB;
    final shapeA = fixtureA.shape;
    final shapeB = fixtureB.shape;
    final radiusA = shapeA.radius;
    final radiusB = shapeB.radius;
    final bodyA = fixtureA.body;
    final bodyB = fixtureB.body;
    final manifold = contact.manifold;

    final pointCount = manifold.pointCount;
    assert(pointCount > 0);

    final velocityConstraint = contact.velocityConstraint
      ..friction = contact.friction
      ..restitution = contact.restitution
      ..tangentSpeed = contact.tangentSpeed
      ..indexA = bodyA.islandIndex
      ..indexB = bodyB.islandIndex
      ..invMassA = bodyA.inverseMass
      ..invMassB = bodyB.inverseMass
      ..invIA = bodyA.inverseInertia
      ..invIB = bodyB.inverseInertia
      ..contactIndex = _contacts.indexOf(contact)
      ..pointCount = pointCount
      ..K.setZero()
      ..normalMass.setZero();

    final positionConstraint = contact.positionConstraint
      ..indexA = bodyA.islandIndex
      ..indexB = bodyB.islandIndex
      ..invMassA = bodyA.inverseMass
      ..invMassB = bodyB.inverseMass
      ..localCenterA.setFrom(bodyA.sweep.localCenter)
      ..localCenterB.setFrom(bodyB.sweep.localCenter)
      ..invIA = bodyA.inverseInertia
      ..invIB = bodyB.inverseInertia
      ..localNormal.setFrom(manifold.localNormal)
      ..localPoint.setFrom(manifold.localPoint)
      ..pointCount = pointCount
      ..radiusA = radiusA
      ..radiusB = radiusB
      ..type = manifold.type;

    for (var j = 0; j < pointCount; j++) {
      final cp = manifold.points[j];
      final vcp = velocityConstraint.points[j];

      if (_step.warmStarting) {
        vcp.normalImpulse = _step.dtRatio * cp.normalImpulse;
        vcp.tangentImpulse = _step.dtRatio * cp.tangentImpulse;
      } else {
        vcp.normalImpulse = 0.0;
        vcp.tangentImpulse = 0.0;
      }

      vcp.rA.setZero();
      vcp.rB.setZero();
      vcp.normalMass = 0.0;
      vcp.tangentMass = 0.0;
      vcp.velocityBias = 0.0;
      positionConstraint.localPoints[j].x = cp.localPoint.x;
      positionConstraint.localPoints[j].y = cp.localPoint.y;
    }
  }
}