From a028738f3d6b6c9c20dfaaeec3959959461890eb Mon Sep 17 00:00:00 2001 From: Kronos Date: Sat, 24 Jun 2017 03:10:15 +1000 Subject: [PATCH] Added wireframe rendering to DevTools for local player model --- .../src/main/java/net/runelite/api/Actor.java | 5 ++ .../main/java/net/runelite/api/Player.java | 77 ++++++++++++++++++- .../plugins/devtools/DevToolsOverlay.java | 28 +++++-- .../main/java/net/runelite/rs/api/Actor.java | 3 + .../main/java/net/runelite/rs/api/Model.java | 19 +++++ .../main/java/net/runelite/rs/api/Player.java | 2 +- 6 files changed, 124 insertions(+), 10 deletions(-) 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 0a0464edbd..39f275cf6a 100644 --- a/runelite-api/src/main/java/net/runelite/api/Actor.java +++ b/runelite-api/src/main/java/net/runelite/api/Actor.java @@ -155,6 +155,11 @@ public abstract class Actor extends Renderable return actor.getY(); } + public int getOrientation() + { + return actor.getOrientation(); + } + public int getAnimation() { return actor.getAnimation(); diff --git a/runelite-api/src/main/java/net/runelite/api/Player.java b/runelite-api/src/main/java/net/runelite/api/Player.java index 07ed351c6e..ac5484ba78 100644 --- a/runelite-api/src/main/java/net/runelite/api/Player.java +++ b/runelite-api/src/main/java/net/runelite/api/Player.java @@ -24,10 +24,15 @@ */ package net.runelite.api; +import java.awt.Polygon; +import java.util.ArrayList; +import java.util.List; +import net.runelite.rs.api.Model; + public class Player extends Actor { - private Client client; - private net.runelite.rs.api.Player player; + private final Client client; + private final net.runelite.rs.api.Player player; public Player(Client client, net.runelite.rs.api.Player player) { @@ -53,4 +58,72 @@ public class Player extends Actor { return new PlayerComposition(player.getComposition()); } + + public Model getModel() + { + return player.getModel(); + } + + public Polygon[] getPolygons() + { + List polys = new ArrayList<>(); + Model model = getModel(); + int localX = player.getX(); + int localY = player.getY(); + + // models are orientated north (1024) and there are 2048 angles total + int orientation = (player.getOrientation() + 1024) % 2048; + + if (model == null) + { + return null; + } + + int[] verticesX = model.getVerticesX().clone(); + int[] verticesY = model.getVerticesY(); + int[] verticesZ = model.getVerticesZ().clone(); + + int[] trianglesX = model.getTrianglesX(); + int[] trianglesY = model.getTrianglesY(); + int[] trianglesZ = model.getTrianglesZ(); + + if (orientation != 0) + { + setOrientation(model, orientation, verticesX, verticesZ); + } + + for (int i = 0; i < trianglesX.length; i++) + { + Point x = Perspective.worldToCanvas(client, localX - verticesX[trianglesX[i]], localY - verticesZ[trianglesX[i]], -verticesY[trianglesX[i]]); + Point y = Perspective.worldToCanvas(client, localX - verticesX[trianglesY[i]], localY - verticesZ[trianglesY[i]], -verticesY[trianglesY[i]]); + Point z = Perspective.worldToCanvas(client, localX - verticesX[trianglesZ[i]], localY - verticesZ[trianglesZ[i]], -verticesY[trianglesZ[i]]); + + int xx[] = + { + x.getX(), y.getX(), z.getX() + }; + int yy[] = + { + x.getY(), y.getY(), z.getY() + }; + polys.add(new Polygon(xx, yy, 3)); + } + + return polys.toArray(new Polygon[polys.size()]); + } + + private void setOrientation(Model model, int orientation, int[] verticesX, int[] verticesZ) + { + int sin = Perspective.SINE[orientation]; + int cos = Perspective.COSINE[orientation]; + + int[] originalX = model.getVerticesX(); + int[] originalZ = model.getVerticesZ(); + + for (int i = 0; i < originalX.length; ++i) + { + verticesX[i] = originalX[i] * cos + originalZ[i] * sin >> 16; + verticesZ[i] = originalZ[i] * cos - originalX[i] * sin >> 16; + } + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java index c38dc359e7..d08f49785a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java @@ -25,7 +25,6 @@ */ package net.runelite.client.plugins.devtools; -import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; @@ -35,7 +34,6 @@ import java.awt.Polygon; import java.awt.Rectangle; import java.awt.geom.Rectangle2D; -import net.runelite.api.Actor; import net.runelite.api.Client; import net.runelite.api.DecorativeObject; import net.runelite.api.GameObject; @@ -46,10 +44,8 @@ import net.runelite.api.ItemLayer; import net.runelite.api.NPC; import net.runelite.api.Node; import net.runelite.api.Player; -import net.runelite.api.Point; import net.runelite.api.Region; import net.runelite.api.Tile; -import net.runelite.api.TileObject; import net.runelite.api.WallObject; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; @@ -147,6 +143,7 @@ public class DevToolsOverlay extends Overlay String text = local.getName() + " (A: " + local.getAnimation() + ") (G: " + local.getGraphic() + ")"; OverlayUtil.renderActorOverlay(graphics, local, text, CYAN); + renderPlayerWireframe(graphics, local, CYAN); } private void renderNpcs(Graphics2D graphics) @@ -368,8 +365,8 @@ public class DevToolsOverlay extends Overlay Widget childComponent = widgetChild.getChild(itemIndex); if (childComponent != null && !childComponent.isHidden() - && childComponent.getItemId() != ITEM_EMPTY - && childComponent.getItemId() != ITEM_FILLED) + && childComponent.getItemId() != ITEM_EMPTY + && childComponent.getItemId() != ITEM_FILLED) { Rectangle componentBounds = childComponent.getBounds(); @@ -413,4 +410,21 @@ public class DevToolsOverlay extends Overlay graphics.drawString(text, textX, textY); } -} \ No newline at end of file + private void renderPlayerWireframe(Graphics2D graphics, Player player, Color color) + { + Polygon[] polys = player.getPolygons(); + + if (polys == null) + { + return; + } + + graphics.setColor(color); + + for (Polygon p : polys) + { + graphics.drawPolygon(p); + } + } + +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/Actor.java b/runescape-api/src/main/java/net/runelite/rs/api/Actor.java index d37b12f80a..7c7b166be3 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/Actor.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/Actor.java @@ -52,4 +52,7 @@ public interface Actor extends Renderable @Import("combatInfoList") CombatInfoList getCombatInfoList(); + + @Import("orientation") + int getOrientation(); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/Model.java b/runescape-api/src/main/java/net/runelite/rs/api/Model.java index 410fe069f6..0e391eaa05 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/Model.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/Model.java @@ -25,6 +25,25 @@ package net.runelite.rs.api; +import net.runelite.mapping.Import; + public interface Model { + @Import("verticesX") + int[] getVerticesX(); + + @Import("verticesY") + int[] getVerticesY(); + + @Import("verticesZ") + int[] getVerticesZ(); + + @Import("indices1") + int[] getTrianglesX(); + + @Import("indices2") + int[] getTrianglesY(); + + @Import("indices3") + int[] getTrianglesZ(); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/Player.java b/runescape-api/src/main/java/net/runelite/rs/api/Player.java index 957c3292bb..86fb468c49 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/Player.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/Player.java @@ -35,7 +35,7 @@ public interface Player extends Actor @Import("name") String getName(); - @Import("model") + @Import("getModel") Model getModel(); @Import("combatLevel")