Added wireframe rendering to DevTools for local player model
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -52,4 +52,7 @@ public interface Actor extends Renderable
|
||||
|
||||
@Import("combatInfoList")
|
||||
CombatInfoList getCombatInfoList();
|
||||
|
||||
@Import("orientation")
|
||||
int getOrientation();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ public interface Player extends Actor
|
||||
@Import("name")
|
||||
String getName();
|
||||
|
||||
@Import("model")
|
||||
@Import("getModel")
|
||||
Model getModel();
|
||||
|
||||
@Import("combatLevel")
|
||||
|
||||
Reference in New Issue
Block a user