package openblocks.client.renderer.tileentity;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import openblocks.client.renderer.tileentity.tank.ITankRenderFluidData;
import openblocks.common.tileentity.TileEntityTank;
import openmods.renderer.TessellatorPool;
import openmods.renderer.TessellatorPool.TessellatorUser;
import openmods.utils.Diagonal;
import openmods.utils.TextureUtils;
import org.lwjgl.opengl.GL11;
public class TileEntityTankRenderer extends TileEntitySpecialRenderer {
RenderBlocks renderBlocks = new RenderBlocks();
@Override
public void renderTileEntityAt(TileEntity te, double x, double y, double z, float f) {
TileEntityTank tankTile = (TileEntityTank)te;
if (tankTile.isInvalid()) return;
final ITankRenderFluidData data = tankTile.getRenderFluidData();
if (data != null && data.hasFluid()) {
bindTexture(TextureMap.locationBlocksTexture);
GL11.glPushMatrix();
GL11.glTranslated(x, y, z);
// it just looks broken with blending
// GL11.glEnable(GL11.GL_BLEND);
// OpenGlHelper.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
// I just can't get it right
GL11.glDisable(GL11.GL_BLEND);
float time = te.getWorldObj().getTotalWorldTime() + f;
renderFluid(data, time);
// GL11.glDisable(GL11.GL_BLEND);
GL11.glPopMatrix();
}
}
public static void renderFluid(final ITankRenderFluidData data, float time) {
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glColor4f(1, 1, 1, 1);
FluidStack fluidStack = data.getFluid();
final Fluid fluid = fluidStack.getFluid();
IIcon texture = fluid.getStillIcon();
final int color;
if (texture != null) {
TextureUtils.bindTextureToClient(getFluidSheet(fluid));
color = fluid.getColor(fluidStack);
} else {
TextureUtils.bindDefaultTerrainTexture();
texture = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite("missingno");
color = 0xFFFFFFFF;
}
final double se = data.getCornerFluidLevel(Diagonal.SE, time);
final double ne = data.getCornerFluidLevel(Diagonal.NE, time);
final double sw = data.getCornerFluidLevel(Diagonal.SW, time);
final double nw = data.getCornerFluidLevel(Diagonal.NW, time);
final double center = data.getCenterFluidLevel(time);
final double uMin = texture.getMinU();
final double uMax = texture.getMaxU();
final double vMin = texture.getMinV();
final double vMax = texture.getMaxV();
final double vHeight = vMax - vMin;
final float r = (color >> 16 & 0xFF) / 255.0F;
final float g = (color >> 8 & 0xFF) / 255.0F;
final float b = (color & 0xFF) / 255.0F;
TessellatorPool.instance.startDrawingQuads(new TessellatorUser() {
@Override
public void execute(Tessellator tes) {
tes.setColorOpaque_F(r, g, b);
if (data.shouldRenderFluidWall(ForgeDirection.NORTH) && (nw > 0 || ne > 0)) {
tes.addVertexWithUV(1, 0, 0, uMax, vMin);
tes.addVertexWithUV(0, 0, 0, uMin, vMin);
tes.addVertexWithUV(0, nw, 0, uMin, vMin + (vHeight * nw));
tes.addVertexWithUV(1, ne, 0, uMax, vMin + (vHeight * ne));
}
if (data.shouldRenderFluidWall(ForgeDirection.SOUTH) && (se > 0 || sw > 0)) {
tes.addVertexWithUV(1, 0, 1, uMin, vMin);
tes.addVertexWithUV(1, se, 1, uMin, vMin + (vHeight * se));
tes.addVertexWithUV(0, sw, 1, uMax, vMin + (vHeight * sw));
tes.addVertexWithUV(0, 0, 1, uMax, vMin);
}
if (data.shouldRenderFluidWall(ForgeDirection.EAST) && (ne > 0 || se > 0)) {
tes.addVertexWithUV(1, 0, 0, uMin, vMin);
tes.addVertexWithUV(1, ne, 0, uMin, vMin + (vHeight * ne));
tes.addVertexWithUV(1, se, 1, uMax, vMin + (vHeight * se));
tes.addVertexWithUV(1, 0, 1, uMax, vMin);
}
if (data.shouldRenderFluidWall(ForgeDirection.WEST) && (sw > 0 || nw > 0)) {
tes.addVertexWithUV(0, 0, 1, uMin, vMin);
tes.addVertexWithUV(0, sw, 1, uMin, vMin + (vHeight * sw));
tes.addVertexWithUV(0, nw, 0, uMax, vMin + (vHeight * nw));
tes.addVertexWithUV(0, 0, 0, uMax, vMin);
}
if (data.shouldRenderFluidWall(ForgeDirection.UP)) {
final double uMid = (uMax + uMin) / 2;
final double vMid = (vMax + vMin) / 2;
tes.addVertexWithUV(0.5, center, 0.5, uMid, vMid);
tes.addVertexWithUV(1, se, 1, uMax, vMin);
tes.addVertexWithUV(1, ne, 0, uMin, vMin);
tes.addVertexWithUV(0, nw, 0, uMin, vMax);
tes.addVertexWithUV(0, sw, 1, uMax, vMax);
tes.addVertexWithUV(1, se, 1, uMax, vMin);
tes.addVertexWithUV(0.5, center, 0.5, uMid, vMid);
tes.addVertexWithUV(0, nw, 0, uMin, vMax);
}
if (data.shouldRenderFluidWall(ForgeDirection.DOWN)) {
tes.addVertexWithUV(1, 0, 0, uMax, vMin);
tes.addVertexWithUV(1, 0, 1, uMin, vMin);
tes.addVertexWithUV(0, 0, 1, uMin, vMax);
tes.addVertexWithUV(0, 0, 0, uMax, vMax);
}
}
});
GL11.glEnable(GL11.GL_LIGHTING);
}
public static ResourceLocation getFluidSheet(FluidStack liquid) {
if (liquid == null) return TextureMap.locationBlocksTexture;
return getFluidSheet(liquid.getFluid());
}
/**
* @param liquid
*/
public static ResourceLocation getFluidSheet(Fluid liquid) {
return TextureMap.locationBlocksTexture;
}
}