From 2b5bedd54371bf219651eeeed3641671039a7f6f Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Wed, 5 Apr 2023 15:50:28 +0200 Subject: [PATCH] [c][cpp] Fixed IK constraint NaN when a parent bone has zero scale. --- spine-c/spine-c/src/spine/IkConstraint.c | 2 +- spine-cpp/spine-cpp/src/spine/IkConstraint.cpp | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/spine-c/spine-c/src/spine/IkConstraint.c b/spine-c/spine-c/src/spine/IkConstraint.c index a5b7551d2..89e674a7f 100644 --- a/spine-c/spine-c/src/spine/IkConstraint.c +++ b/spine-c/spine-c/src/spine/IkConstraint.c @@ -181,7 +181,7 @@ void spIkConstraint_apply2(spBone *parent, spBone *child, float targetX, float t d = pp->d; id = a * d - b * c; if (id > 0) id = 1 / MAX(0.0001f, id); - else id = 1 / MIN(0.0001f, id); + else id = 1 / MIN(-0.0001f, id); x = cwx - pp->worldX; y = cwy - pp->worldY; dx = (x * d - y * b) * id - px; diff --git a/spine-cpp/spine-cpp/src/spine/IkConstraint.cpp b/spine-cpp/spine-cpp/src/spine/IkConstraint.cpp index 8a9af567c..3ba9588ba 100644 --- a/spine-cpp/spine-cpp/src/spine/IkConstraint.cpp +++ b/spine-cpp/spine-cpp/src/spine/IkConstraint.cpp @@ -51,7 +51,7 @@ void IkConstraint::apply(Bone &bone, float targetX, float targetY, bool compress ty = targetY - bone._worldY; break; case TransformMode_NoRotationOrReflection: { - float s = MathUtil::abs(pa * pd - pb * pc) / (pa * pa + pc * pc); + float s = MathUtil::abs(pa * pd - pb * pc) / MathUtil::max(0.0001f, pa * pa + pc * pc); float sa = pa / bone._skeleton.getScaleX(); float sc = pc / bone._skeleton.getScaleY(); pb = -sc * s * bone._skeleton.getScaleX(); @@ -61,6 +61,8 @@ void IkConstraint::apply(Bone &bone, float targetX, float targetY, bool compress default: float x = targetX - p->_worldX, y = targetY - p->_worldY; float d = pa * pd - pb * pc; + if (d > 0) d = MathUtil::max(0.0001f, d); + d = MathUtil::min(-0.0001f, d); tx = (x * pd - y * pb) / d - bone._ax; ty = (y * pa - x * pc) / d - bone._ay; } @@ -140,8 +142,10 @@ void IkConstraint::apply(Bone &parent, Bone &child, float targetX, float targetY b = pp->_b; c = pp->_c; d = pp->_d; - id = 1 / (a * d - b * c); - x = cwx - pp->_worldX; + id = a * d - b * c; + if (id > 0) MathUtil::max(0.0001f, id); + else MathUtil::min(-0.0001f, id); + x = cwx - pp->_worldX; y = cwy - pp->_worldY; dx = (x * d - y * b) * id - px; dy = (y * a - x * c) * id - py;