package micdoodle8.mods.galacticraft.core.client.render.tile; import micdoodle8.mods.galacticraft.core.tile.TileEntityFluidTank; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.util.EnumFacing; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; import org.lwjgl.opengl.GL11; public class TileEntityFluidTankRenderer extends TileEntitySpecialRenderer<TileEntityFluidTank> { @Override public void renderTileEntityAt(TileEntityFluidTank tank, double x, double y, double z, float partialTicks, int destroyStage) { FluidTankInfo[] info = tank.getTankInfo(EnumFacing.DOWN); if (info.length != 1) { return; } FluidStack tankFluid = info[0].fluid; if (tankFluid == null || tankFluid.getFluid() == null || (!tankFluid.getFluid().isGaseous() && tankFluid.amount == 0)) { return; } TileEntityFluidTank tankAbove = tank.getNextTank(tank.getPos()); TileEntityFluidTank tankBelow = tank.getPreviousTank(tank.getPos()); this.bindTexture(TextureMap.locationBlocksTexture); TextureAtlasSprite sprite = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(tankFluid.getFluid().getStill().toString()); final double uMin = sprite.getMinU(); final double uMax = sprite.getMaxU(); final double vMin = sprite.getMinV(); final double vMax = sprite.getMaxV(); GL11.glPushMatrix(); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glTranslatef((float) x, (float) y + 1.5F, (float) z + 1.0F); GL11.glScalef(1.0F, -1.0F, -1.0F); GL11.glTranslatef(0.5F, 0.5F, 0.5F); GlStateManager.disableLighting(); GlStateManager.enableBlend(); GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); Tessellator tess = Tessellator.getInstance(); WorldRenderer worldRenderer = tess.getWorldRenderer(); float level = 1.0F; float levelInv = 0.0F; float opacity = 1.0F; boolean compositeGaseous = tankFluid.getFluid().isGaseous(); if (compositeGaseous) { opacity = Math.min(tankFluid.amount / (float) info[0].capacity * 0.8F + 0.2F, 1F); } else { level = tank.fluidTank.getFluidAmount() / 16400.0F; levelInv = 0.988F - level; //1.2% inset from each end of the tank, to avoid z-fighting with blocks above/below } GL11.glColor4f(1.0F, 1.0F, 1.0F, opacity); if (levelInv < 1.0F) { // North worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); worldRenderer.pos(-0.4, levelInv, -0.399).tex(uMin, vMin).endVertex(); worldRenderer.pos(-0.4, 1.0, -0.399).tex(uMin, vMin + (vMax - vMin) * level).endVertex(); worldRenderer.pos(0.4, 1.0, -0.399).tex(uMax, vMin + (vMax - vMin) * level).endVertex(); worldRenderer.pos(0.4, levelInv, -0.399).tex(uMax, vMin).endVertex(); tess.draw(); // South worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); worldRenderer.pos(0.4, levelInv, 0.399).tex(uMax, vMin).endVertex(); worldRenderer.pos(0.4, 1.0, 0.399).tex(uMax, vMin + (vMax - vMin) * level).endVertex(); worldRenderer.pos(-0.4, 1.0, 0.399).tex(uMin, vMin + (vMax - vMin) * level).endVertex(); worldRenderer.pos(-0.4, levelInv, 0.399).tex(uMin, vMin).endVertex(); tess.draw(); // West worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); worldRenderer.pos(-0.399, 1.0, -0.4).tex(uMin, vMin + (vMax - vMin) * level).endVertex(); worldRenderer.pos(-0.399, levelInv, -0.4).tex(uMin, vMin).endVertex(); worldRenderer.pos(-0.399, levelInv, 0.4).tex(uMax, vMin).endVertex(); worldRenderer.pos(-0.399, 1.0, 0.4).tex(uMax, vMin + (vMax - vMin) * level).endVertex(); tess.draw(); // East worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); worldRenderer.pos(0.399, 1.0, 0.4).tex(uMax, vMin + (vMax - vMin) * level).endVertex(); worldRenderer.pos(0.399, levelInv, 0.4).tex(uMax, vMin).endVertex(); worldRenderer.pos(0.399, levelInv, -0.4).tex(uMin, vMin).endVertex(); worldRenderer.pos(0.399, 1.0, -0.4).tex(uMin, vMin + (vMax - vMin) * level).endVertex(); tess.draw(); if (tankAbove == null || (tankAbove.fluidTank.getFluidAmount() == 0 && !compositeGaseous)) { worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); worldRenderer.pos(0.4, 0.01 + levelInv, 0.4).tex(uMax, vMax).endVertex(); worldRenderer.pos(-0.4, 0.01 + levelInv, 0.4).tex(uMax, vMin).endVertex(); worldRenderer.pos(-0.4, 0.01 + levelInv, -0.4).tex(uMin, vMin).endVertex(); worldRenderer.pos(0.4, 0.01 + levelInv, -0.4).tex(uMin, vMax).endVertex(); tess.draw(); } if (tankBelow == null || (tankBelow.fluidTank.getFluidAmount() == 0 && !compositeGaseous)) { worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); worldRenderer.pos(0.4, 0.99, 0.4).tex(uMax, vMax).endVertex(); worldRenderer.pos(0.4, 0.99, -0.4).tex(uMin, vMax).endVertex(); worldRenderer.pos(-0.4, 0.99, -0.4).tex(uMin, vMin).endVertex(); worldRenderer.pos(-0.4, 0.99, 0.4).tex(uMax, vMin).endVertex(); tess.draw(); } } GlStateManager.enableLighting(); GlStateManager.disableBlend(); GL11.glPopMatrix(); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); } }