Merge pull request #8346 from Abextm/fix-contouring
mixins: Fix convex hulls being incorrectly contoured
This commit is contained in:
@@ -54,6 +54,7 @@ public class Perspective
|
|||||||
|
|
||||||
public static final int LOCAL_COORD_BITS = 7;
|
public static final int LOCAL_COORD_BITS = 7;
|
||||||
public static final int LOCAL_TILE_SIZE = 1 << LOCAL_COORD_BITS; // 128 - size of a tile in local coordinates
|
public static final int LOCAL_TILE_SIZE = 1 << LOCAL_COORD_BITS; // 128 - size of a tile in local coordinates
|
||||||
|
public static final int LOCAL_HALF_TILE_SIZE = LOCAL_TILE_SIZE / 2;
|
||||||
|
|
||||||
public static final int SCENE_SIZE = Constants.SCENE_SIZE; // in tiles
|
public static final int SCENE_SIZE = Constants.SCENE_SIZE; // in tiles
|
||||||
|
|
||||||
@@ -114,7 +115,7 @@ public class Perspective
|
|||||||
* @return a {@link Point} on screen corresponding to the position in
|
* @return a {@link Point} on screen corresponding to the position in
|
||||||
* 3D-space
|
* 3D-space
|
||||||
*/
|
*/
|
||||||
private static Point localToCanvas(@Nonnull Client client, int x, int y, int z)
|
public static Point localToCanvas(@Nonnull Client client, int x, int y, int z)
|
||||||
{
|
{
|
||||||
if (x >= 128 && y >= 128 && x <= 13056 && y <= 13056)
|
if (x >= 128 && y >= 128 && x <= 13056 && y <= 13056)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ import net.runelite.rs.api.RSCombatInfo1;
|
|||||||
import net.runelite.rs.api.RSCombatInfo2;
|
import net.runelite.rs.api.RSCombatInfo2;
|
||||||
import net.runelite.rs.api.RSCombatInfoList;
|
import net.runelite.rs.api.RSCombatInfoList;
|
||||||
import net.runelite.rs.api.RSCombatInfoListHolder;
|
import net.runelite.rs.api.RSCombatInfoListHolder;
|
||||||
import net.runelite.rs.api.RSModel;
|
|
||||||
import net.runelite.rs.api.RSNPC;
|
import net.runelite.rs.api.RSNPC;
|
||||||
import net.runelite.rs.api.RSNode;
|
import net.runelite.rs.api.RSNode;
|
||||||
|
|
||||||
@@ -221,18 +220,6 @@ public abstract class RSActorMixin implements RSActor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject
|
|
||||||
@Override
|
|
||||||
public Polygon getConvexHull()
|
|
||||||
{
|
|
||||||
RSModel model = getModel();
|
|
||||||
if (model == null)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return model.getConvexHull(getX(), getY(), getOrientation());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@Override
|
@Override
|
||||||
public WorldArea getWorldArea()
|
public WorldArea getWorldArea()
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import java.awt.Polygon;
|
|||||||
import java.awt.geom.Area;
|
import java.awt.geom.Area;
|
||||||
import net.runelite.api.Model;
|
import net.runelite.api.Model;
|
||||||
import net.runelite.api.Perspective;
|
import net.runelite.api.Perspective;
|
||||||
|
import net.runelite.api.coords.LocalPoint;
|
||||||
import net.runelite.api.mixins.Inject;
|
import net.runelite.api.mixins.Inject;
|
||||||
import net.runelite.api.mixins.Mixin;
|
import net.runelite.api.mixins.Mixin;
|
||||||
import net.runelite.api.mixins.Shadow;
|
import net.runelite.api.mixins.Shadow;
|
||||||
@@ -123,7 +124,8 @@ public abstract class RSDecorativeObjectMixin implements RSDecorativeObject
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return model.getConvexHull(getX() + getXOffset(), getY() + getYOffset(), 0);
|
int tileHeight = Perspective.getTileHeight(client, new LocalPoint(getX(), getY()), client.getPlane());
|
||||||
|
return model.getConvexHull(getX() + getXOffset(), getY() + getYOffset(), 0, tileHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@@ -137,6 +139,7 @@ public abstract class RSDecorativeObjectMixin implements RSDecorativeObject
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return model.getConvexHull(getX(), getY(), 0);
|
int tileHeight = Perspective.getTileHeight(client, new LocalPoint(getX(), getY()), client.getPlane());
|
||||||
|
return model.getConvexHull(getX(), getY(), 0, tileHeight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import java.awt.geom.Area;
|
|||||||
import net.runelite.api.Perspective;
|
import net.runelite.api.Perspective;
|
||||||
import net.runelite.api.Point;
|
import net.runelite.api.Point;
|
||||||
import net.runelite.api.coords.Angle;
|
import net.runelite.api.coords.Angle;
|
||||||
|
import net.runelite.api.coords.LocalPoint;
|
||||||
import net.runelite.api.mixins.Inject;
|
import net.runelite.api.mixins.Inject;
|
||||||
import net.runelite.api.mixins.Mixin;
|
import net.runelite.api.mixins.Mixin;
|
||||||
import net.runelite.api.mixins.Shadow;
|
import net.runelite.api.mixins.Shadow;
|
||||||
@@ -94,7 +95,8 @@ public abstract class RSGameObjectMixin implements RSGameObject
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return model.getConvexHull(getX(), getY(), getRsOrientation());
|
int tileHeight = Perspective.getTileHeight(client, new LocalPoint(getX(), getY()), client.getPlane());
|
||||||
|
return model.getConvexHull(getX(), getY(), getRsOrientation(), tileHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ import java.util.List;
|
|||||||
import net.runelite.api.Model;
|
import net.runelite.api.Model;
|
||||||
import net.runelite.api.Perspective;
|
import net.runelite.api.Perspective;
|
||||||
import net.runelite.api.Point;
|
import net.runelite.api.Point;
|
||||||
import net.runelite.api.coords.LocalPoint;
|
|
||||||
import net.runelite.api.mixins.Copy;
|
import net.runelite.api.mixins.Copy;
|
||||||
import net.runelite.api.mixins.Inject;
|
import net.runelite.api.mixins.Inject;
|
||||||
import net.runelite.api.mixins.MethodHook;
|
import net.runelite.api.mixins.MethodHook;
|
||||||
@@ -323,7 +322,7 @@ public abstract class RSModelMixin implements RSModel
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Inject
|
@Inject
|
||||||
public Polygon getConvexHull(int localX, int localY, int orientation)
|
public Polygon getConvexHull(int localX, int localY, int orientation, int tileHeight)
|
||||||
{
|
{
|
||||||
List<Vertex> vertices = getVertices();
|
List<Vertex> vertices = getVertices();
|
||||||
|
|
||||||
@@ -340,9 +339,9 @@ public abstract class RSModelMixin implements RSModel
|
|||||||
{
|
{
|
||||||
// Compute canvas location of vertex
|
// Compute canvas location of vertex
|
||||||
Point p = Perspective.localToCanvas(client,
|
Point p = Perspective.localToCanvas(client,
|
||||||
new LocalPoint(localX - v.getX(), localY - v.getZ()),
|
localX - v.getX(),
|
||||||
client.getPlane(),
|
localY - v.getZ(),
|
||||||
-v.getY());
|
tileHeight + v.getY());
|
||||||
if (p != null)
|
if (p != null)
|
||||||
{
|
{
|
||||||
points.add(p);
|
points.add(p);
|
||||||
|
|||||||
@@ -24,8 +24,11 @@
|
|||||||
*/
|
*/
|
||||||
package net.runelite.mixins;
|
package net.runelite.mixins;
|
||||||
|
|
||||||
|
import java.awt.Polygon;
|
||||||
import net.runelite.api.AnimationID;
|
import net.runelite.api.AnimationID;
|
||||||
import net.runelite.api.NPCComposition;
|
import net.runelite.api.NPCComposition;
|
||||||
|
import net.runelite.api.Perspective;
|
||||||
|
import net.runelite.api.coords.LocalPoint;
|
||||||
import net.runelite.api.events.NpcDespawned;
|
import net.runelite.api.events.NpcDespawned;
|
||||||
import net.runelite.api.mixins.Copy;
|
import net.runelite.api.mixins.Copy;
|
||||||
import net.runelite.api.mixins.FieldHook;
|
import net.runelite.api.mixins.FieldHook;
|
||||||
@@ -167,4 +170,23 @@ public abstract class RSNPCMixin implements RSNPC
|
|||||||
{
|
{
|
||||||
this.dead = dead;
|
this.dead = dead;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
@Override
|
||||||
|
public Polygon getConvexHull()
|
||||||
|
{
|
||||||
|
RSModel model = getModel();
|
||||||
|
if (model == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
int size = getComposition().getSize();
|
||||||
|
LocalPoint tileHeightPoint = new LocalPoint(
|
||||||
|
size * Perspective.LOCAL_HALF_TILE_SIZE - Perspective.LOCAL_HALF_TILE_SIZE + getX(),
|
||||||
|
size * Perspective.LOCAL_HALF_TILE_SIZE - Perspective.LOCAL_HALF_TILE_SIZE + getY());
|
||||||
|
|
||||||
|
int tileHeight = Perspective.getTileHeight(client, tileHeightPoint, client.getPlane());
|
||||||
|
return model.getConvexHull(getX(), getY(), getOrientation(), tileHeight);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -155,6 +155,8 @@ public abstract class RSPlayerMixin implements RSPlayer
|
|||||||
|
|
||||||
int orientation = getOrientation();
|
int orientation = getOrientation();
|
||||||
|
|
||||||
|
final int tileHeight = Perspective.getTileHeight(client, new LocalPoint(localX, localY), client.getPlane());
|
||||||
|
|
||||||
List<Triangle> triangles = model.getTriangles();
|
List<Triangle> triangles = model.getTriangles();
|
||||||
|
|
||||||
triangles = rotate(triangles, orientation);
|
triangles = rotate(triangles, orientation);
|
||||||
@@ -167,25 +169,25 @@ public abstract class RSPlayerMixin implements RSPlayer
|
|||||||
Vertex vz = triangle.getC();
|
Vertex vz = triangle.getC();
|
||||||
|
|
||||||
Point x = Perspective.localToCanvas(client,
|
Point x = Perspective.localToCanvas(client,
|
||||||
new LocalPoint(localX - vx.getX(), localY - vx.getZ()),
|
localX - vx.getX(),
|
||||||
client.getPlane(),
|
localY - vx.getZ(),
|
||||||
-vx.getY());
|
tileHeight + vx.getY());
|
||||||
|
|
||||||
Point y = Perspective.localToCanvas(client,
|
Point y = Perspective.localToCanvas(client,
|
||||||
new LocalPoint(localX - vy.getX(), localY - vy.getZ()),
|
localX - vy.getX(),
|
||||||
client.getPlane(),
|
localY - vy.getZ(),
|
||||||
-vy.getY());
|
tileHeight + vy.getY());
|
||||||
|
|
||||||
Point z = Perspective.localToCanvas(client,
|
Point z = Perspective.localToCanvas(client,
|
||||||
new LocalPoint(localX - vz.getX(), localY - vz.getZ()),
|
localX - vz.getX(),
|
||||||
client.getPlane(),
|
localY - vz.getZ(),
|
||||||
-vz.getY());
|
tileHeight + vz.getY());
|
||||||
|
|
||||||
int xx[] =
|
int[] xx =
|
||||||
{
|
{
|
||||||
x.getX(), y.getX(), z.getX()
|
x.getX(), y.getX(), z.getX()
|
||||||
};
|
};
|
||||||
int yy[] =
|
int[] yy =
|
||||||
{
|
{
|
||||||
x.getY(), y.getY(), z.getY()
|
x.getY(), y.getY(), z.getY()
|
||||||
};
|
};
|
||||||
@@ -195,6 +197,20 @@ public abstract class RSPlayerMixin implements RSPlayer
|
|||||||
return polys.toArray(new Polygon[polys.size()]);
|
return polys.toArray(new Polygon[polys.size()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
@Override
|
||||||
|
public Polygon getConvexHull()
|
||||||
|
{
|
||||||
|
RSModel model = getModel();
|
||||||
|
if (model == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tileHeight = Perspective.getTileHeight(client, new LocalPoint(getX(), getY()), client.getPlane());
|
||||||
|
return model.getConvexHull(getX(), getY(), getOrientation(), tileHeight);
|
||||||
|
}
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private List<Triangle> rotate(List<Triangle> triangles, int orientation)
|
private List<Triangle> rotate(List<Triangle> triangles, int orientation)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -162,12 +162,8 @@ public interface RSModel extends RSRenderable, Model
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute the convex hull of this model
|
* Compute the convex hull of this model
|
||||||
* @param localX
|
|
||||||
* @param localY
|
|
||||||
* @param orientation
|
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
Polygon getConvexHull(int localX, int localY, int orientation);
|
Polygon getConvexHull(int localX, int localY, int orientation, int tileHeight);
|
||||||
|
|
||||||
float[][] getFaceTextureUCoordinates();
|
float[][] getFaceTextureUCoordinates();
|
||||||
void setFaceTextureUCoordinates(float[][] rl$faceTextureUCoordinates);
|
void setFaceTextureUCoordinates(float[][] rl$faceTextureUCoordinates);
|
||||||
|
|||||||
Reference in New Issue
Block a user