package mekanism.client.render.ctm;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.renderer.block.model.ModelRotation;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.client.event.TextureStitchEvent;
import net.minecraftforge.client.model.Attributes;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.client.model.ModelLoaderRegistry;
import net.minecraftforge.common.model.TRSRTransformation;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.apache.commons.lang3.tuple.Pair;
public class CTMRegistry
{
private static List<TextureSpriteCallback> textures = new ArrayList<TextureSpriteCallback>();
private IBakedModel baseModel;
public static ResourceLocation baseResource = new ResourceLocation("mekanism:block/ctm_block");
public static List<Pair<String, String>> ctmTypes = new ArrayList<Pair<String, String>>();
public static Map<String, TextureCTM> textureCache = new HashMap<String, TextureCTM>();
@SubscribeEvent
public void onTextureStitch(TextureStitchEvent.Pre event)
{
for(TextureSpriteCallback callback : textures)
{
callback.stitch(event.getMap());
}
}
@SubscribeEvent
public void onModelBake(ModelBakeEvent event) throws Exception
{
IModel model = ModelLoaderRegistry.getModel(baseResource);
baseModel = model.bake(new TRSRTransformation(ModelRotation.X0_Y0), Attributes.DEFAULT_BAKED_FORMAT, r -> Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(r.toString()));
for(Pair<String, String> pair : ctmTypes)
{
ModelCTM chiselModel = new ModelCTM(baseModel, pair.getRight());
chiselModel.load();
event.getModelRegistry().putObject(new ModelResourceLocation(pair.getLeft() + ":" + pair.getRight()), new CTMModelFactory(chiselModel));
}
}
public static void registerCTMs(String domain, String... ctms)
{
for(String s : ctms)
{
ctmTypes.add(Pair.of(domain, s));
textureCache.put(s, createTexture(domain, s));
}
}
public static void register(TextureSpriteCallback callback)
{
textures.add(callback);
}
public static TextureCTM createTexture(String domain, String name)
{
TextureSpriteCallback[] callbacks = new TextureSpriteCallback[CTM.REQUIRED_TEXTURES];
callbacks[0] = new TextureSpriteCallback(new ResourceLocation(domain + ":blocks/ctm/" + name));
callbacks[1] = new TextureSpriteCallback(new ResourceLocation(domain + ":blocks/ctm/" + name + "-ctm"));
register(callbacks[0]);
register(callbacks[1]);
return new TextureCTM(callbacks);
}
}