[libgdx] Fixed updateAppliedTransform when transformMode != normal.

Test with:
http://n4te.com/x/5349-disable-inherit-test.spine
Change bone B to not inherit various transform properties, observe behavior in animation.
This commit is contained in:
Nathan Sweet 2022-09-10 12:08:22 -04:00
parent 8ffde33fa9
commit efb015ef4e

View File

@ -172,7 +172,7 @@ public class Bone implements Updatable {
break;
}
case noScale:
case noScaleOrReflection: {
case noScaleOrReflection:
float cos = cosDeg(rotation), sin = sinDeg(rotation);
float za = (pa * cos + pb * sin) / skeleton.scaleX;
float zc = (pc * cos + pd * sin) / skeleton.scaleY;
@ -194,8 +194,6 @@ public class Bone implements Updatable {
b = za * lb + zb * ld;
c = zc * la + zd * lc;
d = zc * lb + zd * ld;
break;
}
}
a *= skeleton.scaleX;
b *= skeleton.scaleX;
@ -407,25 +405,65 @@ public class Bone implements Updatable {
ashearY = atan2(a * b + c * d, a * d - b * c) * radDeg;
return;
}
float pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;
float pid = 1 / (pa * pd - pb * pc);
float ia = pd * pid, ib = pb * pid, ic = pc * pid, id = pa * pid;
float dx = worldX - parent.worldX, dy = worldY - parent.worldY;
ax = (dx * pd * pid - dy * pb * pid);
ay = (dy * pa * pid - dx * pc * pid);
float ia = pid * pd;
float id = pid * pa;
float ib = pid * pb;
float ic = pid * pc;
float ra = ia * a - ib * c;
float rb = ia * b - ib * d;
float rc = id * c - ic * a;
float rd = id * d - ic * b;
ax = (dx * ia - dy * ib);
ay = (dy * id - dx * ic);
float ra, rb, rc, rd;
if (data.transformMode == TransformMode.onlyTranslation) {
ra = a;
rb = b;
rc = c;
rd = d;
} else {
switch (data.transformMode) {
case noRotationOrReflection: {
float s = Math.abs(pa * pd - pb * pc) / (pa * pa + pc * pc);
float sa = pa / skeleton.scaleX;
float sc = pc / skeleton.scaleY;
pb = -sc * s * skeleton.scaleX;
pd = sa * s * skeleton.scaleY;
pid = 1 / (pa * pd - pb * pc);
ia = pd * pid;
ib = pb * pid;
break;
}
case noScale:
case noScaleOrReflection:
float cos = cosDeg(rotation), sin = sinDeg(rotation);
pa = (pa * cos + pb * sin) / skeleton.scaleX;
pc = (pc * cos + pd * sin) / skeleton.scaleY;
float s = (float)Math.sqrt(pa * pa + pc * pc);
if (s > 0.00001f) s = 1 / s;
pa *= s;
pc *= s;
s = (float)Math.sqrt(pa * pa + pc * pc);
if (data.transformMode == TransformMode.noScale && pid < 0 != (skeleton.scaleX < 0 != skeleton.scaleY < 0)) s = -s;
float r = PI / 2 + atan2(pc, pa);
pb = cos(r) * s;
pd = sin(r) * s;
pid = 1 / (pa * pd - pb * pc);
ia = pd * pid;
ib = pb * pid;
ic = pc * pid;
id = pa * pid;
}
ra = ia * a - ib * c;
rb = ia * b - ib * d;
rc = id * c - ic * a;
rd = id * d - ic * b;
}
ashearX = 0;
ascaleX = (float)Math.sqrt(ra * ra + rc * rc);
if (ascaleX > 0.0001f) {
float det = ra * rd - rb * rc;
ascaleY = det / ascaleX;
ashearY = atan2(ra * rb + rc * rd, det) * radDeg;
ashearY = -atan2(ra * rb + rc * rd, det) * radDeg;
arotation = atan2(rc, ra) * radDeg;
} else {
ascaleX = 0;