Merge pull request #1196 from Adam-/minimap2

cache: rewrite map image dumper with logic from client
This commit is contained in:
Adam
2018-04-01 10:41:30 -04:00
committed by GitHub
12 changed files with 1163 additions and 424 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -27,9 +27,10 @@ package net.runelite.cache;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.ArrayList; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.HashMap;
import java.util.Map;
import net.runelite.cache.definitions.ObjectDefinition; import net.runelite.cache.definitions.ObjectDefinition;
import net.runelite.cache.definitions.exporters.ObjectExporter; import net.runelite.cache.definitions.exporters.ObjectExporter;
import net.runelite.cache.definitions.loaders.ObjectLoader; import net.runelite.cache.definitions.loaders.ObjectLoader;
@@ -44,7 +45,7 @@ import net.runelite.cache.util.Namer;
public class ObjectManager public class ObjectManager
{ {
private final Store store; private final Store store;
private final List<ObjectDefinition> objects = new ArrayList<>(); private final Map<Integer, ObjectDefinition> objects = new HashMap<>();
private final Namer namer = new Namer(); private final Namer namer = new Namer();
public ObjectManager(Store store) public ObjectManager(Store store)
@@ -66,20 +67,25 @@ public class ObjectManager
for (FSFile f : files.getFiles()) for (FSFile f : files.getFiles())
{ {
ObjectDefinition def = loader.load(f.getFileId(), f.getContents()); ObjectDefinition def = loader.load(f.getFileId(), f.getContents());
objects.add(def); objects.put(f.getFileId(), def);
} }
} }
public List<ObjectDefinition> getObjects() public Collection<ObjectDefinition> getObjects()
{ {
return Collections.unmodifiableList(objects); return Collections.unmodifiableCollection(objects.values());
}
public ObjectDefinition getObject(int id)
{
return objects.get(id);
} }
public void dump(File out) throws IOException public void dump(File out) throws IOException
{ {
out.mkdirs(); out.mkdirs();
for (ObjectDefinition def : objects) for (ObjectDefinition def : objects.values())
{ {
ObjectExporter exporter = new ObjectExporter(def); ObjectExporter exporter = new ObjectExporter(def);
@@ -100,7 +106,7 @@ public class ObjectManager
fw.println(""); fw.println("");
fw.println("public final class ObjectID"); fw.println("public final class ObjectID");
fw.println("{"); fw.println("{");
for (ObjectDefinition def : objects) for (ObjectDefinition def : objects.values())
{ {
String name; String name;
if (def.getName().equalsIgnoreCase("NULL")) if (def.getName().equalsIgnoreCase("NULL"))

View File

@@ -35,4 +35,105 @@ public class OverlayDefinition
private int texture = -1; private int texture = -1;
private int secondaryRgbColor = -1; private int secondaryRgbColor = -1;
private boolean hideUnderlay = true; private boolean hideUnderlay = true;
private transient int hue;
private transient int saturation;
private transient int lightness;
private transient int otherHue;
private transient int otherSaturation;
private transient int otherLightness;
public void calculateHsl()
{
if (secondaryRgbColor != -1)
{
calculateHsl(secondaryRgbColor);
otherHue = hue;
otherSaturation = saturation;
otherLightness = lightness;
}
calculateHsl(rgbColor);
}
private void calculateHsl(int var1)
{
double var2 = (double) (var1 >> 16 & 255) / 256.0D;
double var4 = (double) (var1 >> 8 & 255) / 256.0D;
double var6 = (double) (var1 & 255) / 256.0D;
double var8 = var2;
if (var4 < var2)
{
var8 = var4;
}
if (var6 < var8)
{
var8 = var6;
}
double var10 = var2;
if (var4 > var2)
{
var10 = var4;
}
if (var6 > var10)
{
var10 = var6;
}
double var12 = 0.0D;
double var14 = 0.0D;
double var16 = (var8 + var10) / 2.0D;
if (var10 != var8)
{
if (var16 < 0.5D)
{
var14 = (var10 - var8) / (var10 + var8);
}
if (var16 >= 0.5D)
{
var14 = (var10 - var8) / (2.0D - var10 - var8);
}
if (var2 == var10)
{
var12 = (var4 - var6) / (var10 - var8);
}
else if (var4 == var10)
{
var12 = 2.0D + (var6 - var2) / (var10 - var8);
}
else if (var10 == var6)
{
var12 = 4.0D + (var2 - var4) / (var10 - var8);
}
}
var12 /= 6.0D;
this.hue = (int) (256.0D * var12);
this.saturation = (int) (var14 * 256.0D);
this.lightness = (int) (var16 * 256.0D);
if (this.saturation < 0)
{
this.saturation = 0;
}
else if (this.saturation > 255)
{
this.saturation = 255;
}
if (this.lightness < 0)
{
this.lightness = 0;
}
else if (this.lightness > 255)
{
this.lightness = 255;
}
}
} }

View File

@@ -31,4 +31,104 @@ public class UnderlayDefinition
{ {
private int id; private int id;
private int color; private int color;
private transient int hue;
private transient int saturation;
private transient int lightness;
private transient int hueMultiplier;
public void calculateHsl()
{
int var1 = color;
double var2 = (double) (var1 >> 16 & 255) / 256.0D;
double var4 = (double) (var1 >> 8 & 255) / 256.0D;
double var6 = (double) (var1 & 255) / 256.0D;
double var8 = var2;
if (var4 < var2)
{
var8 = var4;
}
if (var6 < var8)
{
var8 = var6;
}
double var10 = var2;
if (var4 > var2)
{
var10 = var4;
}
if (var6 > var10)
{
var10 = var6;
}
double var12 = 0.0D;
double var14 = 0.0D;
double var16 = (var10 + var8) / 2.0D;
if (var8 != var10)
{
if (var16 < 0.5D)
{
var14 = (var10 - var8) / (var8 + var10);
}
if (var16 >= 0.5D)
{
var14 = (var10 - var8) / (2.0D - var10 - var8);
}
if (var2 == var10)
{
var12 = (var4 - var6) / (var10 - var8);
}
else if (var10 == var4)
{
var12 = 2.0D + (var6 - var2) / (var10 - var8);
}
else if (var10 == var6)
{
var12 = 4.0D + (var2 - var4) / (var10 - var8);
}
}
var12 /= 6.0D;
this.saturation = (int) (var14 * 256.0D);
this.lightness = (int) (var16 * 256.0D);
if (this.saturation < 0)
{
this.saturation = 0;
}
else if (this.saturation > 255)
{
this.saturation = 255;
}
if (this.lightness < 0)
{
this.lightness = 0;
}
else if (this.lightness > 255)
{
this.lightness = 255;
}
if (var16 > 0.5D)
{
this.hueMultiplier = (int) (var14 * (1.0D - var16) * 512.0D);
}
else
{
this.hueMultiplier = (int) (var14 * var16 * 512.0D);
}
if (this.hueMultiplier < 1)
{
this.hueMultiplier = 1;
}
this.hue = (int) ((double) this.hueMultiplier * var12);
}
} }

View File

@@ -24,14 +24,13 @@
*/ */
package net.runelite.cache.definitions.loaders; package net.runelite.cache.definitions.loaders;
import java.util.HashMap;
import java.util.Map;
import net.runelite.cache.definitions.ObjectDefinition; import net.runelite.cache.definitions.ObjectDefinition;
import net.runelite.cache.io.InputStream; import net.runelite.cache.io.InputStream;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
public class ObjectLoader public class ObjectLoader
{ {
private static final Logger logger = LoggerFactory.getLogger(ObjectLoader.class); private static final Logger logger = LoggerFactory.getLogger(ObjectLoader.class);
@@ -54,6 +53,8 @@ public class ObjectLoader
processOp(opcode, def, is); processOp(opcode, def, is);
} }
post(def);
return def; return def;
} }
@@ -375,4 +376,30 @@ public class ObjectLoader
logger.warn("Unrecognized opcode {}", opcode); logger.warn("Unrecognized opcode {}", opcode);
} }
} }
private void post(ObjectDefinition def)
{
if (def.getAnInt2088() == -1)
{
def.setAnInt2088(0);
if (def.getObjectModels() != null && (def.getObjectTypes() == null || def.getObjectTypes()[0] == 10))
{
def.setAnInt2088(1);
}
for (int var1 = 0; var1 < 5; ++var1)
{
if (def.getActions()[var1] != null)
{
def.setAnInt2088(1);
}
}
}
if (def.getAnInt2106() == -1)
{
def.setAnInt2106(def.getInteractType() != 0 ? 1 : 0);
}
}
} }

View File

@@ -69,6 +69,8 @@ public class OverlayLoader
} }
} }
def.calculateHsl();
return def; return def;
} }
} }

View File

@@ -55,6 +55,8 @@ public class UnderlayLoader
} }
} }
def.calculateHsl();
return def; return def;
} }
} }

View File

@@ -0,0 +1,161 @@
/*
* 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

@@ -70,7 +70,7 @@ class Graphics3D extends Rasterizer2D
int Rasterizer3D_clipNegativeMidY; int Rasterizer3D_clipNegativeMidY;
int Rasterizer3D_clipMidY2; int Rasterizer3D_clipMidY2;
int[] rasterClipY = new int[1024]; int[] rasterClipY = new int[1024];
public int[] colorPalette = new int[65536]; public int[] colorPalette;
public Graphics3D(RSTextureProvider textureProvider) public Graphics3D(RSTextureProvider textureProvider)
{ {
@@ -134,129 +134,7 @@ class Graphics3D extends Rasterizer2D
public final void setBrightness(double var0) public final void setBrightness(double var0)
{ {
buildColorPalette(var0, 0, 512); colorPalette = new ColorPalette(var0, 0, 512).getColorPalette();
}
final void buildColorPalette(double var0, int var2, int var3)
{
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, var0);
if (var22 == 0)
{
var22 = 1;
}
colorPalette[var4++] = var22;
}
}
}
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);
} }
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

@@ -28,7 +28,7 @@ import net.runelite.cache.definitions.TextureDefinition;
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;
class RSTextureProvider public class RSTextureProvider
{ {
private final SpriteProvider spriteProvider; private final SpriteProvider spriteProvider;
TextureDefinition[] textures; TextureDefinition[] textures;

View File

@@ -25,8 +25,9 @@
package net.runelite.cache.region; package net.runelite.cache.region;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.Collection;
import java.util.List; import java.util.HashMap;
import java.util.Map;
import net.runelite.cache.IndexType; import net.runelite.cache.IndexType;
import net.runelite.cache.definitions.LocationsDefinition; import net.runelite.cache.definitions.LocationsDefinition;
import net.runelite.cache.definitions.MapDefinition; import net.runelite.cache.definitions.MapDefinition;
@@ -50,7 +51,7 @@ public class RegionLoader
private final Index index; private final Index index;
private final XteaKeyManager keyManager; private final XteaKeyManager keyManager;
private final List<Region> regions = new ArrayList<>(); private final Map<Integer, Region> regions = new HashMap<>();
private Region lowestX = null, lowestY = null; private Region lowestX = null, lowestY = null;
private Region highestX = null, highestY = null; private Region highestX = null, highestY = null;
@@ -69,7 +70,7 @@ public class RegionLoader
Region region = this.loadRegionFromArchive(i); Region region = this.loadRegionFromArchive(i);
if (region != null) if (region != null)
{ {
regions.add(region); regions.put(i, region);
} }
} }
} }
@@ -117,7 +118,7 @@ public class RegionLoader
public void calculateBounds() public void calculateBounds()
{ {
for (Region region : regions) for (Region region : regions.values())
{ {
if (lowestX == null || region.getBaseX() < lowestX.getBaseX()) if (lowestX == null || region.getBaseX() < lowestX.getBaseX())
{ {
@@ -141,9 +142,16 @@ public class RegionLoader
} }
} }
public List<Region> getRegions() public Collection<Region> getRegions()
{ {
return regions; return regions.values();
}
public Region findRegionForWorldCoordinates(int x, int y)
{
x >>>= 6;
y >>>= 6;
return regions.get((x << 8) | y);
} }
public Region getLowestX() public Region getLowestX()

View File

@@ -30,6 +30,7 @@ import java.io.IOException;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import net.runelite.cache.fs.Store; import net.runelite.cache.fs.Store;
import net.runelite.cache.region.Region; import net.runelite.cache.region.Region;
import net.runelite.cache.region.RegionLoader;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
@@ -46,7 +47,7 @@ public class MapImageDumperTest
@Test @Test
@Ignore @Ignore
public void extract() throws IOException public void dumpMap() throws IOException
{ {
File base = StoreLocation.LOCATION, File base = StoreLocation.LOCATION,
outDir = folder.newFolder(); outDir = folder.newFolder();
@@ -69,4 +70,31 @@ public class MapImageDumperTest
} }
} }
} }
@Test
@Ignore
public void dumpRegions() throws Exception
{
File base = StoreLocation.LOCATION,
outDir = folder.newFolder();
try (Store store = new Store(base))
{
store.load();
RegionLoader regionLoader = new RegionLoader(store);
regionLoader.loadRegions();
MapImageDumper dumper = new MapImageDumper(store);
dumper.load();
int z = 0;
for (Region region : regionLoader.getRegions())
{
File imageFile = new File(outDir, "img-" + z + "-" + region.getRegionID() + ".png");
BufferedImage image = dumper.drawRegion(region, z);
ImageIO.write(image, "png", imageFile);
}
}
}
} }