diff --git a/src/main/java/mods/betterfoliage/client/BetterFoliageClient.java b/src/main/java/mods/betterfoliage/client/BetterFoliageClient.java index d1a5a39..67c7ec5 100644 --- a/src/main/java/mods/betterfoliage/client/BetterFoliageClient.java +++ b/src/main/java/mods/betterfoliage/client/BetterFoliageClient.java @@ -15,6 +15,7 @@ import mods.betterfoliage.client.render.impl.RenderBlockBetterReed; import mods.betterfoliage.client.resource.BlockTextureGenerator; import mods.betterfoliage.client.resource.HalfTextureResource; import mods.betterfoliage.client.resource.LeafTextureGenerator; +import mods.betterfoliage.client.resource.ShortGrassTextureResource; import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.IResource; @@ -68,6 +69,12 @@ public class BetterFoliageClient { return new HalfTextureResource(unwrapResource(var1), false, getMissingResource()); } }); + MinecraftForge.EVENT_BUS.register(new BlockTextureGenerator("bf_shortgrass", new ResourceLocation("betterfoliage", "textures/blocks/missing_leaf.png")) { + @Override + public IResource getResource(ResourceLocation var1) throws IOException { + return new ShortGrassTextureResource(unwrapResource(var1), getMissingResource()); + } + }); MinecraftForge.EVENT_BUS.register(new BetterFoliageClient()); diff --git a/src/main/java/mods/betterfoliage/client/gui/ConfigGuiGrass.java b/src/main/java/mods/betterfoliage/client/gui/ConfigGuiGrass.java index 637e81d..277276a 100644 --- a/src/main/java/mods/betterfoliage/client/gui/ConfigGuiGrass.java +++ b/src/main/java/mods/betterfoliage/client/gui/ConfigGuiGrass.java @@ -9,24 +9,32 @@ import cpw.mods.fml.client.FMLClientHandler; public class ConfigGuiGrass extends ConfigGuiScreenBase { + public enum Button {CLOSE, GRASS_USE_GENERATED} + public ConfigGuiGrass(GuiScreen parent) { super(parent); int id = 10; widgets.add(new OptionDoubleWidget(BetterFoliage.config.grassSize, -100, -70, 200, 50, id++, id++, "message.betterfoliage.size", "%.2f")); - widgets.add(new OptionDoubleWidget(BetterFoliage.config.grassHOffset, -100, -40, 200, 50, id++, id++, "message.betterfoliage.hOffset", "%.3f")); - widgets.add(new OptionDoubleWidget(BetterFoliage.config.grassHeightMin, -100, -10, 200, 50, id++, id++, "message.betterfoliage.minHeight", "%.2f")); - widgets.add(new OptionDoubleWidget(BetterFoliage.config.grassHeightMax, -100, 20, 200, 50, id++, id++, "message.betterfoliage.maxHeight", "%.2f")); + widgets.add(new OptionDoubleWidget(BetterFoliage.config.grassHOffset, -100, -10, 200, 50, id++, id++, "message.betterfoliage.hOffset", "%.3f")); + widgets.add(new OptionDoubleWidget(BetterFoliage.config.grassHeightMin, -100, 20, 200, 50, id++, id++, "message.betterfoliage.minHeight", "%.2f")); + widgets.add(new OptionDoubleWidget(BetterFoliage.config.grassHeightMax, -100, 50, 200, 50, id++, id++, "message.betterfoliage.maxHeight", "%.2f")); } @SuppressWarnings("unchecked") @Override public void addButtons(int x, int y) { - buttonList.add(new GuiButton(0, x - 50, y + 50, 100, 20, I18n.format("message.betterfoliage.back"))); + buttonList.add(new GuiButton(Button.CLOSE.ordinal(), x - 50, y + 80, 100, 20, I18n.format("message.betterfoliage.back"))); + buttonList.add(new GuiButton(Button.GRASS_USE_GENERATED.ordinal(), x - 100, y - 40, 200, 20, "")); } + protected void updateButtons() { + setButtonOptionBoolean(Button.GRASS_USE_GENERATED.ordinal(), "message.betterfoliage.genShortgrass", BetterFoliage.config.grassUseGenerated); + } + @Override protected void onButtonPress(int id) { - if (id == 0) FMLClientHandler.instance().showGuiScreen(parent); + if (id == Button.CLOSE.ordinal()) FMLClientHandler.instance().showGuiScreen(parent); + if (id == Button.GRASS_USE_GENERATED.ordinal()) BetterFoliage.config.grassUseGenerated = !BetterFoliage.config.grassUseGenerated; if (BetterFoliage.config.grassHeightMin.value > BetterFoliage.config.grassHeightMax.value) BetterFoliage.config.grassHeightMin.value = BetterFoliage.config.grassHeightMax.value; } diff --git a/src/main/java/mods/betterfoliage/client/render/impl/RenderBlockBetterGrass.java b/src/main/java/mods/betterfoliage/client/render/impl/RenderBlockBetterGrass.java index 500f1c5..d3483a9 100644 --- a/src/main/java/mods/betterfoliage/client/render/impl/RenderBlockBetterGrass.java +++ b/src/main/java/mods/betterfoliage/client/render/impl/RenderBlockBetterGrass.java @@ -24,7 +24,7 @@ public class RenderBlockBetterGrass extends RenderBlockAOBase implements IRender public IconSet grassIcons = new IconSet("bettergrassandleaves", "better_grass_long_%d"); public IconSet myceliumIcons = new IconSet("bettergrassandleaves", "better_mycel_%d"); - + public IIcon grassGenIcon; public boolean isBlockAccepted(IBlockAccess blockAccess, int x, int y, int z, Block block, int original) { if (!BetterFoliage.config.grassEnabled) return false; @@ -45,7 +45,9 @@ public class RenderBlockBetterGrass extends RenderBlockAOBase implements IRender int variation = getSemiRandomFromPos(x, y, z, 0); int heightVariation = getSemiRandomFromPos(x, y, z, 1); - IIcon renderIcon = (block == Blocks.mycelium) ? myceliumIcons.get(variation) : grassIcons.get(variation); + IIcon renderIcon = (block == Blocks.mycelium) ? + myceliumIcons.get(variation) : + (BetterFoliage.config.grassUseGenerated ? grassGenIcon : grassIcons.get(variation)); if (renderIcon == null) return true; double scale = BetterFoliage.config.grassSize.value * 0.5; @@ -65,6 +67,7 @@ public class RenderBlockBetterGrass extends RenderBlockAOBase implements IRender grassIcons.registerIcons(event.map); myceliumIcons.registerIcons(event.map); + grassGenIcon = event.map.registerIcon("bf_shortgrass:minecraft:tallgrass"); BetterFoliage.log.info(String.format("Found %d short grass textures", grassIcons.numLoaded)); BetterFoliage.log.info(String.format("Found %d mycelium textures", myceliumIcons.numLoaded)); } diff --git a/src/main/java/mods/betterfoliage/client/resource/ShortGrassTextureResource.java b/src/main/java/mods/betterfoliage/client/resource/ShortGrassTextureResource.java new file mode 100644 index 0000000..2aba004 --- /dev/null +++ b/src/main/java/mods/betterfoliage/client/resource/ShortGrassTextureResource.java @@ -0,0 +1,65 @@ +package mods.betterfoliage.client.resource; + +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; + +import javax.imageio.ImageIO; + +import mods.betterfoliage.BetterFoliage; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.IResource; +import net.minecraft.client.resources.IResourceManager; +import net.minecraft.client.resources.data.IMetadataSection; +import net.minecraft.util.ResourceLocation; + +public class ShortGrassTextureResource implements IResource { + + /** Raw PNG data*/ + public byte[] data = null; + + /** Resource to return if generation fails */ + public IResource fallbackResource; + + public ShortGrassTextureResource(ResourceLocation resource, IResource fallbackResource) { + this.fallbackResource = fallbackResource; + + IResourceManager resourceManager = Minecraft.getMinecraft().getResourceManager(); + try { + // load full texture + ResourceLocation origResource = new ResourceLocation(resource.getResourceDomain(), "textures/blocks/" + resource.getResourcePath()); + BufferedImage origImage = ImageIO.read(resourceManager.getResource(origResource).getInputStream()); + + // draw bottom half of texture + BufferedImage result = new BufferedImage(origImage.getWidth(), origImage.getHeight(), BufferedImage.TYPE_4BYTE_ABGR); + Graphics2D graphics = result.createGraphics(); + graphics.drawImage(origImage, 0, origImage.getHeight() / 2, null); + + // create PNG image + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ImageIO.write(result, "PNG", baos); + data = baos.toByteArray(); + } catch (Exception e) { + // stop log spam with GLSL installed + BetterFoliage.log.info(String.format("Could not load texture: %s, exception: %s", resource.toString(), e.getClass().getSimpleName())); + } + } + + @Override + public InputStream getInputStream() { + return data != null ? new ByteArrayInputStream(data) : fallbackResource.getInputStream(); + } + + @Override + public boolean hasMetadata() { + return false; + } + + @Override + public IMetadataSection getMetadata(String var1) { + return null; + } + +} diff --git a/src/main/java/mods/betterfoliage/common/config/BetterFoliageConfig.java b/src/main/java/mods/betterfoliage/common/config/BetterFoliageConfig.java index 8816ddf..8e03e82 100644 --- a/src/main/java/mods/betterfoliage/common/config/BetterFoliageConfig.java +++ b/src/main/java/mods/betterfoliage/common/config/BetterFoliageConfig.java @@ -11,6 +11,9 @@ public class BetterFoliageConfig extends ConfigBase { @CfgElement(category="grass", key="enabled") public boolean grassEnabled = true; + @CfgElement(category="grass", key="useGenerated") + public boolean grassUseGenerated = false; + @CfgElement(category="cactus", key="enabled") public boolean cactusEnabled = true; diff --git a/src/main/resources/assets/betterfoliage/lang/en_US.lang b/src/main/resources/assets/betterfoliage/lang/en_US.lang index 184d5e1..38ba03d 100644 --- a/src/main/resources/assets/betterfoliage/lang/en_US.lang +++ b/src/main/resources/assets/betterfoliage/lang/en_US.lang @@ -21,6 +21,7 @@ message.betterfoliage.maxHeight=Max.Height message.betterfoliage.flowerChance=Flower Chance message.betterfoliage.reedChance=Reed Chance message.betterfoliage.leavesMode=Leaves Offset: %s +message.betterfoliage.genShortgrass=Use generated: %s message.betterfoliage.leavesSkew=Skew message.betterfoliage.leavesTranslate=Translate message.betterfoliage.algaeChance=Algae Chance \ No newline at end of file