package crazypants.enderio.machine.obelisk;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Timer;
import net.minecraft.world.World;
import net.minecraftforge.client.IItemRenderer;
import org.lwjgl.opengl.GL11;
import com.enderio.core.client.render.RenderUtil;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import crazypants.enderio.EnderIO;
import static org.lwjgl.opengl.GL11.*;
@SideOnly(Side.CLIENT)
public class ObeliskSpecialRenderer<T extends TileEntity> extends TileEntitySpecialRenderer implements IItemRenderer {
private ItemStack floatingStack;
private Random rand = new Random();
private ObeliskRenderer blockRen;
public ObeliskSpecialRenderer(ItemStack itemStack, ObeliskRenderer renderer) {
this.floatingStack = itemStack;
this.blockRen = renderer;
}
@Override
public boolean handleRenderType(ItemStack item, ItemRenderType type) {
return true;
}
@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
return helper == ItemRendererHelper.ENTITY_BOBBING || helper == ItemRendererHelper.ENTITY_ROTATION;
}
@Override
public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
GL11.glPushMatrix();
switch(type) {
case ENTITY:
GL11.glTranslatef(0, 0.25f, 0);
break;
case EQUIPPED:
GL11.glRotatef(22, 0, 0, 1);
GL11.glRotatef(-10, 1, 0, 0);
GL11.glTranslatef(0.3f, -0.4f, -0.4f);
break;
case EQUIPPED_FIRST_PERSON:
GL11.glTranslatef(0.75f, 0, 0);
break;
case INVENTORY:
GL11.glTranslatef(8, 9, 0);
GL11.glScalef(12F, 12F, 12F);
GL11.glScalef(1.0F, 1.0F, -1F);
GL11.glRotatef(210F, 1, 0, 0);
GL11.glRotatef(-45F, 0, 1, 0);
break;
default:
break;
}
blockRen.renderInventoryBlock(Block.getBlockFromItem(item.getItem()), item.getItemDamage(), 0, (RenderBlocks) data[0]);
Timer t = RenderUtil.getTimer();
renderItemStack(null, Minecraft.getMinecraft().theWorld, 0, 0, 0, t == null ? 0 : t.renderPartialTicks);
GL11.glPopMatrix();
}
private EntityItem ei = null;
@SuppressWarnings("unchecked")
@Override
public void renderTileEntityAt(TileEntity te, double x, double y, double z, float tick) {
World world = te.getWorldObj();
float f = world.getBlockLightValue(te.xCoord, te.yCoord, te.zCoord);
int l = world.getLightBrightnessForSkyBlocks(te.xCoord, te.yCoord, te.zCoord, 0);
int l1 = l % 65536;
int l2 = l / 65536;
Tessellator.instance.setColorOpaque_F(f, f, f);
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, l1, l2);
renderItemStack((T) te, world, x, y, z, tick);
}
protected void renderItemStack(T te, World world, double x, double y, double z, float tick) {
if(ei == null) {
ei = new EntityItem(world, 0, 0, 0, getFloatingItem(te));
}
ei.setEntityItemStack(getFloatingItem(te));
ei.hoverStart = (float) ((EnderIO.proxy.getTickCount() * 0.05f + (tick * 0.05f)) % (Math.PI * 2));
ei.age = 0;
glPushMatrix();
glPushAttrib(GL_ALL_ATTRIB_BITS);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glEnable(GL11.GL_ALPHA_TEST);
RenderHelper.enableStandardItemLighting();
glTranslated(x + 0.5, y + 0.7, z + 0.5);
glScalef(1.1f, 1.1f, 1.1f);
glDepthMask(true);
if(te != null) {
rand.setSeed(te.xCoord + te.yCoord + te.zCoord);
rand.nextBoolean();
if(Minecraft.getMinecraft().gameSettings.fancyGraphics) {
glRotatef(rand.nextFloat() * 360f, 0, 1, 0);
}
ei.hoverStart += rand.nextFloat();
}
RenderManager.instance.renderEntityWithPosYaw(ei, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F);
glPopAttrib();
glPopMatrix();
}
/**
* @param te CAN BE NULL
*/
protected ItemStack getFloatingItem(T te) {
return floatingStack;
}
}