Search in sources :

Example 1 with Vertex

use of net.runelite.api.model.Vertex in project runelite by runelite.

the class RSPlayerMixin method getPolygons.

@Inject
@Override
public Polygon[] getPolygons() {
    Model model = getModel();
    if (model == null) {
        return null;
    }
    int localX = getX();
    int localY = getY();
    int orientation = getOrientation();
    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.worldToCanvas(client, localX - vx.getX(), localY - vx.getZ(), -vx.getY());
        Point y = Perspective.worldToCanvas(client, localX - vy.getX(), localY - vy.getZ(), -vy.getY());
        Point z = Perspective.worldToCanvas(client, localX - vz.getX(), localY - vz.getZ(), -vz.getY());
        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()]);
}
Also used : Vertex(net.runelite.api.model.Vertex) Model(net.runelite.api.Model) Triangle(net.runelite.api.model.Triangle) ArrayList(java.util.ArrayList) Point(net.runelite.api.Point) Polygon(java.awt.Polygon) Point(net.runelite.api.Point) Inject(net.runelite.api.mixins.Inject)

Example 2 with Vertex

use of net.runelite.api.model.Vertex in project runelite by runelite.

the class RSModelMixin method getConvexHull.

@Override
@Inject
public Polygon getConvexHull(int localX, int localY, int orientation) {
    List<Vertex> vertices = getVertices();
    // rotate vertices
    for (int i = 0; i < vertices.size(); ++i) {
        Vertex v = vertices.get(i);
        vertices.set(i, v.rotate(orientation));
    }
    List<Point> points = new ArrayList<Point>();
    for (Vertex v : vertices) {
        // Compute canvas location of vertex
        Point p = Perspective.worldToCanvas(client, localX - v.getX(), localY - v.getZ(), -v.getY());
        if (p != null) {
            points.add(p);
        }
    }
    // Run Jarvis march algorithm
    points = Jarvis.convexHull(points);
    if (points == null) {
        return null;
    }
    // Convert to a polygon
    Polygon p = new Polygon();
    for (Point point : points) {
        p.addPoint(point.getX(), point.getY());
    }
    return p;
}
Also used : Vertex(net.runelite.api.model.Vertex) ArrayList(java.util.ArrayList) Point(net.runelite.api.Point) Polygon(java.awt.Polygon) Point(net.runelite.api.Point) Inject(net.runelite.api.mixins.Inject)

Example 3 with Vertex

use of net.runelite.api.model.Vertex in project runelite by runelite.

the class Perspective method getAABB.

private static Area getAABB(Client client, List<Vertex> vertices, int orientation, int tileX, int tileY) {
    int maxX = 0;
    int minX = 0;
    int maxY = 0;
    int minY = 0;
    int maxZ = 0;
    int minZ = 0;
    for (Vertex vertex : vertices) {
        int x = vertex.getX();
        int y = vertex.getY();
        int z = vertex.getZ();
        if (x > maxX) {
            maxX = x;
        }
        if (x < minX) {
            minX = x;
        }
        if (y > maxY) {
            maxY = y;
        }
        if (y < minY) {
            minY = y;
        }
        if (z > maxZ) {
            maxZ = z;
        }
        if (z < minZ) {
            minZ = z;
        }
    }
    int centerX = (minX + maxX) / 2;
    int centerY = (minY + maxY) / 2;
    int centerZ = (minZ + maxZ) / 2;
    int extremeX = (maxX - minX + 1) / 2;
    int extremeY = (maxY - minY + 1) / 2;
    int extremeZ = (maxZ - minZ + 1) / 2;
    if (extremeX < 32) {
        extremeX = 32;
    }
    if (extremeZ < 32) {
        extremeZ = 32;
    }
    int x1 = tileX - (centerX - extremeX);
    int y1 = centerY - extremeY;
    int z1 = tileY - (centerZ - extremeZ);
    int x2 = tileX - (centerX + extremeX);
    int y2 = centerY + extremeY;
    int z2 = tileY - (centerZ + extremeZ);
    Point p1 = worldToCanvas(client, x1, z1, -y1, tileX, tileY);
    Point p2 = worldToCanvas(client, x1, z2, -y1, tileX, tileY);
    Point p3 = worldToCanvas(client, x2, z2, -y1, tileX, tileY);
    Point p4 = worldToCanvas(client, x2, z1, -y1, tileX, tileY);
    Point p5 = worldToCanvas(client, x1, z1, -y2, tileX, tileY);
    Point p6 = worldToCanvas(client, x1, z2, -y2, tileX, tileY);
    Point p7 = worldToCanvas(client, x2, z2, -y2, tileX, tileY);
    Point p8 = worldToCanvas(client, x2, z1, -y2, tileX, tileY);
    List<Point> points = new ArrayList<>(8);
    points.add(p1);
    points.add(p2);
    points.add(p3);
    points.add(p4);
    points.add(p5);
    points.add(p6);
    points.add(p7);
    points.add(p8);
    try {
        points = Jarvis.convexHull(points);
    } catch (NullPointerException e) {
        // No non-null screen points for this AABB e.g. for an way off-screen model
        return null;
    }
    if (points == null) {
        return null;
    }
    Polygon hull = new Polygon();
    for (Point p : points) {
        if (p != null) {
            hull.addPoint(p.getX(), p.getY());
        }
    }
    return new Area(hull);
}
Also used : Vertex(net.runelite.api.model.Vertex) Area(java.awt.geom.Area) ArrayList(java.util.ArrayList) LocalPoint(net.runelite.api.coords.LocalPoint) Polygon(java.awt.Polygon) LocalPoint(net.runelite.api.coords.LocalPoint)

Example 4 with Vertex

use of net.runelite.api.model.Vertex in project runelite by runelite.

the class Perspective method get2DGeometry.

private static Area get2DGeometry(Client client, List<Triangle> triangles, int orientation, int tileX, int tileY) {
    int radius = 5;
    Area geometry = new Area();
    for (Triangle triangle : triangles) {
        Vertex _a = triangle.getA();
        Point a = worldToCanvas(client, tileX - _a.getX(), tileY - _a.getZ(), -_a.getY(), tileX, tileY);
        if (a == null) {
            continue;
        }
        Vertex _b = triangle.getB();
        Point b = worldToCanvas(client, tileX - _b.getX(), tileY - _b.getZ(), -_b.getY(), tileX, tileY);
        if (b == null) {
            continue;
        }
        Vertex _c = triangle.getC();
        Point c = worldToCanvas(client, tileX - _c.getX(), tileY - _c.getZ(), -_c.getY(), tileX, tileY);
        if (c == null) {
            continue;
        }
        int minX = Math.min(Math.min(a.getX(), b.getX()), c.getX());
        int minY = Math.min(Math.min(a.getY(), b.getY()), c.getY());
        // For some reason, this calculation is always 4 pixels short of the actual in-client one
        int maxX = Math.max(Math.max(a.getX(), b.getX()), c.getX()) + client.getViewportXOffset();
        int maxY = Math.max(Math.max(a.getY(), b.getY()), c.getY()) + client.getViewportYOffset();
        // ...and the rectangles in the fixed client are shifted 4 pixels right and down
        if (!client.isResized()) {
            minX += 4;
            minY += 4;
            maxX += 4;
            maxY += 4;
        }
        Rectangle clickableRect = new Rectangle(minX - radius, minY - radius, maxX - minX + radius, maxY - minY + radius);
        geometry.add(new Area(clickableRect));
    }
    return geometry;
}
Also used : Vertex(net.runelite.api.model.Vertex) Area(java.awt.geom.Area) Triangle(net.runelite.api.model.Triangle) Rectangle(java.awt.Rectangle) LocalPoint(net.runelite.api.coords.LocalPoint) LocalPoint(net.runelite.api.coords.LocalPoint)

Example 5 with Vertex

use of net.runelite.api.model.Vertex in project runelite by runelite.

the class Perspective method getClickbox.

/**
 * You don't want this. Use {@link TileObject#getClickbox()} instead
 *
 * Get the on-screen clickable area of {@code model} as though it's for the object on the tile at
 * 	({@code tileX}, {@code tileY}) and rotated to angle {@code orientation}
 *
 * @param client
 * @param model the model to calculate a clickbox for
 * @param orientation the orientation of the model (0-2048, where 0 is north)
 * @param tileX the X coordinate of the tile that the object using the model is on
 * @param tileY the Y coordinate of the tile that the object using the model is on
 * @return the clickable area of {@code model}, rotated to angle {@code orientation}, at the height of tile ({@code tileX}, {@code tileY})
 */
public static Area getClickbox(Client client, Model model, int orientation, int tileX, int tileY) {
    if (model == null) {
        return null;
    }
    List<Triangle> triangles = model.getTriangles().stream().map(triangle -> triangle.rotate(orientation)).collect(Collectors.toList());
    List<Vertex> vertices = model.getVertices().stream().map(v -> v.rotate(orientation)).collect(Collectors.toList());
    Area clickBox = get2DGeometry(client, triangles, orientation, tileX, tileY);
    Area visibleAABB = getAABB(client, vertices, orientation, tileX, tileY);
    if (visibleAABB == null || clickBox == null) {
        return null;
    }
    clickBox.intersect(visibleAABB);
    return clickBox;
}
Also used : Polygon(java.awt.Polygon) Rectangle(java.awt.Rectangle) LocalPoint(net.runelite.api.coords.LocalPoint) BufferedImage(java.awt.image.BufferedImage) Vertex(net.runelite.api.model.Vertex) Area(java.awt.geom.Area) Rectangle2D(java.awt.geom.Rectangle2D) Triangle(net.runelite.api.model.Triangle) Collectors(java.util.stream.Collectors) ArrayList(java.util.ArrayList) List(java.util.List) FontMetrics(java.awt.FontMetrics) Graphics2D(java.awt.Graphics2D) Jarvis(net.runelite.api.model.Jarvis) Vertex(net.runelite.api.model.Vertex) Area(java.awt.geom.Area) Triangle(net.runelite.api.model.Triangle)

Aggregations

Vertex (net.runelite.api.model.Vertex)8 ArrayList (java.util.ArrayList)7 Inject (net.runelite.api.mixins.Inject)5 Triangle (net.runelite.api.model.Triangle)5 Polygon (java.awt.Polygon)4 Point (net.runelite.api.Point)4 Area (java.awt.geom.Area)3 LocalPoint (net.runelite.api.coords.LocalPoint)3 Rectangle (java.awt.Rectangle)2 FontMetrics (java.awt.FontMetrics)1 Graphics2D (java.awt.Graphics2D)1 Rectangle2D (java.awt.geom.Rectangle2D)1 BufferedImage (java.awt.image.BufferedImage)1 List (java.util.List)1 Collectors (java.util.stream.Collectors)1 Model (net.runelite.api.Model)1 Jarvis (net.runelite.api.model.Jarvis)1