package buildcraftAdditions.client.render.items;
import org.lwjgl.opengl.GL11;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraftforge.client.IItemRenderer;
import net.minecraftforge.fluids.Fluid;
import buildcraftAdditions.items.ItemBucketBCA;
import buildcraftAdditions.utils.RenderUtils;
/**
* Copyright (c) 2014-2015, AEnterprise
* http://buildcraftadditions.wordpress.com/
* Buildcraft Additions is distributed under the terms of GNU GPL v3.0
* Please check the contents of the license located in
* http://buildcraftadditions.wordpress.com/wiki/licensing-stuff/
*/
@SideOnly(Side.CLIENT)
public class BucketItemRenderer implements IItemRenderer {
public static final BucketItemRenderer INSTANCE = new BucketItemRenderer();
private BucketItemRenderer() {
}
@Override
public boolean handleRenderType(ItemStack item, ItemRenderType type) {
return true;
}
@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
return type.equals(ItemRenderType.ENTITY);
}
@Override
public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
if (item == null || item.getItem() == null || !(item.getItem() instanceof ItemBucketBCA))
return;
ItemBucketBCA bucket = (ItemBucketBCA) item.getItem();
Fluid fluid = null;
boolean gaseous = false;
if (bucket.getFluid() != null) {
fluid = bucket.getFluid().getFluid();
if (fluid != null && (fluid.isGaseous() || fluid.getDensity() < 0))
gaseous = true;
}
IIcon overlay = bucket.getOverlay();
IIcon bucketIcon = Items.bucket.getIconFromDamage(0);
GL11.glPushMatrix();
GL11.glEnable(GL11.GL_ALPHA_TEST);
if (type.equals(ItemRenderType.EQUIPPED)) {
GL11.glRotated(180, 0, 0, 1);
GL11.glTranslated(-1, -1, 0);
} else if (type.equals(ItemRenderType.ENTITY)) {
GL11.glRotated(180, 0, 0, 1);
GL11.glRotated(90, 0, 1, 0);
GL11.glTranslated(-0.5, -0.9, 0);
if (item.isOnItemFrame()) {
GL11.glTranslated(0.075, 0.475, 0);
GL11.glScaled(0.85, 0.85, 0.85);
}
} else if (type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON)) {
GL11.glTranslated(1, 1, 0);
GL11.glRotated(180, 0, 0, 1);
}
if (fluid != null) {
Minecraft.getMinecraft().renderEngine.bindTexture(RenderUtils.MC_ITEM_SHEET);
renderMask(overlay, fluid.getIcon(), type, gaseous);
}
Minecraft.getMinecraft().renderEngine.bindTexture(RenderUtils.MC_ITEM_SHEET);
if (!type.equals(ItemRenderType.INVENTORY)) {
if (gaseous)
ItemRenderer.renderItemIn2D(Tessellator.instance, bucketIcon.getMaxU(), bucketIcon.getMinV(), bucketIcon.getMinU(), bucketIcon.getMaxV(), bucketIcon.getIconWidth(), bucketIcon.getIconHeight(), 0.0625F);
else
ItemRenderer.renderItemIn2D(Tessellator.instance, bucketIcon.getMinU(), bucketIcon.getMaxV(), bucketIcon.getMaxU(), bucketIcon.getMinV(), bucketIcon.getIconWidth(), bucketIcon.getIconHeight(), 0.0625F);
} else
renderIcon(bucketIcon, 0, gaseous);
GL11.glColor4f(1, 1, 1, 1);
GL11.glPopMatrix();
}
private void renderMask(IIcon mask, IIcon subIcon, ItemRenderType type, boolean flip) {
if (mask == null || subIcon == null)
return;
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glDisable(GL11.GL_CULL_FACE);
Tessellator tessellator = Tessellator.instance;
tessellator.startDrawingQuads();
tessellator.setNormal(0, 0, 1);
if (type.equals(ItemRenderType.INVENTORY))
preRenderInvIcon(mask, 0.001, flip);
else
preRenderWorldIcon(mask, 0.001, flip);
tessellator.draw();
tessellator.startDrawingQuads();
tessellator.setNormal(0, 0, -1);
if (type.equals(ItemRenderType.INVENTORY))
preRenderInvIcon(mask, -0.0635, flip);
else
preRenderWorldIcon(mask, -0.0635, flip);
tessellator.draw();
Minecraft.getMinecraft().renderEngine.bindTexture(RenderUtils.MC_BLOCK_SHEET);
GL11.glDepthFunc(GL11.GL_EQUAL);
GL11.glDepthMask(false);
tessellator.startDrawingQuads();
tessellator.setNormal(0, 0, 1);
if (type.equals(ItemRenderType.INVENTORY))
preRenderInvIcon(subIcon, 0.001, flip);
else
preRenderWorldIcon(subIcon, 0.001, flip);
tessellator.draw();
tessellator.startDrawingQuads();
tessellator.setNormal(0, 0, -1);
if (type.equals(ItemRenderType.INVENTORY))
preRenderInvIcon(subIcon, -0.0635, flip);
else
preRenderWorldIcon(subIcon, -0.0635, flip);
tessellator.draw();
GL11.glDisable(GL11.GL_BLEND);
GL11.glDepthMask(true);
GL11.glDepthFunc(GL11.GL_LEQUAL);
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glColor4f(1, 1, 1, 1);
}
private void preRenderInvIcon(IIcon icon, double z, boolean flip) {
Tessellator.instance.addVertexWithUV(16, flip ? 1 : 0, z, icon.getMinU(), icon.getMaxV());
Tessellator.instance.addVertexWithUV(0, flip ? 1 : 0, z, icon.getMaxU(), icon.getMaxV());
Tessellator.instance.addVertexWithUV(0, 16 + (flip ? 1 : 0), z, icon.getMaxU(), icon.getMinV());
Tessellator.instance.addVertexWithUV(16, 16 + (flip ? 1 : 0), z, icon.getMinU(), icon.getMinV());
}
private void preRenderWorldIcon(IIcon icon, double z, boolean flip) {
Tessellator.instance.addVertexWithUV(1, 0, z, icon.getMinU(), icon.getMaxV());
Tessellator.instance.addVertexWithUV(0, 0, z, icon.getMaxU(), icon.getMaxV());
Tessellator.instance.addVertexWithUV(0, 1, z, icon.getMaxU(), icon.getMinV());
Tessellator.instance.addVertexWithUV(1, 1, z, icon.getMinU(), icon.getMinV());
}
private void renderIcon(IIcon icon, double z, boolean flip) {
Tessellator.instance.startDrawingQuads();
if (flip) {
Tessellator.instance.addVertexWithUV(16, 1, z, icon.getMinU(), icon.getMaxV());
Tessellator.instance.addVertexWithUV(0, 1, z, icon.getMaxU(), icon.getMaxV());
Tessellator.instance.addVertexWithUV(0, 17, z, icon.getMaxU(), icon.getMinV());
Tessellator.instance.addVertexWithUV(16, 17, z, icon.getMinU(), icon.getMinV());
} else {
Tessellator.instance.addVertexWithUV(16, 0, z, icon.getMaxU(), icon.getMinV());
Tessellator.instance.addVertexWithUV(0, 0, z, icon.getMinU(), icon.getMinV());
Tessellator.instance.addVertexWithUV(0, 16, z, icon.getMinU(), icon.getMaxV());
Tessellator.instance.addVertexWithUV(16, 16, z, icon.getMaxU(), icon.getMaxV());
}
Tessellator.instance.draw();
}
}