001    package cpw.mods.fml.client.registry;
002    
003    import java.util.List;
004    import java.util.Map;
005    
006    import net.minecraft.block.Block;
007    import net.minecraft.client.renderer.RenderBlocks;
008    import net.minecraft.client.renderer.entity.*;
009    import net.minecraft.entity.Entity;
010    import net.minecraft.world.IBlockAccess;
011    
012    import com.google.common.collect.Lists;
013    import com.google.common.collect.Maps;
014    import com.google.common.collect.ObjectArrays;
015    
016    import cpw.mods.fml.client.SpriteHelper;
017    import cpw.mods.fml.client.TextureFXManager;
018    
019    /**
020     * @author cpw
021     *
022     */
023    public class RenderingRegistry
024    {
025        private static final RenderingRegistry INSTANCE = new RenderingRegistry();
026    
027        private int nextRenderId = 36;
028    
029        private Map<Integer, ISimpleBlockRenderingHandler> blockRenderers = Maps.newHashMap();
030    
031        private List<EntityRendererInfo> entityRenderers = Lists.newArrayList();
032    
033        /**
034         * Add a new armour prefix to the RenderPlayer
035         *
036         * @param armor
037         */
038        public static int addNewArmourRendererPrefix(String armor)
039        {
040            RenderPlayer.armorFilenamePrefix = ObjectArrays.concat(RenderPlayer.armorFilenamePrefix, armor);
041            RenderBiped.bipedArmorFilenamePrefix = RenderPlayer.armorFilenamePrefix;
042            return RenderPlayer.armorFilenamePrefix.length - 1;
043        }
044    
045        /**
046         * Register an entity rendering handler. This will, after mod initialization, be inserted into the main
047         * render map for entities
048         *
049         * @param entityClass
050         * @param renderer
051         */
052        public static void registerEntityRenderingHandler(Class<? extends Entity> entityClass, Render renderer)
053        {
054            instance().entityRenderers.add(new EntityRendererInfo(entityClass, renderer));
055        }
056    
057        /**
058         * Register a simple block rendering handler
059         *
060         * @param handler
061         */
062        public static void registerBlockHandler(ISimpleBlockRenderingHandler handler)
063        {
064            instance().blockRenderers.put(handler.getRenderId(), handler);
065        }
066    
067        /**
068         * Register the simple block rendering handler
069         * This version will not call getRenderId on the passed in handler, instead using the supplied ID, so you
070         * can easily re-use the same rendering handler for multiple IDs
071         *
072         * @param renderId
073         * @param handler
074         */
075        public static void registerBlockHandler(int renderId, ISimpleBlockRenderingHandler handler)
076        {
077            instance().blockRenderers.put(renderId, handler);
078        }
079        /**
080         * Get the next available renderId from the block render ID list
081         */
082        public static int getNextAvailableRenderId()
083        {
084            return instance().nextRenderId++;
085        }
086    
087        /**
088         * Add a texture override for the given path and return the used index
089         *
090         * @param fileToOverride
091         * @param fileToAdd
092         */
093        public static int addTextureOverride(String fileToOverride, String fileToAdd)
094        {
095            int idx = SpriteHelper.getUniqueSpriteIndex(fileToOverride);
096            addTextureOverride(fileToOverride, fileToAdd, idx);
097            return idx;
098        }
099    
100        /**
101         * Add a texture override for the given path and index
102         *
103         * @param path
104         * @param overlayPath
105         * @param index
106         */
107        public static void addTextureOverride(String path, String overlayPath, int index)
108        {
109            TextureFXManager.instance().addNewTextureOverride(path, overlayPath, index);
110        }
111    
112        /**
113         * Get and reserve a unique texture index for the supplied path
114         *
115         * @param path
116         */
117        public static int getUniqueTextureIndex(String path)
118        {
119            return SpriteHelper.getUniqueSpriteIndex(path);
120        }
121    
122        @Deprecated public static RenderingRegistry instance()
123        {
124            return INSTANCE;
125        }
126    
127        private static class EntityRendererInfo
128        {
129            public EntityRendererInfo(Class<? extends Entity> target, Render renderer)
130            {
131                this.target = target;
132                this.renderer = renderer;
133            }
134            private Class<? extends Entity> target;
135            private Render renderer;
136        }
137    
138        public boolean renderWorldBlock(RenderBlocks renderer, IBlockAccess world, int x, int y, int z, Block block, int modelId)
139        {
140            if (!blockRenderers.containsKey(modelId)) { return false; }
141            ISimpleBlockRenderingHandler bri = blockRenderers.get(modelId);
142            return bri.renderWorldBlock(world, x, y, z, block, modelId, renderer);
143        }
144    
145        public void renderInventoryBlock(RenderBlocks renderer, Block block, int metadata, int modelID)
146        {
147            if (!blockRenderers.containsKey(modelID)) { return; }
148            ISimpleBlockRenderingHandler bri = blockRenderers.get(modelID);
149            bri.renderInventoryBlock(block, metadata, modelID, renderer);
150        }
151    
152        public boolean renderItemAsFull3DBlock(int modelId)
153        {
154            ISimpleBlockRenderingHandler bri = blockRenderers.get(modelId);
155            return bri != null && bri.shouldRender3DInInventory();
156        }
157    
158        public void loadEntityRenderers(Map<Class<? extends Entity>, Render> rendererMap)
159        {
160            for (EntityRendererInfo info : entityRenderers)
161            {
162                rendererMap.put(info.target, info.renderer);
163                info.renderer.setRenderManager(RenderManager.instance);
164            }
165        }
166    }