cache: add item sprite renderer
Most of the code is slightly deobfuscated and stripped down from the client
This commit is contained in:
2940
cache/src/main/java/net/runelite/cache/item/Graphics3D.java
vendored
Normal file
2940
cache/src/main/java/net/runelite/cache/item/Graphics3D.java
vendored
Normal file
File diff suppressed because it is too large
Load Diff
439
cache/src/main/java/net/runelite/cache/item/ItemSpriteFactory.java
vendored
Normal file
439
cache/src/main/java/net/runelite/cache/item/ItemSpriteFactory.java
vendored
Normal file
@@ -0,0 +1,439 @@
|
||||
/*
|
||||
* 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 java.awt.image.BufferedImage;
|
||||
import java.io.IOException;
|
||||
import net.runelite.cache.definitions.ItemDefinition;
|
||||
import net.runelite.cache.definitions.ModelDefinition;
|
||||
import net.runelite.cache.definitions.providers.ItemProvider;
|
||||
import net.runelite.cache.definitions.providers.ModelProvider;
|
||||
import net.runelite.cache.definitions.providers.SpriteProvider;
|
||||
import net.runelite.cache.definitions.providers.TextureProvider;
|
||||
import net.runelite.cache.models.FaceNormal;
|
||||
import net.runelite.cache.models.VertexNormal;
|
||||
|
||||
public class ItemSpriteFactory
|
||||
{
|
||||
public static final BufferedImage createSprite(ItemProvider itemProvider, ModelProvider modelProvider,
|
||||
SpriteProvider spriteProvider, TextureProvider textureProvider,
|
||||
int itemId, int quantity, int border, int shadowColor,
|
||||
boolean noted) throws IOException
|
||||
{
|
||||
SpritePixels spritePixels = createSpritePixels(itemProvider, modelProvider, spriteProvider, textureProvider,
|
||||
itemId, quantity, border, shadowColor, noted);
|
||||
return spritePixels == null ? null : spritePixels.toBufferedImage();
|
||||
}
|
||||
|
||||
private static final SpritePixels createSpritePixels(ItemProvider itemProvider, ModelProvider modelProvider,
|
||||
SpriteProvider spriteProvider, TextureProvider textureProvider,
|
||||
int itemId, int quantity, int border, int shadowColor,
|
||||
boolean noted) throws IOException
|
||||
{
|
||||
ItemDefinition item = itemProvider.provide(itemId);
|
||||
|
||||
if (quantity > 1 && item.countObj != null)
|
||||
{
|
||||
int stackItemID = -1;
|
||||
|
||||
for (int i = 0; i < 10; ++i)
|
||||
{
|
||||
if (quantity >= item.countCo[i] && item.countCo[i] != 0)
|
||||
{
|
||||
stackItemID = item.countObj[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (stackItemID != -1)
|
||||
{
|
||||
item = itemProvider.provide(stackItemID);
|
||||
}
|
||||
}
|
||||
|
||||
if (item.notedTemplate != -1)
|
||||
{
|
||||
item.updateNote(itemProvider.provide(item.notedTemplate), itemProvider.provide(item.notedID));
|
||||
}
|
||||
|
||||
Model itemModel = getModel(modelProvider, item);
|
||||
if (itemModel == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
SpritePixels auxSpritePixels = null;
|
||||
if (item.notedTemplate != -1)
|
||||
{
|
||||
auxSpritePixels = createSpritePixels(itemProvider, modelProvider, spriteProvider, textureProvider,
|
||||
item.notedID, 10, 1, 0, true);
|
||||
if (auxSpritePixels == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else if (item.boughtTemplateId != -1)
|
||||
{
|
||||
auxSpritePixels = createSpritePixels(itemProvider, modelProvider, spriteProvider, textureProvider,
|
||||
item.boughtId, quantity, border, shadowColor, false);
|
||||
if (auxSpritePixels == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else if (item.placeholderTemplateId != -1)
|
||||
{
|
||||
auxSpritePixels = createSpritePixels(itemProvider, modelProvider, spriteProvider, textureProvider,
|
||||
item.placeholderId, quantity, 0, 0, false);
|
||||
if (auxSpritePixels == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
RSTextureProvider rsTextureProvider = new RSTextureProvider(textureProvider, spriteProvider);
|
||||
|
||||
SpritePixels spritePixels = new SpritePixels(36, 32);
|
||||
Graphics3D graphics = new Graphics3D(rsTextureProvider);
|
||||
graphics.setBrightness(0.6d);
|
||||
graphics.setRasterBuffer(spritePixels.pixels, 36, 32);
|
||||
graphics.reset();
|
||||
graphics.setRasterClipping();
|
||||
graphics.setOffset(16, 16);
|
||||
graphics.rasterGouraudLowRes = false;
|
||||
if (item.placeholderTemplateId != -1)
|
||||
{
|
||||
auxSpritePixels.drawAtOn(graphics, 0, 0);
|
||||
}
|
||||
|
||||
int zoom2d = item.zoom2d;
|
||||
if (noted)
|
||||
{
|
||||
zoom2d = (int) ((double) zoom2d * 1.5D);
|
||||
}
|
||||
else if (border == 2)
|
||||
{
|
||||
zoom2d = (int) ((double) zoom2d * 1.04D);
|
||||
}
|
||||
|
||||
int var17 = zoom2d * Graphics3D.SINE[item.xan2d] >> 16;
|
||||
int var18 = zoom2d * Graphics3D.COSINE[item.xan2d] >> 16;
|
||||
|
||||
itemModel.calculateBoundsCylinder();
|
||||
itemModel.rotateAndProject(graphics, 0,
|
||||
item.yan2d,
|
||||
item.zan2d,
|
||||
item.xan2d,
|
||||
item.xOffset2d,
|
||||
itemModel.modelHeight / 2 + var17 + item.yOffset2d,
|
||||
var18 + item.yOffset2d);
|
||||
if (item.boughtTemplateId != -1)
|
||||
{
|
||||
auxSpritePixels.drawAtOn(graphics, 0, 0);
|
||||
}
|
||||
|
||||
if (border >= 1)
|
||||
{
|
||||
spritePixels.drawBorder(1);
|
||||
}
|
||||
|
||||
if (border >= 2)
|
||||
{
|
||||
spritePixels.drawBorder(0xffffff);
|
||||
}
|
||||
|
||||
if (shadowColor != 0)
|
||||
{
|
||||
spritePixels.drawShadow(shadowColor);
|
||||
}
|
||||
|
||||
graphics.setRasterBuffer(spritePixels.pixels, 36, 32);
|
||||
if (item.notedTemplate != -1)
|
||||
{
|
||||
auxSpritePixels.drawAtOn(graphics, 0, 0);
|
||||
}
|
||||
|
||||
graphics.setRasterBuffer(graphics.graphicsPixels,
|
||||
graphics.graphicsPixelsWidth,
|
||||
graphics.graphicsPixelsHeight);
|
||||
|
||||
graphics.setRasterClipping();
|
||||
graphics.rasterGouraudLowRes = true;
|
||||
return spritePixels;
|
||||
}
|
||||
|
||||
private static Model getModel(ModelProvider modelProvider, ItemDefinition item) throws IOException
|
||||
{
|
||||
Model itemModel;
|
||||
ModelDefinition inventoryModel = modelProvider.provide(item.inventoryModel);
|
||||
if (inventoryModel == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (item.resizeX != 128 || item.resizeY != 128 || item.resizeZ != 128)
|
||||
{
|
||||
inventoryModel.resize(item.resizeX, item.resizeY, item.resizeZ);
|
||||
}
|
||||
|
||||
if (item.colorFind != null)
|
||||
{
|
||||
for (int i = 0; i < item.colorFind.length; ++i)
|
||||
{
|
||||
inventoryModel.recolor(item.colorFind[i], item.colorReplace[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if (item.textureFind != null)
|
||||
{
|
||||
for (int i = 0; i < item.textureFind.length; ++i)
|
||||
{
|
||||
inventoryModel.retexture(item.textureFind[i], item.textureReplace[i]);
|
||||
}
|
||||
}
|
||||
|
||||
itemModel = light(inventoryModel, item.ambient + 64, item.contrast + 768, -50, -10, -50);
|
||||
itemModel.isItemModel = true;
|
||||
return itemModel;
|
||||
}
|
||||
|
||||
private static Model light(ModelDefinition def, int ambient, int contrast, int x, int y, int z)
|
||||
{
|
||||
def.computeNormals();
|
||||
int somethingMagnitude = (int) Math.sqrt((double) (z * z + x * x + y * y));
|
||||
int var7 = somethingMagnitude * contrast >> 8;
|
||||
Model litModel = new Model();
|
||||
litModel.field1856 = new int[def.faceCount];
|
||||
litModel.field1854 = new int[def.faceCount];
|
||||
litModel.field1823 = new int[def.faceCount];
|
||||
if (def.textureTriangleCount > 0 && def.textureCoordinates != null)
|
||||
{
|
||||
int[] var9 = new int[def.textureTriangleCount];
|
||||
|
||||
int var10;
|
||||
for (var10 = 0; var10 < def.faceCount; ++var10)
|
||||
{
|
||||
if (def.textureCoordinates[var10] != -1)
|
||||
{
|
||||
++var9[def.textureCoordinates[var10] & 255];
|
||||
}
|
||||
}
|
||||
|
||||
litModel.field1852 = 0;
|
||||
|
||||
for (var10 = 0; var10 < def.textureTriangleCount; ++var10)
|
||||
{
|
||||
if (var9[var10] > 0 && def.textureRenderTypes[var10] == 0)
|
||||
{
|
||||
++litModel.field1852;
|
||||
}
|
||||
}
|
||||
|
||||
litModel.field1844 = new int[litModel.field1852];
|
||||
litModel.field1865 = new int[litModel.field1852];
|
||||
litModel.field1846 = new int[litModel.field1852];
|
||||
var10 = 0;
|
||||
|
||||
|
||||
for (int i = 0; i < def.textureTriangleCount; ++i)
|
||||
{
|
||||
if (var9[i] > 0 && def.textureRenderTypes[i] == 0)
|
||||
{
|
||||
litModel.field1844[var10] = def.textureTriangleVertexIndices1[i] & '\uffff';
|
||||
litModel.field1865[var10] = def.textureTriangleVertexIndices2[i] & '\uffff';
|
||||
litModel.field1846[var10] = def.textureTriangleVertexIndices3[i] & '\uffff';
|
||||
var9[i] = var10++;
|
||||
}
|
||||
else
|
||||
{
|
||||
var9[i] = -1;
|
||||
}
|
||||
}
|
||||
|
||||
litModel.field1840 = new byte[def.faceCount];
|
||||
|
||||
for (int i = 0; i < def.faceCount; ++i)
|
||||
{
|
||||
if (def.textureCoordinates[i] != -1)
|
||||
{
|
||||
litModel.field1840[i] = (byte) var9[def.textureCoordinates[i] & 255];
|
||||
}
|
||||
else
|
||||
{
|
||||
litModel.field1840[i] = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int faceIdx = 0; faceIdx < def.faceCount; ++faceIdx)
|
||||
{
|
||||
byte faceType;
|
||||
if (def.faceRenderTypes == null)
|
||||
{
|
||||
faceType = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
faceType = def.faceRenderTypes[faceIdx];
|
||||
}
|
||||
|
||||
byte faceAlpha;
|
||||
if (def.faceAlphas == null)
|
||||
{
|
||||
faceAlpha = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
faceAlpha = def.faceAlphas[faceIdx];
|
||||
}
|
||||
|
||||
short faceTexture;
|
||||
if (def.faceTextures == null)
|
||||
{
|
||||
faceTexture = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
faceTexture = def.faceTextures[faceIdx];
|
||||
}
|
||||
|
||||
if (faceAlpha == -2)
|
||||
{
|
||||
faceType = 3;
|
||||
}
|
||||
|
||||
if (faceAlpha == -1)
|
||||
{
|
||||
faceType = 2;
|
||||
}
|
||||
|
||||
VertexNormal vertexNormal;
|
||||
int tmp;
|
||||
FaceNormal faceNormal;
|
||||
if (faceTexture == -1)
|
||||
{
|
||||
if (faceType != 0)
|
||||
{
|
||||
if (faceType == 1)
|
||||
{
|
||||
faceNormal = def.faceNormals[faceIdx];
|
||||
tmp = (y * faceNormal.y + z * faceNormal.z + x * faceNormal.x) / (var7 / 2 + var7) + ambient;
|
||||
litModel.field1856[faceIdx] = method2608(def.faceColors[faceIdx] & '\uffff', tmp);
|
||||
litModel.field1823[faceIdx] = -1;
|
||||
}
|
||||
else if (faceType == 3)
|
||||
{
|
||||
litModel.field1856[faceIdx] = 128;
|
||||
litModel.field1823[faceIdx] = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
litModel.field1823[faceIdx] = -2;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int var15 = def.faceColors[faceIdx] & '\uffff';
|
||||
vertexNormal = def.vertexNormals[def.faceVertexIndices1[faceIdx]];
|
||||
|
||||
tmp = (y * vertexNormal.y + z * vertexNormal.z + x * vertexNormal.x) / (var7 * vertexNormal.magnitude) + ambient;
|
||||
litModel.field1856[faceIdx] = method2608(var15, tmp);
|
||||
vertexNormal = def.vertexNormals[def.faceVertexIndices2[faceIdx]];
|
||||
|
||||
tmp = (y * vertexNormal.y + z * vertexNormal.z + x * vertexNormal.x) / (var7 * vertexNormal.magnitude) + ambient;
|
||||
litModel.field1854[faceIdx] = method2608(var15, tmp);
|
||||
vertexNormal = def.vertexNormals[def.faceVertexIndices3[faceIdx]];
|
||||
|
||||
tmp = (y * vertexNormal.y + z * vertexNormal.z + x * vertexNormal.x) / (var7 * vertexNormal.magnitude) + ambient;
|
||||
litModel.field1823[faceIdx] = method2608(var15, tmp);
|
||||
}
|
||||
}
|
||||
else if (faceType != 0)
|
||||
{
|
||||
if (faceType == 1)
|
||||
{
|
||||
faceNormal = def.faceNormals[faceIdx];
|
||||
tmp = (y * faceNormal.y + z * faceNormal.z + x * faceNormal.x) / (var7 / 2 + var7) + ambient;
|
||||
litModel.field1856[faceIdx] = bound2to126(tmp);
|
||||
litModel.field1823[faceIdx] = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
litModel.field1823[faceIdx] = -2;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
vertexNormal = def.vertexNormals[def.faceVertexIndices1[faceIdx]];
|
||||
|
||||
tmp = (y * vertexNormal.y + z * vertexNormal.z + x * vertexNormal.x) / (var7 * vertexNormal.magnitude) + ambient;
|
||||
litModel.field1856[faceIdx] = bound2to126(tmp);
|
||||
vertexNormal = def.vertexNormals[def.faceVertexIndices2[faceIdx]];
|
||||
|
||||
tmp = (y * vertexNormal.y + z * vertexNormal.z + x * vertexNormal.x) / (var7 * vertexNormal.magnitude) + ambient;
|
||||
litModel.field1854[faceIdx] = bound2to126(tmp);
|
||||
vertexNormal = def.vertexNormals[def.faceVertexIndices3[faceIdx]];
|
||||
|
||||
tmp = (y * vertexNormal.y + z * vertexNormal.z + x * vertexNormal.x) / (var7 * vertexNormal.magnitude) + ambient;
|
||||
litModel.field1823[faceIdx] = bound2to126(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
litModel.verticesCount = def.vertexCount;
|
||||
litModel.verticesX = def.vertexPositionsX;
|
||||
litModel.verticesY = def.vertexPositionsY;
|
||||
litModel.verticesZ = def.vertexPositionsZ;
|
||||
litModel.indicesCount = def.faceCount;
|
||||
litModel.indices1 = def.faceVertexIndices1;
|
||||
litModel.indices2 = def.faceVertexIndices2;
|
||||
litModel.indices3 = def.faceVertexIndices3;
|
||||
litModel.field1838 = def.faceRenderPriorities;
|
||||
litModel.field1882 = def.faceAlphas;
|
||||
litModel.field1842 = def.priority;
|
||||
litModel.field1841 = def.faceTextures;
|
||||
return litModel;
|
||||
}
|
||||
|
||||
static final int method2608(int var0, int var1)
|
||||
{
|
||||
var1 = ((var0 & 127) * var1) >> 7;
|
||||
var1 = bound2to126(var1);
|
||||
|
||||
return (var0 & 65408) + var1;
|
||||
}
|
||||
|
||||
static final int bound2to126(int var0)
|
||||
{
|
||||
if (var0 < 2)
|
||||
{
|
||||
var0 = 2;
|
||||
}
|
||||
else if (var0 > 126)
|
||||
{
|
||||
var0 = 126;
|
||||
}
|
||||
|
||||
return var0;
|
||||
}
|
||||
}
|
||||
773
cache/src/main/java/net/runelite/cache/item/Model.java
vendored
Normal file
773
cache/src/main/java/net/runelite/cache/item/Model.java
vendored
Normal file
@@ -0,0 +1,773 @@
|
||||
/*
|
||||
* 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;
|
||||
|
||||
class Model extends Renderable
|
||||
{
|
||||
boolean[] field1887 = new boolean[4700];
|
||||
boolean[] field1885 = new boolean[4700];
|
||||
int[] modelViewportYs = new int[4700];
|
||||
int[] modelViewportXs = new int[4700];
|
||||
int[] modelViewportZs = new int[4700];
|
||||
int[] yViewportBuffer = new int[4700];
|
||||
int[] field1839 = new int[4700];
|
||||
int[] field1869 = new int[4700];
|
||||
int[] field1871 = new int[1600];
|
||||
int[][] field1868 = new int[1600][512];
|
||||
int[] field1872 = new int[12];
|
||||
int[][] field1874 = new int[12][2000];
|
||||
int[] field1857 = new int[2000];
|
||||
int[] field1863 = new int[2000];
|
||||
int[] field1877 = new int[12];
|
||||
int[] field1831 = new int[10];
|
||||
int[] field1837 = new int[10];
|
||||
int[] xViewportBuffer = new int[10];
|
||||
static int[] Model_sine;
|
||||
static int[] Model_cosine;
|
||||
static int[] field1890;
|
||||
int verticesCount;
|
||||
int[] verticesX;
|
||||
int[] verticesY;
|
||||
int[] verticesZ;
|
||||
int indicesCount;
|
||||
int[] indices1;
|
||||
int[] indices2;
|
||||
int[] indices3;
|
||||
int[] field1856;
|
||||
int[] field1854;
|
||||
int[] field1823;
|
||||
byte[] field1838;
|
||||
byte[] field1882;
|
||||
byte[] field1840;
|
||||
short[] field1841;
|
||||
byte field1842;
|
||||
int field1852;
|
||||
int[] field1844;
|
||||
int[] field1865;
|
||||
int[] field1846;
|
||||
public boolean isItemModel;
|
||||
int boundsType;
|
||||
int bottomY;
|
||||
int XYZMag;
|
||||
int diameter;
|
||||
int radius;
|
||||
public int extremeX;
|
||||
public int extremeY;
|
||||
public int extremeZ;
|
||||
|
||||
static
|
||||
{
|
||||
Model_sine = Graphics3D.SINE;
|
||||
Model_cosine = Graphics3D.COSINE;
|
||||
field1890 = Graphics3D.field1933;
|
||||
}
|
||||
|
||||
Model()
|
||||
{
|
||||
this.verticesCount = 0;
|
||||
this.indicesCount = 0;
|
||||
this.field1842 = 0;
|
||||
this.field1852 = 0;
|
||||
this.isItemModel = false;
|
||||
this.extremeX = -1;
|
||||
this.extremeY = -1;
|
||||
this.extremeZ = -1;
|
||||
}
|
||||
|
||||
public void calculateBoundsCylinder()
|
||||
{
|
||||
if (this.boundsType != 1)
|
||||
{
|
||||
this.boundsType = 1;
|
||||
super.modelHeight = 0;
|
||||
this.bottomY = 0;
|
||||
this.XYZMag = 0;
|
||||
|
||||
for (int var1 = 0; var1 < this.verticesCount; ++var1)
|
||||
{
|
||||
int var2 = this.verticesX[var1];
|
||||
int var3 = this.verticesY[var1];
|
||||
int var4 = this.verticesZ[var1];
|
||||
if (-var3 > super.modelHeight)
|
||||
{
|
||||
super.modelHeight = -var3;
|
||||
}
|
||||
|
||||
if (var3 > this.bottomY)
|
||||
{
|
||||
this.bottomY = var3;
|
||||
}
|
||||
|
||||
int var5 = var2 * var2 + var4 * var4;
|
||||
if (var5 > this.XYZMag)
|
||||
{
|
||||
this.XYZMag = var5;
|
||||
}
|
||||
}
|
||||
|
||||
this.XYZMag = (int) (Math.sqrt((double) this.XYZMag) + 0.99D);
|
||||
this.radius = (int) (Math.sqrt((double) (this.XYZMag * this.XYZMag + super.modelHeight * super.modelHeight)) + 0.99D);
|
||||
this.diameter = this.radius + (int) (Math.sqrt((double) (this.XYZMag * this.XYZMag + this.bottomY * this.bottomY)) + 0.99D);
|
||||
}
|
||||
}
|
||||
|
||||
public final void rotateAndProject(Graphics3D graphics, int rotation_1, int yRotation, int zRotation, int xRotation, int xOffset, int yOffset, int zOffset)
|
||||
{
|
||||
field1871[0] = -1;
|
||||
// (re?)Calculate magnitude as necessary
|
||||
if (this.boundsType != 2 && this.boundsType != 1)
|
||||
{
|
||||
this.boundsType = 2;
|
||||
this.XYZMag = 0;
|
||||
|
||||
for (int var1 = 0; var1 < this.verticesCount; ++var1)
|
||||
{
|
||||
int x = this.verticesX[var1];
|
||||
int y = this.verticesY[var1];
|
||||
int z = this.verticesZ[var1];
|
||||
int magnitude_squared = x * x + z * z + y * y;
|
||||
if (magnitude_squared > this.XYZMag)
|
||||
{
|
||||
this.XYZMag = magnitude_squared;
|
||||
}
|
||||
}
|
||||
|
||||
this.XYZMag = (int) (Math.sqrt((double) this.XYZMag) + 0.99D);
|
||||
this.radius = this.XYZMag;
|
||||
this.diameter = this.XYZMag + this.XYZMag;
|
||||
}
|
||||
|
||||
// rotate + perspective transform
|
||||
int sinX = Model_sine[xRotation];
|
||||
int cosX = Model_cosine[xRotation];
|
||||
int zRelatedVariable = sinX * yOffset + cosX * zOffset >> 16;
|
||||
|
||||
for (int i = 0; i < this.verticesCount; ++i)
|
||||
{
|
||||
int x = this.verticesX[i];
|
||||
int y = this.verticesY[i];
|
||||
int z = this.verticesZ[i];
|
||||
if (zRotation != 0)
|
||||
{
|
||||
int sinZ = Model_sine[zRotation];
|
||||
int cosZ = Model_cosine[zRotation];
|
||||
int tmp;
|
||||
tmp = y * sinZ + x * cosZ >> 16;
|
||||
y = y * cosZ - x * sinZ >> 16;
|
||||
x = tmp;
|
||||
}
|
||||
|
||||
if (rotation_1 != 0)
|
||||
{
|
||||
int sinR1 = Model_sine[rotation_1];
|
||||
int cosR1 = Model_cosine[rotation_1];
|
||||
int tmp;
|
||||
tmp = y * cosR1 - z * sinR1 >> 16;
|
||||
z = y * sinR1 + z * cosR1 >> 16;
|
||||
y = tmp;
|
||||
}
|
||||
|
||||
if (yRotation != 0)
|
||||
{
|
||||
int sinY = Model_sine[yRotation];
|
||||
int cosY = Model_cosine[yRotation];
|
||||
int tmp;
|
||||
tmp = z * sinY + x * cosY >> 16;
|
||||
z = z * cosY - x * sinY >> 16;
|
||||
x = tmp;
|
||||
}
|
||||
|
||||
x += xOffset;
|
||||
y += yOffset;
|
||||
z += zOffset;
|
||||
int tmp = y * cosX - z * sinX >> 16;
|
||||
z = y * sinX + z * cosX >> 16;
|
||||
modelViewportZs[i] = z - zRelatedVariable;
|
||||
modelViewportYs[i] = x * graphics.Rasterizer3D_zoom / z + graphics.centerX;
|
||||
modelViewportXs[i] = tmp * graphics.Rasterizer3D_zoom / z + graphics.centerY;
|
||||
if (this.field1852 > 0)
|
||||
{
|
||||
yViewportBuffer[i] = x;
|
||||
field1839[i] = tmp;
|
||||
field1869[i] = z;
|
||||
}
|
||||
}
|
||||
|
||||
this.method0(graphics, false, false, 0);
|
||||
}
|
||||
|
||||
|
||||
private void method0(Graphics3D graphics, boolean var1, boolean var3, int var4)
|
||||
{
|
||||
if (this.diameter < 1600)
|
||||
{
|
||||
for (int var5 = 0; var5 < this.diameter; ++var5)
|
||||
{
|
||||
field1871[var5] = 0;
|
||||
}
|
||||
|
||||
int var7;
|
||||
int var9;
|
||||
int var10;
|
||||
int var11;
|
||||
int var12;
|
||||
int var13;
|
||||
int var14;
|
||||
int var15;
|
||||
int var16;
|
||||
int var17;
|
||||
int var18;
|
||||
int var19;
|
||||
int var20;
|
||||
int var27;
|
||||
|
||||
int var26;
|
||||
for (var26 = 0; var26 < this.indicesCount; ++var26)
|
||||
{
|
||||
if (this.field1823[var26] != -2)
|
||||
{
|
||||
var7 = this.indices1[var26];
|
||||
var27 = this.indices2[var26];
|
||||
var9 = this.indices3[var26];
|
||||
var10 = modelViewportYs[var7];
|
||||
var11 = modelViewportYs[var27];
|
||||
var12 = modelViewportYs[var9];
|
||||
if (var1 && (var10 == -5000 || var11 == -5000 || var12 == -5000))
|
||||
{
|
||||
var13 = yViewportBuffer[var7];
|
||||
var14 = yViewportBuffer[var27];
|
||||
var15 = yViewportBuffer[var9];
|
||||
var16 = field1839[var7];
|
||||
var17 = field1839[var27];
|
||||
var18 = field1839[var9];
|
||||
var19 = field1869[var7];
|
||||
var20 = field1869[var27];
|
||||
int var21 = field1869[var9];
|
||||
var13 -= var14;
|
||||
var15 -= var14;
|
||||
var16 -= var17;
|
||||
var18 -= var17;
|
||||
var19 -= var20;
|
||||
var21 -= var20;
|
||||
int var22 = var16 * var21 - var19 * var18;
|
||||
int var23 = var19 * var15 - var13 * var21;
|
||||
int var24 = var13 * var18 - var16 * var15;
|
||||
if (var14 * var22 + var17 * var23 + var20 * var24 > 0)
|
||||
{
|
||||
field1885[var26] = true;
|
||||
int var25 = (modelViewportZs[var7] + modelViewportZs[var27] + modelViewportZs[var9]) / 3 + this.radius;
|
||||
field1868[var25][field1871[var25]++] = var26;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((var10 - var11) * (modelViewportXs[var9] - modelViewportXs[var27]) - (var12 - var11) * (modelViewportXs[var7] - modelViewportXs[var27]) > 0)
|
||||
{
|
||||
field1885[var26] = false;
|
||||
if (var10 >= 0 && var11 >= 0 && var12 >= 0 && var10 <= graphics.rasterClipX && var11 <= graphics.rasterClipX && var12 <= graphics.rasterClipX)
|
||||
{
|
||||
field1887[var26] = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
field1887[var26] = true;
|
||||
}
|
||||
|
||||
var13 = (modelViewportZs[var7] + modelViewportZs[var27] + modelViewportZs[var9]) / 3 + this.radius;
|
||||
field1868[var13][field1871[var13]++] = var26;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int[] var8;
|
||||
if (this.field1838 == null)
|
||||
{
|
||||
for (var26 = this.diameter - 1; var26 >= 0; --var26)
|
||||
{
|
||||
var7 = field1871[var26];
|
||||
if (var7 > 0)
|
||||
{
|
||||
var8 = field1868[var26];
|
||||
|
||||
for (var9 = 0; var9 < var7; ++var9)
|
||||
{
|
||||
this.method2706(graphics, var8[var9]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
for (var26 = 0; var26 < 12; ++var26)
|
||||
{
|
||||
field1872[var26] = 0;
|
||||
field1877[var26] = 0;
|
||||
}
|
||||
|
||||
for (var26 = this.diameter - 1; var26 >= 0; --var26)
|
||||
{
|
||||
var7 = field1871[var26];
|
||||
if (var7 > 0)
|
||||
{
|
||||
var8 = field1868[var26];
|
||||
|
||||
for (var9 = 0; var9 < var7; ++var9)
|
||||
{
|
||||
var10 = var8[var9];
|
||||
byte var31 = this.field1838[var10];
|
||||
var12 = field1872[var31]++;
|
||||
field1874[var31][var12] = var10;
|
||||
if (var31 < 10)
|
||||
{
|
||||
field1877[var31] += var26;
|
||||
}
|
||||
else if (var31 == 10)
|
||||
{
|
||||
field1857[var12] = var26;
|
||||
}
|
||||
else
|
||||
{
|
||||
field1863[var12] = var26;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var26 = 0;
|
||||
if (field1872[1] > 0 || field1872[2] > 0)
|
||||
{
|
||||
var26 = (field1877[1] + field1877[2]) / (field1872[1] + field1872[2]);
|
||||
}
|
||||
|
||||
var7 = 0;
|
||||
if (field1872[3] > 0 || field1872[4] > 0)
|
||||
{
|
||||
var7 = (field1877[3] + field1877[4]) / (field1872[3] + field1872[4]);
|
||||
}
|
||||
|
||||
var27 = 0;
|
||||
if (field1872[6] > 0 || field1872[8] > 0)
|
||||
{
|
||||
var27 = (field1877[8] + field1877[6]) / (field1872[8] + field1872[6]);
|
||||
}
|
||||
|
||||
var10 = 0;
|
||||
var11 = field1872[10];
|
||||
int[] var28 = field1874[10];
|
||||
int[] var29 = field1857;
|
||||
if (var10 == var11)
|
||||
{
|
||||
var10 = 0;
|
||||
var11 = field1872[11];
|
||||
var28 = field1874[11];
|
||||
var29 = field1863;
|
||||
}
|
||||
|
||||
if (var10 < var11)
|
||||
{
|
||||
var9 = var29[var10];
|
||||
}
|
||||
else
|
||||
{
|
||||
var9 = -1000;
|
||||
}
|
||||
|
||||
for (var14 = 0; var14 < 10; ++var14)
|
||||
{
|
||||
while (var14 == 0 && var9 > var26)
|
||||
{
|
||||
this.method2706(graphics, var28[var10++]);
|
||||
if (var10 == var11 && var28 != field1874[11])
|
||||
{
|
||||
var10 = 0;
|
||||
var11 = field1872[11];
|
||||
var28 = field1874[11];
|
||||
var29 = field1863;
|
||||
}
|
||||
|
||||
if (var10 < var11)
|
||||
{
|
||||
var9 = var29[var10];
|
||||
}
|
||||
else
|
||||
{
|
||||
var9 = -1000;
|
||||
}
|
||||
}
|
||||
|
||||
while (var14 == 3 && var9 > var7)
|
||||
{
|
||||
this.method2706(graphics, var28[var10++]);
|
||||
if (var10 == var11 && var28 != field1874[11])
|
||||
{
|
||||
var10 = 0;
|
||||
var11 = field1872[11];
|
||||
var28 = field1874[11];
|
||||
var29 = field1863;
|
||||
}
|
||||
|
||||
if (var10 < var11)
|
||||
{
|
||||
var9 = var29[var10];
|
||||
}
|
||||
else
|
||||
{
|
||||
var9 = -1000;
|
||||
}
|
||||
}
|
||||
|
||||
while (var14 == 5 && var9 > var27)
|
||||
{
|
||||
this.method2706(graphics, var28[var10++]);
|
||||
if (var10 == var11 && var28 != field1874[11])
|
||||
{
|
||||
var10 = 0;
|
||||
var11 = field1872[11];
|
||||
var28 = field1874[11];
|
||||
var29 = field1863;
|
||||
}
|
||||
|
||||
if (var10 < var11)
|
||||
{
|
||||
var9 = var29[var10];
|
||||
}
|
||||
else
|
||||
{
|
||||
var9 = -1000;
|
||||
}
|
||||
}
|
||||
|
||||
var15 = field1872[var14];
|
||||
int[] var30 = field1874[var14];
|
||||
|
||||
for (var17 = 0; var17 < var15; ++var17)
|
||||
{
|
||||
this.method2706(graphics, var30[var17]);
|
||||
}
|
||||
}
|
||||
|
||||
while (var9 != -1000)
|
||||
{
|
||||
this.method2706(graphics, var28[var10++]);
|
||||
if (var10 == var11 && var28 != field1874[11])
|
||||
{
|
||||
var10 = 0;
|
||||
var28 = field1874[11];
|
||||
var11 = field1872[11];
|
||||
var29 = field1863;
|
||||
}
|
||||
|
||||
if (var10 < var11)
|
||||
{
|
||||
var9 = var29[var10];
|
||||
}
|
||||
else
|
||||
{
|
||||
var9 = -1000;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void method2706(Graphics3D graphics, int var1)
|
||||
{
|
||||
if (field1885[var1])
|
||||
{
|
||||
this.method2707(graphics, var1);
|
||||
}
|
||||
else
|
||||
{
|
||||
int var2 = this.indices1[var1];
|
||||
int var3 = this.indices2[var1];
|
||||
int var4 = this.indices3[var1];
|
||||
graphics.rasterClipEnable = field1887[var1];
|
||||
if (this.field1882 == null)
|
||||
{
|
||||
graphics.rasterAlpha = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
graphics.rasterAlpha = this.field1882[var1] & 255;
|
||||
}
|
||||
|
||||
if (this.field1841 != null && this.field1841[var1] != -1)
|
||||
{
|
||||
int var5;
|
||||
int var6;
|
||||
int var7;
|
||||
if (this.field1840 != null && this.field1840[var1] != -1)
|
||||
{
|
||||
int var8 = this.field1840[var1] & 255;
|
||||
var5 = this.field1844[var8];
|
||||
var6 = this.field1865[var8];
|
||||
var7 = this.field1846[var8];
|
||||
}
|
||||
else
|
||||
{
|
||||
var5 = var2;
|
||||
var6 = var3;
|
||||
var7 = var4;
|
||||
}
|
||||
|
||||
if (this.field1823[var1] == -1)
|
||||
{
|
||||
graphics.rasterTextureAffine(modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], this.field1856[var1], this.field1856[var1], this.field1856[var1], yViewportBuffer[var5], yViewportBuffer[var6], yViewportBuffer[var7], field1839[var5], field1839[var6], field1839[var7], field1869[var5], field1869[var6], field1869[var7], this.field1841[var1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
graphics.rasterTextureAffine(modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], this.field1856[var1], this.field1854[var1], this.field1823[var1], yViewportBuffer[var5], yViewportBuffer[var6], yViewportBuffer[var7], field1839[var5], field1839[var6], field1839[var7], field1869[var5], field1869[var6], field1869[var7], this.field1841[var1]);
|
||||
}
|
||||
}
|
||||
else if (this.field1823[var1] == -1)
|
||||
{
|
||||
int[] field1889 = graphics.colorPalette;
|
||||
graphics.rasterFlat(modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], field1889[this.field1856[var1]]);
|
||||
}
|
||||
else
|
||||
{
|
||||
graphics.rasterGouraud(modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], this.field1856[var1], this.field1854[var1], this.field1823[var1]);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void method2707(Graphics3D graphics, int var1)
|
||||
{
|
||||
int var2 = graphics.centerX;
|
||||
int var3 = graphics.centerY;
|
||||
int var4 = 0;
|
||||
int var5 = this.indices1[var1];
|
||||
int var6 = this.indices2[var1];
|
||||
int var7 = this.indices3[var1];
|
||||
int var8 = field1869[var5];
|
||||
int var9 = field1869[var6];
|
||||
int var10 = field1869[var7];
|
||||
if (this.field1882 == null)
|
||||
{
|
||||
graphics.rasterAlpha = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
graphics.rasterAlpha = this.field1882[var1] & 255;
|
||||
}
|
||||
|
||||
int var11;
|
||||
int var12;
|
||||
int var13;
|
||||
int var14;
|
||||
if (var8 >= 50)
|
||||
{
|
||||
field1831[var4] = modelViewportYs[var5];
|
||||
field1837[var4] = modelViewportXs[var5];
|
||||
xViewportBuffer[var4++] = this.field1856[var1];
|
||||
}
|
||||
else
|
||||
{
|
||||
var11 = yViewportBuffer[var5];
|
||||
var12 = field1839[var5];
|
||||
var13 = this.field1856[var1];
|
||||
if (var10 >= 50)
|
||||
{
|
||||
var14 = field1890[var10 - var8] * (50 - var8);
|
||||
field1831[var4] = var2 + graphics.Rasterizer3D_zoom * (var11 + ((yViewportBuffer[var7] - var11) * var14 >> 16)) / 50;
|
||||
field1837[var4] = var3 + graphics.Rasterizer3D_zoom * (var12 + ((field1839[var7] - var12) * var14 >> 16)) / 50;
|
||||
xViewportBuffer[var4++] = var13 + ((this.field1823[var1] - var13) * var14 >> 16);
|
||||
}
|
||||
|
||||
if (var9 >= 50)
|
||||
{
|
||||
var14 = field1890[var9 - var8] * (50 - var8);
|
||||
field1831[var4] = var2 + graphics.Rasterizer3D_zoom * (var11 + ((yViewportBuffer[var6] - var11) * var14 >> 16)) / 50;
|
||||
field1837[var4] = var3 + graphics.Rasterizer3D_zoom * (var12 + ((field1839[var6] - var12) * var14 >> 16)) / 50;
|
||||
xViewportBuffer[var4++] = var13 + ((this.field1854[var1] - var13) * var14 >> 16);
|
||||
}
|
||||
}
|
||||
|
||||
if (var9 >= 50)
|
||||
{
|
||||
field1831[var4] = modelViewportYs[var6];
|
||||
field1837[var4] = modelViewportXs[var6];
|
||||
xViewportBuffer[var4++] = this.field1854[var1];
|
||||
}
|
||||
else
|
||||
{
|
||||
var11 = yViewportBuffer[var6];
|
||||
var12 = field1839[var6];
|
||||
var13 = this.field1854[var1];
|
||||
if (var8 >= 50)
|
||||
{
|
||||
var14 = field1890[var8 - var9] * (50 - var9);
|
||||
field1831[var4] = var2 + graphics.Rasterizer3D_zoom * (var11 + ((yViewportBuffer[var5] - var11) * var14 >> 16)) / 50;
|
||||
field1837[var4] = var3 + graphics.Rasterizer3D_zoom * (var12 + ((field1839[var5] - var12) * var14 >> 16)) / 50;
|
||||
xViewportBuffer[var4++] = var13 + ((this.field1856[var1] - var13) * var14 >> 16);
|
||||
}
|
||||
|
||||
if (var10 >= 50)
|
||||
{
|
||||
var14 = field1890[var10 - var9] * (50 - var9);
|
||||
field1831[var4] = var2 + graphics.Rasterizer3D_zoom * (var11 + ((yViewportBuffer[var7] - var11) * var14 >> 16)) / 50;
|
||||
field1837[var4] = var3 + graphics.Rasterizer3D_zoom * (var12 + ((field1839[var7] - var12) * var14 >> 16)) / 50;
|
||||
xViewportBuffer[var4++] = var13 + ((this.field1823[var1] - var13) * var14 >> 16);
|
||||
}
|
||||
}
|
||||
|
||||
if (var10 >= 50)
|
||||
{
|
||||
field1831[var4] = modelViewportYs[var7];
|
||||
field1837[var4] = modelViewportXs[var7];
|
||||
xViewportBuffer[var4++] = this.field1823[var1];
|
||||
}
|
||||
else
|
||||
{
|
||||
var11 = yViewportBuffer[var7];
|
||||
var12 = field1839[var7];
|
||||
var13 = this.field1823[var1];
|
||||
if (var9 >= 50)
|
||||
{
|
||||
var14 = field1890[var9 - var10] * (50 - var10);
|
||||
field1831[var4] = var2 + graphics.Rasterizer3D_zoom * (var11 + ((yViewportBuffer[var6] - var11) * var14 >> 16)) / 50;
|
||||
field1837[var4] = var3 + graphics.Rasterizer3D_zoom * (var12 + ((field1839[var6] - var12) * var14 >> 16)) / 50;
|
||||
xViewportBuffer[var4++] = var13 + ((this.field1854[var1] - var13) * var14 >> 16);
|
||||
}
|
||||
|
||||
if (var8 >= 50)
|
||||
{
|
||||
var14 = field1890[var8 - var10] * (50 - var10);
|
||||
field1831[var4] = var2 + graphics.Rasterizer3D_zoom * (var11 + ((yViewportBuffer[var5] - var11) * var14 >> 16)) / 50;
|
||||
field1837[var4] = var3 + graphics.Rasterizer3D_zoom * (var12 + ((field1839[var5] - var12) * var14 >> 16)) / 50;
|
||||
xViewportBuffer[var4++] = var13 + ((this.field1856[var1] - var13) * var14 >> 16);
|
||||
}
|
||||
}
|
||||
|
||||
var11 = field1831[0];
|
||||
var12 = field1831[1];
|
||||
var13 = field1831[2];
|
||||
var14 = field1837[0];
|
||||
int var15 = field1837[1];
|
||||
int var16 = field1837[2];
|
||||
graphics.rasterClipEnable = false;
|
||||
int var17;
|
||||
int var18;
|
||||
int var19;
|
||||
int var20;
|
||||
if (var4 == 3)
|
||||
{
|
||||
if (var11 < 0 || var12 < 0 || var13 < 0 || var11 > graphics.rasterClipX || var12 > graphics.rasterClipX || var13 > graphics.rasterClipX)
|
||||
{
|
||||
graphics.rasterClipEnable = true;
|
||||
}
|
||||
|
||||
if (this.field1841 != null && this.field1841[var1] != -1)
|
||||
{
|
||||
if (this.field1840 != null && this.field1840[var1] != -1)
|
||||
{
|
||||
var20 = this.field1840[var1] & 255;
|
||||
var17 = this.field1844[var20];
|
||||
var18 = this.field1865[var20];
|
||||
var19 = this.field1846[var20];
|
||||
}
|
||||
else
|
||||
{
|
||||
var17 = var5;
|
||||
var18 = var6;
|
||||
var19 = var7;
|
||||
}
|
||||
|
||||
if (this.field1823[var1] == -1)
|
||||
{
|
||||
graphics.rasterTextureAffine(var14, var15, var16, var11, var12, var13, this.field1856[var1], this.field1856[var1], this.field1856[var1], yViewportBuffer[var17], yViewportBuffer[var18], yViewportBuffer[var19], field1839[var17], field1839[var18], field1839[var19], field1869[var17], field1869[var18], field1869[var19], this.field1841[var1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
graphics.rasterTextureAffine(var14, var15, var16, var11, var12, var13, xViewportBuffer[0], xViewportBuffer[1], xViewportBuffer[2], yViewportBuffer[var17], yViewportBuffer[var18], yViewportBuffer[var19], field1839[var17], field1839[var18], field1839[var19], field1869[var17], field1869[var18], field1869[var19], this.field1841[var1]);
|
||||
}
|
||||
}
|
||||
else if (this.field1823[var1] == -1)
|
||||
{
|
||||
int[] field1889 = graphics.colorPalette;
|
||||
graphics.rasterFlat(var14, var15, var16, var11, var12, var13, field1889[this.field1856[var1]]);
|
||||
}
|
||||
else
|
||||
{
|
||||
graphics.rasterGouraud(var14, var15, var16, var11, var12, var13, xViewportBuffer[0], xViewportBuffer[1], xViewportBuffer[2]);
|
||||
}
|
||||
}
|
||||
|
||||
if (var4 == 4)
|
||||
{
|
||||
if (var11 < 0 || var12 < 0 || var13 < 0 || var11 > graphics.rasterClipX || var12 > graphics.rasterClipX || var13 > graphics.rasterClipX || field1831[3] < 0 || field1831[3] > graphics.rasterClipX)
|
||||
{
|
||||
graphics.rasterClipEnable = true;
|
||||
}
|
||||
|
||||
if (this.field1841 != null && this.field1841[var1] != -1)
|
||||
{
|
||||
if (this.field1840 != null && this.field1840[var1] != -1)
|
||||
{
|
||||
var20 = this.field1840[var1] & 255;
|
||||
var17 = this.field1844[var20];
|
||||
var18 = this.field1865[var20];
|
||||
var19 = this.field1846[var20];
|
||||
}
|
||||
else
|
||||
{
|
||||
var17 = var5;
|
||||
var18 = var6;
|
||||
var19 = var7;
|
||||
}
|
||||
|
||||
short var21 = this.field1841[var1];
|
||||
if (this.field1823[var1] == -1)
|
||||
{
|
||||
graphics.rasterTextureAffine(var14, var15, var16, var11, var12, var13, this.field1856[var1], this.field1856[var1], this.field1856[var1], yViewportBuffer[var17], yViewportBuffer[var18], yViewportBuffer[var19], field1839[var17], field1839[var18], field1839[var19], field1869[var17], field1869[var18], field1869[var19], var21);
|
||||
graphics.rasterTextureAffine(var14, var16, field1837[3], var11, var13, field1831[3], this.field1856[var1], this.field1856[var1], this.field1856[var1], yViewportBuffer[var17], yViewportBuffer[var18], yViewportBuffer[var19], field1839[var17], field1839[var18], field1839[var19], field1869[var17], field1869[var18], field1869[var19], var21);
|
||||
}
|
||||
else
|
||||
{
|
||||
graphics.rasterTextureAffine(var14, var15, var16, var11, var12, var13, xViewportBuffer[0], xViewportBuffer[1], xViewportBuffer[2], yViewportBuffer[var17], yViewportBuffer[var18], yViewportBuffer[var19], field1839[var17], field1839[var18], field1839[var19], field1869[var17], field1869[var18], field1869[var19], var21);
|
||||
graphics.rasterTextureAffine(var14, var16, field1837[3], var11, var13, field1831[3], xViewportBuffer[0], xViewportBuffer[2], xViewportBuffer[3], yViewportBuffer[var17], yViewportBuffer[var18], yViewportBuffer[var19], field1839[var17], field1839[var18], field1839[var19], field1869[var17], field1869[var18], field1869[var19], var21);
|
||||
}
|
||||
}
|
||||
else if (this.field1823[var1] == -1)
|
||||
{
|
||||
int[] field1889 = graphics.colorPalette;
|
||||
var17 = field1889[this.field1856[var1]];
|
||||
graphics.rasterFlat(var14, var15, var16, var11, var12, var13, var17);
|
||||
graphics.rasterFlat(var14, var16, field1837[3], var11, var13, field1831[3], var17);
|
||||
}
|
||||
else
|
||||
{
|
||||
graphics.rasterGouraud(var14, var15, var16, var11, var12, var13, xViewportBuffer[0], xViewportBuffer[1], xViewportBuffer[2]);
|
||||
graphics.rasterGouraud(var14, var16, field1837[3], var11, var13, field1831[3], xViewportBuffer[0], xViewportBuffer[2], xViewportBuffer[3]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
101
cache/src/main/java/net/runelite/cache/item/RSTextureProvider.java
vendored
Normal file
101
cache/src/main/java/net/runelite/cache/item/RSTextureProvider.java
vendored
Normal file
@@ -0,0 +1,101 @@
|
||||
/*
|
||||
* 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 net.runelite.cache.definitions.TextureDefinition;
|
||||
import net.runelite.cache.definitions.providers.SpriteProvider;
|
||||
import net.runelite.cache.definitions.providers.TextureProvider;
|
||||
|
||||
class RSTextureProvider
|
||||
{
|
||||
private final SpriteProvider spriteProvider;
|
||||
TextureDefinition[] textures;
|
||||
int maxSize;
|
||||
int size;
|
||||
double brightness;
|
||||
int width;
|
||||
|
||||
public RSTextureProvider(TextureProvider textureProvider, SpriteProvider spriteProvider)
|
||||
{
|
||||
this.spriteProvider = spriteProvider;
|
||||
this.size = 0;
|
||||
this.brightness = 1.0D;
|
||||
this.width = 128;
|
||||
this.maxSize = 20;
|
||||
this.size = this.maxSize;
|
||||
this.brightness = 0.8D;
|
||||
this.width = 128;
|
||||
|
||||
int max = -1;
|
||||
for (TextureDefinition textureDefinition : textureProvider.provide())
|
||||
{
|
||||
if (textureDefinition.getId() > max)
|
||||
{
|
||||
max = textureDefinition.getId();
|
||||
}
|
||||
}
|
||||
|
||||
textures = new TextureDefinition[max + 1];
|
||||
for (TextureDefinition textureDefinition : textureProvider.provide())
|
||||
{
|
||||
textures[textureDefinition.getId()] = textureDefinition;
|
||||
}
|
||||
}
|
||||
|
||||
public int[] load(int var1)
|
||||
{
|
||||
TextureDefinition var2 = this.textures[var1];
|
||||
if (var2 != null)
|
||||
{
|
||||
if (var2.pixels != null)
|
||||
{
|
||||
return var2.pixels;
|
||||
}
|
||||
|
||||
boolean var3 = var2.method2680(this.brightness, this.width, spriteProvider);
|
||||
return var2.pixels;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public int getAverageTextureRGB(int var1)
|
||||
{
|
||||
return this.textures[var1] != null ? this.textures[var1].field1777 : 0;
|
||||
}
|
||||
|
||||
|
||||
public boolean vmethod3057(int var1)
|
||||
{
|
||||
return this.textures[var1].field1778;
|
||||
}
|
||||
|
||||
|
||||
public boolean vmethod3066(int var1)
|
||||
{
|
||||
return this.width == 64;
|
||||
}
|
||||
}
|
||||
96
cache/src/main/java/net/runelite/cache/item/Rasterizer2D.java
vendored
Normal file
96
cache/src/main/java/net/runelite/cache/item/Rasterizer2D.java
vendored
Normal file
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
* 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;
|
||||
|
||||
class Rasterizer2D
|
||||
{
|
||||
public int[] graphicsPixels;
|
||||
public int graphicsPixelsWidth;
|
||||
public int graphicsPixelsHeight;
|
||||
public int drawingAreaTop;
|
||||
public int drawingAreaBottom;
|
||||
public int draw_region_x;
|
||||
protected int drawingAreaRight;
|
||||
|
||||
public void setRasterBuffer(int[] var0, int var1, int var2)
|
||||
{
|
||||
graphicsPixels = var0;
|
||||
graphicsPixelsWidth = var1;
|
||||
graphicsPixelsHeight = var2;
|
||||
setDrawRegion(0, 0, var1, var2);
|
||||
}
|
||||
|
||||
public void setDrawRegion(int var0, int var1, int var2, int var3)
|
||||
{
|
||||
if (var0 < 0)
|
||||
{
|
||||
var0 = 0;
|
||||
}
|
||||
|
||||
if (var1 < 0)
|
||||
{
|
||||
var1 = 0;
|
||||
}
|
||||
|
||||
if (var2 > graphicsPixelsWidth)
|
||||
{
|
||||
var2 = graphicsPixelsWidth;
|
||||
}
|
||||
|
||||
if (var3 > graphicsPixelsHeight)
|
||||
{
|
||||
var3 = graphicsPixelsHeight;
|
||||
}
|
||||
|
||||
draw_region_x = var0;
|
||||
drawingAreaTop = var1;
|
||||
drawingAreaRight = var2;
|
||||
drawingAreaBottom = var3;
|
||||
}
|
||||
|
||||
public void reset()
|
||||
{
|
||||
int var0 = 0;
|
||||
|
||||
int var1;
|
||||
for (var1 = graphicsPixelsWidth * graphicsPixelsHeight - 7; var0 < var1; graphicsPixels[var0++] = 0)
|
||||
{
|
||||
graphicsPixels[var0++] = 0;
|
||||
graphicsPixels[var0++] = 0;
|
||||
graphicsPixels[var0++] = 0;
|
||||
graphicsPixels[var0++] = 0;
|
||||
graphicsPixels[var0++] = 0;
|
||||
graphicsPixels[var0++] = 0;
|
||||
graphicsPixels[var0++] = 0;
|
||||
}
|
||||
|
||||
for (var1 += 7; var0 < var1; graphicsPixels[var0++] = 0)
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
35
cache/src/main/java/net/runelite/cache/item/Renderable.java
vendored
Normal file
35
cache/src/main/java/net/runelite/cache/item/Renderable.java
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* 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;
|
||||
|
||||
abstract class Renderable
|
||||
{
|
||||
public int modelHeight;
|
||||
|
||||
protected Renderable()
|
||||
{
|
||||
this.modelHeight = 1000;
|
||||
}
|
||||
}
|
||||
216
cache/src/main/java/net/runelite/cache/item/SpritePixels.java
vendored
Normal file
216
cache/src/main/java/net/runelite/cache/item/SpritePixels.java
vendored
Normal file
@@ -0,0 +1,216 @@
|
||||
/*
|
||||
* 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 java.awt.image.BufferedImage;
|
||||
|
||||
class SpritePixels
|
||||
{
|
||||
public int[] pixels;
|
||||
public int width;
|
||||
public int height;
|
||||
public int offsetX;
|
||||
int offsetY;
|
||||
|
||||
public SpritePixels(int[] var1, int var2, int var3)
|
||||
{
|
||||
this.pixels = var1;
|
||||
this.width = var2;
|
||||
this.height = var3;
|
||||
this.offsetY = 0;
|
||||
this.offsetX = 0;
|
||||
}
|
||||
|
||||
public SpritePixels(int var1, int var2)
|
||||
{
|
||||
this(new int[var2 * var1], var1, var2);
|
||||
}
|
||||
|
||||
public void drawBorder(int color)
|
||||
{
|
||||
int[] newPixels = new int[this.width * this.height];
|
||||
int pixelIndex = 0;
|
||||
|
||||
for (int y = 0; y < this.height; ++y)
|
||||
{
|
||||
for (int x = 0; x < this.width; ++x)
|
||||
{
|
||||
int pixel = this.pixels[pixelIndex];
|
||||
if (pixel == 0)
|
||||
{
|
||||
// W
|
||||
if (x > 0 && this.pixels[pixelIndex - 1] != 0)
|
||||
{
|
||||
pixel = color;
|
||||
}
|
||||
// N
|
||||
else if (y > 0 && this.pixels[pixelIndex - this.width] != 0)
|
||||
{
|
||||
pixel = color;
|
||||
}
|
||||
// E
|
||||
else if (x < this.width - 1 && this.pixels[pixelIndex + 1] != 0)
|
||||
{
|
||||
pixel = color;
|
||||
}
|
||||
// S
|
||||
else if (y < this.height - 1 && this.pixels[pixelIndex + this.width] != 0)
|
||||
{
|
||||
pixel = color;
|
||||
}
|
||||
}
|
||||
|
||||
newPixels[pixelIndex++] = pixel;
|
||||
}
|
||||
}
|
||||
|
||||
this.pixels = newPixels;
|
||||
}
|
||||
|
||||
|
||||
public void drawShadow(int color)
|
||||
{
|
||||
for (int y = this.height - 1; y > 0; --y)
|
||||
{
|
||||
int rowOffset = y * this.width;
|
||||
|
||||
for (int x = this.width - 1; x > 0; --x)
|
||||
{
|
||||
// if *this* pixel is black/unset AND the pixel to the NW isn't black/unset
|
||||
if (this.pixels[x + rowOffset] == 0 && this.pixels[x + rowOffset - 1 - this.width] != 0)
|
||||
{
|
||||
this.pixels[x + rowOffset] = color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void drawAtOn(Rasterizer2D graphics, int x, int y)
|
||||
{
|
||||
x += this.offsetX;
|
||||
y += this.offsetY;
|
||||
int pixelIndex = x + y * graphics.graphicsPixelsWidth;
|
||||
int deltaIndex = 0;
|
||||
int height = this.height;
|
||||
int width = this.width;
|
||||
int var7 = graphics.graphicsPixelsWidth - width;
|
||||
int var8 = 0;
|
||||
if (y < graphics.drawingAreaTop)
|
||||
{
|
||||
int deltaY = graphics.drawingAreaTop - y;
|
||||
height -= deltaY;
|
||||
y = graphics.drawingAreaTop;
|
||||
deltaIndex += deltaY * width;
|
||||
pixelIndex += deltaY * graphics.graphicsPixelsWidth;
|
||||
}
|
||||
|
||||
if (height + y > graphics.drawingAreaBottom)
|
||||
{
|
||||
height -= height + y - graphics.drawingAreaBottom;
|
||||
}
|
||||
|
||||
if (x < graphics.draw_region_x)
|
||||
{
|
||||
int deltaX = graphics.draw_region_x - x;
|
||||
width -= deltaX;
|
||||
x = graphics.draw_region_x;
|
||||
deltaIndex += deltaX;
|
||||
pixelIndex += deltaX;
|
||||
var8 += deltaX;
|
||||
var7 += deltaX;
|
||||
}
|
||||
|
||||
if (width + x > graphics.drawingAreaRight)
|
||||
{
|
||||
int deltaX = width + x - graphics.drawingAreaRight;
|
||||
width -= deltaX;
|
||||
var8 += deltaX;
|
||||
var7 += deltaX;
|
||||
}
|
||||
|
||||
if (width > 0 && height > 0)
|
||||
{
|
||||
method5843(graphics.graphicsPixels, this.pixels, 0, deltaIndex, pixelIndex, width, height, var7, var8);
|
||||
}
|
||||
}
|
||||
|
||||
static void method5843(int[] rasterizerPixels, int[] spritePixels, int var2, int var3, int pixelIndex, int width, int height, int var7, int var8)
|
||||
{
|
||||
int var9 = -(width >> 2);
|
||||
width = -(width & 3);
|
||||
|
||||
for (int var10 = -height; var10 < 0; ++var10)
|
||||
{
|
||||
for (int i = var9 * 4; i < 0; ++i)
|
||||
{
|
||||
var2 = spritePixels[var3++];
|
||||
if (var2 != 0)
|
||||
{
|
||||
rasterizerPixels[pixelIndex++] = var2;
|
||||
}
|
||||
else
|
||||
{
|
||||
++pixelIndex;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = width; i < 0; ++i)
|
||||
{
|
||||
var2 = spritePixels[var3++];
|
||||
if (var2 != 0)
|
||||
{
|
||||
rasterizerPixels[pixelIndex++] = var2;
|
||||
}
|
||||
else
|
||||
{
|
||||
++pixelIndex;
|
||||
}
|
||||
}
|
||||
|
||||
pixelIndex += var7;
|
||||
var3 += var8;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public BufferedImage toBufferedImage()
|
||||
{
|
||||
int[] transPixels = new int[pixels.length];
|
||||
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
|
||||
|
||||
for (int i = 0; i < pixels.length; i++)
|
||||
{
|
||||
if (pixels[i] != 0)
|
||||
{
|
||||
transPixels[i] = pixels[i] | 0xff000000;
|
||||
}
|
||||
}
|
||||
|
||||
img.setRGB(0, 0, width, height, transPixels, 0, width);
|
||||
return img;
|
||||
}
|
||||
|
||||
}
|
||||
118
cache/src/test/java/net/runelite/cache/item/ItemSpriteFactoryTest.java
vendored
Normal file
118
cache/src/test/java/net/runelite/cache/item/ItemSpriteFactoryTest.java
vendored
Normal file
@@ -0,0 +1,118 @@
|
||||
/*
|
||||
* 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 java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import javax.imageio.ImageIO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.runelite.cache.IndexType;
|
||||
import net.runelite.cache.ItemManager;
|
||||
import net.runelite.cache.SpriteManager;
|
||||
import net.runelite.cache.StoreLocation;
|
||||
import net.runelite.cache.TextureManager;
|
||||
import net.runelite.cache.definitions.ItemDefinition;
|
||||
import net.runelite.cache.definitions.ModelDefinition;
|
||||
import net.runelite.cache.definitions.loaders.ModelLoader;
|
||||
import net.runelite.cache.definitions.providers.ModelProvider;
|
||||
import net.runelite.cache.fs.Archive;
|
||||
import net.runelite.cache.fs.Index;
|
||||
import net.runelite.cache.fs.Store;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.rules.TemporaryFolder;
|
||||
|
||||
@Slf4j
|
||||
public class ItemSpriteFactoryTest
|
||||
{
|
||||
@Rule
|
||||
public TemporaryFolder folder = StoreLocation.getTemporaryFolder();
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
public void test() throws IOException
|
||||
{
|
||||
File base = StoreLocation.LOCATION,
|
||||
outDir = folder.newFolder();
|
||||
|
||||
int count = 0;
|
||||
|
||||
try (Store store = new Store(base))
|
||||
{
|
||||
store.load();
|
||||
|
||||
ItemManager itemManager = new ItemManager(store);
|
||||
itemManager.load();
|
||||
|
||||
ModelProvider modelProvider = new ModelProvider()
|
||||
{
|
||||
@Override
|
||||
public ModelDefinition provide(int modelId) throws IOException
|
||||
{
|
||||
Index models = store.getIndex(IndexType.MODELS);
|
||||
Archive archive = models.getArchive(modelId);
|
||||
|
||||
byte[] data = archive.decompress(store.getStorage().loadArchive(archive));
|
||||
ModelDefinition inventoryModel = new ModelLoader().load(modelId, data);
|
||||
return inventoryModel;
|
||||
}
|
||||
};
|
||||
|
||||
SpriteManager spriteManager = new SpriteManager(store);
|
||||
spriteManager.load();
|
||||
|
||||
TextureManager textureManager = new TextureManager(store);
|
||||
textureManager.load();
|
||||
|
||||
for (ItemDefinition itemDef : itemManager.getItems())
|
||||
{
|
||||
if (itemDef.name == null || itemDef.name.equalsIgnoreCase("null"))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
BufferedImage sprite = ItemSpriteFactory.createSprite(itemManager, modelProvider, spriteManager, textureManager,
|
||||
itemDef.id, 1, 1, 3153952, false);
|
||||
|
||||
File out = new File(outDir, itemDef.id + ".png");
|
||||
BufferedImage img = sprite;
|
||||
ImageIO.write(img, "PNG", out);
|
||||
|
||||
++count;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
log.warn("error dumping item {}", itemDef.id, ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
log.info("Dumped {} item images to {}", count, outDir);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user