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