package mekanism.client.render.item;
import java.util.LinkedList;
import java.util.List;
import javax.vecmath.Matrix4f;
import mekanism.api.energy.IEnergizedItem;
import mekanism.client.model.ModelArmoredJetpack;
import mekanism.client.model.ModelAtomicDisassembler;
import mekanism.client.model.ModelChemicalCrystallizer;
import mekanism.client.model.ModelChemicalDissolutionChamber;
import mekanism.client.model.ModelDigitalMiner;
import mekanism.client.model.ModelEnergyCube;
import mekanism.client.model.ModelFlamethrower;
import mekanism.client.model.ModelFreeRunners;
import mekanism.client.model.ModelGasMask;
import mekanism.client.model.ModelJetpack;
import mekanism.client.model.ModelQuantumEntangloporter;
import mekanism.client.model.ModelResistiveHeater;
import mekanism.client.model.ModelScubaTank;
import mekanism.client.model.ModelSecurityDesk;
import mekanism.client.model.ModelSeismicVibrator;
import mekanism.client.model.ModelSolarNeutronActivator;
import mekanism.client.render.MekanismRenderer;
import mekanism.client.render.ctm.CTMModelFactory;
import mekanism.client.render.tileentity.RenderBin;
import mekanism.client.render.tileentity.RenderEnergyCube;
import mekanism.client.render.tileentity.RenderFluidTank;
import mekanism.common.MekanismItems;
import mekanism.common.SideData.IOState;
import mekanism.common.Tier.EnergyCubeTier;
import mekanism.common.Tier.FluidTankTier;
import mekanism.common.base.ITierItem;
import mekanism.common.block.states.BlockStateBasic.BasicBlockType;
import mekanism.common.block.states.BlockStateMachine.MachineType;
import mekanism.common.inventory.InventoryBin;
import mekanism.common.item.ItemAtomicDisassembler;
import mekanism.common.item.ItemBlockBasic;
import mekanism.common.item.ItemBlockEnergyCube;
import mekanism.common.item.ItemBlockMachine;
import mekanism.common.item.ItemFlamethrower;
import mekanism.common.item.ItemFreeRunners;
import mekanism.common.item.ItemGasMask;
import mekanism.common.item.ItemScubaTank;
import mekanism.common.tile.TileEntityBin;
import mekanism.common.tile.TileEntityFluidTank;
import mekanism.common.util.MekanismUtils;
import mekanism.common.util.MekanismUtils.ResourceType;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.model.ModelChest;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.VertexBuffer;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType;
import net.minecraft.client.renderer.block.model.ItemOverrideList;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.client.model.IPerspectiveAwareModel;
import net.minecraftforge.fluids.Fluid;
import org.apache.commons.lang3.tuple.Pair;
import org.lwjgl.opengl.GL11;
public class BakedCustomItemModel implements IBakedModel, IPerspectiveAwareModel
{
private IBakedModel baseModel;
private ItemStack stack;
private TransformType prevTransform;
private Minecraft mc = Minecraft.getMinecraft();
private static final RenderFluidTank fluidTankRenderer = (RenderFluidTank)TileEntityRendererDispatcher.instance.mapSpecialRenderers.get(TileEntityFluidTank.class);
private final RenderBin binRenderer = (RenderBin)TileEntityRendererDispatcher.instance.mapSpecialRenderers.get(TileEntityBin.class);
public static ModelJetpack jetpack = new ModelJetpack();
public static ModelArmoredJetpack armoredJetpack = new ModelArmoredJetpack();
public static ModelGasMask gasMask = new ModelGasMask();
public static ModelScubaTank scubaTank = new ModelScubaTank();
public static ModelFreeRunners freeRunners = new ModelFreeRunners();
public static ModelAtomicDisassembler atomicDisassembler = new ModelAtomicDisassembler();
public static ModelFlamethrower flamethrower = new ModelFlamethrower();
public static ModelChest personalChest = new ModelChest();
public static ModelSolarNeutronActivator solarNeutronActivator = new ModelSolarNeutronActivator();
public static ModelSeismicVibrator seismicVibrator = new ModelSeismicVibrator();
public static ModelChemicalDissolutionChamber chemicalDissolutionChamber = new ModelChemicalDissolutionChamber();
public static ModelChemicalCrystallizer chemicalCrystallizer = new ModelChemicalCrystallizer();
public static ModelSecurityDesk securityDesk = new ModelSecurityDesk();
public static ModelResistiveHeater resistiveHeater = new ModelResistiveHeater();
public static ModelQuantumEntangloporter quantumEntangloporter = new ModelQuantumEntangloporter();
public static ModelEnergyCube energyCube = new ModelEnergyCube();
public static ModelDigitalMiner digitalMiner = new ModelDigitalMiner();
public BakedCustomItemModel(IBakedModel model, ItemStack s)
{
baseModel = model;
stack = s;
}
private void doRender(TransformType type)
{
BasicBlockType basicType = BasicBlockType.get(stack);
if(type == TransformType.GUI)
{
GlStateManager.rotate(180F, 0.0F, 1.0F, 0.0F);
}
if(basicType != null)
{
if(basicType == BasicBlockType.BIN)
{
GlStateManager.pushMatrix();
ItemBlockBasic itemBasic = (ItemBlockBasic)stack.getItem();
InventoryBin inv = new InventoryBin(stack);
binRenderer.render(EnumFacing.NORTH, inv.getItemType(), inv.getItemCount(), false, -0.5, -0.5, -0.5);
Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
GlStateManager.enableRescaleNormal();
GlStateManager.enableAlpha();
GlStateManager.alphaFunc(516, 0.1F);
GlStateManager.enableBlend();
GlStateManager.blendFunc(770, 771);
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
GlStateManager.popMatrix();
}
else if(basicType == BasicBlockType.SECURITY_DESK)
{
GlStateManager.rotate(180, 1.0F, 0.0F, 0.0F);
GlStateManager.rotate(180, 0.0F, 1.0F, 0.0F);
GlStateManager.scale(0.8F, 0.8F, 0.8F);
GlStateManager.translate(0.0F, -0.8F, 0.0F);
mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "SecurityDesk.png"));
securityDesk.render(0.0625F, mc.renderEngine);
}
return;
}
MachineType machineType = MachineType.get(stack);
if(machineType != null)
{
if(machineType == MachineType.FLUID_TANK)
{
GlStateManager.pushMatrix();
ItemBlockMachine itemMachine = (ItemBlockMachine)stack.getItem();
float targetScale = (float)(itemMachine.getFluidStack(stack) != null ? itemMachine.getFluidStack(stack).amount : 0)/itemMachine.getCapacity(stack);
FluidTankTier tier = FluidTankTier.values()[itemMachine.getBaseTier(stack).ordinal()];
Fluid fluid = itemMachine.getFluidStack(stack) != null ? itemMachine.getFluidStack(stack).getFluid() : null;
fluidTankRenderer.render(tier, fluid, targetScale, false, null, -0.5, -0.5, -0.5);
GlStateManager.popMatrix();
}
else if(machineType == MachineType.PERSONAL_CHEST)
{
GlStateManager.pushMatrix();
GlStateManager.rotate(180F, 0.0F, 1.0F, 0.0F);
GlStateManager.translate(-0.5F, -0.5F, -0.5F);
GlStateManager.translate(0, 1.0F, 1.0F);
GlStateManager.scale(1.0F, -1F, -1F);
mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "PersonalChest.png"));
personalChest.renderAll();
GlStateManager.popMatrix();
}
else if(machineType == MachineType.SOLAR_NEUTRON_ACTIVATOR)
{
GlStateManager.rotate(180F, 0.0F, 0.0F, 1.0F);
GlStateManager.scale(0.6F, 0.6F, 0.6F);
GlStateManager.translate(0.0F, -0.55F, 0.0F);
mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "SolarNeutronActivator.png"));
solarNeutronActivator.render(0.0625F);
}
else if(machineType == MachineType.SEISMIC_VIBRATOR)
{
GlStateManager.rotate(180F, 0.0F, 0.0F, 1.0F);
GlStateManager.scale(0.6F, 0.6F, 0.6F);
GlStateManager.translate(0.0F, -0.55F, 0.0F);
mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "SeismicVibrator.png"));
seismicVibrator.render(0.0625F);
}
else if(machineType == MachineType.CHEMICAL_CRYSTALLIZER)
{
GlStateManager.rotate(180F, 0.0F, 0.0F, 1.0F);
GlStateManager.translate(0.05F, -1.001F, 0.05F);
mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "ChemicalCrystallizer.png"));
chemicalCrystallizer.render(0.0625F);
}
else if(machineType == MachineType.CHEMICAL_DISSOLUTION_CHAMBER)
{
GlStateManager.rotate(180F, 0.0F, 0.0F, 1.0F);
GlStateManager.translate(0.05F, -1.001F, 0.05F);
mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "ChemicalDissolutionChamber.png"));
chemicalDissolutionChamber.render(0.0625F);
}
else if(machineType == MachineType.QUANTUM_ENTANGLOPORTER)
{
GlStateManager.rotate(180F, 0.0F, 0.0F, 1.0F);
GlStateManager.translate(0.0F, -1.0F, 0.0F);
mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "QuantumEntangloporter.png"));
quantumEntangloporter.render(0.0625F, mc.renderEngine, true);
}
else if(machineType == MachineType.RESISTIVE_HEATER)
{
GlStateManager.rotate(180F, 0.0F, 0.0F, 1.0F);
GlStateManager.translate(0.05F, -0.96F, 0.05F);
mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "ResistiveHeater.png"));
resistiveHeater.render(0.0625F, false, mc.renderEngine, true);
}
else if(machineType == MachineType.DIGITAL_MINER)
{
GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
GL11.glTranslatef(0.35F, 0.1F, 0.0F);
mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "DigitalMiner.png"));
digitalMiner.render(0.022F, false, mc.renderEngine, true);
}
return;
}
if(stack.getItem() instanceof ItemBlockEnergyCube)
{
GlStateManager.pushMatrix();
EnergyCubeTier tier = EnergyCubeTier.values()[((ITierItem)stack.getItem()).getBaseTier(stack).ordinal()];
IEnergizedItem energized = (IEnergizedItem)stack.getItem();
mc.renderEngine.bindTexture(RenderEnergyCube.baseTexture);
GlStateManager.rotate(180F, 0.0F, 0.0F, 1.0F);
GlStateManager.rotate(180F, 0.0F, 1.0F, 0.0F);
GlStateManager.translate(0.0F, -1.0F, 0.0F);
MekanismRenderer.blendOn();
energyCube.render(0.0625F, tier, mc.renderEngine, true);
for(EnumFacing side : EnumFacing.VALUES)
{
mc.renderEngine.bindTexture(RenderEnergyCube.baseTexture);
energyCube.renderSide(0.0625F, side, side == EnumFacing.NORTH ? IOState.OUTPUT : IOState.INPUT, tier, mc.renderEngine);
}
MekanismRenderer.blendOff();
GlStateManager.popMatrix();
}
if(type == TransformType.GUI)
{
GlStateManager.rotate(90.0F, 0.0F, 1.0F, 0.0F);
}
else {
GlStateManager.rotate(180.0F, 0.0F, 1.0F, 0.0F);
}
if(stack.getItem() == MekanismItems.Jetpack)
{
GlStateManager.pushMatrix();
GlStateManager.rotate(180, 0.0F, 0.0F, 1.0F);
GlStateManager.rotate(90, 0.0F, -1.0F, 0.0F);
GlStateManager.translate(0.2F, -0.35F, 0.0F);
mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "Jetpack.png"));
jetpack.render(0.0625F);
GlStateManager.popMatrix();
}
else if(stack.getItem() == MekanismItems.ArmoredJetpack)
{
GlStateManager.pushMatrix();
GlStateManager.rotate(180, 0.0F, 0.0F, 1.0F);
GlStateManager.rotate(90, 0.0F, -1.0F, 0.0F);
GlStateManager.translate(0.2F, -0.35F, 0.0F);
mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "Jetpack.png"));
armoredJetpack.render(0.0625F);
GlStateManager.popMatrix();
}
else if(stack.getItem() instanceof ItemGasMask)
{
GlStateManager.pushMatrix();
GlStateManager.rotate(180, 0.0F, 0.0F, 1.0F);
GlStateManager.rotate(90, 0.0F, -1.0F, 0.0F);
GlStateManager.translate(0.1F, 0.2F, 0.0F);
mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "ScubaSet.png"));
gasMask.render(0.0625F);
GlStateManager.popMatrix();
}
else if(stack.getItem() instanceof ItemScubaTank)
{
GlStateManager.pushMatrix();
GlStateManager.rotate(180, 0.0F, 0.0F, 1.0F);
GlStateManager.rotate(90, 0.0F, -1.0F, 0.0F);
GlStateManager.scale(1.6F, 1.6F, 1.6F);
GlStateManager.translate(0.2F, -0.5F, 0.0F);
mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "ScubaSet.png"));
scubaTank.render(0.0625F);
GlStateManager.popMatrix();
}
else if(stack.getItem() instanceof ItemFreeRunners)
{
GlStateManager.pushMatrix();
GlStateManager.rotate(180, 0.0F, 0.0F, 1.0F);
GlStateManager.rotate(90, 0.0F, -1.0F, 0.0F);
GlStateManager.scale(2.0F, 2.0F, 2.0F);
GlStateManager.translate(0.2F, -1.43F, 0.12F);
mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "FreeRunners.png"));
freeRunners.render(0.0625F);
GlStateManager.popMatrix();
}
else if(stack.getItem() instanceof ItemAtomicDisassembler)
{
GlStateManager.pushMatrix();
GlStateManager.scale(1.4F, 1.4F, 1.4F);
GlStateManager.rotate(180, 0.0F, 0.0F, 1.0F);
if(type == TransformType.THIRD_PERSON_RIGHT_HAND || type == TransformType.THIRD_PERSON_LEFT_HAND)
{
if(type == TransformType.THIRD_PERSON_LEFT_HAND)
{
GlStateManager.rotate(-90, 0.0F, 1.0F, 0.0F);
}
GlStateManager.rotate(45, 0.0F, 1.0F, 0.0F);
GlStateManager.rotate(50, 1.0F, 0.0F, 0.0F);
GlStateManager.scale(2.0F, 2.0F, 2.0F);
GlStateManager.translate(0.0F, -0.4F, 0.4F);
}
else if(type == TransformType.GUI)
{
GlStateManager.rotate(225, 0.0F, 1.0F, 0.0F);
GlStateManager.rotate(45, -1.0F, 0.0F, -1.0F);
GlStateManager.scale(0.6F, 0.6F, 0.6F);
GlStateManager.translate(0.0F, -0.2F, 0.0F);
}
else {
if(type == TransformType.FIRST_PERSON_LEFT_HAND)
{
GlStateManager.rotate(90, 0.0F, 1.0F, 0.0F);
}
GlStateManager.rotate(45, 0.0F, 1.0F, 0.0F);
GlStateManager.translate(0.0F, -0.7F, 0.0F);
}
mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "AtomicDisassembler.png"));
atomicDisassembler.render(0.0625F);
GlStateManager.popMatrix();
}
else if(stack.getItem() instanceof ItemFlamethrower)
{
GlStateManager.pushMatrix();
GlStateManager.rotate(160, 0.0F, 0.0F, 1.0F);
mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "Flamethrower.png"));
GlStateManager.translate(0.0F, -1.0F, 0.0F);
GlStateManager.rotate(135, 0.0F, 1.0F, 0.0F);
GlStateManager.rotate(-20, 0.0F, 0.0F, 1.0F);
if(type == TransformType.FIRST_PERSON_RIGHT_HAND || type == TransformType.THIRD_PERSON_RIGHT_HAND
|| type == TransformType.FIRST_PERSON_LEFT_HAND || type == TransformType.THIRD_PERSON_LEFT_HAND)
{
if(type == TransformType.FIRST_PERSON_RIGHT_HAND)
{
GlStateManager.rotate(55, 0.0F, 1.0F, 0.0F);
}
else if(type == TransformType.FIRST_PERSON_LEFT_HAND)
{
GlStateManager.rotate(-160, 0.0F, 1.0F, 0.0F);
GlStateManager.rotate(30F, 1.0F, 0.0F, 0.0F);
}
else if(type == TransformType.THIRD_PERSON_RIGHT_HAND)
{
GlStateManager.translate(0.0F, 0.7F, 0.0F);
GlStateManager.rotate(75, 0.0F, 1.0F, 0.0F);
}
else if(type == TransformType.THIRD_PERSON_LEFT_HAND)
{
GlStateManager.translate(0.0F, 0.7F, 0.0F);
GlStateManager.rotate(-75, 0.0F, 1.0F, 0.0F);
}
GlStateManager.scale(2.5F, 2.5F, 2.5F);
GlStateManager.translate(0.0F, -1.0F, -0.5F);
}
else if(type == TransformType.GUI)
{
GlStateManager.translate(-0.6F, 0.0F, 0.0F);
GlStateManager.rotate(45, 0.0F, 1.0F, 0.0F);
}
flamethrower.render(0.0625F);
GlStateManager.popMatrix();
}
}
@Override
public List<BakedQuad> getQuads(IBlockState state, EnumFacing side, long rand)
{
if(side != null)
{
List<BakedQuad> faceQuads = new LinkedList<BakedQuad>();
if(Block.getBlockFromItem(stack.getItem()) != null)
{
MachineType machineType = MachineType.get(stack);
if(machineType != MachineType.QUANTUM_ENTANGLOPORTER && machineType != MachineType.RESISTIVE_HEATER)
{
if(!(stack.getItem() instanceof ItemBlockEnergyCube))
{
faceQuads.addAll(baseModel.getQuads(state, side, rand));
}
}
}
return faceQuads;
}
Tessellator tessellator = Tessellator.getInstance();
VertexFormat prevFormat = null;
int prevMode = -1;
MekanismRenderer.pauseRenderer(tessellator);
List<BakedQuad> generalQuads = new LinkedList<BakedQuad>();
GlStateManager.pushMatrix();
GlStateManager.translate(0.5F, 0.5F, 0.5F);
GlStateManager.rotate(180, 0.0F, 1.0F, 0.0F);
doRender(prevTransform);
GlStateManager.enableLighting();
GlStateManager.enableLight(0);
GlStateManager.enableLight(1);
GlStateManager.enableColorMaterial();
GlStateManager.colorMaterial(1032, 5634);
GlStateManager.enableCull();
Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
GlStateManager.popMatrix();
MekanismRenderer.resumeRenderer(tessellator);
if(Block.getBlockFromItem(stack.getItem()) != null)
{
MachineType machineType = MachineType.get(stack);
if(machineType != MachineType.DIGITAL_MINER)
{
if(!(stack.getItem() instanceof ItemBlockEnergyCube))
{
generalQuads.addAll(baseModel.getQuads(state, side, rand));
}
}
}
return generalQuads;
}
@Override
public boolean isAmbientOcclusion()
{
return baseModel.isAmbientOcclusion();
}
@Override
public boolean isGui3d()
{
return baseModel.isGui3d();
}
@Override
public boolean isBuiltInRenderer()
{
return baseModel.isBuiltInRenderer();
}
@Override
public TextureAtlasSprite getParticleTexture()
{
return baseModel.getParticleTexture();
}
@Override
public ItemCameraTransforms getItemCameraTransforms()
{
return baseModel.getItemCameraTransforms();
}
@Override
public Pair<? extends IPerspectiveAwareModel, Matrix4f> handlePerspective(ItemCameraTransforms.TransformType cameraTransformType)
{
prevTransform = cameraTransformType;
return Pair.of(this, CTMModelFactory.transforms.get(cameraTransformType).getMatrix());
}
@Override
public ItemOverrideList getOverrides()
{
return ItemOverrideList.NONE;
}
}