updateWorldTransformWith method

void updateWorldTransformWith(
  1. double x,
  2. double y,
  3. double rotation,
  4. double scaleX,
  5. double scaleY,
  6. double shearX,
  7. double shearY,
)

Implementation

void updateWorldTransformWith(double x, double y, double rotation,
    double scaleX, double scaleY, double shearX, double shearY) {
  ax = x;
  ay = y;
  arotation = rotation;
  ascaleX = scaleX;
  ascaleY = scaleY;
  ashearX = shearX;
  ashearY = shearY;
  appliedValid = true;

  if (parent == null) {
    // Root bone.
    final double rotationY = rotation + 90 + shearY;
    double la = MathUtils.cosDeg(rotation + shearX) * scaleX;
    double lb = MathUtils.cosDeg(rotationY) * scaleY;
    double lc = MathUtils.sinDeg(rotation + shearX) * scaleX;
    double ld = MathUtils.sinDeg(rotationY) * scaleY;
    final Skeleton skeleton = this.skeleton;
    if (skeleton.flipX) {
      x = -x;
      la = -la;
      lb = -lb;
    }
    if (skeleton.flipY) {
      y = -y;
      lc = -lc;
      ld = -ld;
    }
    a = la;
    b = lb;
    c = lc;
    d = ld;
    worldX = x + skeleton.x;
    worldY = y + skeleton.y;
    return;
  }

  double pa = parent!.a, pb = parent!.b, pc = parent!.c, pd = parent!.d;
  worldX = pa * x + pb * y + parent!.worldX;
  worldY = pc * x + pd * y + parent!.worldY;

  switch (data.transformMode) {
    case TransformMode.normal:
      {
        final double rotationY = rotation + 90 + shearY;
        final double la = MathUtils.cosDeg(rotation + shearX) * scaleX;
        final double lb = MathUtils.cosDeg(rotationY) * scaleY;
        final double lc = MathUtils.sinDeg(rotation + shearX) * scaleX;
        final double ld = MathUtils.sinDeg(rotationY) * scaleY;
        a = pa * la + pb * lc;
        b = pa * lb + pb * ld;
        c = pc * la + pd * lc;
        d = pc * lb + pd * ld;
        return;
      }
    case TransformMode.onlyTranslation:
      {
        final double rotationY = rotation + 90 + shearY;
        a = MathUtils.cosDeg(rotation + shearX) * scaleX;
        b = MathUtils.cosDeg(rotationY) * scaleY;
        c = MathUtils.sinDeg(rotation + shearX) * scaleX;
        d = MathUtils.sinDeg(rotationY) * scaleY;
        break;
      }
    case TransformMode.noRotationOrReflection:
      {
        double s = pa * pa + pc * pc;
        double prx = 0.0;
        if (s > 0.0001) {
          s = (pa * pd - pb * pc).abs() / s;
          pb = pc * s;
          pd = pa * s;
          prx = math.atan2(pc, pa) * MathUtils.radDeg;
        } else {
          pa = 0.0;
          pc = 0.0;
          prx = 90 - math.atan2(pd, pb) * MathUtils.radDeg;
        }
        final double rx = rotation + shearX - prx;
        final double ry = rotation + shearY - prx + 90;
        final double la = MathUtils.cosDeg(rx) * scaleX;
        final double lb = MathUtils.cosDeg(ry) * scaleY;
        final double lc = MathUtils.sinDeg(rx) * scaleX;
        final double ld = MathUtils.sinDeg(ry) * scaleY;
        a = pa * la - pb * lc;
        b = pa * lb - pb * ld;
        c = pc * la + pd * lc;
        d = pc * lb + pd * ld;
        break;
      }
    case TransformMode.noScale:
    case TransformMode.noScaleOrReflection:
      {
        final double cosDeg = MathUtils.cosDeg(rotation);
        final double sinDeg = MathUtils.sinDeg(rotation);
        double za = pa * cosDeg + pb * sinDeg;
        double zc = pc * cosDeg + pd * sinDeg;
        double s = math.sqrt(za * za + zc * zc);
        if (s > 0.00001) s = 1 / s;
        za *= s;
        zc *= s;
        s = math.sqrt(za * za + zc * zc);
        final double r = math.pi / 2 + math.atan2(zc, za);
        double zb = math.cos(r) * s;
        double zd = math.sin(r) * s;
        final double la = MathUtils.cosDeg(shearX) * scaleX;
        final double lb = MathUtils.cosDeg(90 + shearY) * scaleY;
        final double lc = MathUtils.sinDeg(shearX) * scaleX;
        final double ld = MathUtils.sinDeg(90 + shearY) * scaleY;
        if (data.transformMode != TransformMode.noScaleOrReflection
            ? pa * pd - pb * pc < 0
            : skeleton.flipX != skeleton.flipY) {
          zb = -zb;
          zd = -zd;
        }
        a = za * la + zb * lc;
        b = za * lb + zb * ld;
        c = zc * la + zd * lc;
        d = zc * lb + zd * ld;
        return;
      }
  }

  if (skeleton.flipX) {
    a = -a;
    b = -b;
  }

  if (skeleton.flipY) {
    c = -c;
    d = -d;
  }
}