project: Mixins for HD

This commit is contained in:
Owain van Brakel
2021-09-13 03:58:54 +02:00
parent f2a4b60840
commit 638760057e
16 changed files with 395 additions and 77 deletions

View File

@@ -29,6 +29,7 @@ import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.EnumSet;
import java.util.HashSet;
@@ -2290,5 +2291,25 @@ public abstract class RSClientMixin implements RSClient
@Inject
public static RSArchive[] archives = new RSArchive[21];
@Inject
@FieldHook("rndHue")
public static void rndHue(int idx)
{
int rndHue = client.getRndHue();
if (rndHue >= -8 && rndHue <= 8)
{
RSScene scene = client.getScene();
byte[][][] underlays = client.getTileUnderlays();
byte[][][] overlays = client.getTileOverlays();
byte[][][] tileShapes = client.getTileShapes();
scene.setUnderlayIds(Arrays.copyOf(underlays, underlays.length));
scene.setOverlayIds(Arrays.copyOf(overlays, overlays.length));
scene.setTileShapes(Arrays.copyOf(tileShapes, tileShapes.length));
}
}
}

View File

@@ -33,6 +33,7 @@ import net.runelite.api.mixins.Shadow;
import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSModel;
import net.runelite.rs.api.RSModelData;
import net.runelite.rs.api.RSVertexNormal;
@Mixin(RSModelData.class)
public abstract class RSModelDataMixin implements RSModelData
@@ -43,6 +44,15 @@ public abstract class RSModelDataMixin implements RSModelData
@Inject
private float[] faceTextureUVCoordinates;
@Inject
private int[] vertexNormalsX;
@Inject
private int[] vertexNormalsY;
@Inject
private int[] vertexNormalsZ;
@Copy("toModel")
@Replace("toModel")
@SuppressWarnings("InfiniteRecursion")
@@ -61,11 +71,50 @@ public abstract class RSModelDataMixin implements RSModelData
computeTextureUVCoordinates();
}
vertexNormals();
RSModel rsModel = (RSModel) model;
rsModel.setVertexNormalsX(vertexNormalsX);
rsModel.setVertexNormalsY(vertexNormalsY);
rsModel.setVertexNormalsZ(vertexNormalsZ);
rsModel.setFaceTextureUVCoordinates(faceTextureUVCoordinates);
return model;
}
@Inject
public void vertexNormals()
{
RSVertexNormal[] vertexNormals = getVertexNormals();
RSVertexNormal[] vertexVertices = getVertexVertices();
if (vertexNormals != null && vertexNormalsX == null)
{
int verticesCount = getVerticesCount();
vertexNormalsX = new int[verticesCount];
vertexNormalsY = new int[verticesCount];
vertexNormalsZ = new int[verticesCount];
for (int i = 0; i < verticesCount; ++i)
{
RSVertexNormal vertexNormal;
if (vertexVertices != null && (vertexNormal = vertexVertices[i]) != null)
{
vertexNormalsX[i] = vertexNormal.getX();
vertexNormalsY[i] = vertexNormal.getY();
vertexNormalsZ[i] = vertexNormal.getZ();
}
else if ((vertexNormal = vertexNormals[i]) != null)
{
vertexNormalsX[i] = vertexNormal.getX();
vertexNormalsY[i] = vertexNormal.getY();
vertexNormalsZ[i] = vertexNormal.getZ();
}
}
}
}
@Inject
public void computeTextureUVCoordinates()
{
@@ -171,6 +220,6 @@ public abstract class RSModelDataMixin implements RSModelData
}
}
this.faceTextureUVCoordinates = faceTextureUCoordinates;
faceTextureUVCoordinates = faceTextureUCoordinates;
}
}

View File

@@ -63,13 +63,22 @@ public abstract class RSModelMixin implements RSModel
@Inject
private float[] rl$faceTextureUVCoordinates;
@Inject
private int[] rl$vertexNormalsX;
@Inject
private int[] rl$vertexNormalsY;
@Inject
private int[] rl$vertexNormalsZ;
@MethodHook(value = "<init>", end = true)
@Inject
public void rl$init(RSModel[] models, int length)
{
if (this.getFaceTextures() != null)
if (getFaceTextures() != null)
{
int count = this.getTrianglesCount();
int count = getTrianglesCount();
float[] uv = new float[count * 6];
int idx = 0;
@@ -91,6 +100,8 @@ public abstract class RSModelMixin implements RSModel
setFaceTextureUVCoordinates(uv);
}
vertexNormals();
}
@Override
@@ -154,6 +165,9 @@ public abstract class RSModelMixin implements RSModel
if (model != null && model != this)
{
RSModel rsModel = (RSModel) model;
rsModel.setVertexNormalsX(rl$vertexNormalsX);
rsModel.setVertexNormalsY(rl$vertexNormalsY);
rsModel.setVertexNormalsZ(rl$vertexNormalsZ);
rsModel.setFaceTextureUVCoordinates(rl$faceTextureUVCoordinates);
}
return model;
@@ -176,6 +190,9 @@ public abstract class RSModelMixin implements RSModel
{
// Animated models are usually a shared Model instance that is global
RSModel rsModel = (RSModel) sharedModel;
rsModel.setVertexNormalsX(rl$vertexNormalsX);
rsModel.setVertexNormalsY(rl$vertexNormalsY);
rsModel.setVertexNormalsZ(rl$vertexNormalsZ);
rsModel.setFaceTextureUVCoordinates(rl$faceTextureUVCoordinates);
}
@@ -217,7 +234,7 @@ public abstract class RSModelMixin implements RSModel
for (int i = 0; i < frame.getTransformCount(); i++)
{
int type = frame.getTransformTypes()[i];
this.animate(skin.getTypes()[type], skin.getList()[type], frame.getTranslatorX()[i],
animate(skin.getTypes()[type], skin.getList()[type], frame.getTranslatorX()[i],
frame.getTranslatorY()[i], frame.getTranslatorZ()[i]);
}
}
@@ -316,10 +333,10 @@ public abstract class RSModelMixin implements RSModel
@Inject
public Shape getConvexHull(int localX, int localY, int orientation, int tileHeight)
{
int[] x2d = new int[this.getVerticesCount()];
int[] y2d = new int[this.getVerticesCount()];
int[] x2d = new int[getVerticesCount()];
int[] y2d = new int[getVerticesCount()];
Perspective.modelToCanvas(client, this.getVerticesCount(), localX, localY, tileHeight, orientation, this.getVerticesX(), this.getVerticesZ(), this.getVerticesY(), x2d, y2d);
Perspective.modelToCanvas(client, getVerticesCount(), localX, localY, tileHeight, orientation, getVerticesX(), getVerticesZ(), getVerticesY(), x2d, y2d);
return Jarvis.convexHull(x2d, y2d);
}
@@ -335,7 +352,7 @@ public abstract class RSModelMixin implements RSModel
@Override
public void setSceneId(int sceneId)
{
this.rl$sceneId = sceneId;
rl$sceneId = sceneId;
}
@Inject
@@ -377,6 +394,114 @@ public abstract class RSModelMixin implements RSModel
@Override
public void setFaceTextureUVCoordinates(float[] faceTextureUVCoordinates)
{
this.rl$faceTextureUVCoordinates = faceTextureUVCoordinates;
rl$faceTextureUVCoordinates = faceTextureUVCoordinates;
}
@Inject
public void vertexNormals()
{
if (rl$vertexNormalsX == null)
{
int verticesCount = getVerticesCount();
rl$vertexNormalsX = new int[verticesCount];
rl$vertexNormalsY = new int[verticesCount];
rl$vertexNormalsZ = new int[verticesCount];
int[] trianglesX = getTrianglesX();
int[] trianglesY = getTrianglesY();
int[] trianglesZ = getTrianglesZ();
int[] verticesX = getVerticesX();
int[] verticesY = getVerticesY();
int[] verticesZ = getVerticesZ();
for (int i = 0; i < getTrianglesCount(); ++i)
{
int var9 = trianglesX[i];
int var10 = trianglesY[i];
int var11 = trianglesZ[i];
int var12 = verticesX[var10] - verticesX[var9];
int var13 = verticesY[var10] - verticesY[var9];
int var14 = verticesZ[var10] - verticesZ[var9];
int var15 = verticesX[var11] - verticesX[var9];
int var16 = verticesY[var11] - verticesY[var9];
int var17 = verticesZ[var11] - verticesZ[var9];
int var18 = var13 * var17 - var16 * var14;
int var19 = var14 * var15 - var17 * var12;
int var20;
for (var20 = var12 * var16 - var15 * var13; var18 > 8192 || var19 > 8192 || var20 > 8192 || var18 < -8192 || var19 < -8192 || var20 < -8192; var20 >>= 1)
{
var18 >>= 1;
var19 >>= 1;
}
int var21 = (int) Math.sqrt(var18 * var18 + var19 * var19 + var20 * var20);
if (var21 <= 0)
{
var21 = 1;
}
var18 = var18 * 256 / var21;
var19 = var19 * 256 / var21;
var20 = var20 * 256 / var21;
rl$vertexNormalsX[var9] += var18;
rl$vertexNormalsY[var9] += var19;
rl$vertexNormalsZ[var9] += var20;
rl$vertexNormalsX[var10] += var18;
rl$vertexNormalsY[var10] += var19;
rl$vertexNormalsZ[var10] += var20;
rl$vertexNormalsX[var11] += var18;
rl$vertexNormalsY[var11] += var19;
rl$vertexNormalsZ[var11] += var20;
}
}
}
@Inject
@Override
public int[] getVertexNormalsX()
{
return rl$vertexNormalsX;
}
@Inject
@Override
public void setVertexNormalsX(int[] vertexNormalsX)
{
rl$vertexNormalsX = vertexNormalsX;
}
@Inject
@Override
public int[] getVertexNormalsY()
{
return rl$vertexNormalsY;
}
@Inject
@Override
public void setVertexNormalsY(int[] vertexNormalsY)
{
rl$vertexNormalsY = vertexNormalsY;
}
@Inject
@Override
public int[] getVertexNormalsZ()
{
return rl$vertexNormalsZ;
}
@Inject
@Override
public void setVertexNormalsZ(int[] vertexNormalsZ)
{
rl$vertexNormalsZ = vertexNormalsZ;
}
}

View File

@@ -99,6 +99,15 @@ public abstract class RSSceneMixin implements RSScene
@Inject
private static int rl$hoverY = -1;
@Inject
private static byte[][][] rl$underlayIds;
@Inject
private static byte[][][] rl$overlayIds;
@Inject
private static byte[][][] rl$tileShapes;
@Replace("draw")
void drawScene(int cameraX, int cameraY, int cameraZ, int cameraPitch, int cameraYaw, int plane)
{
@@ -1120,7 +1129,7 @@ public abstract class RSSceneMixin implements RSScene
Tile tile = tiles[plane][x][y];
if (tile != null && rl$tiles[plane][x][y] == 0 && blocking(plane, x, y))
{
this.iterateDeque(tile, var2);
iterateDeque(tile, var2);
++var2;
}
}
@@ -1189,4 +1198,46 @@ public abstract class RSSceneMixin implements RSScene
rl$hoverY = y;
}
}
@Inject
@Override
public byte[][][] getUnderlayIds()
{
return rl$underlayIds;
}
@Inject
@Override
public void setUnderlayIds(byte[][][] underlayIds)
{
rl$underlayIds = underlayIds;
}
@Inject
@Override
public byte[][][] getOverlayIds()
{
return rl$overlayIds;
}
@Inject
@Override
public void setOverlayIds(byte[][][] overlayIds)
{
rl$overlayIds = overlayIds;
}
@Inject
@Override
public byte[][][] getTileShapes()
{
return rl$tileShapes;
}
@Inject
@Override
public void setTileShapes(byte[][][] tileShapes)
{
rl$tileShapes = tileShapes;
}
}