From 04c132f4aff33e85ce943b521983e31f0eeb969b Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Thu, 2 May 2024 16:01:04 +0200 Subject: [PATCH] [c] Closes #2509, SP_INHERIT_NOSCALE was incorrectly implemented --- spine-c/spine-c/src/spine/Bone.c | 35 ++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/spine-c/spine-c/src/spine/Bone.c b/spine-c/spine-c/src/spine/Bone.c index 5bb62a1bf..95cec90c0 100644 --- a/spine-c/spine-c/src/spine/Bone.c +++ b/spine-c/spine-c/src/spine/Bone.c @@ -161,21 +161,26 @@ void spBone_updateWorldTransformWith(spBone *self, float x, float y, float rotat float za = (pa * cosine + pb * sine) / sx; float zc = (pc * cosine + pd * sine) / sy; float s = SQRT(za * za + zc * zc); - if (self->data->inherit == SP_INHERIT_NOSCALE && (pa * pd - pb * pc < 0) != (sx < 0 != sy < 0)) - s = -s; - rotation = PI / 2 + ATAN2(zc, za); - float zb = COS(rotation) * s; - float zd = SIN(rotation) * s; - shearX *= DEG_RAD; - shearY = (90 + shearY) * DEG_RAD; - float la = COS(shearX) * scaleX; - float lb = COS(shearY) * scaleY; - float lc = SIN(shearX) * scaleX; - float ld = SIN(shearY) * scaleY; - self->a = za * la + zb * lc; - self->b = za * lb + zb * ld; - self->c = zc * la + zd * lc; - self->d = zc * lb + zd * ld; + if (s > 0.00001f) s = 1 / s; + za *= s; + zc *= s; + s = SQRT(za * za + zc * zc); + if (self->inherit == SP_INHERIT_NOSCALE && + (pa * pd - pb * pc < 0) != (sx < 0 != sy < 0)) + s = -s; + rotation = PI / 2 + ATAN2(zc, za); + float zb = COS(rotation) * s; + float zd = SIN(rotation) * s; + shearX *= DEG_RAD; + shearY = (90 + shearY) * DEG_RAD; + float la = COS(shearX) * scaleX; + float lb = COS(shearY) * scaleY; + float lc = SIN(shearX) * scaleX; + float ld = SIN(shearY) * scaleY; + self->a = za * la + zb * lc; + self->b = za * lb + zb * ld; + self->c = zc * la + zd * lc; + self->d = zc * lb + zd * ld; } }