solvePositionConstraints method

  1. @override
bool solvePositionConstraints(
  1. SolverData data
)
override

This returns true if the position errors are within tolerance. Internal.

Implementation

@override
bool solvePositionConstraints(SolverData data) {
  final cA = data.positions[_indexA].c;
  var aA = data.positions[_indexA].a;
  final cB = data.positions[_indexB].c;
  var aB = data.positions[_indexB].a;

  final qA = Rot();
  final qB = Rot();
  final u = Vector2.zero();
  final rA = Vector2.zero();
  final rB = Vector2.zero();
  final temp = Vector2.zero();

  qA.setAngle(aA);
  qB.setAngle(aB);

  // Compute the effective masses.
  temp
    ..setFrom(localAnchorA)
    ..sub(_localCenterA);
  rA.setFrom(Rot.mulVec2(qA, temp));
  temp
    ..setFrom(localAnchorB)
    ..sub(_localCenterB);
  rB.setFrom(Rot.mulVec2(qB, temp));

  u
    ..setFrom(cB)
    ..add(rB)
    ..sub(cA)
    ..sub(rA);

  final length = u.normalize();
  var c = length - maxLength;

  c = c.clamp(0.0, settings.maxLinearCorrection);

  final impulse = -_mass * c;
  final pX = impulse * u.x;
  final pY = impulse * u.y;

  cA.x -= _invMassA * pX;
  cA.y -= _invMassA * pY;
  aA -= _invIA * (rA.x * pY - rA.y * pX);
  cB.x += _invMassB * pX;
  cB.y += _invMassB * pY;
  aB += _invIB * (rB.x * pY - rB.y * pX);

  data.positions[_indexA].a = aA;
  data.positions[_indexB].a = aB;

  return length - maxLength < settings.linearSlop;
}