From 8e2adef0ab83f820f1ffc2bda19c95898a48f7ac Mon Sep 17 00:00:00 2001 From: tterrag1098 Date: Wed, 18 Feb 2015 15:27:57 -0500 Subject: [PATCH] Begin CTM refactor. Submaps working, lighting not so much --- .../chisel/api/carving/CarvingUtils.java | 33 +- .../chisel/api/carving/ICarvableHelper.java | 6 + .../chisel/carving/CarvableHelper.java | 536 ++++++++++++------ .../chisel/carving/CarvableVariation.java | 5 +- .../chisel/carving/ITextureVariation.java | 6 + .../render/BlockAdvancedMarbleRenderer.java | 7 +- .../render/BlockCTMNoLightRenderer.java | 6 +- .../render/BlockMarblePillarRenderer.java | 3 +- .../chisel/client/render/RenderBlocksCTM.java | 412 ++++++-------- .../client/render/RenderBlocksCTMCarpet.java | 9 - .../chisel/client/render/TextureSubmap.java | 1 - .../chisel/client/render/TextureVirtual.java | 41 +- 12 files changed, 638 insertions(+), 427 deletions(-) create mode 100644 src/main/java/com/cricketcraft/chisel/api/carving/ICarvableHelper.java create mode 100644 src/main/java/com/cricketcraft/chisel/carving/ITextureVariation.java diff --git a/src/main/java/com/cricketcraft/chisel/api/carving/CarvingUtils.java b/src/main/java/com/cricketcraft/chisel/api/carving/CarvingUtils.java index d47676ef..0d687fa6 100644 --- a/src/main/java/com/cricketcraft/chisel/api/carving/CarvingUtils.java +++ b/src/main/java/com/cricketcraft/chisel/api/carving/CarvingUtils.java @@ -31,16 +31,20 @@ public class CarvingUtils { } private static Field _chisel; - private static boolean errored = false; + private static boolean registryErrored = false; private static final String CARVING_CLASS = "com.cricketcraft.chisel.carving.Carving"; + private static Class _carvableHelper; + private static boolean helperErrored = false; + private static final String CARVABLE_HELPER_CLASS = "com.cricketcraft.carving.CarvableHelper"; + /** * @return The instance of the chisel carving registry from the chisel mod. *

* If chisel is not installed or some other error occurs this will return null. */ public static ICarvingRegistry getChiselRegistry() { - if (errored) { + if (registryErrored) { return null; } @@ -51,8 +55,31 @@ public class CarvingUtils { return (ICarvingRegistry) _chisel.get(null); } catch (Exception e) { e.printStackTrace(); - errored = true; + registryErrored = true; return getChiselRegistry(); } } + + /** + * @return An instance of an {@link ICarvableHelper}. + *

+ * If chisel is not installed or some other error occurs this will return null. + */ + @SuppressWarnings("unchecked") + public static ICarvableHelper getCarvableHelperInstance() { + if (helperErrored) { + return null; + } + + try { + if (_carvableHelper == null) { + _carvableHelper = (Class) Class.forName(CARVABLE_HELPER_CLASS); + } + return _carvableHelper.newInstance(); + } catch (Exception e) { + e.printStackTrace(); + helperErrored = true; + return getCarvableHelperInstance(); + } + } } diff --git a/src/main/java/com/cricketcraft/chisel/api/carving/ICarvableHelper.java b/src/main/java/com/cricketcraft/chisel/api/carving/ICarvableHelper.java new file mode 100644 index 00000000..9d47b4cc --- /dev/null +++ b/src/main/java/com/cricketcraft/chisel/api/carving/ICarvableHelper.java @@ -0,0 +1,6 @@ +package com.cricketcraft.chisel.api.carving; + + +public interface ICarvableHelper { + +} diff --git a/src/main/java/com/cricketcraft/chisel/carving/CarvableHelper.java b/src/main/java/com/cricketcraft/chisel/carving/CarvableHelper.java index fe3e0ad5..bd36602f 100644 --- a/src/main/java/com/cricketcraft/chisel/carving/CarvableHelper.java +++ b/src/main/java/com/cricketcraft/chisel/carving/CarvableHelper.java @@ -8,6 +8,7 @@ import com.cricketcraft.chisel.compat.FMPIntegration; import com.cricketcraft.chisel.config.Configurations; import com.cricketcraft.chisel.item.ItemCarvable; import com.cricketcraft.chisel.utils.GeneralClient; + import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.block.Block; import net.minecraft.block.BlockPane; @@ -23,20 +24,288 @@ import java.util.*; public class CarvableHelper { - public static final int NORMAL = 0; - public static final int TOPSIDE = 1; - public static final int TOPBOTSIDE = 2; - public static final int CTM3 = 3; - public static final int CTMV = 4; - public static final int CTMH = 5; - public static final int V9 = 6; - public static final int V4 = 7; - public static final int CTMX = 8; - public static final int R16 = 9; - public static final int R9 = 10; - public static final int R4 = 11; + public interface ISubmapManager { - private static final Random rand = new Random(); + IIcon getIcon(int side, int meta); + + IIcon getIcon(IBlockAccess world, int x, int y, int z, int side); + + void registerIcons(String modName, Block block, IIconRegister register); + } + + public enum TextureType implements ISubmapManager { + + TOPSIDE("top", "side") { + + @Override + public IIcon getIcon(int side, int meta) { + // TODO Auto-generated method stub + return null; + } + + @Override + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void registerIcons(String modName, Block block, IIconRegister register) { + // TODO Auto-generated method stub + + } + }, + TOPBOTSIDE("top", "bottom", "side") { + + @Override + public IIcon getIcon(int side, int meta) { + // TODO Auto-generated method stub + return null; + } + + @Override + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void registerIcons(String modName, Block block, IIconRegister register) { + // TODO Auto-generated method stub + + } + }, + CTM3("ctm1", "ctm2", "ctm3") { + + @Override + public IIcon getIcon(int side, int meta) { + // TODO Auto-generated method stub + return null; + } + + @Override + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void registerIcons(String modName, Block block, IIconRegister register) { + // TODO Auto-generated method stub + + } + }, + CTMV("ctmv", "top") { + + @Override + public IIcon getIcon(int side, int meta) { + // TODO Auto-generated method stub + return null; + } + + @Override + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void registerIcons(String modName, Block block, IIconRegister register) { + // TODO Auto-generated method stub + + } + }, + CTMH("ctmh", "top") { + + @Override + public IIcon getIcon(int side, int meta) { + // TODO Auto-generated method stub + return null; + } + + @Override + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void registerIcons(String modName, Block block, IIconRegister register) { + // TODO Auto-generated method stub + + } + }, + V9("v9") { + + @Override + public IIcon getIcon(int side, int meta) { + // TODO Auto-generated method stub + return null; + } + + @Override + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void registerIcons(String modName, Block block, IIconRegister register) { + // TODO Auto-generated method stub + + } + }, + V4("v4") { + + @Override + public IIcon getIcon(int side, int meta) { + // TODO Auto-generated method stub + return null; + } + + @Override + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void registerIcons(String modName, Block block, IIconRegister register) { + // TODO Auto-generated method stub + + } + }, + CTMX("", "ctm") { + + @Override + public IIcon getIcon(int side, int meta) { + // TODO Auto-generated method stub + return null; + } + + @Override + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void registerIcons(String modName, Block block, IIconRegister register) { + // TODO Auto-generated method stub + + } + }, + R16("r16") { + + @Override + public IIcon getIcon(int side, int meta) { + // TODO Auto-generated method stub + return null; + } + + @Override + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void registerIcons(String modName, Block block, IIconRegister register) { + // TODO Auto-generated method stub + + } + }, + R9("r9") { + + @Override + public IIcon getIcon(int side, int meta) { + // TODO Auto-generated method stub + return null; + } + + @Override + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void registerIcons(String modName, Block block, IIconRegister register) { + // TODO Auto-generated method stub + + } + }, + R4("r4") { + + @Override + public IIcon getIcon(int side, int meta) { + // TODO Auto-generated method stub + return null; + } + + @Override + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void registerIcons(String modName, Block block, IIconRegister register) { + // TODO Auto-generated method stub + + } + }, + NORMAL { + + @Override + public IIcon getIcon(int side, int meta) { + // TODO Auto-generated method stub + return null; + } + + @Override + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void registerIcons(String modName, Block block, IIconRegister register) { + // TODO Auto-generated method stub + + } + }; + + private String[] suffixes; + + private TextureType(String... suffixes) { + this.suffixes = suffixes.length == 0 ? new String[] { "" } : suffixes; + } + + public static ISubmapManager getManagerFor(String path) { + for (TextureType t : values()) { + boolean matches = true; + for (String s : t.suffixes) { + String res = "".equals(s) ? path + ".png" : path + "-" + s + ".png"; + if (Chisel.class.getResource(res) == null) { + matches = false; + } + } + if (matches) { + return t; + } + } + return null; + } + + @Override + public abstract IIcon getIcon(int side, int meta); + + @Override + public abstract IIcon getIcon(IBlockAccess world, int x, int y, int z, int side); + } + + private static final Random rand = new Random(); public ArrayList variations = new ArrayList(); CarvableVariation[] map = new CarvableVariation[16]; @@ -75,53 +344,11 @@ public class CarvableHelper { if (texture != null) { variation.texture = texture; - String path = "/assets/" + Chisel.MOD_ID + "/textures/blocks/" + variation.texture; - - boolean any = Chisel.class.getResource(path + ".png") != null; - boolean ctm3 = Chisel.class.getResource(path + "-ctm1.png") != null && Chisel.class.getResource(path + "-ctm2.png") != null && Chisel.class.getResource(path + "-ctm3.png") != null; - boolean ctmv = Chisel.class.getResource(path + "-ctmv.png") != null; - boolean ctmh = Chisel.class.getResource(path + "-ctmh.png") != null; - boolean side = Chisel.class.getResource(path + "-side.png") != null; - boolean top = Chisel.class.getResource(path + "-top.png") != null; - boolean bot = Chisel.class.getResource(path + "-bottom.png") != null; - boolean v9 = Chisel.class.getResource(path + "-v9.png") != null; - boolean v4 = Chisel.class.getResource(path + "-v4.png") != null; - boolean ctmx = Chisel.class.getResource(path + "-ctm.png") != null; - boolean r16 = Chisel.class.getResource(path + "-r16.png") != null; - boolean r9 = Chisel.class.getResource(path + "-r9.png") != null; - boolean r4 = Chisel.class.getResource(path + "-r4.png") != null; - - if (ctm3) { - variation.kind = 3; - } else if (ctmh && top) { - variation.kind = 5; - } else if (ctmv && top) { - variation.kind = CTMV; - } else if (bot && top && side) { - variation.kind = 2; - } else if (top && side) { - variation.kind = 1; - } else if (v9) { - variation.kind = V9; - } else if (v4) { - variation.kind = V4; - } else if (any && ctmx && !Configurations.disableCTM) { - variation.kind = CTMX; - } else if (r16) { - variation.kind = R16; - } else if (r9) { - variation.kind = R9; - } else if (r4) { - variation.kind = R4; - } else if (any) { - variation.kind = 0; - } else { - throw new RuntimeException("No valid textures found for chisel block variation '" + description + "' (" + variation.texture + ")"); - } + variation.type = (TextureType) TextureType.getManagerFor(path); } else { variation.block = block; - variation.kind = 2; + variation.type = TextureType.TOPBOTSIDE; variation.blockMeta = blockMeta; } @@ -148,45 +375,45 @@ public class CarvableHelper { if (variation == null) return GeneralClient.getMissingIcon(); - switch (variation.kind) { - case NORMAL: - return variation.icon; - case TOPSIDE: - if (side == 0 || side == 1) - return variation.iconTop; - else - return variation.icon; - case TOPBOTSIDE: - if (side == 1) - return variation.iconTop; - else if (side == 0) - return variation.iconBot; - else - return variation.icon; - case CTM3: - return variation.ctm.seams[0].icons[0]; - case CTMV: - if (side < 2) - return variation.iconTop; - else - return variation.seamsCtmVert.icons[0]; - case CTMH: - if (side < 2) - return variation.iconTop; - else - return variation.seamsCtmVert.icons[0]; - case V9: - return variation.variations9.icons[4]; - case V4: - return variation.variations9.icons[0]; - case CTMX: - return variation.icon; - case R16: - return variation.variations9.icons[5]; - case R9: - return variation.variations9.icons[4]; - case R4: - return variation.variations9.icons[0]; + switch (variation.type) { + case NORMAL: + return variation.icon; + case TOPSIDE: + if (side == 0 || side == 1) + return variation.iconTop; + else + return variation.icon; + case TOPBOTSIDE: + if (side == 1) + return variation.iconTop; + else if (side == 0) + return variation.iconBot; + else + return variation.icon; + case CTM3: + return variation.ctm.seams[0].icons[0]; + case CTMV: + if (side < 2) + return variation.iconTop; + else + return variation.seamsCtmVert.icons[0]; + case CTMH: + if (side < 2) + return variation.iconTop; + else + return variation.seamsCtmVert.icons[0]; + case V9: + return variation.variations9.icons[4]; + case V4: + return variation.variations9.icons[0]; + case CTMX: + return variation.icon; + case R16: + return variation.variations9.icons[5]; + case R9: + return variation.variations9.icons[4]; + case R4: + return variation.variations9.icons[0]; } return GeneralClient.getMissingIcon(); @@ -202,7 +429,7 @@ public class CarvableHelper { if (variation == null) return GeneralClient.getMissingIcon(); - switch (variation.kind) { + switch (variation.type) { case NORMAL: case TOPSIDE: case TOPBOTSIDE: @@ -255,61 +482,59 @@ public class CarvableHelper { else if (n) return variation.seamsCtmVert.icons[reverse ? 3 : 2]; return variation.seamsCtmVert.icons[0]; - case V9: - case V4: - int variationSize = (variation.kind == V9) ? 3 : 2; + case V9: + case V4: + int variationSize = (variation.type == TextureType.V9) ? 3 : 2; - int xModulus = x % variationSize; - int zModulus = z % variationSize; - //This ensures that blocks placed near 0,0 or it's axis' do not misbehave - int textureX = (xModulus < 0) ? (xModulus + variationSize) : xModulus; - int textureZ = (zModulus < 0) ? (zModulus + variationSize) : zModulus; - //Always invert the y index - int textureY = (variationSize - (y % variationSize) - 1); + int xModulus = x % variationSize; + int zModulus = z % variationSize; + // This ensures that blocks placed near 0,0 or it's axis' do not misbehave + int textureX = (xModulus < 0) ? (xModulus + variationSize) : xModulus; + int textureZ = (zModulus < 0) ? (zModulus + variationSize) : zModulus; + // Always invert the y index + int textureY = (variationSize - (y % variationSize) - 1); - if (side == 2 || side == 5) { - //For WEST, SOUTH reverse the indexes for both X and Z - textureX = (variationSize - textureX - 1); - textureZ = (variationSize - textureZ - 1); - } else if (side == 0) { - //For DOWN, reverse the indexes for only Z - textureZ = (variationSize - textureZ - 1); - } + if (side == 2 || side == 5) { + // For WEST, SOUTH reverse the indexes for both X and Z + textureX = (variationSize - textureX - 1); + textureZ = (variationSize - textureZ - 1); + } else if (side == 0) { + // For DOWN, reverse the indexes for only Z + textureZ = (variationSize - textureZ - 1); + } - int index; - if (side == 0 || side == 1) { - // DOWN || UP - index = textureX + textureZ * variationSize; - } else if (side == 2 || side == 3) { - // NORTH || SOUTH - index = textureX + textureY * variationSize; - } else { - // WEST || EAST - index = textureZ + textureY * variationSize; - } + int index; + if (side == 0 || side == 1) { + // DOWN || UP + index = textureX + textureZ * variationSize; + } else if (side == 2 || side == 3) { + // NORTH || SOUTH + index = textureX + textureY * variationSize; + } else { + // WEST || EAST + index = textureZ + textureY * variationSize; + } - return variation.variations9.icons[index]; + return variation.variations9.icons[index]; case CTMX: return variation.icon; - case R16: - case R9: - case R4: + case R16: + case R9: + case R4: - int indexRan = x + y + z; - if ((side==2)||(side==5)) { - indexRan = -indexRan; - } - while (indexRan < 0) { - indexRan = indexRan+10000; - } + int indexRan = x + y + z; + if ((side == 2) || (side == 5)) { + indexRan = -indexRan; + } + while (indexRan < 0) { + indexRan = indexRan + 10000; + } - //rand.setSeed(indexRan); // Broken + // rand.setSeed(indexRan); // Broken - return variation.variations9.icons[ /*rand*/ indexRan % ((variation.kind == R9) ? 9 : 4)]; + return variation.variations9.icons[ /* rand */indexRan % ((variation.type == TextureType.R9) ? 9 : 4)]; } - - return GeneralClient.getMissingIcon(); } @@ -360,7 +585,7 @@ public class CarvableHelper { variation.iconBot = ((BlockPane) variation.block).getBlockTextureFromSide(0); } else { - switch (variation.kind) { + switch (variation.type) { case NORMAL: variation.icon = variation.block.getIcon(2, variation.blockMeta); break; @@ -376,7 +601,7 @@ public class CarvableHelper { } } } else { - switch (variation.kind) { + switch (variation.type) { case NORMAL: variation.icon = register.registerIcon(modName + ":" + variation.texture); break; @@ -415,15 +640,15 @@ public class CarvableHelper { variation.submap = new TextureSubmap(register.registerIcon(modName + ":" + variation.texture + "-ctm"), 4, 4); variation.submapSmall = new TextureSubmap(variation.icon, 2, 2); break; - case R16: - variation.variations9 = new TextureSubmap(register.registerIcon(modName + ":" + variation.texture + "-r16"), 4, 4); - break; - case R9: - variation.variations9 = new TextureSubmap(register.registerIcon(modName + ":" + variation.texture + "-r9"), 3, 3); - break; - case R4: - variation.variations9 = new TextureSubmap(register.registerIcon(modName + ":" + variation.texture + "-r4"), 2, 2); - break; + case R16: + variation.variations9 = new TextureSubmap(register.registerIcon(modName + ":" + variation.texture + "-r16"), 4, 4); + break; + case R9: + variation.variations9 = new TextureSubmap(register.registerIcon(modName + ":" + variation.texture + "-r9"), 3, 3); + break; + case R4: + variation.variations9 = new TextureSubmap(register.registerIcon(modName + ":" + variation.texture + "-r4"), 2, 2); + break; } } } @@ -436,12 +661,7 @@ public class CarvableHelper { } public void setChiselBlockName(String name) { - blockName = name; - } - - public static Set getChiselBlockSet() { - HashSet tools = new HashSet(); - return tools; + blockName = name; } public void registerOre(String ore) { diff --git a/src/main/java/com/cricketcraft/chisel/carving/CarvableVariation.java b/src/main/java/com/cricketcraft/chisel/carving/CarvableVariation.java index 65c5a06f..9d3254f4 100644 --- a/src/main/java/com/cricketcraft/chisel/carving/CarvableVariation.java +++ b/src/main/java/com/cricketcraft/chisel/carving/CarvableVariation.java @@ -4,6 +4,7 @@ import net.minecraft.block.Block; import net.minecraft.client.resources.I18n; import net.minecraft.util.IIcon; +import com.cricketcraft.chisel.carving.CarvableHelper.TextureType; import com.cricketcraft.chisel.client.render.TextureSubmap; public class CarvableVariation { @@ -11,7 +12,7 @@ public class CarvableVariation { public String blockName; public String descriptionUnloc; public int metadata; - public int kind; + public TextureType type = TextureType.NORMAL; public Block block; public int blockMeta; @@ -19,8 +20,8 @@ public class CarvableVariation { public String texture; public IIcon icon; - public IIcon iconTop; public IIcon iconBot; + public IIcon iconTop; public CarvableVariationCTM ctm; public TextureSubmap seamsCtmVert; diff --git a/src/main/java/com/cricketcraft/chisel/carving/ITextureVariation.java b/src/main/java/com/cricketcraft/chisel/carving/ITextureVariation.java new file mode 100644 index 00000000..78a25fdb --- /dev/null +++ b/src/main/java/com/cricketcraft/chisel/carving/ITextureVariation.java @@ -0,0 +1,6 @@ +package com.cricketcraft.chisel.carving; + + +public interface ITextureVariation { + +} diff --git a/src/main/java/com/cricketcraft/chisel/client/render/BlockAdvancedMarbleRenderer.java b/src/main/java/com/cricketcraft/chisel/client/render/BlockAdvancedMarbleRenderer.java index 4eb8bbc8..4270ad76 100644 --- a/src/main/java/com/cricketcraft/chisel/client/render/BlockAdvancedMarbleRenderer.java +++ b/src/main/java/com/cricketcraft/chisel/client/render/BlockAdvancedMarbleRenderer.java @@ -9,6 +9,7 @@ import org.lwjgl.opengl.GL11; import com.cricketcraft.chisel.Chisel; import com.cricketcraft.chisel.api.ICarvable; import com.cricketcraft.chisel.carving.CarvableHelper; +import com.cricketcraft.chisel.carving.CarvableHelper.TextureType; import com.cricketcraft.chisel.carving.CarvableVariation; import com.cricketcraft.chisel.utils.Drawing; @@ -45,8 +46,8 @@ public class BlockAdvancedMarbleRenderer implements ISimpleBlockRenderingHandler return true; } - switch (var == null ? 0 : var.kind) { - case CarvableHelper.CTMX: + switch (var == null ? TextureType.NORMAL : var.type) { + case CTMX: rendererCTM.blockAccess = world; rendererCTM.renderMaxX = 1.0; rendererCTM.renderMaxY = 1.0; @@ -58,7 +59,7 @@ public class BlockAdvancedMarbleRenderer implements ISimpleBlockRenderingHandler rendererCTM.rendererOld = rendererOld; return rendererCTM.renderStandardBlock(block, x, y, z); - case CarvableHelper.CTMV: + case CTMV: rendererColumn.blockAccess = world; rendererColumn.renderMaxX = 1.0; rendererColumn.renderMaxY = 1.0; diff --git a/src/main/java/com/cricketcraft/chisel/client/render/BlockCTMNoLightRenderer.java b/src/main/java/com/cricketcraft/chisel/client/render/BlockCTMNoLightRenderer.java index 5426be51..f50eb46d 100644 --- a/src/main/java/com/cricketcraft/chisel/client/render/BlockCTMNoLightRenderer.java +++ b/src/main/java/com/cricketcraft/chisel/client/render/BlockCTMNoLightRenderer.java @@ -10,6 +10,7 @@ import com.cricketcraft.chisel.Chisel; import com.cricketcraft.chisel.api.ICarvable; import com.cricketcraft.chisel.carving.CarvableHelper; import com.cricketcraft.chisel.carving.CarvableVariation; +import com.cricketcraft.chisel.carving.CarvableHelper.TextureType; import com.cricketcraft.chisel.utils.Drawing; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; @@ -40,8 +41,7 @@ public class BlockCTMNoLightRenderer implements ISimpleBlockRenderingHandler { CarvableVariation var = ((ICarvable) block).getVariation(world, x, y, z, meta); - switch (var == null ? 0 : var.kind) { - case CarvableHelper.CTMX: + if (var != null && var.type == TextureType.CTMX) { rendererCTMNoLight.blockAccess = world; rendererCTMNoLight.renderMaxX = 1.0; rendererCTMNoLight.renderMaxY = 1.0; @@ -53,7 +53,7 @@ public class BlockCTMNoLightRenderer implements ISimpleBlockRenderingHandler { rendererCTMNoLight.rendererOld = rendererOld; return rendererCTMNoLight.renderStandardBlock(block, x, y, z); - default: + } else { return rendererOld.renderStandardBlock(block, x, y, z); } } diff --git a/src/main/java/com/cricketcraft/chisel/client/render/BlockMarblePillarRenderer.java b/src/main/java/com/cricketcraft/chisel/client/render/BlockMarblePillarRenderer.java index eb83808d..621a74c7 100644 --- a/src/main/java/com/cricketcraft/chisel/client/render/BlockMarblePillarRenderer.java +++ b/src/main/java/com/cricketcraft/chisel/client/render/BlockMarblePillarRenderer.java @@ -8,6 +8,7 @@ import org.lwjgl.opengl.GL11; import com.cricketcraft.chisel.block.BlockCarvablePillar; import com.cricketcraft.chisel.carving.CarvableHelper; +import com.cricketcraft.chisel.carving.CarvableHelper.TextureType; import com.cricketcraft.chisel.utils.Drawing; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; @@ -54,7 +55,7 @@ public class BlockMarblePillarRenderer implements ISimpleBlockRenderingHandler { metadata = block.carverHelper.variations.size() - 1; } else { - if (block.carverHelper.variations.get(metadata).kind != CarvableHelper.CTMV) { + if (block.carverHelper.variations.get(metadata).type != TextureType.CTMV) { block.sides[0] = block.carverHelper.getIcon(0, metadata); block.sides[1] = block.carverHelper.getIcon(1, metadata); block.sides[2] = block.carverHelper.getIcon(2, metadata); diff --git a/src/main/java/com/cricketcraft/chisel/client/render/RenderBlocksCTM.java b/src/main/java/com/cricketcraft/chisel/client/render/RenderBlocksCTM.java index 4d7e72ff..005fabaa 100644 --- a/src/main/java/com/cricketcraft/chisel/client/render/RenderBlocksCTM.java +++ b/src/main/java/com/cricketcraft/chisel/client/render/RenderBlocksCTM.java @@ -5,8 +5,96 @@ import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.util.IIcon; +import org.apache.commons.lang3.tuple.Triple; + +import static com.cricketcraft.chisel.client.render.RenderBlocksCTM.Vert.*; +import static com.cricketcraft.chisel.client.render.RenderBlocksCTM.SubSide.*; + public class RenderBlocksCTM extends RenderBlocks { + /** + * An enum for all possible 26 sub-side vertices. + *

+ * The naming scheme is as follows: + *

+ */ + enum Vert { + + ZERO(0, 0, 0), + ONE(1, 1, 1), + X(1, 0, 0), + Y(0, 1, 0), + Z(0, 0, 1), + XY(1, 1, 0), + YZ(0, 1, 1), + XZ(1, 0, 1), + X_HALF(0.5, 0, 0), + Y_HALF(0, 0.5, 0), + Z_HALF(0, 0, 0.5), + XY_HALF(0.5, 0.5, 0), + YZ_HALF(0, 0.5, 0.5), + XZ_HALF(0.5, 0, 0.5), + X_HALF_Y(0.5, 1, 0), + X_HALF_Z(0.5, 0, 1), + Y_HALF_X(1, 0.5, 0), + Y_HALF_Z(0, 0.5, 1), + Z_HALF_X(1, 0, 0.5), + Z_HALF_Y(0, 1, 0.5), + X_HALF_YZ(0.5, 1, 1), + Y_HALF_XZ(1, 0.5, 1), + Z_HALF_XY(1, 1, 0.5), + XY_HALF_Z(0.5, 0.5, 1), + YZ_HALF_X(1, 0.5, 0.5), + XZ_HALF_Y(0.5, 1, 0.5); + + private double x, y, z; + + private Vert(double x, double y, double z) { + this.x = x; + this.y = y; + this.z = z; + } + + void render(RenderBlocksCTM inst, int cacheID) { + if (inst.enableAO) { + // inst.tessellator.setColorOpaque_F(inst.redCache[cacheID], inst.greenCache[cacheID], inst.blueCache[cacheID]); + inst.tessellator.setBrightness(inst.lightingCache[cacheID]); + } + + inst.tessellator.addVertexWithUV(x, y, z, inst.uCache[cacheID], inst.vCache[cacheID]); + } + } + + /** + * Each side is divided into 4 sub-sides. LB(left bottom), RB(right bottom), LT(right top), and RT(right top). + *

+ * Each sub-side contains 4 {@link Vert} objects representing its position on the block. + */ + enum SubSide { + XNEG_LB(ZERO, Z_HALF, YZ_HALF, Y_HALF), XNEG_RB(Z_HALF, Z, Y_HALF_Z, YZ_HALF), XNEG_LT(Y_HALF, YZ_HALF, Z_HALF_Y, Y), XNEG_RT(YZ_HALF, Y_HALF_Z, YZ, Z_HALF_Y); + + private Vert xmin, xmax, ymin, ymax; + + SubSide(Vert xmin, Vert ymin, Vert ymax, Vert xmax) { + this.xmin = xmin; + this.ymin = ymin; + this.ymax = ymax; + this.xmax = xmax; + } + + void render(RenderBlocksCTM inst) { + xmin.render(inst, 0); + ymin.render(inst, 1); + ymax.render(inst, 2); + xmax.render(inst, 3); + } + } + // globals added to save the JVM some trouble. No need to constantly create // and destroy ints if we don't have to int blockLightBitChannel = 0; @@ -17,20 +105,15 @@ public class RenderBlocksCTM extends RenderBlocks { RenderBlocksCTM() { super(); - - resetVertices(); } Tessellator tessellator; - double[] X = new double[26]; - double[] Y = new double[26]; - double[] Z = new double[26]; - double[] U = new double[26]; - double[] V = new double[26]; - int[] L = new int[26]; - float[] R = new float[26]; - float[] G = new float[26]; - float[] B = new float[26]; + double[] uCache = new double[4]; + double[] vCache = new double[4]; + int[] lightingCache = new int[4]; + float[] redCache = new float[4]; + float[] greenCache = new float[4]; + float[] blueCache = new float[4]; TextureSubmap submap; TextureSubmap submapSmall; RenderBlocks rendererOld; @@ -55,66 +138,60 @@ public class RenderBlocksCTM extends RenderBlocks { return res; } - void setupSides(int a, int b, int c, int d, int xa, int xb, int xc, int xd, int e) { - L[a] = brightnessBottomLeft; - L[b] = brightnessBottomRight; - L[c] = brightnessTopRight; - L[d] = brightnessTopLeft; + void updateLighting() { + lightingCache[0] = brightnessBottomLeft; + lightingCache[1] = brightnessBottomRight; + lightingCache[2] = brightnessTopRight; + lightingCache[3] = brightnessTopLeft; - // Updated to safely average light and color channels - L[e] = averageBrightnessChannels(brightnessBottomLeft, brightnessTopLeft, brightnessTopRight, brightnessBottomRight); - L[xa] = averageBrightnessChannels(L[a], L[b]); - L[xb] = averageBrightnessChannels(L[b], L[c]); - L[xc] = averageBrightnessChannels(L[c], L[d]); - L[xd] = averageBrightnessChannels(L[d], L[a]); - - R[a] = colorRedBottomLeft; - R[b] = colorRedBottomRight; - R[c] = colorRedTopRight; - R[d] = colorRedTopLeft; - R[e] = (colorRedBottomLeft + colorRedTopLeft + colorRedTopRight + colorRedBottomRight) / 4; - R[xa] = (R[a] + R[b]) / 2; - R[xb] = (R[b] + R[c]) / 2; - R[xc] = (R[c] + R[d]) / 2; - R[xd] = (R[d] + R[a]) / 2; - - G[a] = colorGreenBottomLeft; - G[b] = colorGreenBottomRight; - G[c] = colorGreenTopRight; - G[d] = colorGreenTopLeft; - G[e] = (colorGreenBottomLeft + colorGreenTopLeft + colorGreenTopRight + colorGreenBottomRight) / 4; - G[xa] = (G[a] + G[b]) / 2; - G[xb] = (G[b] + G[c]) / 2; - G[xc] = (G[c] + G[d]) / 2; - G[xd] = (G[d] + G[a]) / 2; - - B[a] = colorBlueBottomLeft; - B[b] = colorBlueBottomRight; - B[c] = colorBlueTopRight; - B[d] = colorBlueTopLeft; - B[e] = (colorBlueBottomLeft + colorBlueTopLeft + colorBlueTopRight + colorBlueBottomRight) / 4; - B[xa] = (B[a] + B[b]) / 2; - B[xb] = (B[b] + B[c]) / 2; - B[xc] = (B[c] + B[d]) / 2; - B[xd] = (B[d] + B[a]) / 2; + // // Updated to safely average light and color channels + // L[e] = averageBrightnessChannels(brightnessBottomLeft, brightnessTopLeft, brightnessTopRight, brightnessBottomRight); + // L[xa] = averageBrightnessChannels(L[a], L[b]); + // L[xb] = averageBrightnessChannels(L[b], L[c]); + // L[xc] = averageBrightnessChannels(L[c], L[d]); + // L[xd] = averageBrightnessChannels(L[d], L[a]); + // + // Rcache[a] = colorRedBottomLeft; + // Rcache[b] = colorRedBottomRight; + // Rcache[c] = colorRedTopRight; + // Rcache[d] = colorRedTopLeft; + // Rcache[e] = (colorRedBottomLeft + colorRedTopLeft + colorRedTopRight + colorRedBottomRight) / 4; + // Rcache[xa] = (Rcache[a] + Rcache[b]) / 2; + // Rcache[xb] = (Rcache[b] + Rcache[c]) / 2; + // Rcache[xc] = (Rcache[c] + Rcache[d]) / 2; + // Rcache[xd] = (Rcache[d] + Rcache[a]) / 2; + // + // Gcache[a] = colorGreenBottomLeft; + // Gcache[b] = colorGreenBottomRight; + // Gcache[c] = colorGreenTopRight; + // Gcache[d] = colorGreenTopLeft; + // Gcache[e] = (colorGreenBottomLeft + colorGreenTopLeft + colorGreenTopRight + colorGreenBottomRight) / 4; + // Gcache[xa] = (Gcache[a] + Gcache[b]) / 2; + // Gcache[xb] = (Gcache[b] + Gcache[c]) / 2; + // Gcache[xc] = (Gcache[c] + Gcache[d]) / 2; + // Gcache[xd] = (Gcache[d] + Gcache[a]) / 2; + // + // Bcache[a] = colorBlueBottomLeft; + // Bcache[b] = colorBlueBottomRight; + // Bcache[c] = colorBlueTopRight; + // Bcache[d] = colorBlueTopLeft; + // Bcache[e] = (colorBlueBottomLeft + colorBlueTopLeft + colorBlueTopRight + colorBlueBottomRight) / 4; + // Bcache[xa] = (Bcache[a] + Bcache[b]) / 2; + // Bcache[xb] = (Bcache[b] + Bcache[c]) / 2; + // Bcache[xc] = (Bcache[c] + Bcache[d]) / 2; + // Bcache[xd] = (Bcache[d] + Bcache[a]) / 2; } - /* - * Takes in a variable number of packed light-integers, and computes the - * average value of each 4 bit channel + /** + * Takes in a variable number of packed light-integers, and computes the average value of each 4 bit channel * - * For vanilla, these look like: (S = skylight and L = block light) 0000 - * 0000 SSSS 0000 0000 0000 LLLL 0000 With the Colored Light Core installed, - * these look like: (B = Blue, G = Green, R = Red) 0000 0000 SSSS BBBB GGGG - * RRRR LLLL 0000 + * For vanilla, these look like: (S = skylight and L = block light) 0000 0000 SSSS 0000 0000 0000 LLLL 0000 With the Colored Light Core installed, these look like: (B = Blue, G = Green, R = Red) + * 0000 0000 SSSS BBBB GGGG RRRR LLLL 0000 * - * This method will average all of the values appropriately for the more - * complex case, by separating each color channel into a running total, then - * it will combine the final results together using integer division and a - * lot of bit-cramming. + * This method will average all of the values appropriately for the more complex case, by separating each color channel into a running total, then it will combine the final results together using + * integer division and a lot of bit-cramming. * - * While slightly more complex, the runtime should not be drastically - * effected, and the averaging routine remains compatible with vanilla. + * While slightly more complex, the runtime should not be drastically effected, and the averaging routine remains compatible with vanilla. * * Authored: CptSpaceToaster - 12/19/2014 */ @@ -137,37 +214,25 @@ public class RenderBlocksCTM extends RenderBlocks { | ((blueBitChannel / lightVals.length) & 0xF0000) | ((sunlightBitChannel / lightVals.length) & 0xF00000); } - void side(int a, int b, int c, int d, int iconIndex, boolean flip) { + void side(SubSide side, int iconIndex, boolean flip) { IIcon icon = iconIndex >= 16 ? submapSmall.icons[iconIndex - 16] : submap.icons[iconIndex]; - double u0 = icon.getMaxU(); - double u1 = icon.getMinU(); - double v0 = icon.getMaxV(); - double v1 = icon.getMinV(); + double umax = icon.getMaxU(); + double umin = icon.getMinU(); + double vmax = icon.getMaxV(); + double vmin = icon.getMinV(); - U[a] = flip ? u1 : u1; - U[b] = flip ? u0 : u1; - U[c] = flip ? u0 : u0; - U[d] = flip ? u1 : u0; + uCache[0] = flip ? umax : umin; + uCache[1] = umax; + uCache[2] = flip ? umin : umax; + uCache[3] = umin; - V[a] = flip ? v1 : v1; - V[b] = flip ? v1 : v0; - V[c] = flip ? v0 : v0; - V[d] = flip ? v0 : v1; + vCache[0] = flip ? vmin : vmax; + vCache[1] = vmax; + vCache[2] = flip ? vmax : vmin; + vCache[3] = vmin; - vert(a); - vert(b); - vert(c); - vert(d); - } - - void vert(int index) { - if (enableAO) { - tessellator.setColorOpaque_F(R[index], G[index], B[index]); - tessellator.setBrightness(L[index]); - } - - tessellator.addVertexWithUV(X[index], Y[index], Z[index], U[index], V[index]); + side.render(this); } @Override @@ -182,11 +247,11 @@ public class RenderBlocksCTM extends RenderBlocks { } else { int tex[] = CTM.getSubmapIndices(blockAccess, bx, by, bz, 4); - setupSides(1, 0, 4, 5, 14, 19, 17, 23, 9); - side(1, 14, 9, 23, tex[0], false); - side(23, 9, 17, 5, tex[1], false); - side(9, 19, 4, 17, tex[3], false); - side(14, 0, 19, 9, tex[2], false); + updateLighting(); + side(XNEG_LB, tex[2], false); + side(XNEG_RB, tex[3], false); + side(XNEG_RT, tex[1], false); + side(XNEG_LT, tex[0], false); } } @@ -202,11 +267,11 @@ public class RenderBlocksCTM extends RenderBlocks { } else { int tex[] = CTM.getSubmapIndices(blockAccess, bx, by, bz, 5); - setupSides(3, 2, 6, 7, 15, 25, 16, 21, 11); - side(11, 21, 3, 15, tex[3], false); - side(16, 7, 21, 11, tex[2], false); - side(25, 11, 15, 2, tex[1], false); - side(6, 16, 11, 25, tex[0], false); + updateLighting(); + // side(11, 21, 3, 15, tex[3], false); + // side(16, 7, 21, 11, tex[2], false); + // side(25, 11, 15, 2, tex[1], false); + // side(6, 16, 11, 25, tex[0], false); } } @@ -222,11 +287,11 @@ public class RenderBlocksCTM extends RenderBlocks { } else { int tex[] = CTM.getSubmapIndices(blockAccess, bx, by, bz, 2); - setupSides(2, 3, 0, 1, 15, 18, 14, 22, 8); - side(2, 15, 8, 22, tex[0], false); - side(15, 3, 18, 8, tex[2], false); - side(8, 18, 0, 14, tex[3], false); - side(22, 8, 14, 1, tex[1], false); + updateLighting(); + // side(2, 15, 8, 22, tex[0], false); + // side(15, 3, 18, 8, tex[2], false); + // side(8, 18, 0, 14, tex[3], false); + // side(22, 8, 14, 1, tex[1], false); } } @@ -242,11 +307,11 @@ public class RenderBlocksCTM extends RenderBlocks { } else { int tex[] = CTM.getSubmapIndices(blockAccess, bx, by, bz, 3); - setupSides(4, 7, 6, 5, 20, 16, 24, 17, 10); - side(17, 4, 20, 10, tex[2], false); - side(5, 17, 10, 24, tex[0], false); - side(24, 10, 16, 6, tex[1], false); - side(10, 20, 7, 16, tex[3], false); + updateLighting(); + // side(17, 4, 20, 10, tex[2], false); + // side(5, 17, 10, 24, tex[0], false); + // side(24, 10, 16, 6, tex[1], false); + // side(10, 20, 7, 16, tex[3], false); } } @@ -262,11 +327,11 @@ public class RenderBlocksCTM extends RenderBlocks { } else { int tex[] = CTM.getSubmapIndices(blockAccess, bx, by, bz, 0); - setupSides(0, 3, 7, 4, 18, 21, 20, 19, 13); - side(13, 21, 7, 20, tex[3], true); - side(19, 13, 20, 4, tex[2], true); - side(0, 18, 13, 19, tex[0], true); - side(18, 3, 21, 13, tex[1], true); + updateLighting(); + // side(13, 21, 7, 20, tex[3], true); + // side(19, 13, 20, 4, tex[2], true); + // side(0, 18, 13, 19, tex[0], true); + // side(18, 3, 21, 13, tex[1], true); } } @@ -282,117 +347,12 @@ public class RenderBlocksCTM extends RenderBlocks { } else { int tex[] = CTM.getSubmapIndices(blockAccess, bx, by, bz, 1); - setupSides(2, 1, 5, 6, 22, 23, 24, 25, 12); - side(12, 24, 6, 25, tex[3], false); - side(22, 12, 25, 2, tex[1], false); - side(1, 23, 12, 22, tex[0], false); - side(23, 5, 24, 12, tex[2], false); + updateLighting(); + // side(12, 24, 6, 25, tex[3], false); + // side(22, 12, 25, 2, tex[1], false); + // side(1, 23, 12, 22, tex[0], false); + // side(23, 5, 24, 12, tex[2], false); } } - void resetVertices() { - X[0] = 0; - Z[0] = 0; - Y[0] = 0; - - X[1] = 0; - Z[1] = 0; - Y[1] = 1; - - X[2] = 1; - Z[2] = 0; - Y[2] = 1; - - X[3] = 1; - Z[3] = 0; - Y[3] = 0; - - X[4] = 0; - Z[4] = 1; - Y[4] = 0; - - X[5] = 0; - Z[5] = 1; - Y[5] = 1; - - X[6] = 1; - Z[6] = 1; - Y[6] = 1; - - X[7] = 1; - Z[7] = 1; - Y[7] = 0; - - X[8] = 0.5; - Z[8] = 0; - Y[8] = 0.5; - - X[9] = 0; - Z[9] = 0.5; - Y[9] = 0.5; - - X[10] = 0.5; - Z[10] = 1; - Y[10] = 0.5; - - X[11] = 1; - Z[11] = 0.5; - Y[11] = 0.5; - - X[12] = 0.5; - Z[12] = 0.5; - Y[12] = 1; - - X[13] = 0.5; - Z[13] = 0.5; - Y[13] = 0; - - X[14] = 0; - Z[14] = 0; - Y[14] = 0.5; - - X[15] = 1; - Z[15] = 0; - Y[15] = 0.5; - - X[16] = 1; - Z[16] = 1; - Y[16] = 0.5; - - X[17] = 0; - Z[17] = 1; - Y[17] = 0.5; - - X[18] = 0.5; - Z[18] = 0; - Y[18] = 0; - - X[19] = 0; - Z[19] = 0.5; - Y[19] = 0; - - X[20] = 0.5; - Z[20] = 1; - Y[20] = 0; - - X[21] = 1; - Z[21] = 0.5; - Y[21] = 0; - - X[22] = 0.5; - Z[22] = 0; - Y[22] = 1; - - X[23] = 0; - Z[23] = 0.5; - Y[23] = 1; - - X[24] = 0.5; - Z[24] = 1; - Y[24] = 1; - - X[25] = 1; - Z[25] = 0.5; - Y[25] = 1; - } } diff --git a/src/main/java/com/cricketcraft/chisel/client/render/RenderBlocksCTMCarpet.java b/src/main/java/com/cricketcraft/chisel/client/render/RenderBlocksCTMCarpet.java index 4d226d3a..ebb6eda9 100644 --- a/src/main/java/com/cricketcraft/chisel/client/render/RenderBlocksCTMCarpet.java +++ b/src/main/java/com/cricketcraft/chisel/client/render/RenderBlocksCTMCarpet.java @@ -9,15 +9,6 @@ public class RenderBlocksCTMCarpet extends RenderBlocksCTM { super(); } - @Override - void resetVertices() { - super.resetVertices(); - - for (int i = 0; i < Y.length; i++) { - Y[i] /= 16; - } - } - @Override public void renderFaceXNeg(Block block, double x, double y, double z, IIcon icon) { rendererOld.renderFaceXNeg(block, 0, 0, 0, submapSmall.icon); diff --git a/src/main/java/com/cricketcraft/chisel/client/render/TextureSubmap.java b/src/main/java/com/cricketcraft/chisel/client/render/TextureSubmap.java index cb3e81b0..350b17fc 100644 --- a/src/main/java/com/cricketcraft/chisel/client/render/TextureSubmap.java +++ b/src/main/java/com/cricketcraft/chisel/client/render/TextureSubmap.java @@ -29,5 +29,4 @@ public class TextureSubmap { } } } - } diff --git a/src/main/java/com/cricketcraft/chisel/client/render/TextureVirtual.java b/src/main/java/com/cricketcraft/chisel/client/render/TextureVirtual.java index 15b81e5a..9cd28cb1 100644 --- a/src/main/java/com/cricketcraft/chisel/client/render/TextureVirtual.java +++ b/src/main/java/com/cricketcraft/chisel/client/render/TextureVirtual.java @@ -6,59 +6,59 @@ import cpw.mods.fml.relauncher.SideOnly; public class TextureVirtual implements IIcon { - int ox, oy; - float u0, u1, v0, v1; - String name; - IIcon icon; + private int width, height; + private float umin, umax, vmin, vmax; + private String name; + private IIcon parentIcon; TextureVirtual(IIcon parent, int w, int h, int x, int y) { - icon = parent; + parentIcon = parent; - u0 = icon.getInterpolatedU(16.0 * (x) / w); - u1 = icon.getInterpolatedU(16.0 * (x + 1) / w); - v0 = icon.getInterpolatedV(16.0 * (y) / h); - v1 = icon.getInterpolatedV(16.0 * (y + 1) / h); + umin = parentIcon.getInterpolatedU(16.0 * (x) / w); + umax = parentIcon.getInterpolatedU(16.0 * (x + 1) / w); + vmin = parentIcon.getInterpolatedV(16.0 * (y) / h); + vmax = parentIcon.getInterpolatedV(16.0 * (y + 1) / h); - name = icon.getIconName() + "|" + x + "." + y; + name = parentIcon.getIconName() + "|" + x + "." + y; - ox = icon.getIconWidth(); - oy = icon.getIconHeight(); + width = parentIcon.getIconWidth(); + height = parentIcon.getIconHeight(); } @Override @SideOnly(Side.CLIENT) public float getMinU() { - return u0; + return umin; } @Override @SideOnly(Side.CLIENT) public float getMaxU() { - return u1; + return umax; } @Override @SideOnly(Side.CLIENT) public float getInterpolatedU(double d0) { - return (float) (u0 + (u1 - u0) * d0 / 16.0); + return (float) (umin + (umax - umin) * d0 / 16.0); } @Override @SideOnly(Side.CLIENT) public float getMinV() { - return v0; + return vmin; } @Override @SideOnly(Side.CLIENT) public float getMaxV() { - return v1; + return vmax; } @Override @SideOnly(Side.CLIENT) public float getInterpolatedV(double d0) { - return (float) (v0 + (v1 - v0) * d0 / 16.0); + return (float) (vmin + (vmax - vmin) * d0 / 16.0); } @Override @@ -70,13 +70,12 @@ public class TextureVirtual implements IIcon { @Override @SideOnly(Side.CLIENT) public int getIconWidth() { - return ox; + return width; } @Override @SideOnly(Side.CLIENT) public int getIconHeight() { - return oy; + return height; } - }