mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-02-06 23:34:53 +08:00
[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:
parent
8ffde33fa9
commit
efb015ef4e
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user