blob: d0a04dd726e4560197dd54f3d1f66897daebdddc [file] [log] [blame] [raw]
package mekanism.client.render.item;
import java.util.LinkedList;
import java.util.List;
import javax.vecmath.Matrix4f;
import mekanism.client.model.ModelArmoredJetpack;
import mekanism.client.model.ModelAtomicDisassembler;
import mekanism.client.model.ModelFlamethrower;
import mekanism.client.model.ModelFreeRunners;
import mekanism.client.model.ModelGasMask;
import mekanism.client.model.ModelJetpack;
import mekanism.client.model.ModelScubaTank;
import mekanism.client.render.ctm.ModelChiselBlock;
import mekanism.client.render.tileentity.RenderBin;
import mekanism.client.render.tileentity.RenderFluidTank;
import mekanism.common.MekanismItems;
import mekanism.common.Tier.FluidTankTier;
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.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.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType;
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.client.resources.model.IBakedModel;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.client.model.Attributes;
import net.minecraftforge.client.model.IFlexibleBakedModel;
import net.minecraftforge.client.model.IPerspectiveAwareModel;
import net.minecraftforge.fluids.Fluid;
import org.apache.commons.lang3.tuple.Pair;
public class BakedCustomItemModel implements IBakedModel, IPerspectiveAwareModel
{
private IBakedModel baseModel;
private ItemStack stack;
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 BakedCustomItemModel(IBakedModel model, ItemStack s)
{
baseModel = model;
stack = s;
}
private void doRender(TransformType type)
{
BasicBlockType basicType = BasicBlockType.get(stack);
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(), -0.5, -0.5, -0.5);
Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture);
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();
}
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();
}
return;
}
if(type == TransformType.GUI)
{
GlStateManager.scale(0.625, 0.625, 0.625);
GlStateManager.rotate(30.0F, 1.0F, 0.0F, 0.0F);
GlStateManager.rotate(-45.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)
{
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(90, 0.0F, 1.0F, 0.0F);
GlStateManager.rotate(45, -1.0F, 0.0F, 0.0F);
GlStateManager.translate(0.0F, -0.2F, 0.0F);
}
else {
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 || type == TransformType.THIRD_PERSON)
{
if(type == TransformType.FIRST_PERSON)
{
GlStateManager.rotate(55, 0.0F, 1.0F, 0.0F);
}
else {
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.45F, -0.45F, 0.0F);
GlStateManager.rotate(-45, 0.0F, 1.0F, 0.0F);
GlStateManager.scale(1.4, 1.4, 1.4);
}
flamethrower.render(0.0625F);
GlStateManager.popMatrix();
}
}
@Override
public List<BakedQuad> getFaceQuads(EnumFacing facing)
{
List<BakedQuad> faceQuads = new LinkedList<BakedQuad>();
if(Block.getBlockFromItem(stack.getItem()) != null)
{
faceQuads.addAll(baseModel.getFaceQuads(facing));
}
return faceQuads;
}
@Override
public List<BakedQuad> getGeneralQuads()
{
List<BakedQuad> generalQuads = new LinkedList<BakedQuad>();
if(Block.getBlockFromItem(stack.getItem()) != null)
{
generalQuads.addAll(baseModel.getGeneralQuads());
}
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 VertexFormat getFormat()
{
return Attributes.DEFAULT_BAKED_FORMAT;
}
@Override
public Pair<? extends IFlexibleBakedModel, Matrix4f> handlePerspective(ItemCameraTransforms.TransformType cameraTransformType)
{
if(cameraTransformType == TransformType.THIRD_PERSON)
{
ForgeHooksClient.multiplyCurrentGlMatrix(ModelChiselBlock.DEFAULT_BLOCK_THIRD_PERSON_MATRIX);
}
GlStateManager.pushMatrix();
GlStateManager.scale(0.5F, 0.5F, 0.5F);
doRender(cameraTransformType);
GlStateManager.scale(2.0F, 2.0F, 2.0F);
RenderHelper.enableStandardItemLighting();
GlStateManager.popMatrix();
return Pair.of(this, null);
}
}