package mekanism.client.render;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import mekanism.api.Coord4D;
import mekanism.api.EnumColor;
import mekanism.client.render.MekanismRenderer.DisplayInteger;
import mekanism.client.render.MekanismRenderer.Model3D;
import mekanism.common.tile.TileEntityDigitalMiner;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.init.Blocks;
import org.lwjgl.opengl.GL11;
public final class MinerVisualRenderer
{
private static Minecraft mc = Minecraft.getMinecraft();
private static Map<MinerRenderData, DisplayInteger> cachedVisuals = new HashMap<MinerRenderData, DisplayInteger>();
private static final double offset = 0.01;
public static void render(TileEntityDigitalMiner miner)
{
GlStateManager.pushMatrix();
GL11.glTranslated(getX(miner.getPos().getX()), getY(miner.getPos().getY()), getZ(miner.getPos().getZ()));
MekanismRenderer.blendOn();
MekanismRenderer.glowOn();
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.8F);
mc.getTextureManager().bindTexture(MekanismRenderer.getBlocksTexture());
getList(new MinerRenderData(miner)).render();
MekanismRenderer.resetColor();
MekanismRenderer.glowOff();
MekanismRenderer.blendOff();
GlStateManager.popMatrix();
}
private static DisplayInteger getList(MinerRenderData data)
{
if(cachedVisuals.containsKey(data))
{
return cachedVisuals.get(data);
}
DisplayInteger display = DisplayInteger.createAndStart();
cachedVisuals.put(data, display);
List<Model3D> models = new ArrayList<Model3D>();
for(int x = -data.radius; x <= data.radius; x++)
{
for(int y = data.minY-data.yCoord; y <= data.maxY-data.yCoord; y++)
{
for(int z = -data.radius; z <= data.radius; z++)
{
if(x == -data.radius || x == data.radius || y == data.minY-data.yCoord || y == data.maxY-data.yCoord || z == -data.radius || z == data.radius)
{
models.add(createModel(new Coord4D(x, y, z, mc.theWorld.provider.getDimension())));
}
}
}
}
for(Model3D model : models)
{
MekanismRenderer.renderObject(model);
}
display.endList();
return display;
}
private static Model3D createModel(Coord4D rel)
{
Model3D toReturn = new Model3D();
toReturn.setBlockBounds(rel.xCoord + 0.4, rel.yCoord + 0.4, rel.zCoord + 0.4, rel.xCoord + 0.6, rel.yCoord + 0.6, rel.zCoord + 0.6);
toReturn.baseBlock = Blocks.WATER;
toReturn.setTexture(MekanismRenderer.getColorIcon(EnumColor.WHITE));
return toReturn;
}
private static double getX(int x)
{
return x - TileEntityRendererDispatcher.staticPlayerX;
}
private static double getY(int y)
{
return y - TileEntityRendererDispatcher.staticPlayerY;
}
private static double getZ(int z)
{
return z - TileEntityRendererDispatcher.staticPlayerZ;
}
public static class MinerRenderData
{
public int minY;
public int maxY;
public int radius;
public int yCoord;
public MinerRenderData(int min, int max, int rad, int y)
{
minY = min;
maxY = max;
radius = rad;
yCoord = y;
}
public MinerRenderData(TileEntityDigitalMiner miner)
{
this(miner.minY, miner.maxY, miner.radius, miner.getPos().getY());
}
@Override
public boolean equals(Object data)
{
return data instanceof MinerRenderData && ((MinerRenderData)data).minY == minY &&
((MinerRenderData)data).maxY == maxY && ((MinerRenderData)data).radius == radius &&
((MinerRenderData)data).yCoord == yCoord;
}
@Override
public int hashCode()
{
int code = 1;
code = 31 * code + minY;
code = 31 * code + maxY;
code = 31 * code + radius;
code = 31 * code + yCoord;
return code;
}
}
}