Fix alpha and nw/se being swapped

This commit is contained in:
Lucwousin
2020-01-02 19:13:58 +01:00
parent 61aea62c11
commit 318e3659ca
4 changed files with 189 additions and 208 deletions

View File

@@ -53,18 +53,9 @@ import net.runelite.api.IntegerNode;
import net.runelite.api.InventoryID;
import net.runelite.api.MenuEntry;
import net.runelite.api.MenuOpcode;
import static net.runelite.api.MenuOpcode.PLAYER_EIGTH_OPTION;
import static net.runelite.api.MenuOpcode.PLAYER_FIFTH_OPTION;
import static net.runelite.api.MenuOpcode.PLAYER_FIRST_OPTION;
import static net.runelite.api.MenuOpcode.PLAYER_FOURTH_OPTION;
import static net.runelite.api.MenuOpcode.PLAYER_SECOND_OPTION;
import static net.runelite.api.MenuOpcode.PLAYER_SEVENTH_OPTION;
import static net.runelite.api.MenuOpcode.PLAYER_SIXTH_OPTION;
import static net.runelite.api.MenuOpcode.PLAYER_THIRD_OPTION;
import net.runelite.api.MessageNode;
import net.runelite.api.NPC;
import net.runelite.api.Node;
import static net.runelite.api.Perspective.LOCAL_TILE_SIZE;
import net.runelite.api.Player;
import net.runelite.api.Point;
import net.runelite.api.Prayer;
@@ -135,6 +126,8 @@ import net.runelite.rs.api.RSTileItem;
import net.runelite.rs.api.RSUsername;
import net.runelite.rs.api.RSWidget;
import org.slf4j.Logger;
import static net.runelite.api.MenuOpcode.*;
import static net.runelite.api.Perspective.LOCAL_TILE_SIZE;
@Mixin(RSClient.class)
public abstract class RSClientMixin implements RSClient

View File

@@ -26,9 +26,9 @@ package net.runelite.mixins;
import net.runelite.api.Entity;
import net.runelite.api.Perspective;
import net.runelite.api.Tile;
import net.runelite.api.TileModel;
import net.runelite.api.TilePaint;
import net.runelite.api.Tile;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.hooks.DrawCallbacks;
import net.runelite.api.mixins.Copy;
@@ -41,10 +41,10 @@ import net.runelite.rs.api.RSBoundaryObject;
import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSFloorDecoration;
import net.runelite.rs.api.RSNodeDeque;
import net.runelite.rs.api.RSTileItem;
import net.runelite.rs.api.RSTileItemPile;
import net.runelite.rs.api.RSScene;
import net.runelite.rs.api.RSTile;
import net.runelite.rs.api.RSTileItem;
import net.runelite.rs.api.RSTileItemPile;
import net.runelite.rs.api.RSTileModel;
import net.runelite.rs.api.RSWallDecoration;
@@ -828,41 +828,171 @@ public abstract class RSSceneMixin implements RSScene
return;
}
Tile tile = getTiles()[z][x][y];
if (tile != null)
if (tile == null)
{
TilePaint sceneTilePaint = tile.getTilePaint();
if (sceneTilePaint != null)
return;
}
TilePaint sceneTilePaint = tile.getTilePaint();
if (sceneTilePaint != null)
{
int rgb = sceneTilePaint.getRBG();
if (sceneTilePaint.getSwColor() != INVALID_HSL_COLOR)
{
int rgb = sceneTilePaint.getRBG();
if (sceneTilePaint.getSwColor() != INVALID_HSL_COLOR)
// hue and saturation
int hs = sceneTilePaint.getSwColor() & ~0x7F;
// I know this looks dumb (and it probably is) but I don't feel like hunting down the problem
int seLightness = sceneTilePaint.getNwColor() & 0x7F;
int neLightness = sceneTilePaint.getNeColor() & 0x7F;
int southDeltaLightness = (sceneTilePaint.getSwColor() & 0x7F) - seLightness;
int northDeltaLightness = (sceneTilePaint.getSeColor() & 0x7F) - neLightness;
seLightness <<= 2;
neLightness <<= 2;
for (int i = 0; i < 4; i++)
{
// hue and saturation
int hs = sceneTilePaint.getSwColor() & ~0x7F;
int seLightness = sceneTilePaint.getSeColor() & 0x7F;
int neLightness = sceneTilePaint.getNeColor() & 0x7F;
int southDeltaLightness = (sceneTilePaint.getSwColor() & 0x7F) - seLightness;
int northDeltaLightness = (sceneTilePaint.getNwColor() & 0x7F) - neLightness;
if (sceneTilePaint.getTexture() == -1)
{
pixels[pixelOffset] = colorPalette[hs | seLightness >> 2];
pixels[pixelOffset + 1] = colorPalette[hs | seLightness * 3 + neLightness >> 4];
pixels[pixelOffset + 2] = colorPalette[hs | seLightness + neLightness >> 3];
pixels[pixelOffset + 3] = colorPalette[hs | seLightness + neLightness * 3 >> 4];
}
else
{
int lig = 0xFF - ((seLightness >> 1) * (seLightness >> 1) >> 8);
pixels[pixelOffset] = ((rgb & 0xFF00FF) * lig & ~0xFF00FF) + ((rgb & 0xFF00) * lig & 0xFF0000) >> 8;
lig = 0xFF - ((seLightness * 3 + neLightness >> 3) * (seLightness * 3 + neLightness >> 3) >> 8);
pixels[pixelOffset + 1] = ((rgb & 0xFF00FF) * lig & ~0xFF00FF) + ((rgb & 0xFF00) * lig & 0xFF0000) >> 8;
lig = 0xFF - ((seLightness + neLightness >> 2) * (seLightness + neLightness >> 2) >> 8);
pixels[pixelOffset + 2] = ((rgb & 0xFF00FF) * lig & ~0xFF00FF) + ((rgb & 0xFF00) * lig & 0xFF0000) >> 8;
lig = 0xFF - ((seLightness + neLightness * 3 >> 3) * (seLightness + neLightness * 3 >> 3) >> 8);
pixels[pixelOffset + 3] = ((rgb & 0xFF00FF) * lig & ~0xFF00FF) + ((rgb & 0xFF00) * lig & 0xFF0000) >> 8;
}
seLightness += southDeltaLightness;
neLightness += northDeltaLightness;
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;
}
}
return;
}
TileModel sceneTileModel = tile.getTileModel();
if (sceneTileModel != null)
{
int shape = sceneTileModel.getShape();
int rotation = sceneTileModel.getRotation();
int overlayRgb = sceneTileModel.getModelOverlay();
int underlayRgb = sceneTileModel.getModelUnderlay();
int[] points = getTileShape2D()[shape];
int[] indices = getTileRotation2D()[rotation];
int shapeOffset = 0;
if (sceneTileModel.getOverlaySwColor() != INVALID_HSL_COLOR)
{
// hue and saturation
int hs = sceneTileModel.getOverlaySwColor() & ~0x7F;
int seLightness = sceneTileModel.getOverlaySeColor() & 0x7F;
int neLightness = sceneTileModel.getOverlayNeColor() & 0x7F;
int southDeltaLightness = (sceneTileModel.getOverlaySwColor() & 0x7F) - seLightness;
int northDeltaLightness = (sceneTileModel.getOverlayNwColor() & 0x7F) - neLightness;
seLightness <<= 2;
neLightness <<= 2;
for (int i = 0; i < 4; i++)
{
if (sceneTileModel.getTriangleTextureId() == null)
{
if (points[indices[shapeOffset++]] != 0)
{
pixels[pixelOffset] = colorPalette[hs | (seLightness >> 2)];
}
if (points[indices[shapeOffset++]] != 0)
{
pixels[pixelOffset + 1] = colorPalette[hs | (seLightness * 3 + neLightness >> 4)];
}
if (points[indices[shapeOffset++]] != 0)
{
pixels[pixelOffset + 2] = colorPalette[hs | (seLightness + neLightness >> 3)];
}
if (points[indices[shapeOffset++]] != 0)
{
pixels[pixelOffset + 3] = colorPalette[hs | (seLightness + neLightness * 3 >> 4)];
}
}
else
{
if (points[indices[shapeOffset++]] != 0)
{
int lig = 0xFF - ((seLightness >> 1) * (seLightness >> 1) >> 8);
pixels[pixelOffset] = ((overlayRgb & 0xFF00FF) * lig & ~0xFF00FF) +
((overlayRgb & 0xFF00) * lig & 0xFF0000) >> 8;
}
if (points[indices[shapeOffset++]] != 0)
{
int lig = 0xFF - ((seLightness * 3 + neLightness >> 3) *
(seLightness * 3 + neLightness >> 3) >> 8);
pixels[pixelOffset + 1] = ((overlayRgb & 0xFF00FF) * lig & ~0xFF00FF) +
((overlayRgb & 0xFF00) * lig & 0xFF0000) >> 8;
}
if (points[indices[shapeOffset++]] != 0)
{
int lig = 0xFF - ((seLightness + neLightness >> 2) *
(seLightness + neLightness >> 2) >> 8);
pixels[pixelOffset + 2] = ((overlayRgb & 0xFF00FF) * lig & ~0xFF00FF) +
((overlayRgb & 0xFF00) * lig & 0xFF0000) >> 8;
}
if (points[indices[shapeOffset++]] != 0)
{
int lig = 0xFF - ((seLightness + neLightness * 3 >> 3) *
(seLightness + neLightness * 3 >> 3) >> 8);
pixels[pixelOffset + 3] = ((overlayRgb & 0xFF00FF) * lig & ~0xFF00FF) +
((overlayRgb & 0xFF00) * lig & 0xFF0000) >> 8;
}
}
seLightness += southDeltaLightness;
neLightness += northDeltaLightness;
pixelOffset += width;
}
if (underlayRgb != 0 && sceneTileModel.getUnderlaySwColor() != INVALID_HSL_COLOR)
{
pixelOffset -= width << 2;
shapeOffset -= 16;
hs = sceneTileModel.getUnderlaySwColor() & ~0x7F;
seLightness = sceneTileModel.getUnderlaySeColor() & 0x7F;
neLightness = sceneTileModel.getUnderlayNeColor() & 0x7F;
southDeltaLightness = (sceneTileModel.getUnderlaySwColor() & 0x7F) - seLightness;
northDeltaLightness = (sceneTileModel.getUnderlayNwColor() & 0x7F) - neLightness;
seLightness <<= 2;
neLightness <<= 2;
for (int i = 0; i < 4; i++)
{
if (sceneTilePaint.getTexture() == -1)
if (points[indices[shapeOffset++]] == 0)
{
pixels[pixelOffset] = colorPalette[hs | seLightness >> 2];
pixels[pixelOffset + 1] = colorPalette[hs | seLightness * 3 + neLightness >> 4];
pixels[pixelOffset + 2] = colorPalette[hs | seLightness + neLightness >> 3];
pixels[pixelOffset + 3] = colorPalette[hs | seLightness + neLightness * 3 >> 4];
pixels[pixelOffset] = colorPalette[hs | (seLightness >> 2)];
}
else
if (points[indices[shapeOffset++]] == 0)
{
int lig = 0xFF - ((seLightness >> 1) * (seLightness >> 1) >> 8);
pixels[pixelOffset] = ((rgb & 0xFF00FF) * lig & ~0xFF00FF) + ((rgb & 0xFF00) * lig & 0xFF0000) >> 8;
lig = 0xFF - ((seLightness * 3 + neLightness >> 3) * (seLightness * 3 + neLightness >> 3) >> 8);
pixels[pixelOffset + 1] = ((rgb & 0xFF00FF) * lig & ~0xFF00FF) + ((rgb & 0xFF00) * lig & 0xFF0000) >> 8;
lig = 0xFF - ((seLightness + neLightness >> 2) * (seLightness + neLightness >> 2) >> 8);
pixels[pixelOffset + 2] = ((rgb & 0xFF00FF) * lig & ~0xFF00FF) + ((rgb & 0xFF00) * lig & 0xFF0000) >> 8;
lig = 0xFF - ((seLightness + neLightness * 3 >> 3) * (seLightness + neLightness * 3 >> 3) >> 8);
pixels[pixelOffset + 3] = ((rgb & 0xFF00FF) * lig & ~0xFF00FF) + ((rgb & 0xFF00) * lig & 0xFF0000) >> 8;
pixels[pixelOffset + 1] = colorPalette[hs | (seLightness * 3 + neLightness >> 4)];
}
if (points[indices[shapeOffset++]] == 0)
{
pixels[pixelOffset + 2] = colorPalette[hs | (seLightness + neLightness >> 3)];
}
if (points[indices[shapeOffset++]] == 0)
{
pixels[pixelOffset + 3] = colorPalette[hs | (seLightness + neLightness * 3 >> 4)];
}
seLightness += southDeltaLightness;
neLightness += northDeltaLightness;
@@ -870,171 +1000,42 @@ public abstract class RSSceneMixin implements RSScene
pixelOffset += width;
}
}
else if (rgb != 0)
}
else if (underlayRgb != 0)
{
for (int i = 0; i < 4; i++)
{
for (int i = 0; i < 4; i++)
{
pixels[pixelOffset] = rgb;
pixels[pixelOffset + 1] = rgb;
pixels[pixelOffset + 2] = rgb;
pixels[pixelOffset + 3] = rgb;
pixelOffset += width;
}
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
{
TileModel sceneTileModel = tile.getTileModel();
if (sceneTileModel != null)
for (int i = 0; i < 4; i++)
{
int shape = sceneTileModel.getShape();
int rotation = sceneTileModel.getRotation();
int overlayRgb = sceneTileModel.getModelOverlay();
int underlayRgb = sceneTileModel.getModelUnderlay();
int[] points = getTileShape2D()[shape];
int[] indices = getTileRotation2D()[rotation];
int shapeOffset = 0;
if (sceneTileModel.getOverlaySwColor() != INVALID_HSL_COLOR)
if (points[indices[shapeOffset++]] != 0)
{
// hue and saturation
int hs = sceneTileModel.getOverlaySwColor() & ~0x7F;
int seLightness = sceneTileModel.getOverlaySeColor() & 0x7F;
int neLightness = sceneTileModel.getOverlayNeColor() & 0x7F;
int southDeltaLightness = (sceneTileModel.getOverlaySwColor() & 0x7F) - seLightness;
int northDeltaLightness = (sceneTileModel.getOverlayNwColor() & 0x7F) - neLightness;
seLightness <<= 2;
neLightness <<= 2;
for (int i = 0; i < 4; i++)
{
if (sceneTileModel.getTriangleTextureId() == null)
{
if (points[indices[shapeOffset++]] != 0)
{
pixels[pixelOffset] = colorPalette[hs | (seLightness >> 2)];
}
if (points[indices[shapeOffset++]] != 0)
{
pixels[pixelOffset + 1] = colorPalette[hs | (seLightness * 3 + neLightness >> 4)];
}
if (points[indices[shapeOffset++]] != 0)
{
pixels[pixelOffset + 2] = colorPalette[hs | (seLightness + neLightness >> 3)];
}
if (points[indices[shapeOffset++]] != 0)
{
pixels[pixelOffset + 3] = colorPalette[hs | (seLightness + neLightness * 3 >> 4)];
}
}
else
{
if (points[indices[shapeOffset++]] != 0)
{
int lig = 0xFF - ((seLightness >> 1) * (seLightness >> 1) >> 8);
pixels[pixelOffset] = ((overlayRgb & 0xFF00FF) * lig & ~0xFF00FF) +
((overlayRgb & 0xFF00) * lig & 0xFF0000) >> 8;
}
if (points[indices[shapeOffset++]] != 0)
{
int lig = 0xFF - ((seLightness * 3 + neLightness >> 3) *
(seLightness * 3 + neLightness >> 3) >> 8);
pixels[pixelOffset + 1] = ((overlayRgb & 0xFF00FF) * lig & ~0xFF00FF) +
((overlayRgb & 0xFF00) * lig & 0xFF0000) >> 8;
}
if (points[indices[shapeOffset++]] != 0)
{
int lig = 0xFF - ((seLightness + neLightness >> 2) *
(seLightness + neLightness >> 2) >> 8);
pixels[pixelOffset + 2] = ((overlayRgb & 0xFF00FF) * lig & ~0xFF00FF) +
((overlayRgb & 0xFF00) * lig & 0xFF0000) >> 8;
}
if (points[indices[shapeOffset++]] != 0)
{
int lig = 0xFF - ((seLightness + neLightness * 3 >> 3) *
(seLightness + neLightness * 3 >> 3) >> 8);
pixels[pixelOffset + 3] = ((overlayRgb & 0xFF00FF) * lig & ~0xFF00FF) +
((overlayRgb & 0xFF00) * lig & 0xFF0000) >> 8;
}
}
seLightness += southDeltaLightness;
neLightness += northDeltaLightness;
pixelOffset += width;
}
if (underlayRgb != 0 && sceneTileModel.getUnderlaySwColor() != INVALID_HSL_COLOR)
{
pixelOffset -= width << 2;
shapeOffset -= 16;
hs = sceneTileModel.getUnderlaySwColor() & ~0x7F;
seLightness = sceneTileModel.getUnderlaySeColor() & 0x7F;
neLightness = sceneTileModel.getUnderlayNeColor() & 0x7F;
southDeltaLightness = (sceneTileModel.getUnderlaySwColor() & 0x7F) - seLightness;
northDeltaLightness = (sceneTileModel.getUnderlayNwColor() & 0x7F) - neLightness;
seLightness <<= 2;
neLightness <<= 2;
for (int i = 0; i < 4; i++)
{
if (points[indices[shapeOffset++]] == 0)
{
pixels[pixelOffset] = colorPalette[hs | (seLightness >> 2)];
}
if (points[indices[shapeOffset++]] == 0)
{
pixels[pixelOffset + 1] = colorPalette[hs | (seLightness * 3 + neLightness >> 4)];
}
if (points[indices[shapeOffset++]] == 0)
{
pixels[pixelOffset + 2] = colorPalette[hs | (seLightness + neLightness >> 3)];
}
if (points[indices[shapeOffset++]] == 0)
{
pixels[pixelOffset + 3] = colorPalette[hs | (seLightness + neLightness * 3 >> 4)];
}
seLightness += southDeltaLightness;
neLightness += northDeltaLightness;
pixelOffset += width;
}
}
pixels[pixelOffset] = overlayRgb;
}
else if (underlayRgb != 0)
if (points[indices[shapeOffset++]] != 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;
}
pixels[pixelOffset + 1] = overlayRgb;
}
else
if (points[indices[shapeOffset++]] != 0)
{
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;
}
pixels[pixelOffset + 2] = overlayRgb;
}
if (points[indices[shapeOffset++]] != 0)
{
pixels[pixelOffset + 3] = overlayRgb;
}
pixelOffset += width;
}
}
}

View File

@@ -37,6 +37,8 @@ import net.runelite.rs.api.RSSprite;
@Mixin(RSSprite.class)
public abstract class RSSpriteMixin implements RSSprite
{
private static final int ALPHA = 0xFF000000;
@Shadow("client")
private static RSClient client;
@@ -155,21 +157,6 @@ public abstract class RSSpriteMixin implements RSSprite
if (!hdMinimapEnabled)
{
rs$drawAlphaMapped(x, y, width, height, xOffset, yOffset, rotation, zoom, xOffsets, yOffsets);
// hack required for this to work with gpu mode because
// the alpha injector does not inject the copied method
int[] graphicsPixels = client.getGraphicsPixels();
int pixelOffset = x + y * client.getGraphicsPixelsWidth();
for (int h = 0; h < height; h++)
{
int offset = xOffsets[h];
int pixelIndex = pixelOffset + offset;
for (int w = -yOffsets[h]; w < 0; w++)
{
graphicsPixels[pixelIndex++] |= 0xFF000000;
}
pixelOffset += client.getGraphicsPixelsWidth();
}
return;
}
try
@@ -222,7 +209,7 @@ public abstract class RSSpriteMixin implements RSSprite
(c3 >> 8 & 0xFF) * a3 + (c4 >> 8 & 0xFF) * a4 >> 8 & 0xFF00;
int b = (c1 & 0xFF) * a1 + (c2 & 0xFF) * a2 +
(c3 & 0xFF) * a3 + (c4 & 0xFF) * a4 >> 16;
graphicsPixels[graphicsPixelIndex++] = r | g | b;
graphicsPixels[graphicsPixelIndex++] = ALPHA | r | g | b;
spriteX += rotCos;
spriteY -= rotSin;
}

View File

@@ -13,11 +13,11 @@ public interface RSTilePaint extends TilePaint
@Override
int getSwColor();
@Import("nwColor")
@Import("seColor")
@Override
int getSeColor();
@Import("seColor")
@Import("nwColor")
@Override
int getNwColor();