updateAppliedTransform method

void updateAppliedTransform()

Implementation

void updateAppliedTransform() {
  appliedValid = true;
  final Bone? parent = this.parent;
  if (parent == null) {
    ax = worldX;
    ay = worldY;
    arotation = math.atan2(c, a) * MathUtils.radDeg;
    ascaleX = math.sqrt(a * a + c * c);
    ascaleY = math.sqrt(b * b + d * d);
    ashearX = 0.0;
    ashearY = math.atan2(a * b + c * d, a * d - b * c) * MathUtils.radDeg;
    return;
  }
  final double pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;
  final double pid = 1 / (pa * pd - pb * pc);
  final double dx = worldX - parent.worldX, dy = worldY - parent.worldY;
  ax = (dx * pd * pid - dy * pb * pid);
  ay = (dy * pa * pid - dx * pc * pid);
  final double ia = pid * pd;
  final double id = pid * pa;
  final double ib = pid * pb;
  final double ic = pid * pc;
  final double ra = ia * a - ib * c;
  final double rb = ia * b - ib * d;
  final double rc = id * c - ic * a;
  final double rd = id * d - ic * b;
  ashearX = 0.0;
  ascaleX = math.sqrt(ra * ra + rc * rc);
  if (ascaleX > 0.0001) {
    final double det = ra * rd - rb * rc;
    ascaleY = det / ascaleX;
    ashearY = math.atan2(ra * rb + rc * rd, det) * MathUtils.radDeg;
    arotation = math.atan2(rc, ra) * MathUtils.radDeg;
  } else {
    ascaleX = 0.0;
    ascaleY = math.sqrt(rb * rb + rd * rd);
    ashearY = 0.0;
    arotation = 90 - math.atan2(rd, rb) * MathUtils.radDeg;
  }
}