001package net.minecraftforge.client;
002
003import net.minecraft.entity.item.EntityItem;
004import net.minecraft.entity.EntityLiving;
005import net.minecraft.item.ItemStack;
006import net.minecraft.client.renderer.RenderBlocks;
007
008public interface IItemRenderer
009{
010    public enum ItemRenderType
011    {
012        /** 
013         * Called to render an in-world item, e.g. one that has been thrown or
014         * dropped. The appropriate OpenGL transformations and scaling have already
015         * been applied, so Tessellator location (0,0,0) is the center of the
016         * EntityItem.
017         * 
018         * Data parameters:
019         * RenderBlocks render - The RenderBlocks instance
020         * EntityItem entity - The in-world item to be rendered
021         */
022        ENTITY, 
023        
024        /** 
025         * Called to render an item currently held in-hand by a living entity. If
026         * rendering as a 3D block, the item will be rotated to a 45-degree angle.
027         * To render a 2D texture with some thickness (like default items), see
028         * net.minecraft.src.ItemRenderer. In either case, rendering should be done
029         * in local coordinates from (0,0,0)-(1,1,1).
030         * 
031         * Data parameters:
032         * RenderBlocks render - The RenderBlocks instance
033         * EntityLiving entity - The entity holding this item
034         */
035        EQUIPPED, 
036        
037        /** 
038         * Called to render an item in a GUI inventory slot. If rendering as a 3D
039         * block, the appropriate OpenGL translations and scaling have already been
040         * applied, and the rendering should be done in local coordinates from
041         * (0,0,0)-(1,1,1). If rendering as a 2D texture, the rendering should be in
042         * GUI pixel coordinates from (0, 0, 0)-(16, 16, 0).
043         * 
044         * Data parameters:
045         * RenderBlocks render - The RenderBlocks instance
046         */
047        INVENTORY,
048        
049        /**
050         * The render type used for when a ItemMap is rendered in first person, 
051         * All appropriate rotations have been applied, and the player's hands, 
052         * and the map BG are already rendered.
053         * 
054         * Data Parameters:
055         * EntityPlayer player - The player holding the map
056         * RenderEngine engine - The RenderEngine instance
057         * MapData mapData - The map data
058         */
059        FIRST_PERSON_MAP
060    }
061    
062    public enum ItemRendererHelper
063    {
064        /** 
065         * Determines if a rotation effect should be used when rendering an
066         * EntityItem, like most default blocks do.
067         */
068        ENTITY_ROTATION,
069        
070        /** 
071         * Determines if an up-and-down bobbing effect should be used when
072         * rendering an EntityItem, like most default items do.
073         */
074        ENTITY_BOBBING,
075
076        /** 
077         * Determines if the currently equipped item should be rendered as a 3D
078         * block or as a 2D texture.
079         */
080        EQUIPPED_BLOCK,
081        
082        /**
083         * Determines if the item should equate to a block that has 
084         * RenderBlocks.renderItemIn3d return true
085         */
086        BLOCK_3D,
087
088        /** 
089         * Determines if the item should be rendered in GUI inventory slots as a 3D
090         * block or as a 2D texture.
091         */
092        INVENTORY_BLOCK
093    }
094    
095    /** 
096     * Checks if this renderer should handle a specific item's render type
097     * @param item The item we are trying to render
098     * @param type A render type to check if this renderer handles
099     * @return true if this renderer should handle the given render type,
100     * otherwise false
101     */
102    public boolean handleRenderType(ItemStack item, ItemRenderType type);
103    
104    /**
105     * Checks if certain helper functionality should be executed for this renderer.
106     * See ItemRendererHelper for more info
107     * 
108     * @param type The render type
109     * @param item The ItemStack being rendered
110     * @param helper The type of helper functionality to be ran
111     * @return True to run the helper functionality, false to not.
112     */
113    public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper);
114    
115    /**
116     * Called to do the actual rendering, see ItemRenderType for details on when specific 
117     * types are run, and what extra data is passed into the data parameter.
118     * 
119     * @param type The render type
120     * @param item The ItemStack being rendered
121     * @param data Extra Type specific data
122     */
123    public void renderItem(ItemRenderType type, ItemStack item, Object... data);
124}