Added wireframe rendering to DevTools for local player model

This commit is contained in:
Kronos
2017-06-24 03:10:15 +10:00
committed by Adam
parent 0735d6c8e4
commit a028738f3d
6 changed files with 124 additions and 10 deletions

View File

@@ -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();

View File

@@ -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<Polygon> 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;
}
}
}

View File

@@ -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);
}
}
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);
}
}
}

View File

@@ -52,4 +52,7 @@ public interface Actor extends Renderable
@Import("combatInfoList")
CombatInfoList getCombatInfoList();
@Import("orientation")
int getOrientation();
}

View File

@@ -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();
}

View File

@@ -35,7 +35,7 @@ public interface Player extends Actor
@Import("name")
String getName();
@Import("model")
@Import("getModel")
Model getModel();
@Import("combatLevel")