package mekanism.client.render.obj; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.vecmath.Matrix4f; import mekanism.client.render.obj.MekanismOBJModel.OBJModelType; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.client.resources.IResourceManager; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.model.ICustomModelLoader; import net.minecraftforge.client.model.IModel; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.client.model.ModelLoaderRegistry; import net.minecraftforge.client.model.obj.OBJLoader; import net.minecraftforge.client.model.obj.OBJModel; import net.minecraftforge.client.model.obj.OBJModel.OBJBakedModel; import net.minecraftforge.common.model.IModelState; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import com.google.common.base.Function; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; public class MekanismOBJLoader implements ICustomModelLoader { public static final MekanismOBJLoader INSTANCE = new MekanismOBJLoader(); private final Map<ResourceLocation, MekanismOBJModel> modelCache = new HashMap<ResourceLocation, MekanismOBJModel>(); public static final ImmutableMap<String, String> flipData = ImmutableMap.of("flip-v", String.valueOf(true)); public static final String[] OBJ_RENDERS = new String[] {"glow_panel"}; @SubscribeEvent public void onModelBake(ModelBakeEvent event) throws IOException { GlowPanelModel.forceRebake(); for(String s : OBJ_RENDERS) { ModelResourceLocation model = new ModelResourceLocation("mekanism:" + s, "inventory"); Object obj = event.getModelRegistry().getObject(model); if(obj instanceof IBakedModel) { event.getModelRegistry().putObject(model, createBakedObjItemModel((IBakedModel)obj, "mekanism:models/block/" + s + ".obj.mek", new OBJModel.OBJState(Lists.newArrayList(OBJModel.Group.ALL), true), DefaultVertexFormats.ITEM)); } } } public OBJBakedModel createBakedObjItemModel(IBakedModel existingModel, String name, IModelState state, VertexFormat format) { try { Function<ResourceLocation, TextureAtlasSprite> textureGetter = new Function<ResourceLocation, TextureAtlasSprite>() { @Override public TextureAtlasSprite apply(ResourceLocation location) { return Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(location.toString()); } }; ResourceLocation modelLocation = new ResourceLocation(name); OBJModel objModel = (OBJModel)OBJLoader.INSTANCE.loadModel(modelLocation); objModel = (OBJModel)objModel.process(flipData); ImmutableMap.Builder<String, TextureAtlasSprite> builder = ImmutableMap.builder(); builder.put(ModelLoader.White.LOCATION.toString(), ModelLoader.White.INSTANCE); TextureAtlasSprite missing = textureGetter.apply(new ResourceLocation("missingno")); for(String s : objModel.getMatLib().getMaterialNames()) { if(objModel.getMatLib().getMaterial(s).getTexture().getTextureLocation().getResourcePath().startsWith("#")) { FMLLog.severe("OBJLoader: Unresolved texture '%s' for obj model '%s'", objModel.getMatLib().getMaterial(s).getTexture().getTextureLocation().getResourcePath(), modelLocation); builder.put(s, missing); } else { builder.put(s, textureGetter.apply(objModel.getMatLib().getMaterial(s).getTexture().getTextureLocation())); } } builder.put("missingno", missing); return new GlowPanelModel(existingModel, objModel, state, format, builder.build(), new HashMap<TransformType, Matrix4f>()); } catch(Exception e) { e.printStackTrace(); } return null; } @Override public boolean accepts(ResourceLocation modelLocation) { return modelLocation.getResourcePath().endsWith(".obj.mek"); } @Override public IModel loadModel(ResourceLocation loc) throws Exception { ResourceLocation file = new ResourceLocation(loc.getResourceDomain(), loc.getResourcePath()); if(!modelCache.containsKey(file)) { IModel model = OBJLoader.INSTANCE.loadModel(file); if(model instanceof OBJModel) { if(file.getResourcePath().contains("glow_panel")) { MekanismOBJModel mekModel = new MekanismOBJModel(OBJModelType.GLOW_PANEL, ((OBJModel)model).getMatLib(), file); modelCache.put(file, mekModel); } else if(file.getResourcePath().contains("transmitter")) { MekanismOBJModel mekModel = new MekanismOBJModel(OBJModelType.TRANSMITTER, ((OBJModel)model).getMatLib(), file); modelCache.put(file, mekModel); } } } MekanismOBJModel mekModel = modelCache.get(file); if(mekModel == null) { return ModelLoaderRegistry.getMissingModel(); } return mekModel; } @Override public void onResourceManagerReload(IResourceManager resourceManager) { modelCache.clear(); } }