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 }