From 222f4c9d0dec1e92a18ff5528fd3ee922473be4b Mon Sep 17 00:00:00 2001 From: badlogic Date: Wed, 5 Dec 2018 16:16:54 +0100 Subject: [PATCH] [c][cpp] Clipping fix, see #1219 --- spine-c/spine-c/src/spine/SkeletonClipping.c | 26 ++++++++++++++----- .../spine-cpp/src/spine/SkeletonClipping.cpp | 26 +++++++++++++------ 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/spine-c/spine-c/src/spine/SkeletonClipping.c b/spine-c/spine-c/src/spine/SkeletonClipping.c index 7b8702cce..bb5310efe 100644 --- a/spine-c/spine-c/src/spine/SkeletonClipping.c +++ b/spine-c/spine-c/src/spine/SkeletonClipping.c @@ -161,21 +161,33 @@ int /*boolean*/ _clip(spSkeletonClipping* self, float x1, float y1, float x2, fl int side2 = deltaX * (inputY2 - edgeY2) - deltaY * (inputX2 - edgeX2) > 0; if (deltaX * (inputY - edgeY2) - deltaY * (inputX - edgeX2) > 0) { float c0, c2; - float ua; + float s, ua; if (side2) { spFloatArray_add(output, inputX2); spFloatArray_add(output, inputY2); continue; } c0 = inputY2 - inputY, c2 = inputX2 - inputX; - ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / (c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY)); - spFloatArray_add(output, edgeX + (edgeX2 - edgeX) * ua); - spFloatArray_add(output, edgeY + (edgeY2 - edgeY) * ua); + s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY); + if (ABS(s) > 0.000001f) { + ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s; + spFloatArray_add(output, edgeX + (edgeX2 - edgeX) * ua); + spFloatArray_add(output, edgeY + (edgeY2 - edgeY) * ua); + } else { + spFloatArray_add(output, edgeX); + spFloatArray_add(output, edgeY); + } } else if (side2) { float c0 = inputY2 - inputY, c2 = inputX2 - inputX; - float ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / (c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY)); - spFloatArray_add(output, edgeX + (edgeX2 - edgeX) * ua); - spFloatArray_add(output, edgeY + (edgeY2 - edgeY) * ua); + float s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY); + if (ABS(s) > 0.000001f) { + float ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s; + spFloatArray_add(output, edgeX + (edgeX2 - edgeX) * ua); + spFloatArray_add(output, edgeY + (edgeY2 - edgeY) * ua); + } else { + spFloatArray_add(output, edgeX); + spFloatArray_add(output, edgeY); + } spFloatArray_add(output, inputX2); spFloatArray_add(output, inputY2); } diff --git a/spine-cpp/spine-cpp/src/spine/SkeletonClipping.cpp b/spine-cpp/spine-cpp/src/spine/SkeletonClipping.cpp index 67e6f117e..d86aff2f5 100644 --- a/spine-cpp/spine-cpp/src/spine/SkeletonClipping.cpp +++ b/spine-cpp/spine-cpp/src/spine/SkeletonClipping.cpp @@ -250,17 +250,27 @@ bool SkeletonClipping::clip(float x1, float y1, float x2, float y2, float x3, fl } // v1 inside, v2 outside float c0 = inputY2 - inputY, c2 = inputX2 - inputX; - float ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / - (c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY)); - output->add(edgeX + (edgeX2 - edgeX) * ua); - output->add(edgeY + (edgeY2 - edgeY) * ua); + float s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY); + if (MathUtil::abs(s) > 0.000001f) { + float ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s; + output->add(edgeX + (edgeX2 - edgeX) * ua); + output->add(edgeY + (edgeY2 - edgeY) * ua); + } else { + output->add(edgeX); + output->add(edgeY); + } } else if (side2) { // v1 outside, v2 inside float c0 = inputY2 - inputY, c2 = inputX2 - inputX; - float ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / - (c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY)); - output->add(edgeX + (edgeX2 - edgeX) * ua); - output->add(edgeY + (edgeY2 - edgeY) * ua); + float s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY); + if (MathUtil::abs(s) > 0.000001f) { + float ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s; + output->add(edgeX + (edgeX2 - edgeX) * ua); + output->add(edgeY + (edgeY2 - edgeY) * ua); + } else { + output->add(edgeX); + output->add(edgeY); + } output->add(inputX2); output->add(inputY2); }