From 32c4dc60358b7b59b8e096d91b44af95f6c6da13 Mon Sep 17 00:00:00 2001 From: octarine-noise Date: Fri, 11 Jul 2014 15:13:38 +0200 Subject: [PATCH] new feature: use pre-drawn leaf textures if available some refactoring --- .../client/render/FakeRenderBlockAOBase.java | 3 +++ .../client/render/IRenderBlockDecorator.java | 3 +++ .../betterfoliage/client/render/IconSet.java | 18 +++++-------- .../render/impl/RenderBlockBetterLeaves.java | 4 +-- .../render/impl/RenderBlockBetterReed.java | 3 +++ .../resource/BlockTextureGenerator.java | 9 ++++--- .../client/resource/LeafTextureGenerator.java | 25 ++++++++++++++++--- .../util/{ReflectionUtil.java => Utils.java} | 16 ++++++++++-- 8 files changed, 58 insertions(+), 23 deletions(-) rename src/main/java/mods/betterfoliage/common/util/{ReflectionUtil.java => Utils.java} (80%) diff --git a/src/main/java/mods/betterfoliage/client/render/FakeRenderBlockAOBase.java b/src/main/java/mods/betterfoliage/client/render/FakeRenderBlockAOBase.java index e17d302..207c571 100644 --- a/src/main/java/mods/betterfoliage/client/render/FakeRenderBlockAOBase.java +++ b/src/main/java/mods/betterfoliage/client/render/FakeRenderBlockAOBase.java @@ -1,11 +1,14 @@ package mods.betterfoliage.client.render; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.util.IIcon; /** Same as {@link RenderBlockAOBase}, but does not actually render anything. * @author octarine-noise */ +@SideOnly(Side.CLIENT) public class FakeRenderBlockAOBase extends RenderBlockAOBase { @Override diff --git a/src/main/java/mods/betterfoliage/client/render/IRenderBlockDecorator.java b/src/main/java/mods/betterfoliage/client/render/IRenderBlockDecorator.java index 2fd71a4..7401235 100644 --- a/src/main/java/mods/betterfoliage/client/render/IRenderBlockDecorator.java +++ b/src/main/java/mods/betterfoliage/client/render/IRenderBlockDecorator.java @@ -1,9 +1,12 @@ package mods.betterfoliage.client.render; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.world.IBlockAccess; +@SideOnly(Side.CLIENT) public interface IRenderBlockDecorator extends ISimpleBlockRenderingHandler { public void init(); diff --git a/src/main/java/mods/betterfoliage/client/render/IconSet.java b/src/main/java/mods/betterfoliage/client/render/IconSet.java index 5fe36ae..a9076e5 100644 --- a/src/main/java/mods/betterfoliage/client/render/IconSet.java +++ b/src/main/java/mods/betterfoliage/client/render/IconSet.java @@ -1,17 +1,16 @@ package mods.betterfoliage.client.render; -import java.io.IOException; - -import net.minecraft.client.Minecraft; +import mods.betterfoliage.common.util.Utils; import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.client.resources.IResource; -import net.minecraft.client.resources.IResourceManager; import net.minecraft.util.IIcon; import net.minecraft.util.ResourceLocation; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; /** Loads an indexed set of textures * @author octarine-noise */ +@SideOnly(Side.CLIENT) public class IconSet { /** Icon array */ @@ -33,18 +32,13 @@ public class IconSet { public void registerIcons(IIconRegister register) { numLoaded = 0; - IResourceManager manager = Minecraft.getMinecraft().getResourceManager(); - for (int idx = 0; idx < 16; idx++) { icons[idx] = null; // if the path contains a domain, use that to check if the resource exists String resolvedDomain = path.contains(":") ? new ResourceLocation(path).getResourceDomain() : domain; String resolvedPath = String.format("textures/blocks/" + (path.contains(":") ? new ResourceLocation(path).getResourcePath() : path) + ".png", idx); - try { - IResource resource = manager.getResource(new ResourceLocation(resolvedDomain, resolvedPath)); - if (resource != null) icons[numLoaded++] = register.registerIcon(domain + ":" + String.format(path, idx)); - } catch (IOException e) { - } + if (Utils.resourceExists(new ResourceLocation(resolvedDomain, resolvedPath))) + icons[numLoaded++] = register.registerIcon(domain + ":" + String.format(path, idx)); } } diff --git a/src/main/java/mods/betterfoliage/client/render/impl/RenderBlockBetterLeaves.java b/src/main/java/mods/betterfoliage/client/render/impl/RenderBlockBetterLeaves.java index 1cbe790..d9d9f3c 100644 --- a/src/main/java/mods/betterfoliage/client/render/impl/RenderBlockBetterLeaves.java +++ b/src/main/java/mods/betterfoliage/client/render/impl/RenderBlockBetterLeaves.java @@ -5,7 +5,7 @@ import mods.betterfoliage.client.BetterFoliageClient; import mods.betterfoliage.client.render.IRenderBlockDecorator; import mods.betterfoliage.client.render.RenderBlockAOBase; import mods.betterfoliage.common.util.Double3; -import mods.betterfoliage.common.util.ReflectionUtil; +import mods.betterfoliage.common.util.Utils; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderBlocks; @@ -37,7 +37,7 @@ public class RenderBlockBetterLeaves extends RenderBlockAOBase implements IRende if (block.getRenderType() == 0) { renderStandardBlock(block, x, y, z); } else { - ISimpleBlockRenderingHandler handler = ReflectionUtil.getRenderingHandler(block.getRenderType()); + ISimpleBlockRenderingHandler handler = Utils.getRenderingHandler(block.getRenderType()); handler.renderWorldBlock(world, x, y, z, block, block.getRenderType(), this); } diff --git a/src/main/java/mods/betterfoliage/client/render/impl/RenderBlockBetterReed.java b/src/main/java/mods/betterfoliage/client/render/impl/RenderBlockBetterReed.java index 15b2083..780559c 100644 --- a/src/main/java/mods/betterfoliage/client/render/impl/RenderBlockBetterReed.java +++ b/src/main/java/mods/betterfoliage/client/render/impl/RenderBlockBetterReed.java @@ -20,7 +20,10 @@ import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.event.world.WorldEvent; import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +@SideOnly(Side.CLIENT) public class RenderBlockBetterReed extends RenderBlockAOBase implements IRenderBlockDecorator { public IconSet reedBottomIcons = new IconSet("bf_reed_bottom", "bettergrassandleaves:better_reed_%d"); diff --git a/src/main/java/mods/betterfoliage/client/resource/BlockTextureGenerator.java b/src/main/java/mods/betterfoliage/client/resource/BlockTextureGenerator.java index c937e3c..5f730f0 100644 --- a/src/main/java/mods/betterfoliage/client/resource/BlockTextureGenerator.java +++ b/src/main/java/mods/betterfoliage/client/resource/BlockTextureGenerator.java @@ -6,7 +6,7 @@ import java.util.Map; import java.util.Set; import mods.betterfoliage.BetterFoliage; -import mods.betterfoliage.common.util.ReflectionUtil; +import mods.betterfoliage.common.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.resources.IResource; @@ -18,7 +18,10 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +@SideOnly(Side.CLIENT) public abstract class BlockTextureGenerator implements IResourceManager { /** Resource domain name of generated textures */ @@ -48,7 +51,7 @@ public abstract class BlockTextureGenerator implements IResourceManager { blockTextures = event.map; counter = 0; - Map domainManagers = ReflectionUtil.getDomainResourceManagers(); + Map domainManagers = Utils.getDomainResourceManagers(); if (domainManagers == null) { BetterFoliage.log.warn("Failed to inject texture generator"); return; @@ -64,7 +67,7 @@ public abstract class BlockTextureGenerator implements IResourceManager { if (event.map.getTextureType() != 0) return; // don't leave a mess - Map domainManagers = ReflectionUtil.getDomainResourceManagers(); + Map domainManagers = Utils.getDomainResourceManagers(); if (domainManagers != null) domainManagers.remove(domainName); onStitchEnd(event); diff --git a/src/main/java/mods/betterfoliage/client/resource/LeafTextureGenerator.java b/src/main/java/mods/betterfoliage/client/resource/LeafTextureGenerator.java index 76b2479..a36cd45 100644 --- a/src/main/java/mods/betterfoliage/client/resource/LeafTextureGenerator.java +++ b/src/main/java/mods/betterfoliage/client/resource/LeafTextureGenerator.java @@ -9,8 +9,9 @@ import java.util.Set; import mods.betterfoliage.BetterFoliage; import mods.betterfoliage.client.BetterFoliageClient; import mods.betterfoliage.common.util.DeobfNames; -import mods.betterfoliage.common.util.ReflectionUtil; +import mods.betterfoliage.common.util.Utils; import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.IResource; @@ -31,6 +32,10 @@ import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class LeafTextureGenerator extends BlockTextureGenerator implements IIconRegister { + public String nonGeneratedDomain = "betterfoliage"; + + public int nonGeneratedCounter = 0; + public LeafTextureGenerator() { super("bf_leaves_autogen", new ResourceLocation("betterfoliage", "textures/blocks/missing_leaf.png")); } @@ -39,7 +44,17 @@ public class LeafTextureGenerator extends BlockTextureGenerator implements IIcon public List recognizers = Lists.newLinkedList(); public IResource getResource(ResourceLocation resourceLocation) throws IOException { - LeafTextureResource result = new LeafTextureResource(unwrapResource(resourceLocation), getMissingResource()); + ResourceLocation original = unwrapResource(resourceLocation); + + // check for provided texture + ResourceLocation handDrawnLocation = new ResourceLocation(nonGeneratedDomain, String.format("textures/blocks/%s/%s", original.getResourceDomain(), original.getResourcePath())); + if (Utils.resourceExists(handDrawnLocation)) { + nonGeneratedCounter++; + return Minecraft.getMinecraft().getResourceManager().getResource(handDrawnLocation); + } + + // generate our own + LeafTextureResource result = new LeafTextureResource(original, getMissingResource()); if (result.data != null) counter++; return result; } @@ -62,6 +77,7 @@ public class LeafTextureGenerator extends BlockTextureGenerator implements IIcon @SuppressWarnings("unchecked") @Override public void onStitchStart(Pre event) { + nonGeneratedCounter = 0; BetterFoliage.log.info("Reloading leaf textures"); // register simple block textures @@ -76,8 +92,8 @@ public class LeafTextureGenerator extends BlockTextureGenerator implements IIcon // enumerate all registered textures, find leaf textures among them Map mapAtlas = null; - mapAtlas = ReflectionUtil.getField(blockTextures, DeobfNames.TM_MRS_SRG, Map.class); - if (mapAtlas == null) mapAtlas = ReflectionUtil.getField(blockTextures, DeobfNames.TM_MRS_MCP, Map.class); + mapAtlas = Utils.getField(blockTextures, DeobfNames.TM_MRS_SRG, Map.class); + if (mapAtlas == null) mapAtlas = Utils.getField(blockTextures, DeobfNames.TM_MRS_MCP, Map.class); if (mapAtlas == null) { BetterFoliage.log.warn("Failed to reflect texture atlas, textures may be missing"); } else { @@ -95,6 +111,7 @@ public class LeafTextureGenerator extends BlockTextureGenerator implements IIcon @Override public void onStitchEnd(Post event) { + BetterFoliage.log.info(String.format("Found %d pre-drawn leaf textures", nonGeneratedCounter)); BetterFoliage.log.info(String.format("Generated %d leaf textures", counter)); } diff --git a/src/main/java/mods/betterfoliage/common/util/ReflectionUtil.java b/src/main/java/mods/betterfoliage/common/util/Utils.java similarity index 80% rename from src/main/java/mods/betterfoliage/common/util/ReflectionUtil.java rename to src/main/java/mods/betterfoliage/common/util/Utils.java index c46319e..9fb8735 100644 --- a/src/main/java/mods/betterfoliage/common/util/ReflectionUtil.java +++ b/src/main/java/mods/betterfoliage/common/util/Utils.java @@ -1,16 +1,19 @@ package mods.betterfoliage.common.util; +import java.io.IOException; import java.lang.reflect.Field; import java.util.Map; import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.IResource; import net.minecraft.client.resources.IResourceManager; +import net.minecraft.util.ResourceLocation; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import cpw.mods.fml.client.registry.RenderingRegistry; -public class ReflectionUtil { +public class Utils { - private ReflectionUtil() {} + private Utils() {} @SuppressWarnings("unchecked") public static Map getDomainResourceManagers() { @@ -55,4 +58,13 @@ public class ReflectionUtil { return null; } } + + public static boolean resourceExists(ResourceLocation resourceLocation) { + try { + IResource resource = Minecraft.getMinecraft().getResourceManager().getResource(resourceLocation); + if (resource != null) return true; + } catch (IOException e) { + } + return false; + } }