package com.carpentersblocks.renderer;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.util.Vec3;
import net.minecraftforge.common.util.ForgeDirection;
import com.carpentersblocks.block.BlockCarpentersLever;
import com.carpentersblocks.block.BlockCoverable;
import com.carpentersblocks.data.Lever;
import com.carpentersblocks.data.Lever.Axis;
import com.carpentersblocks.renderer.helper.VertexHelper;
import com.carpentersblocks.util.BlockProperties;
import com.carpentersblocks.util.registry.BlockRegistry;
import com.carpentersblocks.util.registry.IconRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@SideOnly(Side.CLIENT)
public class BlockHandlerCarpentersLever extends BlockHandlerBase {
@Override
public boolean shouldRender3DInInventory(int modelId)
{
return false;
}
@Override
/**
* Override to provide custom icons.
*/
protected IIcon getUniqueIcon(ItemStack itemStack, int side, IIcon icon)
{
Block block = BlockProperties.toBlock(itemStack);
if (block instanceof BlockCoverable) {
return IconRegistry.icon_uncovered_solid;
} else {
return icon;
}
}
@Override
/**
* Renders block
*/
protected void renderCarpentersBlock(int x, int y, int z)
{
renderBlocks.renderAllFaces = true;
renderLever(getCoverForRendering(), x, y, z);
renderBlocks.renderAllFaces = false;
}
/**
* Renders lever.
*/
private void renderLever(ItemStack itemStack, int x, int y, int z)
{
/* Set block bounds and render lever base. */
BlockCarpentersLever blockRef = (BlockCarpentersLever) BlockRegistry.blockCarpentersLever;
blockRef.setBlockBoundsBasedOnState(renderBlocks.blockAccess, x, y, z);
renderBlocks.setRenderBoundsFromBlock(blockRef);
renderBlock(itemStack, x, y, z);
/* Render lever handle. */
renderLeverHandle(x, y, z);
}
/**
* Renders the lever handle.
*/
private void renderLeverHandle(int x, int y, int z)
{
Tessellator tessellator = Tessellator.instance;
tessellator.setBrightness(Blocks.dirt.getMixedBrightnessForBlock(renderBlocks.blockAccess, x, y, z));
tessellator.setColorOpaque_F(1.0F, 1.0F, 1.0F);
Lever data = new Lever();
ForgeDirection dir = data.getDirection(TE);
boolean toggleState = data.getState(TE) == data.STATE_ON;
boolean rotateLever = data.getAxis(TE) == Axis.X;
IIcon icon = renderBlocks.hasOverrideBlockTexture() ? renderBlocks.overrideBlockTexture : IconRegistry.icon_lever;
double uMin = icon.getMinU();
double uMax = icon.getMaxU();
double vMin = icon.getMinV();
double vMax = icon.getMaxV();
Vec3[] vector = {
Vec3.createVectorHelper(-0.0625F, 0.0D, -0.0625F),
Vec3.createVectorHelper( 0.0625F, 0.0D, -0.0625F),
Vec3.createVectorHelper( 0.0625F, 0.0D, 0.0625F),
Vec3.createVectorHelper(-0.0625F, 0.0D, 0.0625F),
Vec3.createVectorHelper(-0.0625F, 0.625F, -0.0625F),
Vec3.createVectorHelper( 0.0625F, 0.625F, -0.0625F),
Vec3.createVectorHelper( 0.0625F, 0.625F, 0.0625F),
Vec3.createVectorHelper(-0.0625F, 0.625F, 0.0625F)
};
/* Set up lever handle rotation. */
for (int vecCount = 0; vecCount < 8; ++vecCount)
{
if (toggleState) {
vector[vecCount].zCoord -= 0.0625D;
vector[vecCount].rotateAroundX((float)Math.PI * 2F / 9F);
} else {
vector[vecCount].zCoord += 0.0625D;
vector[vecCount].rotateAroundX(-((float)Math.PI * 2F / 9F));
}
if (dir.ordinal() < 2) {
if (dir.equals(ForgeDirection.DOWN)) {
vector[vecCount].rotateAroundZ((float)Math.PI);
}
if (rotateLever) {
vector[vecCount].rotateAroundY((float)Math.PI / 2F);
}
if (dir.equals(ForgeDirection.UP)) {
vector[vecCount].xCoord += x + 0.5D;
vector[vecCount].yCoord += y + 0.125F;
vector[vecCount].zCoord += z + 0.5D;
} else {
vector[vecCount].xCoord += x + 0.5D;
vector[vecCount].yCoord += y + 0.875F;
vector[vecCount].zCoord += z + 0.5D;
}
} else {
vector[vecCount].yCoord -= 0.375D;
vector[vecCount].rotateAroundX((float)Math.PI / 2F);
switch (dir) {
case NORTH:
vector[vecCount].rotateAroundY(0.0F);
break;
case SOUTH:
vector[vecCount].rotateAroundY((float)Math.PI);
break;
case WEST:
vector[vecCount].rotateAroundY((float)Math.PI / 2F);
break;
case EAST:
vector[vecCount].rotateAroundY(-((float)Math.PI / 2F));
break;
default: {}
}
vector[vecCount].xCoord += x + 0.5D;
vector[vecCount].yCoord += y + 0.5F;
vector[vecCount].zCoord += z + 0.5D;
}
}
Vec3 vertex1 = null;
Vec3 vertex2 = null;
Vec3 vertex3 = null;
Vec3 vertex4 = null;
for (int idx = 0; idx < 6; ++idx)
{
if (idx == 0) {
uMin = icon.getInterpolatedU(7.0D);
vMin = icon.getInterpolatedV(6.0D);
uMax = icon.getInterpolatedU(9.0D);
vMax = icon.getInterpolatedV(8.0D);
} else if (idx == 2) {
uMin = icon.getInterpolatedU(7.0D);
vMin = icon.getInterpolatedV(6.0D);
uMax = icon.getInterpolatedU(9.0D);
vMax = icon.getMaxV();
}
switch (idx) {
case 0:
vertex1 = vector[0];
vertex2 = vector[1];
vertex3 = vector[2];
vertex4 = vector[3];
break;
case 1:
vertex1 = vector[7];
vertex2 = vector[6];
vertex3 = vector[5];
vertex4 = vector[4];
break;
case 2:
tessellator.setColorOpaque_F(0.8F, 0.8F, 0.8F);
vertex1 = vector[1];
vertex2 = vector[0];
vertex3 = vector[4];
vertex4 = vector[5];
break;
case 3:
tessellator.setColorOpaque_F(0.6F, 0.6F, 0.6F);
vertex1 = vector[2];
vertex2 = vector[1];
vertex3 = vector[5];
vertex4 = vector[6];
break;
case 4:
tessellator.setColorOpaque_F(0.8F, 0.8F, 0.8F);
vertex1 = vector[3];
vertex2 = vector[2];
vertex3 = vector[6];
vertex4 = vector[7];
break;
case 5:
tessellator.setColorOpaque_F(0.6F, 0.6F, 0.6F);
vertex1 = vector[0];
vertex2 = vector[3];
vertex3 = vector[7];
vertex4 = vector[4];
break;
}
VertexHelper.drawVertex(renderBlocks, vertex1.xCoord, vertex1.yCoord, vertex1.zCoord, uMin, vMax);
VertexHelper.drawVertex(renderBlocks, vertex2.xCoord, vertex2.yCoord, vertex2.zCoord, uMax, vMax);
VertexHelper.drawVertex(renderBlocks, vertex3.xCoord, vertex3.yCoord, vertex3.zCoord, uMax, vMin);
VertexHelper.drawVertex(renderBlocks, vertex4.xCoord, vertex4.yCoord, vertex4.zCoord, uMin, vMin);
}
}
}