From 97f7bd0c48c36e66fbe202e1864fa602cb310596 Mon Sep 17 00:00:00 2001 From: Tyler Hardy Date: Thu, 19 Oct 2017 12:03:18 -0500 Subject: [PATCH] Add sprite drawing on actors --- .../src/main/java/net/runelite/api/Actor.java | 2 ++ .../java/net/runelite/api/Perspective.java | 28 +++++++++++++++++ .../java/net/runelite/api/SpritePixels.java | 4 +++ .../client/ui/overlay/OverlayUtil.java | 30 +++++++++++++++++++ .../net/runelite/mixins/RSActorMixin.java | 8 +++++ .../net/runelite/rs/api/RSSpritePixels.java | 8 +++++ 6 files changed, 80 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/Actor.java b/runelite-api/src/main/java/net/runelite/api/Actor.java index 1d6ba09f47..84dd389df7 100644 --- a/runelite-api/src/main/java/net/runelite/api/Actor.java +++ b/runelite-api/src/main/java/net/runelite/api/Actor.java @@ -56,5 +56,7 @@ public interface Actor extends Renderable Point getCanvasImageLocation(Graphics2D graphics, BufferedImage image, int zOffset); + Point getCanvasSpriteLocation(Graphics2D graphics, SpritePixels sprite, int zOffset); + Point getMinimapLocation(); } 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 cf5f5de8f9..47aa5f07b5 100644 --- a/runelite-api/src/main/java/net/runelite/api/Perspective.java +++ b/runelite-api/src/main/java/net/runelite/api/Perspective.java @@ -307,4 +307,32 @@ public class Perspective return new Point(xOffset, yOffset); } + /** + * Calculates sprite position and centers depending on sprite size. + * + * @param client + * @param graphics + * @param localLocation local location of the tile + * @param sprite SpritePixel for size measurement + * @param zOffset offset from ground plane + * @return a {@link Point} on screen corresponding to the given + * localLocation. + */ + public static Point getCanvasSpriteLocation(Client client, Graphics2D graphics, Point localLocation, SpritePixels sprite, int zOffset) + { + int plane = client.getPlane(); + + Point p = Perspective.worldToCanvas(client, localLocation.getX(), localLocation.getY(), plane, zOffset); + + if (p == null) + { + return null; + } + + int xOffset = p.getX() - sprite.getWidth() / 2; + int yOffset = p.getY() - sprite.getHeight() / 2; + + return new Point(xOffset, yOffset); + } + } diff --git a/runelite-api/src/main/java/net/runelite/api/SpritePixels.java b/runelite-api/src/main/java/net/runelite/api/SpritePixels.java index ce822a0e6f..df4c31396a 100644 --- a/runelite-api/src/main/java/net/runelite/api/SpritePixels.java +++ b/runelite-api/src/main/java/net/runelite/api/SpritePixels.java @@ -29,4 +29,8 @@ public interface SpritePixels int DEFAULT_SHADOW_COLOR = 3153952; void drawAt(int x, int y); + + int getWidth(); + + int getHeight(); } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java index f9ca92fa6e..95c3d06c5e 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java @@ -32,6 +32,7 @@ import java.awt.image.BufferedImage; import net.runelite.api.Actor; import net.runelite.api.Point; +import net.runelite.api.SpritePixels; import net.runelite.api.TileObject; @@ -78,6 +79,14 @@ public class OverlayUtil graphics.drawImage(image, x, y, null); } + public static void renderSpriteLocation(Graphics2D graphics, Point imgLoc, SpritePixels sprite) + { + int x = imgLoc.getX(); + int y = imgLoc.getY(); + + sprite.drawAt(x, y); + } + public static void renderActorOverlay(Graphics2D graphics, Actor actor, String text, Color color) { Polygon poly = actor.getCanvasTilePoly(); @@ -120,6 +129,27 @@ public class OverlayUtil } } + public static void renderActorOverlaySprite(Graphics2D graphics, Actor actor, SpritePixels sprite, Color color) + { + Polygon poly = actor.getCanvasTilePoly(); + if (poly != null) + { + renderPolygon(graphics, poly, color); + } + + Point minimapLocation = actor.getMinimapLocation(); + if (minimapLocation != null) + { + renderMinimapLocation(graphics, minimapLocation, color); + } + + Point imageLocation = actor.getCanvasSpriteLocation(graphics, sprite, actor.getModelHeight()); + if (imageLocation != null) + { + renderSpriteLocation(graphics, imageLocation, sprite); + } + } + public static void renderTileOverlay(Graphics2D graphics, TileObject tileObject, String text, Color color) { Polygon poly = tileObject.getCanvasTilePoly(); 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 60ce77b5a8..364bd14941 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java @@ -32,6 +32,7 @@ import net.runelite.api.NPC; import net.runelite.api.Perspective; import net.runelite.api.Player; import net.runelite.api.Point; +import net.runelite.api.SpritePixels; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; @@ -143,6 +144,13 @@ public abstract class RSActorMixin implements RSActor return Perspective.getCanvasImageLocation(client, graphics, getLocalLocation(), image, zOffset); } + @Inject + @Override + public Point getCanvasSpriteLocation(Graphics2D graphics, SpritePixels sprite, int zOffset) + { + return Perspective.getCanvasSpriteLocation(client, graphics, getLocalLocation(), sprite, zOffset); + } + @Inject @Override public Point getMinimapLocation() diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSSpritePixels.java b/runescape-api/src/main/java/net/runelite/rs/api/RSSpritePixels.java index fc3db40be8..f59d6a34f4 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSSpritePixels.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSSpritePixels.java @@ -32,4 +32,12 @@ public interface RSSpritePixels extends SpritePixels @Import("drawAt") @Override void drawAt(int x, int y); + + @Import("height") + @Override + int getHeight(); + + @Import("width") + @Override + int getWidth(); }