/**
* Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
* <p/>
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.transport.render;
import java.util.Random;
import org.lwjgl.opengl.GL11;
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraftforge.client.IItemRenderer;
import buildcraft.api.gates.IGateExpansion;
import buildcraft.transport.gates.ItemGate;
public class GateItemRenderer implements IItemRenderer {
RenderItem renderItem = new RenderItem();
@Override
public boolean handleRenderType(ItemStack stack, ItemRenderType type) {
return type == ItemRenderType.INVENTORY
|| type == ItemRenderType.ENTITY
|| type == ItemRenderType.EQUIPPED
|| type == ItemRenderType.EQUIPPED_FIRST_PERSON;
}
@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack stack, ItemRendererHelper helper) {
return helper == ItemRendererHelper.ENTITY_BOBBING;
}
@Override
public void renderItem(ItemRenderType type, ItemStack stack, Object... data) {
if (type == ItemRenderType.INVENTORY) {
render(ItemRenderType.INVENTORY, stack);
} else if (type == ItemRenderType.ENTITY) {
if (RenderManager.instance.options.fancyGraphics) {
renderAsEntity(stack, (EntityItem) data[1]);
} else {
renderAsEntityFlat(stack);
}
} else if (type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON) {
renderIn3D(stack);
}
}
private void renderIn3D(ItemStack stack) {
GL11.glPushMatrix();
renderLayerIn3D(ItemGate.getLogic(stack).getIconItem());
GL11.glScalef(1, 1, 1.05f);
renderLayerIn3D(ItemGate.getMaterial(stack).getIconItem());
for (IGateExpansion expansion : ItemGate.getInstalledExpansions(stack)) {
renderLayerIn3D(expansion.getOverlayItem());
}
GL11.glPopMatrix();
}
private void renderLayerIn3D(IIcon icon) {
if (icon == null) {
return;
}
GL11.glPushMatrix();
Tessellator tessellator = Tessellator.instance;
float uv1 = icon.getMinU();
float uv2 = icon.getMaxU();
float uv3 = icon.getMinV();
float uv4 = icon.getMaxV();
ItemRenderer.renderItemIn2D(tessellator, uv2, uv3, uv1, uv4, icon.getIconWidth(), icon.getIconHeight(), 0.0625F);
GL11.glPopMatrix();
}
private void renderAsEntity(ItemStack stack, EntityItem entity) {
GL11.glPushMatrix();
byte iterations = 1;
if (stack.stackSize > 1) {
iterations = 2;
}
if (stack.stackSize > 15) {
iterations = 3;
}
if (stack.stackSize > 31) {
iterations = 4;
}
Random rand = new Random(187L);
float offsetZ = 0.0625F + 0.021875F;
GL11.glRotatef(((entity.age + 1.0F) / 20.0F + entity.hoverStart) * (180F / (float) Math.PI), 0.0F, 1.0F, 0.0F);
GL11.glTranslatef(-0.5F, -0.25F, -(offsetZ * iterations / 2.0F));
for (int count = 0; count < iterations; ++count) {
if (count > 0) {
float offsetX = (rand.nextFloat() * 2.0F - 1.0F) * 0.3F / 0.5F;
float offsetY = (rand.nextFloat() * 2.0F - 1.0F) * 0.3F / 0.5F;
GL11.glTranslatef(offsetX, offsetY, offsetZ);
} else {
GL11.glTranslatef(0f, 0f, offsetZ);
}
renderIn3D(stack);
}
GL11.glPopMatrix();
}
private void renderAsEntityFlat(ItemStack stack) {
GL11.glPushMatrix();
byte iterations = 1;
if (stack.stackSize > 1) {
iterations = 2;
}
if (stack.stackSize > 15) {
iterations = 3;
}
if (stack.stackSize > 31) {
iterations = 4;
}
Random rand = new Random(187L);
for (int ii = 0; ii < iterations; ++ii) {
GL11.glPushMatrix();
GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
GL11.glRotatef(180 - RenderManager.instance.playerViewY, 0.0F, 1.0F, 0.0F);
if (ii > 0) {
float var12 = (rand.nextFloat() * 2.0F - 1.0F) * 0.3F;
float var13 = (rand.nextFloat() * 2.0F - 1.0F) * 0.3F;
float var14 = (rand.nextFloat() * 2.0F - 1.0F) * 0.3F;
GL11.glTranslatef(var12, var13, var14);
}
GL11.glTranslatef(0.5f, 0.8f, 0);
GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F);
GL11.glScalef(1f / 16f, 1f / 16f, 1);
render(ItemRenderType.ENTITY, stack);
GL11.glPopMatrix();
}
GL11.glPopMatrix();
}
private void render(ItemRenderType type, ItemStack stack) {
GL11.glPushMatrix();
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_ALPHA_TEST); // In certain cases gets disabled by this point
IIcon icon = ItemGate.getLogic(stack).getIconItem();
renderItem.renderIcon(0, 0, icon, 16, 16);
if (type == ItemRenderType.ENTITY) {
GL11.glTranslatef(0, 0, -0.01f);
}
icon = ItemGate.getMaterial(stack).getIconItem();
if (icon != null) {
renderItem.renderIcon(0, 0, icon, 16, 16);
}
for (IGateExpansion expansion : ItemGate.getInstalledExpansions(stack)) {
icon = expansion.getOverlayItem();
if (icon != null) {
renderItem.renderIcon(0, 0, icon, 16, 16);
}
}
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glPopMatrix();
}
}