package crazypants.enderio.machine.capbank.render;
import java.util.Locale;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.IIcon;
import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.opengl.GL11;
import com.enderio.core.client.render.ColorUtil;
import com.enderio.core.client.render.RenderUtil;
import crazypants.enderio.EnderIO;
import crazypants.enderio.machine.capbank.TileCapBank;
import crazypants.enderio.machine.capbank.network.CapBankClientNetwork;
import crazypants.enderio.machine.power.PowerDisplayUtil;
public class IoDisplay implements IInfoRenderer {
@Override
public void render(TileCapBank cb, ForgeDirection dir, double x, double y, double z, float partialTick) {
if(dir.offsetY != 0) {
return;
}
CapBankClientNetwork nw = (CapBankClientNetwork) cb.getNetwork();
if(nw == null) {
return;
}
CapBankClientNetwork.IOInfo info = nw.getIODisplayInfo(cb.xCoord, cb.yCoord, cb.zCoord, dir);
if(info.isInside()) {
return;
}
boolean selfIlum = true;
int brightness = 0;
if(!selfIlum) {
brightness = cb.getWorldObj().getLightBrightnessForSkyBlocks(cb.xCoord + dir.offsetX, cb.yCoord + dir.offsetY, cb.zCoord + dir.offsetZ, 0);
int l1 = brightness % 65536;
int l2 = brightness / 65536;
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, l1, l2);
} else {
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240);
}
boolean drawBackground = true;
if(drawBackground) {
RenderUtil.bindBlockTexture();
Tessellator tes = Tessellator.instance;
tes.startDrawingQuads();
if(!selfIlum) {
tes.setBrightness(brightness);
}
tes.setColorOpaque_F(1, 1, 1);
float scale = 0.85f;
float offset = (1-scale)/2;
IIcon icon = EnderIO.blockCapBank.getInfoPanelIcon();
float minU = icon.getMinU();
float maxU = icon.getMaxU();
float minV = icon.getMinV();
float maxV = icon.getMaxV();
switch (dir) {
case NORTH: {
float y0 = offset - (info.height-1);
float y1 = 1 - offset;
float x0 = offset;
float x1 = info.width - offset;
float z0 = 0;
tes.setNormal(0, 0, -1);
tes.addVertexWithUV(x1, y0, z0, minU, minV);
tes.addVertexWithUV(x0, y0, z0, maxU, minV);
tes.addVertexWithUV(x0, y1, z0, maxU, maxV);
tes.addVertexWithUV(x1, y1, z0, minU, maxV);
break;
}
case SOUTH: {
float y0 = offset - (info.height-1);
float y1 = 1 - offset;
float x0 = offset - (info.width-1);
float x1 = 1 - offset;
float z1 = 1;
tes.setNormal(0, 0, 1);
tes.addVertexWithUV(x0, y0, z1, maxU, minV);
tes.addVertexWithUV(x1, y0, z1, minU, minV);
tes.addVertexWithUV(x1, y1, z1, minU, maxV);
tes.addVertexWithUV(x0, y1, z1, maxU, maxV);
break;
}
case EAST: {
float y0 = offset - (info.height-1);
float y1 = 1 - offset;
float z0 = offset;
float z1 = info.width - offset;
float x1 = 1;
tes.setNormal(1, 0, 0);
tes.addVertexWithUV(x1, y1, z0, maxU, maxV);
tes.addVertexWithUV(x1, y1, z1, minU, maxV);
tes.addVertexWithUV(x1, y0, z1, minU, minV);
tes.addVertexWithUV(x1, y0, z0, maxU, minV);
break;
}
case WEST: {
float y0 = offset - (info.height-1);
float y1 = 1 - offset;
float z0 = offset - (info.width-1);
float z1 = 1 - offset;
float x0 = 0;
tes.setNormal(-1, 0, 0);
tes.addVertexWithUV(x0, y0, z0, maxU, minV);
tes.addVertexWithUV(x0, y0, z1, minU, minV);
tes.addVertexWithUV(x0, y1, z1, minU, maxV);
tes.addVertexWithUV(x0, y1, z0, maxU, maxV);
break;
}
default:
throw new AssertionError();
}
tes.draw();
}
nw.requestPowerUpdate(cb, 20);
HeadingText heading1 = HeadingText.STABLE;
HeadingText heading2 = null;
String text1;
String text2 = "";
FontRenderer fr = Minecraft.getMinecraft().fontRenderer;
float size = 0.15f * Math.min(info.width, info.height);
float scale = size / fr.FONT_HEIGHT;
float offset;
if(info.height*3 >= info.width*4) {
heading1 = HeadingText.INPUT;
heading2 = HeadingText.OUTPUT;
text1 = getChangeText(nw.getAverageInputPerTick(), fr);
text2 = getChangeText(nw.getAverageOutputPerTick(), fr);
offset = -size*2.5f;
} else {
int change = Math.round(nw.getAverageChangePerTick());
if(change > 0) {
heading1 = HeadingText.GAIN;
} else if(change < 0) {
heading1 = HeadingText.LOSS;
}
text1 = getChangeText(change, fr);
offset = -size;
}
ForgeDirection right = dir.getRotation(ForgeDirection.UP);
GL11.glPushMatrix();
GL11.glTranslatef(
(dir.offsetX * 1.02f)/2 + 0.5f + right.offsetX*(info.width-1)*0.5f,
1 + size*0.5f - info.height*0.5f,
(dir.offsetZ * 1.02f)/2 + 0.5f + right.offsetZ*(info.width-1)*0.5f);
GL11.glRotatef(-180, 1, 0, 0);
if(dir == ForgeDirection.NORTH) {
GL11.glRotatef(-180, 0, 1, 0);
} else if(dir == ForgeDirection.EAST) {
GL11.glRotatef(-90, 0, 1, 0);
} else if(dir == ForgeDirection.WEST) {
GL11.glRotatef(90, 0, 1, 0);
}
GL11.glEnable(GL11.GL_BLEND);
GL11.glDisable(GL11.GL_LIGHTING);
OpenGlHelper.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
offset = drawText(heading1, text1, offset, scale, size, fr);
if(heading2 != null) {
drawText(heading2, text2, offset, scale, size, fr);
}
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_BLEND);
GL11.glPopMatrix();
}
private float drawText(HeadingText heading, String text, float offset, float scale, float size, FontRenderer fr) {
GL11.glPushMatrix();
GL11.glTranslatef(0, offset, 0);
GL11.glScalef(scale, scale, scale);
fr.drawString(heading.text, -fr.getStringWidth(heading.text) / 2, 0, 0);
GL11.glPopMatrix();
offset += size * 1.5f;
GL11.glPushMatrix();
GL11.glTranslatef(0, offset, 0);
GL11.glScalef(scale, scale, scale);
fr.drawString(text, -fr.getStringWidth(text) / 2, 0, heading.color);
GL11.glPopMatrix();
offset += size * 1.5f;
return offset;
}
protected String getChangeText(float average, FontRenderer fr) {
int change = Math.round(Math.abs(average));
String txt = PowerDisplayUtil.INT_NF.format(change);
int width = fr.getStringWidth(txt);
if(width > 38 && change > 1000) {
change = change / 1000;
txt = PowerDisplayUtil.INT_NF.format(change) + "K";
}
return txt;
}
static enum HeadingText {
STABLE(ColorUtil.getRGB(0, 0, 0)),
GAIN(ColorUtil.getRGB(0, 0.25f, 0)),
LOSS(ColorUtil.getRGB(0.25f, 0, 0)),
INPUT(ColorUtil.getRGB(0, 0.25f, 0)),
OUTPUT(ColorUtil.getRGB(0.25f, 0, 0));
final String text;
final int color;
private HeadingText(int color) {
this.text = EnderIO.lang.localize("capbank.iodisplay.".concat(name().toLowerCase(Locale.US)));
this.color = color;
}
}
}