package mekanism.client.render.transmitter; import java.util.HashMap; import java.util.Map; import mcmultipart.client.multipart.MultipartSpecialRenderer; import mekanism.client.render.MekanismRenderer; import mekanism.common.ColourRGBA; import mekanism.common.multipart.PartTransmitter; import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils.ResourceType; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.VertexBuffer; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.Attributes; import net.minecraftforge.client.model.obj.OBJLoader; import net.minecraftforge.client.model.obj.OBJModel; import net.minecraftforge.client.model.pipeline.LightUtil; import org.lwjgl.opengl.GL11; import com.google.common.base.Function; import com.google.common.collect.ImmutableList; public abstract class RenderTransmitterBase<T extends PartTransmitter> extends MultipartSpecialRenderer<T> { private static OBJModel contentsModel; private static Map<String, IBakedModel> contentsMap = new HashMap<String, IBakedModel>(); protected Minecraft mc = Minecraft.getMinecraft(); public RenderTransmitterBase() { if(contentsModel == null) { try { contentsModel = (OBJModel)OBJLoader.INSTANCE.loadModel(MekanismUtils.getResource(ResourceType.MODEL, "transmitter_contents.obj")); contentsMap = buildModelMap(contentsModel); } catch(Exception e) { e.printStackTrace(); } } } protected void push() { GL11.glPushMatrix(); GL11.glPushAttrib(GL11.GL_ENABLE_BIT); GL11.glEnable(GL11.GL_CULL_FACE); GL11.glEnable(GL11.GL_BLEND); GL11.glDisable(GL11.GL_LIGHTING); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); } protected void pop() { GL11.glPopAttrib(); GL11.glPopMatrix(); } public void renderTransparency(VertexBuffer renderer, TextureAtlasSprite icon, IBakedModel cc, ColourRGBA color) { if(!MekanismRenderer.isDrawing(renderer)) { renderer.begin(GL11.GL_QUADS, DefaultVertexFormats.ITEM); } for(EnumFacing side : EnumFacing.values()) { for(BakedQuad quad : cc.getQuads(null, side, 0)) { quad = MekanismRenderer.iconTransform(quad, icon); LightUtil.renderQuadColor(renderer, quad, color.argb()); } } for(BakedQuad quad : cc.getQuads(null, null, 0)) { quad = MekanismRenderer.iconTransform(quad, icon); LightUtil.renderQuadColor(renderer, quad, color.argb()); } } public static HashMap<String, IBakedModel> buildModelMap(OBJModel objModel) { HashMap<String, IBakedModel> modelParts = new HashMap<String, IBakedModel>(); if(!objModel.getMatLib().getGroups().keySet().isEmpty()) { for(String key : objModel.getMatLib().getGroups().keySet()) { String k = key; if(!modelParts.containsKey(key)) { modelParts.put(k, objModel.bake(new OBJModel.OBJState(ImmutableList.of(k), false), Attributes.DEFAULT_BAKED_FORMAT, textureGetterFlipV)); } } } return modelParts; } public IBakedModel getModelForSide(PartTransmitter part, EnumFacing side) { String sideName = side.name().toLowerCase(); String typeName = part.getConnectionType(side).name().toUpperCase(); String name = sideName + typeName; return contentsMap.get(name); } /* Credit to Eternal Energy */ public static Function<ResourceLocation, TextureAtlasSprite> textureGetterFlipV = new Function<ResourceLocation, TextureAtlasSprite>() { @Override public TextureAtlasSprite apply(ResourceLocation location) { return DummyAtlasTextureFlipV.instance; } }; private static class DummyAtlasTextureFlipV extends TextureAtlasSprite { public static DummyAtlasTextureFlipV instance = new DummyAtlasTextureFlipV(); protected DummyAtlasTextureFlipV() { super("dummyFlipV"); } @Override public float getInterpolatedU(double u) { return (float)u / 16; } @Override public float getInterpolatedV(double v) { return (float)v / -16; } } }