diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Bone.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Bone.java index 9cc61ac80..16def0359 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Bone.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Bone.java @@ -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;