From 20e264f9ee5b74d517b9449f68c4e218da261f39 Mon Sep 17 00:00:00 2001 From: LexManos Date: Mon, 9 Apr 2012 22:57:52 -0700 Subject: [PATCH] Rewrote IItemRenderer to be a more generic and expandable version, Breaks previous interfaces, but this should be the last time the interface changes. Implemented the MapRender hook ChickenBones requested. --- .../minecraft/src/forge/ForgeHooksClient.java | 19 +-- .../minecraft/src/forge/IItemRenderer.java | 155 +++++++++++------- .../minecraft/src/forge/ItemRenderType.java | 1 + .../src/forge/MinecraftForgeClient.java | 1 + .../net/minecraft/src/forge/ForgeHooks.java | 6 +- .../net/minecraft/src/ItemRenderer.java.patch | 39 ++++- .../net/minecraft/src/RenderItem.java.patch | 37 +++-- 7 files changed, 164 insertions(+), 94 deletions(-) diff --git a/forge/forge_client/src/net/minecraft/src/forge/ForgeHooksClient.java b/forge/forge_client/src/net/minecraft/src/forge/ForgeHooksClient.java index 1def88887..4ae2efe22 100644 --- a/forge/forge_client/src/net/minecraft/src/forge/ForgeHooksClient.java +++ b/forge/forge_client/src/net/minecraft/src/forge/ForgeHooksClient.java @@ -19,6 +19,9 @@ import java.util.*; import net.minecraft.src.*; import org.lwjgl.opengl.GL12; +import static net.minecraft.src.forge.IItemRenderer.ItemRenderType.*; +import static net.minecraft.src.forge.IItemRenderer.ItemRendererHelper.*; + public class ForgeHooksClient { @@ -261,18 +264,13 @@ public class ForgeHooksClient } } - public static void renderEntityItem(IItemRenderer customRenderer, RenderBlocks renderBlocks, EntityItem item) - { - customRenderer.renderEntityItem(renderBlocks, item); - } - public static void renderEquippedItem(IItemRenderer customRenderer, RenderBlocks renderBlocks, EntityLiving entity, ItemStack item) { - if (customRenderer.renderEquippedItemAsBlock(item)) + if (customRenderer.shouldUseRenderHelper(EQUIPPED, item, EQUIPPED_BLOCK)) { GL11.glPushMatrix(); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - customRenderer.renderEquippedItem(renderBlocks, entity, item); + customRenderer.renderItem(EQUIPPED, item, renderBlocks, entity); GL11.glPopMatrix(); } else @@ -284,14 +282,9 @@ public class ForgeHooksClient GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F); GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F); - customRenderer.renderEquippedItem(renderBlocks, entity, item); + customRenderer.renderItem(EQUIPPED, item, renderBlocks, entity); GL11.glDisable(GL12.GL_RESCALE_NORMAL); GL11.glPopMatrix(); } } - - public static void renderInventoryItem(IItemRenderer customRenderer, RenderBlocks renderBlocks, ItemStack item) - { - customRenderer.renderInventoryItem(renderBlocks, item); - } } diff --git a/forge/forge_client/src/net/minecraft/src/forge/IItemRenderer.java b/forge/forge_client/src/net/minecraft/src/forge/IItemRenderer.java index 8d38d5cd6..e1e44959e 100644 --- a/forge/forge_client/src/net/minecraft/src/forge/IItemRenderer.java +++ b/forge/forge_client/src/net/minecraft/src/forge/IItemRenderer.java @@ -7,7 +7,86 @@ import net.minecraft.src.RenderBlocks; public interface IItemRenderer { - /** Checks if this renderer should handle a specific item's render type + public enum ItemRenderType + { + /** + * Called to render an in-world item, e.g. one that has been thrown or + * dropped. The appropriate OpenGL transformations and scaling have already + * been applied, so Tessellator location (0,0,0) is the center of the + * EntityItem. + * + * Data parameters: + * RenderBlocks render - The RenderBlocks instance + * EntityItem entity - The in-world item to be rendered + */ + ENTITY, + + /** + * Called to render an item currently held in-hand by a living entity. If + * rendering as a 3D block, the item will be rotated to a 45-degree angle. + * To render a 2D texture with some thickness (like default items), see + * net.minecraft.src.ItemRenderer. In either case, rendering should be done + * in local coordinates from (0,0,0)-(1,1,1). + * + * Data parameters: + * RenderBlocks render - The RenderBlocks instance + * EntityLiving entity - The entity holding this item + */ + EQUIPPED, + + /** + * Called to render an item in a GUI inventory slot. If rendering as a 3D + * block, the appropriate OpenGL translations and scaling have already been + * applied, and the rendering should be done in local coordinates from + * (0,0,0)-(1,1,1). If rendering as a 2D texture, the rendering should be in + * GUI pixel coordinates from (0, 0, 0)-(16, 16, 0). + * + * Data parameters: + * RenderBlocks render - The RenderBlocks instance + */ + INVENTORY, + + /** + * The render type used for when a ItemMap is rendered in first person, + * All appropriate rotations have been applied, and the player's hands, + * and the map BG are already rendered. + * + * Data Parameters: + * EntityPlayer player - The player holding the map + * RenderEngine engine - The RenderEngine instance + * MapData mapData - The map data + */ + FIRST_PERSON_MAP + } + + public enum ItemRendererHelper + { + /** + * Determines if a rotation effect should be used when rendering an + * EntityItem, like most default blocks do. + */ + ENTITY_ROTATION, + + /** + * Determines if an up-and-down bobbing effect should be used when + */ + ENTITY_BOBBING, + + /** + * Determines if the currently equipped item should be rendered as a 3D + * block or as a 2D texture. + */ + EQUIPPED_BLOCK, + + /** + * Determines if the item should be rendered in GUI inventory slots as a 3D + * block or as a 2D texture. + */ + INVENTORY_BLOCK + } + + /** + * Checks if this renderer should handle a specific item's render type * @param item The item we are trying to render * @param type A render type to check if this renderer handles * @return true if this renderer should handle the given render type, @@ -15,64 +94,24 @@ public interface IItemRenderer */ public boolean handleRenderType(ItemStack item, ItemRenderType type); - /** Called to render an in-world item, e.g. one that has been thrown or - * dropped. The appropriate OpenGL transformations and scaling have already - * been applied, so Tessellator location (0,0,0) is the center of the - * EntityItem. - * @param render The RenderBlocks instance - * @param item The in-world item to be rendered + /** + * Checks if certain helper functionality should be executed for this renderer. + * See ItemRendererHelper for more info + * + * @param type The render type + * @param item The ItemStack being rendered + * @param helper The type of helper functionality to be ran + * @return True to run the helper functionality, false to not. */ - public void renderEntityItem(RenderBlocks render, EntityItem item); + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper); - /** Determines if a rotation effect should be used when rendering an - * EntityItem, like most default blocks do. - * @param item the item we are trying to render - * @return true if the EntityItem should rotate, otherwise false + /** + * Called to do the actual rendering, see ItemRenderType for details on when specific + * types are run, and what extra data is passed into the data parameter. + * + * @param type The render type + * @param item The ItemStack being rendered + * @param data Extra Type specific data */ - public boolean useEntityItemRotationEffect(ItemStack item); - - /** Determines if an up-and-down bobbing effect should be used when - * rendering an EntityItem, like all default blocks and items do. - * @param item the item we are trying to render - * @return true if the EntityItem should bob up and down, otherwise false - */ - public boolean useEntityItemBobbingEffect(ItemStack item); - - /** Called to render an item currently held in-hand by a living entity. If - * rendering as a 3D block, the item will be rotated to a 45-degree angle. - * To render a 2D texture with some thickness (like default items), see - * net.minecraft.src.ItemRenderer. In either case, rendering should be done - * in local coordinates from (0,0,0)-(1,1,1). - * @param render The RenderBlocks instance - * @param entity The entity holding this item - * @param item The equipped item to be rendered - */ - public void renderEquippedItem(RenderBlocks render, EntityLiving entity, ItemStack item); - - /** Determines if the currently equipped item should be rendered as a 3D - * block or as a 2D texture. - * @param item the item we are trying to render - * @return true if the equipped item should be rendered as a 3D block, - * otherwise false - */ - public boolean renderEquippedItemAsBlock(ItemStack item); - - /** Called to render an item in a GUI inventory slot. If rendering as a 3D - * block, the appropriate OpenGL translations and scaling have already been - * applied, and the rendering should be done in local coordinates from - * (0,0,0)-(1,1,1). If rendering as a 2D texture, the rendering should be in - * GUI pixel coordinates from (0, 0, 0)-(16, 16, 0). - * @param render The RenderBlocks instance - * @param item The item stack to render - */ - public void renderInventoryItem(RenderBlocks render, ItemStack item); - - /** Determines if the item should be rendered in GUI inventory slots as a 3D - * block or as a 2D texture. - * @param item the item we are trying to render - * @return true if the inventory item should be rendered as a 3D block, - * otherwise false - */ - public boolean renderInventoryItemAsBlock(ItemStack item); - + public void renderItem(ItemRenderType type, ItemStack item, Object... data); } diff --git a/forge/forge_client/src/net/minecraft/src/forge/ItemRenderType.java b/forge/forge_client/src/net/minecraft/src/forge/ItemRenderType.java index 16affa208..258e784cc 100644 --- a/forge/forge_client/src/net/minecraft/src/forge/ItemRenderType.java +++ b/forge/forge_client/src/net/minecraft/src/forge/ItemRenderType.java @@ -1,5 +1,6 @@ package net.minecraft.src.forge; +@Deprecated //Now consolidated into IITemRenderer public enum ItemRenderType { ENTITY, // Render type for in-world EntityItems diff --git a/forge/forge_client/src/net/minecraft/src/forge/MinecraftForgeClient.java b/forge/forge_client/src/net/minecraft/src/forge/MinecraftForgeClient.java index fc938e4bc..e47d99650 100755 --- a/forge/forge_client/src/net/minecraft/src/forge/MinecraftForgeClient.java +++ b/forge/forge_client/src/net/minecraft/src/forge/MinecraftForgeClient.java @@ -12,6 +12,7 @@ import net.minecraft.src.Item; import net.minecraft.src.ItemStack; import net.minecraft.src.ModLoader; import net.minecraft.src.RenderBlocks; +import net.minecraft.src.forge.IItemRenderer.ItemRenderType; public class MinecraftForgeClient { diff --git a/forge/forge_common/net/minecraft/src/forge/ForgeHooks.java b/forge/forge_common/net/minecraft/src/forge/ForgeHooks.java index 375847919..fc81213af 100644 --- a/forge/forge_common/net/minecraft/src/forge/ForgeHooks.java +++ b/forge/forge_common/net/minecraft/src/forge/ForgeHooks.java @@ -603,9 +603,13 @@ public class ForgeHooks } public static ArrayList arrowNockHandlers = new ArrayList(); + //This number is incremented every Minecraft version, and never reset public static final int majorVersion = 3; + //This number is incremented every official release, and reset every Minecraft version public static final int minorVersion = 0; - public static final int revisionVersion = 0; + //This number is incremented every time a interface changes, and reset every Minecraft version + public static final int revisionVersion = 1; + //This number is incremented every time Jenkins builds Forge, and never reset. Should always be 0 in the repo code. public static final int buildVersion = 0; static { diff --git a/forge/patches/minecraft/net/minecraft/src/ItemRenderer.java.patch b/forge/patches/minecraft/net/minecraft/src/ItemRenderer.java.patch index 1e2a6aa14..152c03cab 100644 --- a/forge/patches/minecraft/net/minecraft/src/ItemRenderer.java.patch +++ b/forge/patches/minecraft/net/minecraft/src/ItemRenderer.java.patch @@ -1,22 +1,23 @@ --- ../src_base/minecraft/net/minecraft/src/ItemRenderer.java 0000-00-00 00:00:00.000000000 -0000 +++ ../src_work/minecraft/net/minecraft/src/ItemRenderer.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,6 +1,11 @@ +@@ -1,6 +1,12 @@ package net.minecraft.src; import net.minecraft.client.Minecraft; +import net.minecraft.src.forge.ForgeHooksClient; +import net.minecraft.src.forge.IItemRenderer; -+import net.minecraft.src.forge.ItemRenderType; +import net.minecraft.src.forge.MinecraftForgeClient; ++import static net.minecraft.src.forge.IItemRenderer.ItemRenderType.*; ++import static net.minecraft.src.forge.IItemRenderer.ItemRendererHelper.*; + import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; -@@ -35,21 +40,27 @@ +@@ -35,21 +41,27 @@ public void renderItem(EntityLiving par1EntityLiving, ItemStack par2ItemStack, int par3) { GL11.glPushMatrix(); -+ IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(par2ItemStack, ItemRenderType.EQUIPPED); ++ IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(par2ItemStack, EQUIPPED); - if (par2ItemStack.itemID < 256 && RenderBlocks.renderItemIn3d(Block.blocksList[par2ItemStack.itemID].getRenderType())) + if (customRenderer != null) @@ -44,3 +45,33 @@ } Tessellator var4 = Tessellator.instance; +@@ -246,8 +258,10 @@ + float var11; + float var13; + +- if (var14 != null && var14.itemID == Item.map.shiftedIndex) ++ if (var14 != null && var14.getItem() instanceof ItemMap) + { ++ IItemRenderer custom = MinecraftForgeClient.getItemRenderer(var14, FIRST_PERSON_MAP); ++ + GL11.glPushMatrix(); + var7 = 0.8F; + var17 = var3.getSwingProgress(par1); +@@ -313,8 +327,15 @@ + var26.addVertexWithUV((double)(128 + var27), (double)(0 - var27), 0.0D, 1.0D, 0.0D); + var26.addVertexWithUV((double)(0 - var27), (double)(0 - var27), 0.0D, 0.0D, 0.0D); + var26.draw(); +- MapData var23 = Item.map.getMapData(var14, this.mc.theWorld); +- this.mapItemRenderer.renderMap(this.mc.thePlayer, this.mc.renderEngine, var23); ++ MapData var23 = ((ItemMap)var14.getItem()).getMapData(var14, this.mc.theWorld); ++ if (custom == null) ++ { ++ this.mapItemRenderer.renderMap(this.mc.thePlayer, this.mc.renderEngine, var23); ++ } ++ else ++ { ++ custom.renderItem(FIRST_PERSON_MAP, var14, mc.thePlayer, mc.renderEngine, var23); ++ } + GL11.glPopMatrix(); + } + else if (var14 != null) diff --git a/forge/patches/minecraft/net/minecraft/src/RenderItem.java.patch b/forge/patches/minecraft/net/minecraft/src/RenderItem.java.patch index 53bcd982d..865cff010 100644 --- a/forge/patches/minecraft/net/minecraft/src/RenderItem.java.patch +++ b/forge/patches/minecraft/net/minecraft/src/RenderItem.java.patch @@ -1,32 +1,33 @@ --- ../src_base/minecraft/net/minecraft/src/RenderItem.java 0000-00-00 00:00:00.000000000 -0000 +++ ../src_work/minecraft/net/minecraft/src/RenderItem.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,6 +1,12 @@ +@@ -1,6 +1,13 @@ package net.minecraft.src; import java.util.Random; + +import net.minecraft.src.forge.ForgeHooksClient; +import net.minecraft.src.forge.IItemRenderer; -+import net.minecraft.src.forge.ItemRenderType; +import net.minecraft.src.forge.MinecraftForgeClient; ++import static net.minecraft.src.forge.IItemRenderer.ItemRenderType.*; ++import static net.minecraft.src.forge.IItemRenderer.ItemRendererHelper.*; + import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; -@@ -55,10 +61,58 @@ +@@ -55,10 +62,58 @@ float var18; float var23; - if (var10.itemID < 256 && RenderBlocks.renderItemIn3d(Block.blocksList[var10.itemID].getRenderType())) -+ IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(var10, ItemRenderType.ENTITY); ++ IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(var10, ENTITY); + + if (customRenderer != null) + { -+ if (customRenderer.useEntityItemRotationEffect(var10)) ++ if (customRenderer.shouldUseRenderHelper(ENTITY, var10, ENTITY_ROTATION)) + { + GL11.glRotatef(var12, 0.0F, 1.0F, 0.0F); + } -+ if (!customRenderer.useEntityItemBobbingEffect(var10)) ++ if (!customRenderer.shouldUseRenderHelper(ENTITY, var10, ENTITY_BOBBING)) + { + GL11.glTranslatef(0.0F, -var11, 0.0F); + } @@ -54,7 +55,7 @@ + ((random.nextFloat() * 2.0F - 1.0F) * 0.2F) / 0.5F, + ((random.nextFloat() * 2.0F - 1.0F) * 0.2F) / 0.5F); + } -+ ForgeHooksClient.renderEntityItem(customRenderer, renderBlocks, par1EntityItem); ++ customRenderer.renderItem(ENTITY, var10, renderBlocks, par1EntityItem); + GL11.glPopMatrix(); + } + } @@ -62,7 +63,7 @@ + { + this.loadTexture(ForgeHooksClient.getTexture(var10.itemID < 256 ? "/terrain.png" : "/gui/items.png", var10.getItem())); + GL11.glScalef(0.5F, 0.5F, 0.5F); -+ ForgeHooksClient.renderEntityItem(customRenderer, renderBlocks, par1EntityItem); ++ customRenderer.renderItem(ENTITY, var10, renderBlocks, par1EntityItem); + } + + } @@ -74,7 +75,7 @@ float var21 = 0.25F; var15 = Block.blocksList[var10.itemID].getRenderType(); -@@ -94,7 +148,7 @@ +@@ -94,7 +149,7 @@ if (var10.getItem().func_46058_c()) { GL11.glScalef(0.5F, 0.5F, 0.5F); @@ -83,7 +84,7 @@ for (var14 = 0; var14 <= 1; ++var14) { -@@ -120,11 +174,11 @@ +@@ -120,11 +175,11 @@ if (var10.itemID < 256) { @@ -97,7 +98,7 @@ } if (this.field_27004_a) -@@ -186,10 +240,10 @@ +@@ -186,10 +241,10 @@ float var11; float var12; float var13; @@ -110,7 +111,7 @@ Block var15 = Block.blocksList[par3]; GL11.glPushMatrix(); GL11.glTranslatef((float)(par6 - 2), (float)(par7 + 3), -3.0F + this.zLevel); -@@ -221,7 +275,7 @@ +@@ -221,7 +276,7 @@ if (Item.itemsList[par3].func_46058_c()) { GL11.glDisable(GL11.GL_LIGHTING); @@ -119,7 +120,7 @@ for (var8 = 0; var8 <= 1; ++var8) { -@@ -247,11 +301,11 @@ +@@ -247,11 +302,11 @@ if (par3 < 256) { @@ -133,16 +134,16 @@ } var8 = Item.itemsList[par3].getColorFromDamage(par4, 0); -@@ -279,7 +333,58 @@ +@@ -279,7 +334,58 @@ { if (par3ItemStack != null) { - this.drawItemIntoGui(par1FontRenderer, par2RenderEngine, par3ItemStack.itemID, par3ItemStack.getItemDamage(), par3ItemStack.getIconIndex(), par4, par5); -+ IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(par3ItemStack, ItemRenderType.INVENTORY); ++ IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(par3ItemStack, INVENTORY); + if (customRenderer != null) + { + par2RenderEngine.bindTexture(par2RenderEngine.getTexture(ForgeHooksClient.getTexture(par3ItemStack.itemID < 256 ? "/terrain.png" : "/gui/items.png", Item.itemsList[par3ItemStack.itemID]))); -+ if (customRenderer.renderInventoryItemAsBlock(par3ItemStack)) ++ if (customRenderer.shouldUseRenderHelper(INVENTORY, par3ItemStack, INVENTORY_BLOCK)) + { + GL11.glPushMatrix(); + GL11.glTranslatef((float)(par4 - 2), (float)(par5 + 3), -3.0F + this.zLevel); @@ -161,7 +162,7 @@ + } + GL11.glRotatef(-90F, 0.0F, 1.0F, 0.0F); + renderBlocks.useInventoryTint = field_27004_a; -+ ForgeHooksClient.renderInventoryItem(customRenderer, renderBlocks, par3ItemStack); ++ customRenderer.renderItem(INVENTORY, par3ItemStack, renderBlocks); + renderBlocks.useInventoryTint = true; + GL11.glPopMatrix(); + } @@ -181,7 +182,7 @@ + GL11.glColor4f(r, g, b, 1.0F); + } + -+ ForgeHooksClient.renderInventoryItem(customRenderer, renderBlocks, par3ItemStack); ++ customRenderer.renderItem(INVENTORY, par3ItemStack, renderBlocks); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_LIGHTING); + }