From dc53f8d29314757946adfabad9b95e9ceb728c4e Mon Sep 17 00:00:00 2001 From: badlogic Date: Wed, 29 Mar 2017 14:30:11 +0200 Subject: [PATCH] [libgdx] Clipper assumes counter clockwise order, easier to adapt decomposition algorithm that way --- .../spine/SoftwareClippingTest.java | 4 ++-- .../esotericsoftware/spine/SkeletonRenderer.java | 4 ++-- .../spine/utils/SutherlandHodgmanClipper.java | 16 ++++++++-------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/spine-libgdx/spine-libgdx-tests/src/com/esotericsoftware/spine/SoftwareClippingTest.java b/spine-libgdx/spine-libgdx-tests/src/com/esotericsoftware/spine/SoftwareClippingTest.java index 9c16e3668..db723e0d1 100644 --- a/spine-libgdx/spine-libgdx-tests/src/com/esotericsoftware/spine/SoftwareClippingTest.java +++ b/spine-libgdx/spine-libgdx-tests/src/com/esotericsoftware/spine/SoftwareClippingTest.java @@ -137,7 +137,7 @@ public class SoftwareClippingTest extends ApplicationAdapter { // edge normals shapes.setColor(Color.YELLOW); if (clippingPolygon.size > 2) { - boolean clockwise = SutherlandHodgmanClipper.clockwise(clippingPolygon); + boolean clockwise = SutherlandHodgmanClipper.counterClockwise(clippingPolygon); for (int i = 0; i < clippingPolygon.size; i += 2) { float x = clippingPolygon.get(i); float y = clippingPolygon.get(i + 1); @@ -183,7 +183,7 @@ public class SoftwareClippingTest extends ApplicationAdapter { // must duplicate first vertex at end of polygon // so we can avoid module/branch in clipping code - SutherlandHodgmanClipper.makeClockwise(clippingPolygon); + SutherlandHodgmanClipper.makeCounterClockwise(clippingPolygon); clippingPolygon.add(clippingPolygon.get(0)); clippingPolygon.add(clippingPolygon.get(1)); diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java index fc85551fe..0cf6a9761 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java @@ -406,9 +406,9 @@ public class SkeletonRenderer { int n = clip.getWorldVerticesLength(); float[] vertices = this.clippingArea.setSize(n); clip.computeWorldVertices(slot, 0, n, vertices, 0, 2); - clippingAreaClockwise = SutherlandHodgmanClipper.clockwise(this.clippingArea); + clippingAreaClockwise = SutherlandHodgmanClipper.counterClockwise(this.clippingArea); if (!clippingAreaClockwise) { - SutherlandHodgmanClipper.makeClockwise(clippingArea); + SutherlandHodgmanClipper.makeCounterClockwise(clippingArea); } clippingArea.add(clippingArea.items[0]); clippingArea.add(clippingArea.items[1]); diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/utils/SutherlandHodgmanClipper.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/utils/SutherlandHodgmanClipper.java index b4ec53751..8e55f92cc 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/utils/SutherlandHodgmanClipper.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/utils/SutherlandHodgmanClipper.java @@ -35,10 +35,10 @@ public class SutherlandHodgmanClipper { final float[] clippingVertices = clippingArea.items; final int clippingVerticesLength = clippingArea.size - 2; for (int i = 0; i < clippingVerticesLength; i += 2) { - float edgeX = clippingVertices[i]; - float edgeY = clippingVertices[i + 1]; - float edgeX2 = clippingVertices[i + 2]; - float edgeY2 = clippingVertices[i + 3]; + float edgeX2 = clippingVertices[i]; + float edgeY2 = clippingVertices[i + 1]; + float edgeX = clippingVertices[i + 2]; + float edgeY = clippingVertices[i + 3]; final float deltaX = edgeX - edgeX2; final float deltaY = edgeY - edgeY2; @@ -129,8 +129,8 @@ public class SutherlandHodgmanClipper { return clipped; } - public static void makeClockwise (FloatArray poly) { - if (clockwise(poly)) return; + public static void makeCounterClockwise (FloatArray poly) { + if (counterClockwise(poly)) return; int lastX = poly.size - 2; final float[] polygon = poly.items; @@ -145,8 +145,8 @@ public class SutherlandHodgmanClipper { } } - public static boolean clockwise (FloatArray poly) { - return area(poly) < 0; + public static boolean counterClockwise (FloatArray poly) { + return area(poly) > 0; } public static float area (FloatArray poly) {