package crazypants.enderio.machine.capbank.render;
import java.util.HashMap;
import java.util.Map;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer;
import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.opengl.GL11;
import com.enderio.core.client.render.ConnectedTextureRenderer;
import com.enderio.core.client.render.CubeRenderer;
import com.enderio.core.client.render.CustomCubeRenderer;
import com.enderio.core.client.render.RenderUtil;
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import crazypants.enderio.EnderIO;
import crazypants.enderio.machine.capbank.BlockCapBank;
import crazypants.enderio.machine.capbank.CapBankType;
import crazypants.enderio.machine.capbank.InfoDisplayType;
import crazypants.enderio.machine.capbank.TileCapBank;
import crazypants.enderio.machine.capbank.network.CapBankClientNetwork;
import crazypants.enderio.machine.capbank.render.FillGauge.GaugeInfo;
import crazypants.enderio.machine.capbank.render.FillGauge.GaugeKey;
import crazypants.enderio.power.PowerHandlerUtil;
@SideOnly(Side.CLIENT)
public class CapBankRenderer extends TileEntitySpecialRenderer implements ISimpleBlockRenderingHandler, IItemRenderer {
private ConnectedTextureRenderer connectedTexRenderer;
private Map<InfoDisplayType, IInfoRenderer> infoRenderers;
private FillGauge fillGaugeRenderer;
public CapBankRenderer() {
connectedTexRenderer = new ConnectedTextureRenderer();
connectedTexRenderer.setMatchMeta(true);
fillGaugeRenderer = new FillGauge();
infoRenderers = new HashMap<InfoDisplayType, IInfoRenderer>();
infoRenderers.put(InfoDisplayType.LEVEL_BAR, fillGaugeRenderer);
infoRenderers.put(InfoDisplayType.IO, new IoDisplay());
}
//------- Block
@Override
public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
}
@Override
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
int meta = world.getBlockMetadata(x, y, z);
meta = MathHelper.clamp_int(meta, 0, CapBankType.types().size() - 1);
CapBankType type = CapBankType.getTypeFromMeta(meta);
if(!type.isMultiblock()) {
connectedTexRenderer.setForceAllEdges(true);
} else {
connectedTexRenderer.setForceAllEdges(false);
}
connectedTexRenderer.setEdgeTexture(EnderIO.blockCapBank.getBorderIcon(0, meta));
CustomCubeRenderer.instance.setOverrideTexture(renderer.overrideBlockTexture);
if (renderer.overrideBlockTexture == null) {
CustomCubeRenderer.instance.renderBlock(world, block, x, y, z, connectedTexRenderer);
} else {
CustomCubeRenderer.instance.renderBlock(world, block, x, y, z);
}
CustomCubeRenderer.instance.setOverrideTexture(null);
return true;
}
@Override
public boolean shouldRender3DInInventory(int modelId) {
return true;
}
@Override
public int getRenderId() {
return BlockCapBank.renderId;
}
//------- Item
@Override
public boolean handleRenderType(ItemStack item, ItemRenderType type) {
return true;
}
@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
return true;
}
@Override
public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
RenderUtil.bindBlockTexture();
Tessellator tes = Tessellator.instance;
tes.startDrawingQuads();
CubeRenderer.render(EnderIO.blockCapBank, item.getItemDamage());
tes.draw();
GL11.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
GL11.glPolygonOffset(-1.0f, -1.0f);
tes.startDrawingQuads();
tes.setColorRGBA_F(1, 1, 1, 1);
tes.addTranslation(0, -0.1f, 0);
renderBorder(null, 0, 0, 0, item.getItemDamage());
tes.draw();
GL11.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
CapBankClientNetwork nw = new CapBankClientNetwork(-1);
nw.setMaxEnergyStoredL(CapBankType.getTypeFromMeta(item.getItemDamage()).getMaxEnergyStored());
nw.setEnergyStored(PowerHandlerUtil.getStoredEnergyForItem(item));
GaugeInfo gi = new GaugeInfo(1, 0);
GaugeKey key = new GaugeKey(ForgeDirection.SOUTH, FillGauge.Type.SINGLE);
fillGaugeRenderer.doRender(nw, RenderUtil.BRIGHTNESS_MAX, gi, key);
// key = new GaugeKey(ForgeDirection.EAST, FillGauge.Type.SINGLE);
// fillGaugeRenderer.doRender(nw, RenderUtil.BRIGHTNESS_MAX, gi, key);
tes.addTranslation(0, 0.1f, 0);
}
private void renderBorder(IBlockAccess blockAccess, int x, int y, int z, int meta) {
IIcon texture = EnderIO.blockCapBank.getBorderIcon(0, meta);
for (ForgeDirection face : ForgeDirection.VALID_DIRECTIONS) {
RenderUtil.renderConnectedTextureFace(blockAccess, EnderIO.blockCapBank, x, y, z, face, texture,
blockAccess == null, false, false);
}
}
//---- Info Display
@Override
public void renderTileEntityAt(TileEntity te, double x, double y, double z, float partialTick) {
TileCapBank cb = (TileCapBank) te;
if(!cb.hasDisplayTypes()) {
return;
}
boolean glSetup = false;
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
InfoDisplayType type = cb.getDisplayType(dir);
if(type != InfoDisplayType.NONE) {
IInfoRenderer rend = infoRenderers.get(type);
if(rend != null) {
if(!glSetup) {
glSetup = true;
GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
GL11.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
GL11.glPolygonOffset(-1.0f, -1.0f);
GL11.glPushMatrix();
GL11.glTranslatef((float) x, (float) y, (float) z);
}
rend.render(cb, dir, x, y, z, partialTick);
}
}
}
if(glSetup) {
GL11.glPopMatrix();
GL11.glPopAttrib();
}
}
}