package openblocks.client.renderer.item; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraftforge.client.IItemRenderer; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.common.MinecraftForge; import openblocks.common.item.ItemDevNull; import openblocks.common.item.ItemDevNull.Icons; import openmods.inventory.ItemInventory; import openmods.renderer.DisplayListWrapper; import openmods.utils.TextureUtils; import openmods.utils.render.RenderUtils; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; public class ItemRendererDevNull implements IItemRenderer { protected static RenderItem itemRenderer = new RenderItem(); private static class Counter { private int value; public int enter() { return ++value; } public void exit() { --value; } } private final ThreadLocal<Counter> counter = new ThreadLocal<Counter>() { @Override protected Counter initialValue() { return new Counter(); } }; private DisplayListWrapper cube = new DisplayListWrapper() { @Override public void compile() { IIcon backgroundIcon = Icons.iconFull; final float minU = backgroundIcon.getMinU(); final float minV = backgroundIcon.getMinV(); final float maxV = backgroundIcon.getMaxV(); final float maxU = backgroundIcon.getMaxU(); final Tessellator tes = new Tessellator(); tes.startDrawingQuads(); tes.addVertexWithUV(0, 0, 0, minU, minV); tes.addVertexWithUV(0, 1, 0, minU, maxV); tes.addVertexWithUV(1, 1, 0, maxU, maxV); tes.addVertexWithUV(1, 0, 0, maxU, minV); tes.addVertexWithUV(0, 0, 1, minU, minV); tes.addVertexWithUV(1, 0, 1, minU, maxV); tes.addVertexWithUV(1, 1, 1, maxU, maxV); tes.addVertexWithUV(0, 1, 1, maxU, minV); tes.addVertexWithUV(0, 0, 0, minU, minV); tes.addVertexWithUV(0, 0, 1, minU, maxV); tes.addVertexWithUV(0, 1, 1, maxU, maxV); tes.addVertexWithUV(0, 1, 0, maxU, minV); tes.addVertexWithUV(1, 0, 0, minU, minV); tes.addVertexWithUV(1, 1, 0, minU, maxV); tes.addVertexWithUV(1, 1, 1, maxU, maxV); tes.addVertexWithUV(1, 0, 1, maxU, minV); tes.addVertexWithUV(0, 0, 0, minU, minV); tes.addVertexWithUV(1, 0, 0, minU, maxV); tes.addVertexWithUV(1, 0, 1, maxU, maxV); tes.addVertexWithUV(0, 0, 1, maxU, minV); tes.addVertexWithUV(0, 1, 0, minU, minV); tes.addVertexWithUV(0, 1, 1, minU, maxV); tes.addVertexWithUV(1, 1, 1, maxU, maxV); tes.addVertexWithUV(1, 1, 0, maxU, minV); GL11.glEnable(GL11.GL_CULL_FACE); GL11.glFrontFace(GL11.GL_CW); GL11.glDisable(GL11.GL_LIGHTING); tes.draw(); GL11.glEnable(GL11.GL_LIGHTING); GL11.glFrontFace(GL11.GL_CCW); } }; public ItemRendererDevNull() { MinecraftForge.EVENT_BUS.register(this); } @SubscribeEvent public void onTextuteChange(TextureStitchEvent evt) { if (evt.map.getTextureType() == TextureUtils.TEXTURE_MAP_ITEMS) cube.reset(); } @Override public boolean handleRenderType(ItemStack item, ItemRenderType type) { return true; } @Override public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack stack, ItemRendererHelper helper) { return type != ItemRenderType.INVENTORY; } @Override public void renderItem(ItemRenderType type, ItemStack containerStack, Object... data) { if (data.length == 0 || !(data[0] instanceof RenderBlocks)) { return; } final Counter counter = this.counter.get(); if (counter.enter() < ItemDevNull.STACK_LIMIT) { ItemInventory inv = new ItemInventory(containerStack, 1); ItemStack containedStack = inv.getStackInSlot(0); if (type == ItemRenderType.INVENTORY) renderInventoryStack(containerStack, containedStack); else renderInHandStack(type, containerStack, containedStack); } else { if (type == ItemRenderType.INVENTORY) renderOverload(); } counter.exit(); } private static void renderOverload() { RenderUtils.disableLightmap(); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glEnable(GL12.GL_RESCALE_NORMAL); TextureUtils.bindDefaultItemsTexture(); itemRenderer.renderIcon(0, 0, Icons.iconOverload, 16, 16); } protected void renderInHandStack(ItemRenderType type, ItemStack containerStack, ItemStack containedStack) { GL11.glPushMatrix(); if (type == ItemRenderType.ENTITY) { GL11.glTranslated(-0.25, -0.25, -0.25); GL11.glScaled(0.5, 0.5, 0.5); RenderUtils.disableLightmap(); } TextureUtils.bindDefaultItemsTexture(); cube.render(); if (type == ItemRenderType.ENTITY) { RenderUtils.enableLightmap(); } if (containedStack != null && (containedStack.getItem() instanceof ItemBlock)) { GL11.glTranslated(0.5, 0.5, 0.5); GL11.glScalef(0.8f, 0.8f, 0.8f); Minecraft mc = Minecraft.getMinecraft(); RenderManager.instance.itemRenderer.renderItem(mc.thePlayer, containedStack, 0, ItemRenderType.EQUIPPED); } GL11.glPopMatrix(); } private static void renderInventoryStack(ItemStack containerStack, ItemStack containedStack) { Minecraft mc = Minecraft.getMinecraft(); TextureManager textureManager = mc.getTextureManager(); FontRenderer fontRenderer = RenderManager.instance.getFontRenderer(); RenderUtils.disableLightmap(); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glEnable(GL12.GL_RESCALE_NORMAL); TextureUtils.bindDefaultItemsTexture(); itemRenderer.renderIcon(0, 0, Icons.iconTransparent, 16, 16); if (fontRenderer != null && containedStack != null) { GL11.glPushMatrix(); RenderHelper.enableGUIStandardItemLighting(); GL11.glScalef(14.0f / 16.0f, 14.0f / 16.0f, 1); itemRenderer.renderItemAndEffectIntoGUI(fontRenderer, textureManager, containedStack, 1, 1); GL11.glPopMatrix(); final String sizeToRender = (containedStack.stackSize > 1)? Integer.toString(containedStack.stackSize) : ""; itemRenderer.renderItemOverlayIntoGUI(fontRenderer, textureManager, containedStack, 0, 0, sizeToRender); } } }