mixins: add method for grabbing game object polys.

This commit is contained in:
Ganom
2019-08-29 01:27:53 -04:00
parent 201e86a0e0
commit 2ac1d869e9
3 changed files with 121 additions and 6 deletions

View File

@@ -24,15 +24,20 @@
*/
package net.runelite.mixins;
import java.awt.Polygon;
import java.awt.geom.Area;
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.coords.Angle;
import net.runelite.api.coords.LocalPoint;
import java.awt.Polygon;
import java.awt.geom.Area;
import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Shadow;
import net.runelite.api.model.Triangle;
import net.runelite.api.model.Vertex;
import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSEntity;
import net.runelite.rs.api.RSGameObject;
@@ -85,6 +90,89 @@ public abstract class RSGameObjectMixin implements RSGameObject
return Perspective.getClickbox(client, getModel(), getRsOrientation(), getLocalLocation());
}
@Inject
@Override
public Polygon[] getPolygons()
{
Model model = getModel();
if (model == null)
{
return null;
}
int localX = getX();
int localY = getY();
int orientation = getRsOrientation();
final int tileHeight = Perspective.getTileHeight(client, new LocalPoint(localX, localY), client.getPlane());
List<Triangle> triangles = model.getTriangles();
triangles = rotate(triangles, orientation);
List<Polygon> polys = new ArrayList<Polygon>();
for (Triangle triangle : triangles)
{
Vertex vx = triangle.getA();
Vertex vy = triangle.getB();
Vertex vz = triangle.getC();
Point x = Perspective.localToCanvas(client,
localX - vx.getX(),
localY - vx.getZ(),
tileHeight + vx.getY());
Point y = Perspective.localToCanvas(client,
localX - vy.getX(),
localY - vy.getZ(),
tileHeight + vy.getY());
Point z = Perspective.localToCanvas(client,
localX - vz.getX(),
localY - vz.getZ(),
tileHeight + vz.getY());
if (x == null || y == null || z == null)
{
return null;
}
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[0]);
}
@Inject
private List<Triangle> rotate(List<Triangle> triangles, int orientation)
{
List<Triangle> rotatedTriangles = new ArrayList<Triangle>();
for (Triangle triangle : triangles)
{
Vertex a = triangle.getA();
Vertex b = triangle.getB();
Vertex c = triangle.getC();
Triangle rotatedTriangle = new Triangle(
a.rotate(orientation),
b.rotate(orientation),
c.rotate(orientation)
);
rotatedTriangles.add(rotatedTriangle);
}
return rotatedTriangles;
}
@Inject
@Override
public Polygon getConvexHull()