From 93d78523c40edb119258e4850191b7449337a853 Mon Sep 17 00:00:00 2001 From: badlogic Date: Wed, 3 Jun 2020 17:36:42 +0200 Subject: [PATCH] [c] Fix 1-bone IK, see #1692. --- spine-c/spine-c/src/spine/IkConstraint.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/spine-c/spine-c/src/spine/IkConstraint.c b/spine-c/spine-c/src/spine/IkConstraint.c index a917fd775..c6d7fdda8 100644 --- a/spine-c/spine-c/src/spine/IkConstraint.c +++ b/spine-c/spine-c/src/spine/IkConstraint.c @@ -72,7 +72,7 @@ void spIkConstraint_apply1 (spBone* bone, float targetX, float targetY, int /*bo spBone* p = bone->parent; float pa = p->a, pb = p->b, pc = p->c, pd = p->d; float rotationIK = -bone->ashearX - bone->arotation; - float tx = 0, ty = 0, sx = 0, sy = 0, s = 0; + float tx = 0, ty = 0, sx = 0, sy = 0, s = 0, sa = 0, sc = 0; if (!bone->appliedValid) spBone_updateAppliedTransform(bone); switch(bone->data->transformMode) { @@ -81,11 +81,12 @@ void spIkConstraint_apply1 (spBone* bone, float targetX, float targetY, int /*bo ty = targetY - bone->worldY; break; case SP_TRANSFORMMODE_NOROTATIONORREFLECTION: { - float ps; - rotationIK += ATAN2(pc, pa) * RAD_DEG; - ps = ABS(pa * pd - pb * pc) / (pa * pa + pc * pc); - pb = -pc * ps; - pd = pa * ps; + s = ABS(pa * pd - pb * pc) / (pa * pa + pc * pc); + sa = pa / bone->skeleton->scaleX; + sc = pc / bone->skeleton->scaleY; + pb = -sc * s * bone->skeleton->scaleX; + pd = sa * s * bone->skeleton->scaleY; + rotationIK += ATAN2(sc, sa) * RAD_DEG; } default: { float x = targetX - p->worldX, y = targetY - p->worldY;