From cac1b15c33a9d9c4c0f3e26dce98f971dec7cae5 Mon Sep 17 00:00:00 2001 From: Dennis Date: Wed, 25 Jul 2018 00:09:36 +0200 Subject: [PATCH] runelite-mixins: add depth to hd minimap --- .../net/runelite/mixins/RSSceneMixin.java | 269 ++++++++++++++++-- .../java/net/runelite/rs/api/RSClient.java | 4 - .../java/net/runelite/rs/api/RSScene.java | 6 + 3 files changed, 254 insertions(+), 25 deletions(-) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java index 44e3d46697..ab689582ad 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java @@ -51,20 +51,23 @@ import net.runelite.rs.api.RSWallDecoration; @Mixin(RSScene.class) public abstract class RSSceneMixin implements RSScene { + private static final int INVALID_HSL_COLOR = 12345678; private static final int DEFAULT_DISTANCE = 25; - private static final int MAX_DISTANCE = 90; - private static final int PITCH_LOWER_LIMIT = 128; private static final int PITCH_UPPER_LIMIT = 383; - private static final int MAX_TARGET_DISTANCE = 45; - @Shadow("client") static RSClient client; @Shadow("pitchRelaxEnabled") private static boolean pitchRelaxEnabled; + @Shadow("hdMinimapEnabled") + private static boolean hdMinimapEnabled; + + @Shadow("Rasterizer3D_colorPalette") + private static int[] colorPalette; + @Inject private static int[] tmpX = new int[6]; @@ -631,15 +634,15 @@ public abstract class RSSceneMixin implements RSScene return; } - RSTileModel sceneTileModel = (RSTileModel) tile; + RSTileModel TileModel = (RSTileModel) tile; - final int[] faceX = sceneTileModel.getFaceX(); - final int[] faceY = sceneTileModel.getFaceY(); - final int[] faceZ = sceneTileModel.getFaceZ(); + final int[] faceX = TileModel.getFaceX(); + final int[] faceY = TileModel.getFaceY(); + final int[] faceZ = TileModel.getFaceZ(); - final int[] vertexX = sceneTileModel.getVertexX(); - final int[] vertexY = sceneTileModel.getVertexY(); - final int[] vertexZ = sceneTileModel.getVertexZ(); + final int[] vertexX = TileModel.getVertexX(); + final int[] vertexY = TileModel.getVertexY(); + final int[] vertexZ = TileModel.getVertexZ(); final int vertexCount = vertexX.length; final int faceCount = faceX.length; @@ -715,7 +718,7 @@ public abstract class RSSceneMixin implements RSScene } @Inject - static void setTargetTile(int targetX, int targetY) + private static void setTargetTile(int targetX, int targetY) { client.setSelectedSceneTileX(targetX); client.setSelectedSceneTileY(targetY); @@ -799,17 +802,241 @@ public abstract class RSSceneMixin implements RSScene if (shape != 0 && shape != 1) { Tile tile = getTiles()[z][x][y]; - TileModel sceneTileModel = tile.getTileModel(); + TileModel TileModel = tile.getTileModel(); - sceneTileModel.setUnderlaySwColor(underlaySwColor); - sceneTileModel.setUnderlaySeColor(underlaySeColor); - sceneTileModel.setUnderlayNeColor(underlayNeColor); - sceneTileModel.setUnderlayNwColor(underlayNwColor); + TileModel.setUnderlaySwColor(underlaySwColor); + TileModel.setUnderlaySeColor(underlaySeColor); + TileModel.setUnderlayNeColor(underlayNeColor); + TileModel.setUnderlayNwColor(underlayNwColor); - sceneTileModel.setOverlaySwColor(overlaySwColor); - sceneTileModel.setOverlaySeColor(overlaySeColor); - sceneTileModel.setOverlayNeColor(overlayNeColor); - sceneTileModel.setOverlayNwColor(overlayNwColor); + TileModel.setOverlaySwColor(overlaySwColor); + TileModel.setOverlaySeColor(overlaySeColor); + TileModel.setOverlayNeColor(overlayNeColor); + TileModel.setOverlayNwColor(overlayNwColor); + } + } + + @Copy("drawTileMinimap") + abstract void rs$drawTile(int[] pixels, int pixelOffset, int width, int z, int x, int y); + + @Replace("drawTileMinimap") + public void rl$drawTile(int[] pixels, int pixelOffset, int width, int z, int x, int y) + { + if (!hdMinimapEnabled) + { + rs$drawTile(pixels, pixelOffset, width, z, x, y); + return; + } + Tile tile = getTiles()[z][x][y]; + if (tile != null) + { + TilePaint TilePaint = tile.getTilePaint(); + if (TilePaint != null) + { + int rgb = TilePaint.getRBG(); + if (TilePaint.getSwColor() != INVALID_HSL_COLOR) + { + // hue and saturation + int hs = TilePaint.getSwColor() & ~0x7f; + int nwLightness = TilePaint.getNwColor() & 0x7f; + int neLightness = TilePaint.getNeColor() & 0x7f; + int deltaSwLightness = (TilePaint.getSwColor() & 0x7f) - nwLightness; + int deltaSeLightness = (TilePaint.getSeColor() & 0x7f) - neLightness; + nwLightness <<= 2; + neLightness <<= 2; + for (int i = 0; i < 4; i++) + { + if (TilePaint.getTexture() == -1) + { + pixels[pixelOffset] = colorPalette[hs | nwLightness >> 2]; + pixels[pixelOffset + 1] = colorPalette[hs | nwLightness * 3 + neLightness >> 4]; + pixels[pixelOffset + 2] = colorPalette[hs | nwLightness + neLightness >> 3]; + pixels[pixelOffset + 3] = colorPalette[hs | nwLightness + neLightness * 3 >> 4]; + } + else + { + int lig = 0xff - ((nwLightness >> 1) * (nwLightness >> 1) >> 8); + pixels[pixelOffset] = ((rgb & 0xff00ff) * lig & ~0xff00ff) + ((rgb & 0xff00) * lig & 0xff0000) >> 8; + lig = 0xff - ((nwLightness * 3 + neLightness >> 3) * (nwLightness * 3 + neLightness >> 3) >> 8); + pixels[pixelOffset + 1] = ((rgb & 0xff00ff) * lig & ~0xff00ff) + ((rgb & 0xff00) * lig & 0xff0000) >> 8; + lig = 0xff - ((nwLightness + neLightness >> 2) * (nwLightness + neLightness >> 2) >> 8); + pixels[pixelOffset + 2] = ((rgb & 0xff00ff) * lig & ~0xff00ff) + ((rgb & 0xff00) * lig & 0xff0000) >> 8; + lig = 0xff - ((nwLightness + neLightness * 3 >> 3) * (nwLightness + neLightness * 3 >> 3) >> 8); + pixels[pixelOffset + 3] = ((rgb & 0xff00ff) * lig & ~0xff00ff) + ((rgb & 0xff00) * lig & 0xff0000) >> 8; + } + nwLightness += deltaSwLightness; + neLightness += deltaSeLightness; + + pixelOffset += width; + } + } + else if (rgb != 0) + { + for (int i = 0; i < 4; i++) + { + pixels[pixelOffset] = rgb; + pixels[pixelOffset + 1] = rgb; + pixels[pixelOffset + 2] = rgb; + pixels[pixelOffset + 3] = rgb; + pixelOffset += width; + } + } + } + else + { + TileModel TileModel = tile.getTileModel(); + if (TileModel != null) + { + int shape = TileModel.getShape(); + int rotation = TileModel.getRotation(); + int overlayRgb = TileModel.getModelOverlay(); + int underlayRgb = TileModel.getModelUnderlay(); + int[] points = getTileShape2D()[shape]; + int[] indices = getTileRotation2D()[rotation]; + + int shapeOffset = 0; + + if (TileModel.getOverlaySwColor() != INVALID_HSL_COLOR) + { + // hue and saturation + int hs = TileModel.getOverlaySwColor() & ~0x7f; + int nwLightness = TileModel.getOverlayNwColor() & 0x7f; + int neLightness = TileModel.getOverlayNeColor() & 0x7f; + int deltaSwLightness = (TileModel.getOverlaySwColor() & 0x7f) - nwLightness; + int deltaSeLightness = (TileModel.getOverlaySeColor() & 0x7f) - neLightness; + nwLightness <<= 2; + neLightness <<= 2; + for (int i = 0; i < 4; i++) + { + if (TileModel.getTriangleTextureId() == null) + { + if (points[indices[shapeOffset++]] != 0) + { + pixels[pixelOffset] = colorPalette[hs | (nwLightness >> 2)]; + } + if (points[indices[shapeOffset++]] != 0) + { + pixels[pixelOffset + 1] = colorPalette[hs | (nwLightness * 3 + neLightness >> 4)]; + } + if (points[indices[shapeOffset++]] != 0) + { + pixels[pixelOffset + 2] = colorPalette[hs | (nwLightness + neLightness >> 3)]; + } + if (points[indices[shapeOffset++]] != 0) + { + pixels[pixelOffset + 3] = colorPalette[hs | (nwLightness + neLightness * 3 >> 4)]; + } + } + else + { + if (points[indices[shapeOffset++]] != 0) + { + int lig = 0xff - ((nwLightness >> 1) * (nwLightness >> 1) >> 8); + pixels[pixelOffset] = ((overlayRgb & 0xff00ff) * lig & ~0xff00ff) + + ((overlayRgb & 0xff00) * lig & 0xff0000) >> 8; + } + if (points[indices[shapeOffset++]] != 0) + { + int lig = 0xff - ((nwLightness * 3 + neLightness >> 3) * + (nwLightness * 3 + neLightness >> 3) >> 8); + pixels[pixelOffset + 1] = ((overlayRgb & 0xff00ff) * lig & ~0xff00ff) + + ((overlayRgb & 0xff00) * lig & 0xff0000) >> 8; + } + if (points[indices[shapeOffset++]] != 0) + { + int lig = 0xff - ((nwLightness + neLightness >> 2) * + (nwLightness + neLightness >> 2) >> 8); + pixels[pixelOffset + 2] = ((overlayRgb & 0xff00ff) * lig & ~0xff00ff) + + ((overlayRgb & 0xff00) * lig & 0xff0000) >> 8; + } + if (points[indices[shapeOffset++]] != 0) + { + int lig = 0xff - ((nwLightness + neLightness * 3 >> 3) * + (nwLightness + neLightness * 3 >> 3) >> 8); + pixels[pixelOffset + 3] = ((overlayRgb & 0xff00ff) * lig & ~0xff00ff) + + ((overlayRgb & 0xff00) * lig & 0xff0000) >> 8; + } + } + nwLightness += deltaSwLightness; + neLightness += deltaSeLightness; + + pixelOffset += width; + } + if (underlayRgb != 0 && TileModel.getUnderlaySwColor() != INVALID_HSL_COLOR) + { + pixelOffset -= width << 2; + shapeOffset -= 16; + hs = TileModel.getUnderlaySwColor() & ~0x7f; + nwLightness = TileModel.getUnderlayNwColor() & 0x7f; + neLightness = TileModel.getUnderlayNeColor() & 0x7f; + deltaSwLightness = (TileModel.getUnderlaySwColor() & 0x7f) - nwLightness; + deltaSeLightness = (TileModel.getUnderlaySeColor() & 0x7f) - neLightness; + nwLightness <<= 2; + neLightness <<= 2; + for (int i = 0; i < 4; i++) + { + if (points[indices[shapeOffset++]] == 0) + { + pixels[pixelOffset] = colorPalette[hs | (nwLightness >> 2)]; + } + if (points[indices[shapeOffset++]] == 0) + { + pixels[pixelOffset + 1] = colorPalette[hs | (nwLightness * 3 + neLightness >> 4)]; + } + if (points[indices[shapeOffset++]] == 0) + { + pixels[pixelOffset + 2] = colorPalette[hs | (nwLightness + neLightness >> 3)]; + } + if (points[indices[shapeOffset++]] == 0) + { + pixels[pixelOffset + 3] = colorPalette[hs | (nwLightness + neLightness * 3 >> 4)]; + } + nwLightness += deltaSwLightness; + neLightness += deltaSeLightness; + + pixelOffset += width; + } + } + } + else if (underlayRgb != 0) + { + for (int i = 0; i < 4; i++) + { + pixels[pixelOffset] = points[indices[shapeOffset++]] != 0 ? overlayRgb : underlayRgb; + pixels[pixelOffset + 1] = + points[indices[shapeOffset++]] != 0 ? overlayRgb : underlayRgb; + pixels[pixelOffset + 2] = + points[indices[shapeOffset++]] != 0 ? overlayRgb : underlayRgb; + pixels[pixelOffset + 3] = + points[indices[shapeOffset++]] != 0 ? overlayRgb : underlayRgb; + pixelOffset += width; + } + } + else + { + for (int i = 0; i < 4; i++) + { + if (points[indices[shapeOffset++]] != 0) + { + pixels[pixelOffset] = overlayRgb; + } + if (points[indices[shapeOffset++]] != 0) + { + pixels[pixelOffset + 1] = overlayRgb; + } + if (points[indices[shapeOffset++]] != 0) + { + pixels[pixelOffset + 2] = overlayRgb; + } + if (points[indices[shapeOffset++]] != 0) + { + pixels[pixelOffset + 3] = overlayRgb; + } + pixelOffset += width; + } + } + } + } } } } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java index b14f2e662b..518ac112a3 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java @@ -472,10 +472,6 @@ public interface RSClient extends RSGameShell, Client @Override int getGameCycle(); - // unused - //@Import("packetHandler") - //void packetHandler(); - @Import("Messages_channels") @Override Map getChatLineMap(); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSScene.java b/runescape-api/src/main/java/net/runelite/rs/api/RSScene.java index 73e306a680..84d6d058eb 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSScene.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSScene.java @@ -13,6 +13,12 @@ public interface RSScene extends Scene @Override RSTile[][][] getTiles(); + @Import("tileShape2D") + int[][] getTileShape2D(); + + @Import("tileRotation2D") + int[][] getTileRotation2D(); + @Import("drawTile") void draw(Tile tile, boolean var2);