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