new feature: generate short grass texture
This commit is contained in:
@@ -15,6 +15,7 @@ import mods.betterfoliage.client.render.impl.RenderBlockBetterReed;
|
|||||||
import mods.betterfoliage.client.resource.BlockTextureGenerator;
|
import mods.betterfoliage.client.resource.BlockTextureGenerator;
|
||||||
import mods.betterfoliage.client.resource.HalfTextureResource;
|
import mods.betterfoliage.client.resource.HalfTextureResource;
|
||||||
import mods.betterfoliage.client.resource.LeafTextureGenerator;
|
import mods.betterfoliage.client.resource.LeafTextureGenerator;
|
||||||
|
import mods.betterfoliage.client.resource.ShortGrassTextureResource;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||||
import net.minecraft.client.resources.IResource;
|
import net.minecraft.client.resources.IResource;
|
||||||
@@ -68,6 +69,12 @@ public class BetterFoliageClient {
|
|||||||
return new HalfTextureResource(unwrapResource(var1), false, getMissingResource());
|
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());
|
MinecraftForge.EVENT_BUS.register(new BetterFoliageClient());
|
||||||
|
|
||||||
|
|||||||
@@ -9,24 +9,32 @@ import cpw.mods.fml.client.FMLClientHandler;
|
|||||||
|
|
||||||
public class ConfigGuiGrass extends ConfigGuiScreenBase {
|
public class ConfigGuiGrass extends ConfigGuiScreenBase {
|
||||||
|
|
||||||
|
public enum Button {CLOSE, GRASS_USE_GENERATED}
|
||||||
|
|
||||||
public ConfigGuiGrass(GuiScreen parent) {
|
public ConfigGuiGrass(GuiScreen parent) {
|
||||||
super(parent);
|
super(parent);
|
||||||
int id = 10;
|
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.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.grassHOffset, -100, -10, 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.grassHeightMin, -100, 20, 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.grassHeightMax, -100, 50, 200, 50, id++, id++, "message.betterfoliage.maxHeight", "%.2f"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
public void addButtons(int x, int y) {
|
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
|
@Override
|
||||||
protected void onButtonPress(int id) {
|
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;
|
if (BetterFoliage.config.grassHeightMin.value > BetterFoliage.config.grassHeightMax.value) BetterFoliage.config.grassHeightMin.value = BetterFoliage.config.grassHeightMax.value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ public class RenderBlockBetterGrass extends RenderBlockAOBase implements IRender
|
|||||||
|
|
||||||
public IconSet grassIcons = new IconSet("bettergrassandleaves", "better_grass_long_%d");
|
public IconSet grassIcons = new IconSet("bettergrassandleaves", "better_grass_long_%d");
|
||||||
public IconSet myceliumIcons = new IconSet("bettergrassandleaves", "better_mycel_%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) {
|
public boolean isBlockAccepted(IBlockAccess blockAccess, int x, int y, int z, Block block, int original) {
|
||||||
if (!BetterFoliage.config.grassEnabled) return false;
|
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 variation = getSemiRandomFromPos(x, y, z, 0);
|
||||||
int heightVariation = getSemiRandomFromPos(x, y, z, 1);
|
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;
|
if (renderIcon == null) return true;
|
||||||
|
|
||||||
double scale = BetterFoliage.config.grassSize.value * 0.5;
|
double scale = BetterFoliage.config.grassSize.value * 0.5;
|
||||||
@@ -65,6 +67,7 @@ public class RenderBlockBetterGrass extends RenderBlockAOBase implements IRender
|
|||||||
|
|
||||||
grassIcons.registerIcons(event.map);
|
grassIcons.registerIcons(event.map);
|
||||||
myceliumIcons.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 short grass textures", grassIcons.numLoaded));
|
||||||
BetterFoliage.log.info(String.format("Found %d mycelium textures", myceliumIcons.numLoaded));
|
BetterFoliage.log.info(String.format("Found %d mycelium textures", myceliumIcons.numLoaded));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -11,6 +11,9 @@ public class BetterFoliageConfig extends ConfigBase {
|
|||||||
@CfgElement(category="grass", key="enabled")
|
@CfgElement(category="grass", key="enabled")
|
||||||
public boolean grassEnabled = true;
|
public boolean grassEnabled = true;
|
||||||
|
|
||||||
|
@CfgElement(category="grass", key="useGenerated")
|
||||||
|
public boolean grassUseGenerated = false;
|
||||||
|
|
||||||
@CfgElement(category="cactus", key="enabled")
|
@CfgElement(category="cactus", key="enabled")
|
||||||
public boolean cactusEnabled = true;
|
public boolean cactusEnabled = true;
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ message.betterfoliage.maxHeight=Max.Height
|
|||||||
message.betterfoliage.flowerChance=Flower Chance
|
message.betterfoliage.flowerChance=Flower Chance
|
||||||
message.betterfoliage.reedChance=Reed Chance
|
message.betterfoliage.reedChance=Reed Chance
|
||||||
message.betterfoliage.leavesMode=Leaves Offset: %s
|
message.betterfoliage.leavesMode=Leaves Offset: %s
|
||||||
|
message.betterfoliage.genShortgrass=Use generated: %s
|
||||||
message.betterfoliage.leavesSkew=Skew
|
message.betterfoliage.leavesSkew=Skew
|
||||||
message.betterfoliage.leavesTranslate=Translate
|
message.betterfoliage.leavesTranslate=Translate
|
||||||
message.betterfoliage.algaeChance=Algae Chance
|
message.betterfoliage.algaeChance=Algae Chance
|
||||||
Reference in New Issue
Block a user