From 3dd56a5a4fc406eb3178d1be4c0ea97980dc5797 Mon Sep 17 00:00:00 2001 From: badlogic Date: Fri, 26 Oct 2018 17:43:24 +0200 Subject: [PATCH] [c][cpp] Port of fix for tangents at position 0 in PathConstraint. See #1198. --- spine-c/spine-c/src/spine/PathConstraint.c | 15 +++++++++++++-- spine-cpp/spine-cpp/src/spine/PathConstraint.cpp | 13 ++++++++++--- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/spine-c/spine-c/src/spine/PathConstraint.c b/spine-c/spine-c/src/spine/PathConstraint.c index 28e1890ef..4fb9ef0cc 100644 --- a/spine-c/spine-c/src/spine/PathConstraint.c +++ b/spine-c/spine-c/src/spine/PathConstraint.c @@ -224,13 +224,24 @@ static void _addCurvePosition (float p, float x1, float y1, float cx1, float cy1 float tt, ttt, u, uu, uuu; float ut, ut3, uut3, utt3; float x, y; - if (p == 0 || _isNan(p, 0)) p = 0.0001f; + if (p == 0 || _isNan(p, 0)) { + out[o] = x1; + out[o + 1] = y1; + out[o + 2] = ATAN2(cy1 - y1, cx1 - x1); + return; + } tt = p * p, ttt = tt * p, u = 1 - p, uu = u * u, uuu = uu * u; ut = u * p, ut3 = ut * 3, uut3 = u * ut3, utt3 = ut3 * p; x = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt, y = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt; out[o] = x; out[o + 1] = y; - if (tangents) out[o + 2] = ATAN2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), x - (x1 * uu + cx1 * ut * 2 + cx2 * tt)); + if (tangents) { + if (p < 0.001) { + out[o + 2] = ATAN2(cy1 - y1, cx1 - x1); + } else { + out[o + 2] = ATAN2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), x - (x1 * uu + cx1 * ut * 2 + cx2 * tt)); + } + } } float* spPathConstraint_computeWorldPositions(spPathConstraint* self, spPathAttachment* path, int spacesCount, int/*bool*/ tangents, int/*bool*/percentPosition, int/**/percentSpacing) { diff --git a/spine-cpp/spine-cpp/src/spine/PathConstraint.cpp b/spine-cpp/spine-cpp/src/spine/PathConstraint.cpp index 692bc32ff..6755a9622 100644 --- a/spine-cpp/spine-cpp/src/spine/PathConstraint.cpp +++ b/spine-cpp/spine-cpp/src/spine/PathConstraint.cpp @@ -549,7 +549,10 @@ void PathConstraint::addAfterPosition(float p, Vector &temp, int i, Vecto void PathConstraint::addCurvePosition(float p, float x1, float y1, float cx1, float cy1, float cx2, float cy2, float x2, float y2, Vector &output, int o, bool tangents) { if (p < EPSILON || MathUtil::isNan(p)) { - p = EPSILON; + output[o] = x1; + output[o + 1] = y1; + output[o + 2] = MathUtil::atan2(cy1 - y1, cx1 - x1); + return; } float tt = p * p, ttt = tt * p, u = 1 - p, uu = u * u, uuu = uu * u; @@ -558,7 +561,11 @@ void PathConstraint::addCurvePosition(float p, float x1, float y1, float cx1, fl output[o] = x; output[o + 1] = y; if (tangents) { - output[o + 2] = MathUtil::atan2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), - x - (x1 * uu + cx1 * ut * 2 + cx2 * tt)); + if (p < 0.001) { + output[o + 2] = MathUtil::atan2(cy1 - y1, cx1 - x1); + } else { + output[o + 2] = MathUtil::atan2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), + x - (x1 * uu + cx1 * ut * 2 + cx2 * tt)); + } } }