updateWorldTransformWith method
void
updateWorldTransformWith()
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;
}
}