    001package net.minecraftforge.client.model;
    002
    003import java.io.InputStream;
    004import java.net.URL;
    005import java.util.Collection;
    006import java.util.Map;
    007
    008import net.minecraftforge.client.model.obj.ObjModelLoader;
    009
    010import com.google.common.collect.Maps;
    011
    012import cpw.mods.fml.common.FMLLog;
    013import cpw.mods.fml.relauncher.Side;
    014import cpw.mods.fml.relauncher.SideOnly;
    015
    016/**
    017 * Common interface for advanced model loading from files, based on file suffix
    018 * Model support can be queried through the {@link #getSupportedSuffixes()} method.
    019 * Instances can be created by calling {@link #loadModel(String)} with a class-loadable-path
    020 *
    021 * @author cpw
    022 *
    023 */
    024@SideOnly(Side.CLIENT)
    025public class AdvancedModelLoader {
    026    private static Map<String, IModelCustomLoader> instances = Maps.newHashMap();
    027
    028    /**
    029     * Register a new model handler
    030     * @param modelHandler The model handler to register
    031     */
    032    public static void registerModelHandler(IModelCustomLoader modelHandler)
    033    {
    034        for (String suffix : modelHandler.getSuffixes())
    035        {
    036            instances.put(suffix, modelHandler);
    037        }
    038    }
    039
    040    /**
    041     * Load the model from the supplied classpath resolvable resource name
    042     * @param resourceName The resource name
    043     * @return A model
    044     * @throws IllegalArgumentException if the resource name cannot be understood
    045     * @throws ModelFormatException if the underlying model handler cannot parse the model format
    046     */
    047    public static IModelCustom loadModel(String resourceName) throws IllegalArgumentException, ModelFormatException
    048    {
    049        int i = resourceName.lastIndexOf('.');
    050        if (i == -1)
    051        {
    052            FMLLog.severe("The resource name %s is not valid", resourceName);
    053            throw new IllegalArgumentException("The resource name is not valid");
    054        }
    055        String suffix = resourceName.substring(i+1);
    056        IModelCustomLoader loader = instances.get(suffix);
    057        if (loader == null)
    058        {
    059            FMLLog.severe("The resource name %s is not supported", resourceName);
    060            throw new IllegalArgumentException("The resource name is not supported");
    061        }
    062
    063        URL resource = AdvancedModelLoader.class.getResource(resourceName);
    064        if (resource == null)
    065        {
    066            FMLLog.severe("The resource name %s could not be found", resourceName);
    067            throw new IllegalArgumentException("The resource name could not be found");
    068        }
    069        return loader.loadInstance(resourceName, resource);
    070    }
    071
    072    public static Collection<String> getSupportedSuffixes()
    073    {
    074        return instances.keySet();
    075    }
    076
    077
    078    static
    079    {
    080        registerModelHandler(new ObjModelLoader());
    081    }
    082}