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) {
  if (_frequencyHz > 0.0) {
    return true;
  }
  final qA = Rot();
  final qB = Rot();
  final rA = Vector2.zero();
  final rB = Vector2.zero();
  final u = Vector2.zero();

  final cA = data.positions[_indexA].c;
  var aA = data.positions[_indexA].a;
  final cB = data.positions[_indexB].c;
  var aB = data.positions[_indexB].a;

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

  u
    ..setFrom(localAnchorA)
    ..sub(_localCenterA);
  rA.setFrom(Rot.mulVec2(qA, u));
  u
    ..setFrom(localAnchorB)
    ..sub(_localCenterB);
  rB.setFrom(Rot.mulVec2(qB, u));
  u
    ..setFrom(cB)
    ..add(rB)
    ..sub(cA)
    ..sub(rA);

  final length = u.normalize();
  final C = (length - _length)
      .clamp(-settings.maxLinearCorrection, 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 C.abs() < settings.linearSlop;
}