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