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