Allow providing a BufferedImage for banner render generation (#5041)

Ported to 1.13 using NativeImage

Co-authored-by: tterrag <tterrag1098@gmail.com>
This commit is contained in:
XCompWiz 2019-01-11 18:22:32 -05:00 committed by tterrag
parent 497bc10d0a
commit f2b54acd67
3 changed files with 222 additions and 0 deletions

View file

@ -0,0 +1,12 @@
--- a/net/minecraft/client/renderer/texture/LayeredColorMaskTexture.java
+++ b/net/minecraft/client/renderer/texture/LayeredColorMaskTexture.java
@@ -38,8 +38,7 @@
String s = this.field_174949_h.get(i);
if (s != null) {
try (
- IResource iresource1 = p_195413_1_.func_199002_a(new ResourceLocation(s));
- NativeImage nativeimage2 = NativeImage.func_195713_a(iresource1.func_199027_b());
+ NativeImage nativeimage2 = net.minecraftforge.client.MinecraftForgeClient.getImageLayer(new ResourceLocation(s), p_195413_1_);
) {
int j = ((EnumDyeColor)this.field_174950_i.get(i)).func_196057_c();
if (nativeimage2.func_195702_a() == nativeimage1.func_195702_a() && nativeimage2.func_195714_b() == nativeimage1.func_195714_b()) {

View file

@ -19,12 +19,21 @@
package net.minecraftforge.client;
import java.io.IOException;
import java.util.BitSet;
import java.util.HashMap;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
import javax.annotation.Nonnull;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.NativeImage;
import net.minecraft.resources.IResource;
import net.minecraft.resources.IResourceManager;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.ChunkCache;
import net.minecraft.world.World;
@ -124,4 +133,21 @@ public class MinecraftForgeClient
regionCache.invalidateAll();
regionCache.cleanUp();
}
private static HashMap<ResourceLocation, Supplier<NativeImage>> bufferedImageSuppliers = new HashMap<ResourceLocation, Supplier<NativeImage>>();
public static void registerImageLayerSupplier(ResourceLocation resourceLocation, Supplier<NativeImage> supplier)
{
bufferedImageSuppliers.put(resourceLocation, supplier);
}
@Nonnull
public static NativeImage getImageLayer(ResourceLocation resourceLocation, IResourceManager resourceManager) throws IOException
{
Supplier<NativeImage> supplier = bufferedImageSuppliers.get(resourceLocation);
if (supplier != null)
return supplier.get();
IResource iresource1 = resourceManager.getResource(resourceLocation);
return NativeImage.read(iresource1.getInputStream());
}
}

View file

@ -0,0 +1,184 @@
/*
* Minecraft Forge
* Copyright (c) 2016-2018.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2.1
* of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.minecraftforge.debug.gameplay;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.BannerTextures;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.EnumDyeColor;
import net.minecraft.item.ItemBanner;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.BannerPattern;
import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.MinecraftForgeClient;
import net.minecraftforge.common.util.EnumHelper;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@Mod(modid = DynamicBannerTest.MODID, name = "ForgeDebugDynamicBanner", version = DynamicBannerTest.VERSION, acceptableRemoteVersions = "*")
public class DynamicBannerTest
{
private static final boolean ENABLE = false;
public static final String MODID = "forgedebugdynamicbanner";
public static final String VERSION = "1.0";
public static CreativeTabs bannerTab;
@SidedProxy
public static CommonProxy proxy = null;
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event)
{
if (ENABLE)
{
BannerPattern pattern = addBasicPattern("Y");
proxy.registerSupplier(new ResourceLocation("textures/entity/banner/" + pattern.getFileName() + ".png"));
proxy.registerSupplier(new ResourceLocation("textures/entity/shield/" + pattern.getFileName() + ".png"));
bannerTab = new CreativeTabBanners("dynbanner.banners");
}
}
public static abstract class CommonProxy
{
public void registerSupplier(ResourceLocation location)
{
}
}
public static final class ServerProxy extends CommonProxy
{
}
public static final class ClientProxy extends CommonProxy
{
@Override
@SideOnly(Side.CLIENT)
public void registerSupplier(ResourceLocation location)
{
MinecraftForgeClient.registerImageLayerSupplier(location, () -> {
return createBufferedImage();
});
}
}
public static BannerPattern addBasicPattern(String name)
{
final Class<?>[] paramTypes = { String.class, String.class };
final Object[] paramValues = { MODID + "_" + name, MODID + "." + name };
return EnumHelper.addEnum(BannerPattern.class, name.toUpperCase(), paramTypes, paramValues);
}
@SideOnly(Side.CLIENT)
private static BufferedImage createBufferedImage()
{
BufferedImage baseImage = buildBackground();
int width = 11;
int height = 30;
int startX = 5;
int startY = 5;
for (int xx = startX; xx <= startX + width; xx++)
{
for (int yy = startY; yy <= startY + height; yy++)
{
baseImage.setRGB(xx, yy, 0xFF000000); // Black
}
}
return baseImage;
}
@SideOnly(Side.CLIENT)
private static BufferedImage buildBackground()
{
ResourceLocation originalBackground = BannerTextures.BANNER_BASE_TEXTURE;
try (InputStream is = Minecraft.getMinecraft().getResourceManager().getResource(originalBackground).getInputStream())
{
return ImageIO.read(is);
}
catch (IOException exc)
{
throw new RuntimeException("Couldn't find or open the page background image.", exc);
}
}
public static NBTTagList makePatternNBTList(BannerPattern pattern, EnumDyeColor color)
{
final NBTTagList patterns = new NBTTagList();
final NBTTagCompound tag = new NBTTagCompound();
tag.setString("Pattern", pattern.getHashname());
tag.setInteger("Color", color.getDyeDamage());
patterns.appendTag(tag);
return patterns;
}
public static class CreativeTabBanners extends CreativeTabs
{
private static ItemStack DISPLAY = null;
public CreativeTabBanners(String id)
{
super(id);
this.setBackgroundImageName("item_search.png");
}
@Override
public ItemStack getTabIconItem()
{
return this.getIconItemStack();
}
@Override
public ItemStack getIconItemStack()
{
if (DISPLAY == null)
DISPLAY = ItemBanner.makeBanner(EnumDyeColor.WHITE, makePatternNBTList(BannerPattern.CREEPER, EnumDyeColor.GREEN));
return DISPLAY;
}
@Override
public boolean hasSearchBar()
{
return true;
}
@Override
public void displayAllRelevantItems(NonNullList<ItemStack> itemList)
{
super.displayAllRelevantItems(itemList);
for (final BannerPattern pattern : BannerPattern.values())
itemList.add(ItemBanner.makeBanner(EnumDyeColor.WHITE, makePatternNBTList(pattern, EnumDyeColor.BLACK)));
}
}
}