package buildcraft.transport.render;
import org.lwjgl.opengl.GL11;
import net.minecraft.client.renderer.GLAllocation;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.BuildCraftTransport;
import buildcraft.core.CoreConstants;
import buildcraft.core.lib.render.RenderEntityBlock;
import buildcraft.transport.Pipe;
import buildcraft.transport.PipeIconProvider;
import buildcraft.transport.PipeTransportPower;
public class PipeTransportPowerRenderer extends PipeTransportRenderer<PipeTransportPower> {
public static final int POWER_STAGES = 256;
public static final int[] displayPowerList = new int[POWER_STAGES];
public static final int[] displayPowerListOverload = new int[POWER_STAGES];
private static final int[] angleY = {0, 0, 270, 90, 0, 180};
private static final int[] angleZ = {90, 270, 0, 0, 0, 0};
private static final float POWER_MAGIC = 0.7F; // Math.pow(displayPower, POWER_MAGIC)
private static boolean initialized = false;
protected static void clear() {
if (initialized) {
for (int i = 0; i < POWER_STAGES; i++) {
GL11.glDeleteLists(displayPowerList[i], 1);
GL11.glDeleteLists(displayPowerListOverload[i], 1);
}
}
initialized = false;
}
public boolean useServerTileIfPresent() {
return true;
}
private void initializeDisplayPowerList(World world) {
if (initialized) {
return;
}
initialized = true;
RenderEntityBlock.RenderInfo block = new RenderEntityBlock.RenderInfo();
block.texture = BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.Power_Normal.ordinal());
float size = CoreConstants.PIPE_MAX_POS - CoreConstants.PIPE_MIN_POS;
for (int s = 0; s < POWER_STAGES; ++s) {
displayPowerList[s] = GLAllocation.generateDisplayLists(1);
GL11.glNewList(displayPowerList[s], GL11.GL_COMPILE);
float minSize = 0.005F;
float unit = (size - minSize) / 2F / POWER_STAGES;
block.minY = 0.5 - (minSize / 2F) - unit * s;
block.maxY = 0.5 + (minSize / 2F) + unit * s;
block.minZ = 0.5 - (minSize / 2F) - unit * s;
block.maxZ = 0.5 + (minSize / 2F) + unit * s;
block.minX = 0;
block.maxX = 0.5 + (minSize / 2F) + unit * s;
RenderEntityBlock.INSTANCE.renderBlock(block);
GL11.glEndList();
}
block.texture = BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.Power_Overload.ordinal());
size = CoreConstants.PIPE_MAX_POS - CoreConstants.PIPE_MIN_POS;
for (int s = 0; s < POWER_STAGES; ++s) {
displayPowerListOverload[s] = GLAllocation.generateDisplayLists(1);
GL11.glNewList(displayPowerListOverload[s], GL11.GL_COMPILE);
float minSize = 0.005F;
float unit = (size - minSize) / 2F / POWER_STAGES;
block.minY = 0.5 - (minSize / 2F) - unit * s;
block.maxY = 0.5 + (minSize / 2F) + unit * s;
block.minZ = 0.5 - (minSize / 2F) - unit * s;
block.maxZ = 0.5 + (minSize / 2F) + unit * s;
block.minX = 0;
block.maxX = 0.5 + (minSize / 2F) + unit * s;
RenderEntityBlock.INSTANCE.renderBlock(block);
GL11.glEndList();
}
}
@Override
public void render(Pipe<PipeTransportPower> pipe, double x, double y, double z, float f) {
initializeDisplayPowerList(pipe.container.getWorldObj());
PipeTransportPower pow = pipe.transport;
GL11.glPushMatrix();
GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glTranslatef((float) x, (float) y, (float) z);
bindTexture(TextureMap.locationBlocksTexture);
int[] displayList = pow.overload > 0 ? displayPowerListOverload : displayPowerList;
for (int side = 0; side < 6; ++side) {
int stage = (int) Math.ceil(Math.pow(pow.displayPower[side], POWER_MAGIC));
if (stage >= 1) {
if (!pipe.container.isPipeConnected(ForgeDirection.getOrientation(side))) {
continue;
}
GL11.glPushMatrix();
GL11.glTranslatef(0.5F, 0.5F, 0.5F);
GL11.glRotatef(angleY[side], 0, 1, 0);
GL11.glRotatef(angleZ[side], 0, 0, 1);
float scale = 1.0F - side * 0.0001F;
GL11.glScalef(scale, scale, scale);
GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
if (stage < displayList.length) {
GL11.glCallList(displayList[stage]);
} else {
GL11.glCallList(displayList[displayList.length - 1]);
}
GL11.glPopMatrix();
}
}
/*bindTexture(STRIPES_TEXTURE);
for (int side = 0; side < 6; side += 2) {
if (pipe.container.isPipeConnected(ForgeDirection.values()[side])) {
GL11.glPushMatrix();
GL11.glTranslatef(0.5F, 0.5F, 0.5F);
GL11.glRotatef(angleY[side], 0, 1, 0);
GL11.glRotatef(angleZ[side], 0, 0, 1);
float scale = 1.0F - side * 0.0001F;
GL11.glScalef(scale, scale, scale);
float movement = (0.50F) * pipe.transport.getPistonStage(side / 2);
GL11.glTranslatef(-0.25F - 1F / 16F - movement, -0.5F, -0.5F);
// float factor = (float) (1.0 / 256.0);
float factor = (float) (1.0 / 16.0);
box.render(factor);
GL11.glPopMatrix();
}
}*/
GL11.glPopAttrib();
GL11.glPopMatrix();
}
}