001    /**
002     * This software is provided under the terms of the Minecraft Forge Public
003     * License v1.0.
004     */
005    
006    package net.minecraftforge.client;
007    
008    import org.lwjgl.opengl.Display;
009    
010    import net.minecraft.src.Block;
011    import net.minecraft.src.Entity;
012    import net.minecraft.src.Item;
013    import net.minecraft.src.ItemStack;
014    import net.minecraft.src.ModLoader;
015    import net.minecraft.src.RenderBlocks;
016    import net.minecraft.src.World;
017    import net.minecraftforge.client.IItemRenderer.ItemRenderType;
018    import net.minecraftforge.common.MinecraftForge;
019    
020    public class MinecraftForgeClient
021    {
022        /** Register a new render context handler.  A render context is a block
023         * of rendering performed with similar OpenGL modes, for example,
024         * texture name.
025         * @param texture The name of the texture for this render context.
026         * @param subid The subid of this render context.  0 is the default pass
027         * for normal rendering, higher subids render later.  All subids of 0
028         * will render before all subids of 1, etc.
029         * @param handler The handler to register.
030         */
031        public static void registerRenderContextHandler(String texture, int subid, IRenderContextHandler handler)
032        {
033            ForgeHooksClient.registerRenderContextHandler(texture, subid, handler);
034        }
035    
036        /** 
037         * Preload a texture.  Textures must be preloaded before the first
038         * use, or they will cause visual anomalies.
039         */
040        public static void preloadTexture(String texture)
041        {
042            ModLoader.getMinecraftInstance().renderEngine.getTexture(texture);
043        }
044    
045        /** Render a block.  Render a block which may have a custom texture.
046         */
047        public static void renderBlock(RenderBlocks render, Block block, int x, int y, int z)
048        {
049            ForgeHooksClient.beforeBlockRender(block, render);
050            render.renderBlockByRenderType(block, x, y, z);
051            ForgeHooksClient.afterBlockRender(block, render);
052        }
053    
054        /** 
055         * Get the current render pass.
056         */
057        public static int getRenderPass()
058        {
059            return ForgeHooksClient.renderPass;
060        }
061        
062        private static IItemRenderer[] customItemRenderers = new IItemRenderer[Item.itemsList.length];
063    
064        /** 
065         * Register a custom renderer for a specific item. This can be used to
066         * render the item in-world as an EntityItem, when the item is equipped, or
067         * when the item is in an inventory slot.
068         * @param itemID The item ID (shifted index) to handle rendering.
069         * @param renderer The IItemRenderer interface that handles rendering for
070         * this item.
071         */
072        public static void registerItemRenderer(int itemID, IItemRenderer renderer)
073        {
074            customItemRenderers[itemID] = renderer;
075        }
076    
077        public static IItemRenderer getItemRenderer(ItemStack item, ItemRenderType type)
078        {
079            IItemRenderer renderer = customItemRenderers[item.itemID];
080            if (renderer != null && renderer.handleRenderType(item, type)) 
081            {
082                return customItemRenderers[item.itemID];
083            }
084            return null;
085        }
086    }