From efab85968552bcd7a8e4ffb4897e3a980c1b3b00 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 29 May 2018 20:10:27 -0400 Subject: [PATCH 1/4] Revert "perspective: use viewport offset in get2DGeometry" This reverts commit 45597133f78c3470f8270df7dfb53319d106dcd5. --- runelite-api/src/main/java/net/runelite/api/Perspective.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/Perspective.java b/runelite-api/src/main/java/net/runelite/api/Perspective.java index c9655f825a..6a307010e4 100644 --- a/runelite-api/src/main/java/net/runelite/api/Perspective.java +++ b/runelite-api/src/main/java/net/runelite/api/Perspective.java @@ -541,8 +541,8 @@ public class Perspective int minY = Math.min(Math.min(a.getY(), b.getY()), c.getY()); // For some reason, this calculation is always 4 pixels short of the actual in-client one - int maxX = Math.max(Math.max(a.getX(), b.getX()), c.getX()) + client.getViewportXOffset(); - int maxY = Math.max(Math.max(a.getY(), b.getY()), c.getY()) + client.getViewportYOffset(); + int maxX = Math.max(Math.max(a.getX(), b.getX()), c.getX()) + 4; + int maxY = Math.max(Math.max(a.getY(), b.getY()), c.getY()) + 4; // ...and the rectangles in the fixed client are shifted 4 pixels right and down if (!client.isResized()) From 4b18dce38c9361a571b6f8f416e3bb2707cd82f8 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 29 May 2018 19:23:48 -0400 Subject: [PATCH 2/4] perspective: use viewport offset for offsetting rectangle in get2DGeometry --- .../src/main/java/net/runelite/api/Perspective.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/Perspective.java b/runelite-api/src/main/java/net/runelite/api/Perspective.java index 6a307010e4..f35df0c898 100644 --- a/runelite-api/src/main/java/net/runelite/api/Perspective.java +++ b/runelite-api/src/main/java/net/runelite/api/Perspective.java @@ -547,10 +547,10 @@ public class Perspective // ...and the rectangles in the fixed client are shifted 4 pixels right and down if (!client.isResized()) { - minX += 4; - minY += 4; - maxX += 4; - maxY += 4; + minX += client.getViewportXOffset(); + minY += client.getViewportYOffset(); + maxX += client.getViewportXOffset(); + maxY += client.getViewportYOffset(); } Rectangle clickableRect = new Rectangle( From d6b5e31c9d47102c0418ab4a32b7cc92bcdb789b Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 29 May 2018 19:24:16 -0400 Subject: [PATCH 3/4] runelite-api: use lombok constructors for Vertex/Triangle --- .../src/main/java/net/runelite/api/model/Triangle.java | 7 ------- .../src/main/java/net/runelite/api/model/Vertex.java | 7 ------- 2 files changed, 14 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/model/Triangle.java b/runelite-api/src/main/java/net/runelite/api/model/Triangle.java index 39178b1db5..daf59c2489 100644 --- a/runelite-api/src/main/java/net/runelite/api/model/Triangle.java +++ b/runelite-api/src/main/java/net/runelite/api/model/Triangle.java @@ -36,13 +36,6 @@ public class Triangle private final Vertex b; private final Vertex c; - public Triangle(Vertex a, Vertex b, Vertex c) - { - this.a = a; - this.b = b; - this.c = c; - } - /** * Rotates the triangle by the given orientation. * diff --git a/runelite-api/src/main/java/net/runelite/api/model/Vertex.java b/runelite-api/src/main/java/net/runelite/api/model/Vertex.java index af99f157b0..b59a7d7891 100644 --- a/runelite-api/src/main/java/net/runelite/api/model/Vertex.java +++ b/runelite-api/src/main/java/net/runelite/api/model/Vertex.java @@ -37,13 +37,6 @@ public class Vertex private final int y; private final int z; - public Vertex(int x, int y, int z) - { - this.x = x; - this.y = y; - this.z = z; - } - /** * Rotates the triangle by the given orientation. * From dd7c7e1a4d2af6c398edbbf73d6f47bb1caa627a Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 29 May 2018 20:09:11 -0400 Subject: [PATCH 4/4] perspective: optimize clickbox generation --- .../java/net/runelite/api/Perspective.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/Perspective.java b/runelite-api/src/main/java/net/runelite/api/Perspective.java index f35df0c898..2aa46c04eb 100644 --- a/runelite-api/src/main/java/net/runelite/api/Perspective.java +++ b/runelite-api/src/main/java/net/runelite/api/Perspective.java @@ -494,6 +494,29 @@ public class Perspective return clickBox; } + /** + * Determine if a triangle goes counter clockwise + * + * @return Returns true if the triangle goes counter clockwise and should be culled, otherwise false + */ + private static boolean cullFace(int x1, int y1, int x2, int y2, int x3, int y3) + { + return (y2 - y1) * (x3 - x2) - (x2 - x1) * (y3 - y2) < 0; + } + + /** + * Determine if a given point is off-screen. + * + * @param client + * @param point + * @return + */ + private static boolean isOffscreen(@Nonnull Client client, @Nonnull Point point) + { + return (point.getX() < 0 || point.getX() >= client.getViewportWidth()) + && (point.getY() < 0 || point.getY() >= client.getViewportHeight()); + } + private static Area get2DGeometry( @Nonnull Client client, @Nonnull List triangles, @@ -537,6 +560,16 @@ public class Perspective continue; } + if (cullFace(a.getX(), a.getY(), b.getX(), b.getY(), c.getX(), c.getY())) + { + continue; + } + + if (isOffscreen(client, a) && isOffscreen(client, b) && isOffscreen(client, c)) + { + continue; + } + int minX = Math.min(Math.min(a.getX(), b.getX()), c.getX()); int minY = Math.min(Math.min(a.getY(), b.getY()), c.getY()); @@ -557,6 +590,12 @@ public class Perspective minX - radius, minY - radius, maxX - minX + radius, maxY - minY + radius ); + + if (geometry.contains(clickableRect)) + { + continue; + } + geometry.add(new Area(clickableRect)); }