diff --git a/runelite-api/src/main/java/net/runelite/api/TileObject.java b/runelite-api/src/main/java/net/runelite/api/TileObject.java index abf2e36bd9..abc580c92e 100644 --- a/runelite-api/src/main/java/net/runelite/api/TileObject.java +++ b/runelite-api/src/main/java/net/runelite/api/TileObject.java @@ -56,8 +56,6 @@ public interface TileObject Point getMinimapLocation(); - Polygon getConvexHull(Model model, int orientation); - /** * Get the on-screen clickable area of {@code object} * diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java index 1a664fe05c..b4cd17453d 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java @@ -35,12 +35,12 @@ import net.runelite.api.Point; import net.runelite.api.SpritePixels; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.AnimationChanged; import net.runelite.api.events.GraphicChanged; import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; -import net.runelite.api.events.AnimationChanged; import static net.runelite.client.callback.Hooks.eventBus; import net.runelite.rs.api.RSActor; import net.runelite.rs.api.RSClient; diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSDecorativeObjectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSDecorativeObjectMixin.java index f16b39f81b..f6a7f23064 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSDecorativeObjectMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSDecorativeObjectMixin.java @@ -28,12 +28,13 @@ import java.awt.Polygon; import java.awt.geom.Area; import net.runelite.api.Model; import net.runelite.api.Perspective; -import net.runelite.api.Renderable; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSDecorativeObject; +import net.runelite.rs.api.RSModel; +import net.runelite.rs.api.RSRenderable; @Mixin(RSDecorativeObject.class) public abstract class RSDecorativeObjectMixin implements RSDecorativeObject @@ -59,19 +60,19 @@ public abstract class RSDecorativeObjectMixin implements RSDecorativeObject } @Inject - private Model getModel() + private RSModel getModel() { - Renderable renderable = getRenderable(); + RSRenderable renderable = getRenderable(); if (renderable == null) { return null; } - Model model; + RSModel model; if (renderable instanceof Model) { - model = (Model) renderable; + model = (RSModel) renderable; } else { @@ -92,13 +93,13 @@ public abstract class RSDecorativeObjectMixin implements RSDecorativeObject @Override public Polygon getConvexHull() { - Model model = getModel(); + RSModel model = getModel(); if (model == null) { return null; } - return getConvexHull(model, getOrientation()); + return model.getConvexHull(getX(), getY(), getOrientation()); } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSGameObjectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSGameObjectMixin.java index 0ff8ffaed1..ec8695b03d 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSGameObjectMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSGameObjectMixin.java @@ -26,15 +26,15 @@ package net.runelite.mixins; import java.awt.Polygon; import java.awt.geom.Area; -import net.runelite.api.Model; import net.runelite.api.Perspective; import net.runelite.api.Point; -import net.runelite.api.Renderable; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSGameObject; +import net.runelite.rs.api.RSModel; +import net.runelite.rs.api.RSRenderable; @Mixin(RSGameObject.class) public abstract class RSGameObjectMixin implements RSGameObject @@ -57,17 +57,17 @@ public abstract class RSGameObjectMixin implements RSGameObject } @Inject - private Model getModel() + private RSModel getModel() { - Renderable renderable = getRenderable(); + RSRenderable renderable = getRenderable(); if (renderable == null) { return null; } - if (renderable instanceof Model) + if (renderable instanceof RSModel) { - return (Model) renderable; + return (RSModel) renderable; } else { @@ -86,13 +86,13 @@ public abstract class RSGameObjectMixin implements RSGameObject @Override public Polygon getConvexHull() { - Model model = getModel(); + RSModel model = getModel(); if (model == null) { return null; } - return getConvexHull(model, getOrientation()); + return model.getConvexHull(getX(), getY(), getOrientation()); } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSModelMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSModelMixin.java index 10e2b089c0..003591e200 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSModelMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSModelMixin.java @@ -24,17 +24,26 @@ */ package net.runelite.mixins; +import java.awt.Polygon; import java.util.ArrayList; import java.util.List; -import net.runelite.api.model.Triangle; -import net.runelite.api.model.Vertex; +import net.runelite.api.Perspective; +import net.runelite.api.Point; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; +import net.runelite.api.mixins.Shadow; +import net.runelite.api.model.Jarvis; +import net.runelite.api.model.Triangle; +import net.runelite.api.model.Vertex; +import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSModel; @Mixin(RSModel.class) public abstract class RSModelMixin implements RSModel { + @Shadow("clientInstance") + private static RSClient client; + @Override @Inject public List getVertices() @@ -85,4 +94,49 @@ public abstract class RSModelMixin implements RSModel return triangles; } + + @Override + @Inject + public Polygon getConvexHull(int localX, int localY, int orientation) + { + List vertices = getVertices(); + + // rotate vertices + for (int i = 0; i < vertices.size(); ++i) + { + Vertex v = vertices.get(i); + vertices.set(i, v.rotate(orientation)); + } + + List points = new ArrayList(); + + for (Vertex v : vertices) + { + // Compute canvas location of vertex + Point p = Perspective.worldToCanvas(client, + localX - v.getX(), + localY - v.getZ(), + -v.getY()); + if (p != null) + { + points.add(p); + } + } + + // Run Jarvis march algorithm + points = Jarvis.convexHull(points); + if (points == null) + { + return null; + } + + // Convert to a polygon + Polygon p = new Polygon(); + for (Point point : points) + { + p.addPoint(point.getX(), point.getY()); + } + + return p; + } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/TileObjectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/TileObjectMixin.java index 539e389beb..3ee9d46268 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/TileObjectMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/TileObjectMixin.java @@ -26,9 +26,6 @@ package net.runelite.mixins; import java.awt.Graphics2D; import java.awt.Polygon; -import java.util.ArrayList; -import java.util.List; -import net.runelite.api.Model; import net.runelite.api.Perspective; import net.runelite.api.Point; import net.runelite.api.TileObject; @@ -38,8 +35,6 @@ import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Mixins; import net.runelite.api.mixins.Shadow; -import net.runelite.api.model.Jarvis; -import net.runelite.api.model.Vertex; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSDecorativeObject; import net.runelite.rs.api.RSGameObject; @@ -115,52 +110,4 @@ public abstract class TileObjectMixin implements TileObject { return Perspective.worldToMiniMap(client, getX(), getY()); } - - @Override - @Inject - public Polygon getConvexHull(Model model, int orientation) - { - int localX = getX(); - int localY = getY(); - - List vertices = model.getVertices(); - - // rotate vertices - for (int i = 0; i < vertices.size(); ++i) - { - Vertex v = vertices.get(i); - vertices.set(i, v.rotate(orientation)); - } - - List points = new ArrayList(); - - for (Vertex v : vertices) - { - // Compute canvas location of vertex - Point p = Perspective.worldToCanvas(client, - localX - v.getX(), - localY - v.getZ(), - -v.getY()); - if (p != null) - { - points.add(p); - } - } - - // Run Jarvis march algorithm - points = Jarvis.convexHull(points); - if (points == null) - { - return null; - } - - // Convert to a polygon - Polygon p = new Polygon(); - for (Point point : points) - { - p.addPoint(point.getX(), point.getY()); - } - - return p; - } } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSDecorativeObject.java b/runescape-api/src/main/java/net/runelite/rs/api/RSDecorativeObject.java index c2e539e7be..8263a676d0 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSDecorativeObject.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSDecorativeObject.java @@ -25,7 +25,6 @@ package net.runelite.rs.api; import net.runelite.api.DecorativeObject; -import net.runelite.api.Renderable; import net.runelite.mapping.Import; public interface RSDecorativeObject extends DecorativeObject @@ -44,7 +43,7 @@ public interface RSDecorativeObject extends DecorativeObject int getOrientation(); @Import("renderable1") - Renderable getRenderable(); + RSRenderable getRenderable(); void setPlane(int plane); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSGameObject.java b/runescape-api/src/main/java/net/runelite/rs/api/RSGameObject.java index 3595beda6b..f62b24e8ed 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSGameObject.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSGameObject.java @@ -25,13 +25,12 @@ package net.runelite.rs.api; import net.runelite.api.GameObject; -import net.runelite.api.Renderable; import net.runelite.mapping.Import; public interface RSGameObject extends GameObject { @Import("renderable") - Renderable getRenderable(); + RSRenderable getRenderable(); @Import("plane") int getPlane(); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSModel.java b/runescape-api/src/main/java/net/runelite/rs/api/RSModel.java index a1273f0cdb..7e10c56061 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSModel.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSModel.java @@ -24,6 +24,7 @@ */ package net.runelite.rs.api; +import java.awt.Polygon; import net.runelite.api.Model; import net.runelite.mapping.Import; @@ -52,4 +53,13 @@ public interface RSModel extends RSRenderable, Model @Import("indices3") int[] getTrianglesZ(); + + /** + * Compute the convex hull of this model + * @param localX + * @param localY + * @param orientation + * @return + */ + Polygon getConvexHull(int localX, int localY, int orientation); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSRenderable.java b/runescape-api/src/main/java/net/runelite/rs/api/RSRenderable.java index 04b2e077f2..d9bff9eb5b 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSRenderable.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSRenderable.java @@ -24,7 +24,6 @@ */ package net.runelite.rs.api; -import net.runelite.api.Model; import net.runelite.api.Renderable; import net.runelite.mapping.Import; @@ -35,5 +34,5 @@ public interface RSRenderable extends RSNode, Renderable @Import("getModel") @Override - Model getModel(); + RSModel getModel(); }