cache: unify jagex hsl conversion

This commit is contained in:
Max Weber
2021-10-15 17:48:00 -06:00
committed by Adam
parent 1f5ca21546
commit 7cbef5edaa
7 changed files with 21 additions and 169 deletions

View File

@@ -47,8 +47,8 @@ import net.runelite.cache.fs.FSFile;
import net.runelite.cache.fs.Index; import net.runelite.cache.fs.Index;
import net.runelite.cache.fs.Storage; import net.runelite.cache.fs.Storage;
import net.runelite.cache.fs.Store; import net.runelite.cache.fs.Store;
import net.runelite.cache.item.ColorPalette;
import net.runelite.cache.item.RSTextureProvider; import net.runelite.cache.item.RSTextureProvider;
import net.runelite.cache.models.JagexColor;
import net.runelite.cache.region.Location; import net.runelite.cache.region.Location;
import net.runelite.cache.region.Region; import net.runelite.cache.region.Region;
import net.runelite.cache.region.RegionLoader; import net.runelite.cache.region.RegionLoader;
@@ -65,7 +65,7 @@ public class MapImageDumper
private static final int MAPICON_MAX_HEIGHT = 6; private static final int MAPICON_MAX_HEIGHT = 6;
private static final int BLEND = 5; // number of surrounding tiles for ground blending private static final int BLEND = 5; // number of surrounding tiles for ground blending
private static int[] colorPalette = new ColorPalette(0.9d, 0, 512).getColorPalette(); private static int[] colorPalette = JagexColor.createPalette(JagexColor.BRIGHTNESS_MIN);
private static int[][] TILE_SHAPE_2D = new int[][]{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1}, {1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1}, {0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1}, {1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1}}; private static int[][] TILE_SHAPE_2D = new int[][]{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1}, {1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1}, {0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1}, {1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1}};
private static int[][] TILE_ROTATION_2D = new int[][]{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, {12, 8, 4, 0, 13, 9, 5, 1, 14, 10, 6, 2, 15, 11, 7, 3}, {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, {3, 7, 11, 15, 2, 6, 10, 14, 1, 5, 9, 13, 0, 4, 8, 12}}; private static int[][] TILE_ROTATION_2D = new int[][]{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, {12, 8, 4, 0, 13, 9, 5, 1, 14, 10, 6, 2, 15, 11, 7, 3}, {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, {3, 7, 11, 15, 2, 6, 10, 14, 1, 5, 9, 13, 0, 4, 8, 12}};

View File

@@ -1,161 +0,0 @@
/*
* Copyright (c) 2018, Adam <Adam@sigterm.info>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.cache.item;
import lombok.Getter;
public class ColorPalette
{
@Getter
private final int[] colorPalette;
public ColorPalette(double brightness, int var2, int var3)
{
colorPalette = buildColorPalettee(brightness, var2, var3);
}
private int[] buildColorPalettee(double brightness, int var2, int var3)
{
int[] colorPalette = new int[65536];
int var4 = var2 * 128;
for (int var5 = var2; var5 < var3; ++var5)
{
double var6 = (double) (var5 >> 3) / 64.0D + 0.0078125D;
double var8 = (double) (var5 & 7) / 8.0D + 0.0625D;
for (int var10 = 0; var10 < 128; ++var10)
{
double var11 = (double) var10 / 128.0D;
double var13 = var11;
double var15 = var11;
double var17 = var11;
if (var8 != 0.0D)
{
double var19;
if (var11 < 0.5D)
{
var19 = var11 * (1.0D + var8);
}
else
{
var19 = var11 + var8 - var11 * var8;
}
double var21 = 2.0D * var11 - var19;
double var23 = var6 + 0.3333333333333333D;
if (var23 > 1.0D)
{
--var23;
}
double var27 = var6 - 0.3333333333333333D;
if (var27 < 0.0D)
{
++var27;
}
if (6.0D * var23 < 1.0D)
{
var13 = var21 + (var19 - var21) * 6.0D * var23;
}
else if (2.0D * var23 < 1.0D)
{
var13 = var19;
}
else if (3.0D * var23 < 2.0D)
{
var13 = var21 + (var19 - var21) * (0.6666666666666666D - var23) * 6.0D;
}
else
{
var13 = var21;
}
if (6.0D * var6 < 1.0D)
{
var15 = var21 + (var19 - var21) * 6.0D * var6;
}
else if (2.0D * var6 < 1.0D)
{
var15 = var19;
}
else if (3.0D * var6 < 2.0D)
{
var15 = var21 + (var19 - var21) * (0.6666666666666666D - var6) * 6.0D;
}
else
{
var15 = var21;
}
if (6.0D * var27 < 1.0D)
{
var17 = var21 + (var19 - var21) * 6.0D * var27;
}
else if (2.0D * var27 < 1.0D)
{
var17 = var19;
}
else if (3.0D * var27 < 2.0D)
{
var17 = var21 + (var19 - var21) * (0.6666666666666666D - var27) * 6.0D;
}
else
{
var17 = var21;
}
}
int var29 = (int) (var13 * 256.0D);
int var20 = (int) (var15 * 256.0D);
int var30 = (int) (var17 * 256.0D);
int var22 = var30 + (var20 << 8) + (var29 << 16);
var22 = adjustRGB(var22, brightness);
if (var22 == 0)
{
var22 = 1;
}
colorPalette[var4++] = var22;
}
}
return colorPalette;
}
private static int adjustRGB(int var0, double var1)
{
double var3 = (double) (var0 >> 16) / 256.0D;
double var5 = (double) (var0 >> 8 & 255) / 256.0D;
double var7 = (double) (var0 & 255) / 256.0D;
var3 = Math.pow(var3, var1);
var5 = Math.pow(var5, var1);
var7 = Math.pow(var7, var1);
int var9 = (int) (var3 * 256.0D);
int var10 = (int) (var5 * 256.0D);
int var11 = (int) (var7 * 256.0D);
return var11 + (var10 << 8) + (var9 << 16);
}
}

View File

@@ -24,6 +24,8 @@
*/ */
package net.runelite.cache.item; package net.runelite.cache.item;
import net.runelite.cache.models.JagexColor;
class Graphics3D extends Rasterizer2D class Graphics3D extends Rasterizer2D
{ {
private static final double UNIT = Math.PI / 1024d; // How much of the circle each unit of SINE/COSINE is private static final double UNIT = Math.PI / 1024d; // How much of the circle each unit of SINE/COSINE is
@@ -132,9 +134,9 @@ class Graphics3D extends Rasterizer2D
Rasterizer3D_clipMidY2 = Rasterizer3D_clipHeight - centerY; Rasterizer3D_clipMidY2 = Rasterizer3D_clipHeight - centerY;
} }
public final void setBrightness(double var0) public final void setBrightness(double brightness)
{ {
colorPalette = new ColorPalette(var0, 0, 512).getColorPalette(); colorPalette = JagexColor.createPalette(brightness);
} }
final void rasterGouraud(int var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) final void rasterGouraud(int var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8)

View File

@@ -33,6 +33,7 @@ import net.runelite.cache.definitions.providers.ModelProvider;
import net.runelite.cache.definitions.providers.SpriteProvider; import net.runelite.cache.definitions.providers.SpriteProvider;
import net.runelite.cache.definitions.providers.TextureProvider; import net.runelite.cache.definitions.providers.TextureProvider;
import net.runelite.cache.models.FaceNormal; import net.runelite.cache.models.FaceNormal;
import net.runelite.cache.models.JagexColor;
import net.runelite.cache.models.VertexNormal; import net.runelite.cache.models.VertexNormal;
public class ItemSpriteFactory public class ItemSpriteFactory
@@ -111,7 +112,7 @@ public class ItemSpriteFactory
SpritePixels spritePixels = new SpritePixels(36, 32); SpritePixels spritePixels = new SpritePixels(36, 32);
Graphics3D graphics = new Graphics3D(rsTextureProvider); Graphics3D graphics = new Graphics3D(rsTextureProvider);
graphics.setBrightness(0.6d); graphics.setBrightness(JagexColor.BRIGHTNESS_MAX);
graphics.setRasterBuffer(spritePixels.pixels, 36, 32); graphics.setRasterBuffer(spritePixels.pixels, 36, 32);
graphics.reset(); graphics.reset();
graphics.setRasterClipping(); graphics.setRasterClipping();

View File

@@ -29,7 +29,7 @@ public final class JagexColor
public static final double BRIGHTNESS_MAX = .6; public static final double BRIGHTNESS_MAX = .6;
public static final double BRIGHTNESS_HIGH = .7; public static final double BRIGHTNESS_HIGH = .7;
public static final double BRIGHTNESS_LOW = .8; public static final double BRIGHTNESS_LOW = .8;
public static final double BRIGTHNESS_MIN = .9; public static final double BRIGHTNESS_MIN = .9;
private static final double HUE_OFFSET = (.5 / 64.D); private static final double HUE_OFFSET = (.5 / 64.D);
private static final double SATURATION_OFFSET = (.5 / 8.D); private static final double SATURATION_OFFSET = (.5 / 8.D);
@@ -133,4 +133,14 @@ public final class JagexColor
| ((int) (g * 256.0D) << 8) | ((int) (g * 256.0D) << 8)
| (int) (b * 256.0D); | (int) (b * 256.0D);
} }
public static int[] createPalette(double brightness)
{
int[] colorPalette = new int[65536];
for (int i = 0; i < colorPalette.length; i++)
{
colorPalette[i] = HSLtoRGB((short) i, brightness);
}
return colorPalette;
}
} }

View File

@@ -31,7 +31,7 @@ import net.runelite.cache.definitions.TextureDefinition;
public class ObjExporter public class ObjExporter
{ {
private static final double BRIGHTNESS = JagexColor.BRIGTHNESS_MIN; private static final double BRIGHTNESS = JagexColor.BRIGHTNESS_MIN;
private final TextureManager textureManager; private final TextureManager textureManager;
private final ModelDefinition model; private final ModelDefinition model;

View File

@@ -30,7 +30,7 @@ import org.junit.Test;
public class JagexColorTest public class JagexColorTest
{ {
private static final double[] BRIGHTNESS_LEVELS = { private static final double[] BRIGHTNESS_LEVELS = {
JagexColor.BRIGTHNESS_MIN, JagexColor.BRIGHTNESS_MIN,
JagexColor.BRIGHTNESS_LOW, JagexColor.BRIGHTNESS_LOW,
JagexColor.BRIGHTNESS_HIGH, JagexColor.BRIGHTNESS_HIGH,
JagexColor.BRIGHTNESS_MAX, JagexColor.BRIGHTNESS_MAX,