package matteroverdrive.client.render.block;
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import cpw.mods.fml.client.registry.RenderingRegistry;
import matteroverdrive.tile.pipes.TileEntityPipe;
import matteroverdrive.util.math.MOMathHelper;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.opengl.GL11;
/**
* Created by Simeon on 6/18/2015.
*/
public class RendererBlockPipe implements ISimpleBlockRenderingHandler
{
public static int rendererID;
public RendererBlockPipe()
{
rendererID = RenderingRegistry.getNextAvailableRenderId();
}
@Override
public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer)
{
IIcon icon = block.getIcon(0, metadata);
GL11.glPushMatrix();
GL11.glScaled(2, 2, 2);
GL11.glTranslated(-0.5, -0.5, -0.5);
Tessellator.instance.startDrawingQuads();
renderPipe(0, 0, 0, block, 0, icon, 15728704);
Tessellator.instance.draw();
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glPopMatrix();
}
@Override
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer)
{
int meta = world.getBlockMetadata(x, y, z);
IIcon icon = block.getIcon(world, x, y, z, meta);
int connections = ((TileEntityPipe)world.getTileEntity(x, y, z)).getConnectionsMask();
int brightness = block.getMixedBrightnessForBlock(world, x, y, z);
renderPipe(x, y, z, block, connections, icon, brightness);
return true;
}
protected void renderPipe(int x, int y, int z, Block block, int connections, IIcon icon, int brigtness)
{
float step = 1f / 3f;
Tessellator.instance.setColorRGBA(255, 255, 255, 255);
Tessellator.instance.setBrightness(brigtness);
for (int i = 0;i < 6;i++)
{
if (MOMathHelper.getBoolean(connections, i))
{
ForgeDirection direction = ForgeDirection.getOrientation(i);
if (direction == ForgeDirection.UP || direction == ForgeDirection.DOWN) {
drawCubeUpDown(x + step + step * direction.offsetX, y + step + step * direction.offsetY, z + step + step * direction.offsetZ, 1f / 3f, icon, 6, 0);
}else if (direction == ForgeDirection.NORTH || direction == ForgeDirection.SOUTH)
{
drawCubeNorthSouth(x + step + step * direction.offsetX, y + step + step * direction.offsetY, z + step + step * direction.offsetZ, 1f / 3f, icon, 6, 0);
}
else
{
drawCube(x + step + step * direction.offsetX, y + step + step * direction.offsetY, z + step + step * direction.offsetZ, 1f / 3f, icon, 6, 0);
}
}
}
if (connections == 3) {
drawCubeUpDown(x + step, y + step, z + step, 1f / 3f, icon, 6, 0);
}else if (connections == 12) {
drawCubeNorthSouth(x + step,y + step,z + step,1f / 3f, icon, 6, 0);
}else if (connections == 48) {
drawCube(x + step, y + step, z + step, 1f / 3f, icon, 6, 0);
}else
{
drawCube(x + step, y + step, z + step, 1f / 3f, icon, 0, 0);
}
}
public void drawCube(double x, double y, double z, float size, IIcon icon, int u, int v)
{
//bottom side
Tessellator.instance.setColorOpaque_F(0.6f, 0.65f, 0.7f);
Tessellator.instance.setNormal(0, -1, 0);
Tessellator.instance.addVertexWithUV(x, y, z, icon.getInterpolatedU(u), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x + size, y, z, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x + size, y, z + size, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x, y, z + size, icon.getInterpolatedU(u), icon.getInterpolatedV(v + 6));
//top side
Tessellator.instance.setColorOpaque_F(1f, 1f, 1f);
Tessellator.instance.setNormal(0, 1, 0);
Tessellator.instance.addVertexWithUV(x, y + size, z, icon.getInterpolatedU(u), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x, y + size, z + size,icon.getInterpolatedU(u), icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x+size,y + size, z + size, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x+size,y + size, z, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v));
//west
Tessellator.instance.setColorOpaque_F(0.7f, 0.75f, 0.8f);
Tessellator.instance.setNormal(-1, 0, 0);
Tessellator.instance.addVertexWithUV(x, y, z, icon.getInterpolatedU(u), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x, y, z + size, icon.getInterpolatedU(u), icon.getInterpolatedV(v+6));
Tessellator.instance.addVertexWithUV(x, y + size, z + size, icon.getInterpolatedU(u+6), icon.getInterpolatedV(v+6));
Tessellator.instance.addVertexWithUV(x, y + size, z, icon.getInterpolatedU(u+6), icon.getInterpolatedV(v));
//east
Tessellator.instance.setColorOpaque_F(0.7f, 0.75f, 0.8f);
Tessellator.instance.setNormal(1, 0, 0);
Tessellator.instance.addVertexWithUV(x + size, y, z, icon.getInterpolatedU(u), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x + size, y + size, z, icon.getInterpolatedU(u + 6),icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x + size, y + size,z + size,icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x + size, y, z + size, icon.getInterpolatedU(u), icon.getInterpolatedV(v + 6));
//south
Tessellator.instance.setColorOpaque_F(0.9f, 0.95f, 1f);
Tessellator.instance.setNormal(0, 0, 1);
Tessellator.instance.addVertexWithUV(x, y, z + size,icon.getInterpolatedU(u), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x + size, y, z + size, icon.getInterpolatedU(u+6), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x + size, y + size, z + size, icon.getInterpolatedU(u+6), icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x, y + size, z + size, icon.getInterpolatedU(u), icon.getInterpolatedV(v + 6));
//north
Tessellator.instance.setColorOpaque_F(0.9f, 0.95f, 1f);
Tessellator.instance.setNormal(0, 0, -1);
Tessellator.instance.addVertexWithUV(x, y, z, icon.getInterpolatedU(u), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x, y + size, z, icon.getInterpolatedU(u), icon.getInterpolatedV(v +6 ));
Tessellator.instance.addVertexWithUV(x + size, y + size, z, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x + size, y, z, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v));
}
public void drawCubeUpDown(double x, double y, double z, float size, IIcon icon, int u, int v)
{
//bottom side
Tessellator.instance.setColorOpaque_F(0.6f, 0.65f, 0.7f);
Tessellator.instance.setNormal(0, -1, 0);
Tessellator.instance.addVertexWithUV(x, y, z, icon.getInterpolatedU(u), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x + size, y, z, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x + size, y, z + size, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x, y, z + size, icon.getInterpolatedU(u), icon.getInterpolatedV(v + 6));
//top side
Tessellator.instance.setColorOpaque_F(1f,1f,1f);
Tessellator.instance.setNormal(0, 1, 0);
Tessellator.instance.addVertexWithUV(x, y + size, z, icon.getInterpolatedU(u), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x, y + size, z + size,icon.getInterpolatedU(u), icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x + size, y + size, z + size, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x + size, y + size, z, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v));
//west
Tessellator.instance.setColorOpaque_F(0.7f, 0.75f, 0.8f);
Tessellator.instance.setNormal(-1, 0, 0);
Tessellator.instance.addVertexWithUV(x, y, z, icon.getInterpolatedU(u), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x, y, z + size, icon.getInterpolatedU(u), icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x, y + size, z + size, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x, y + size, z, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v));
//east
Tessellator.instance.setColorOpaque_F(0.7f, 0.75f, 0.8f);
Tessellator.instance.setNormal(1, 0, 0);
Tessellator.instance.addVertexWithUV(x + size, y, z, icon.getInterpolatedU(u), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x + size, y + size, z, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x + size, y + size, z+size,icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x + size, y, z + size, icon.getInterpolatedU(u), icon.getInterpolatedV(v + 6));
//south
Tessellator.instance.setColorOpaque_F(0.9f, 0.95f, 1f);
Tessellator.instance.setNormal(0, 0, 1);
Tessellator.instance.addVertexWithUV(x, y, z + size, icon.getInterpolatedU(u), icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x + size, y, z + size, icon.getInterpolatedU(u), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x + size, y + size, z + size, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x, y + size, z + size, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v + 6));
//north
Tessellator.instance.setColorOpaque_F(0.9f, 1f, 0.95f);
Tessellator.instance.setNormal(0, 0, -1);
Tessellator.instance.addVertexWithUV(x, y, z, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x, y + size, z, icon.getInterpolatedU(u), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x + size, y + size, z, icon.getInterpolatedU(u), icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x + size, y, z, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v + 6));
}
public void drawCubeNorthSouth(double x, double y, double z, float size, IIcon icon, int u, int v)
{
//bottom side
Tessellator.instance.setColorOpaque_F(0.6f, 0.65f, 0.7f);
Tessellator.instance.setNormal(0, -1, 0);
Tessellator.instance.addVertexWithUV(x, y, z, icon.getInterpolatedU(u),icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x + size, y, z, icon.getInterpolatedU(u), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x + size, y, z + size, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x, y, z + size, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v + 6));
//top side
Tessellator.instance.setColorOpaque_F(1f, 1f, 1f);
Tessellator.instance.setNormal(0, 1, 0);
Tessellator.instance.addVertexWithUV(x, y + size, z,icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x, y + size, z + size, icon.getInterpolatedU(u), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x + size, y + size, z + size, icon.getInterpolatedU(u), icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x + size, y + size, z, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v + 6));
//west
Tessellator.instance.setColorOpaque_F(0.7f, 0.75f, 0.8f);
Tessellator.instance.setNormal(-1, 0, 0);
Tessellator.instance.addVertexWithUV(x, y, z, icon.getInterpolatedU(u + 6),icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x, y, z + size, icon.getInterpolatedU(u), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x, y + size, z + size, icon.getInterpolatedU(u), icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x, y + size, z, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v + 6));
//east
Tessellator.instance.setColorOpaque_F(0.7f, 0.75f, 0.8f);
Tessellator.instance.setNormal(1, 0, 0);
Tessellator.instance.addVertexWithUV(x + size, y, z, icon.getInterpolatedU(u),icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x + size, y + size, z, icon.getInterpolatedU(u), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x + size, y + size, z + size, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x + size, y, z + size, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v + 6));
//south
Tessellator.instance.setColorOpaque_F(0.9f, 0.95f, 1f);
Tessellator.instance.setNormal(0, 0, 1);
Tessellator.instance.addVertexWithUV(x, y, z + size, icon.getInterpolatedU(u), icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x + size, y, z + size, icon.getInterpolatedU(u), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x + size, y + size, z + size, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x, y + size, z + size, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v + 6));
//north
Tessellator.instance.setColorOpaque_F(0.9f, 0.95f, 1f);
Tessellator.instance.setNormal(0, 0, -1);
Tessellator.instance.addVertexWithUV(x, y, z, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x, y + size, z, icon.getInterpolatedU(u), icon.getInterpolatedV(v));
Tessellator.instance.addVertexWithUV(x + size, y + size, z, icon.getInterpolatedU(u), icon.getInterpolatedV(v + 6));
Tessellator.instance.addVertexWithUV(x + size, y, z, icon.getInterpolatedU(u + 6), icon.getInterpolatedV(v + 6));
}
@Override
public boolean shouldRender3DInInventory(int modelId) {
return true;
}
@Override
public int getRenderId() {
return rendererID;
}
}