package matteroverdrive.client.render.tileentity;
import matteroverdrive.Reference;
import matteroverdrive.tile.pipes.TileEntityPipe;
import matteroverdrive.util.math.MOMathHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.opengl.GL11;
import javax.vecmath.*;
public class TileEntityRendererPipe extends TileEntitySpecialRenderer {
private static Vector4d pv1 = new Vector4d(1,1,0,1);
private static Vector4d pv2 = new Vector4d(1,0,0,1);
private static Vector4d pv3 = new Vector4d(0,0,0,1);
private static Vector4d pv4 = new Vector4d(0,1,0,1);
ResourceLocation texture;
protected static double size = 5 * (1d / 15d);
boolean drawInside = false;
float texPixel = 1f / 16f;
public TileEntityRendererPipe()
{
texture = new ResourceLocation(Reference.PATH_BLOCKS + "pipe.png");
}
@Override
public void renderTileEntityAt(TileEntity tileentity, double x,
double y, double z, float f)
{
if(tileentity instanceof TileEntityPipe)
{
TileEntityPipe pipe = (TileEntityPipe) tileentity;
GL11.glPushMatrix();
GL11.glTranslated(x, y, z);
if(texture != null)
this.bindTexture(texture);
drawCore(pipe, x, y, z, f, drawSides(pipe, x, y, z, f));
GL11.glPopMatrix();
}
}
protected int drawSides(TileEntityPipe pipe, double x,
double y, double z, float f)
{
int connections = pipe.getConnectionsMask();
for (int i = 0; i < 6; i++)
{
if (MOMathHelper.getBoolean(connections,i))
{
drawSide(pipe,ForgeDirection.values()[i]);
}
}
return connections;
}
protected void drawCore(TileEntityPipe tile, double x,
double y, double z, float f, int sides)
{
Vector2f uv = getCoreUV(tile);
AxisAngle4d rotation = new AxisAngle4d();
if(drawInside)
GL11.glDisable(GL11.GL_CULL_FACE);
if(sides == 3)
{
uv = getSidesUV(tile, ForgeDirection.UP);
rotation = new AxisAngle4d(0, 0, 1, 90);
}
else if(sides == 12)
{
uv = getSidesUV(tile, ForgeDirection.NORTH);
rotation = new AxisAngle4d(0, 1, 0, 90);
}
else if(sides == 48)
{
uv = getSidesUV(tile, ForgeDirection.WEST);
rotation = new AxisAngle4d(0, 0, 1, 180);
}
drawCube(uv,rotation,new Vector3d());
GL11.glEnable(GL11.GL_CULL_FACE);
}
protected Vector2f getCoreUV(TileEntity entity)
{
return new Vector2f(0, 0);
}
protected Vector2f getSidesUV(TileEntity entity,ForgeDirection dir)
{
return new Vector2f(1, 0);
}
protected void drawSide(TileEntityPipe tile,ForgeDirection dir)
{
if(drawInside)
GL11.glDisable(GL11.GL_CULL_FACE);
Vector3d offset = new Vector3d(dir.offsetX * size, dir.offsetY * size, dir.offsetZ * size);
Vector2f uv = getSidesUV(tile, dir);
if(dir == ForgeDirection.UP || dir == ForgeDirection.DOWN)
{
drawCube(uv,new AxisAngle4d(0, 0, 1, 90),offset);
}
else if(dir == ForgeDirection.WEST || dir == ForgeDirection.EAST)
{
drawCube(uv,new AxisAngle4d(0, 0, 1, 180),offset);
}
else
{
drawCube(uv,new AxisAngle4d(0, 1, 0, 90),offset);
}
GL11.glEnable(GL11.GL_CULL_FACE);
}
void drawCube(Vector2f uv,AxisAngle4d rot,Vector3d pos) {
//down
drawPlane(new Vector3d(0, 0, 1), new AxisAngle4d(1, 0, 0, -90), size, uv, rot, pos);
//up
drawPlane(new Vector3d(0, 1, 0), new AxisAngle4d(1, 0, 0, 90), size, uv, rot, pos);
//north
drawPlane(new Vector3d(), new AxisAngle4d(0, 1, 0, 0), size, uv, rot, pos);
//south
drawPlane(new Vector3d(1, 0, 1), new AxisAngle4d(0, 1, 0, 180), size, uv, rot, pos);
//west
drawPlane(new Vector3d(0, 0, 1), new AxisAngle4d(0, 1, 0, 90), size, uv, rot, pos);
//east
drawPlane(new Vector3d(1, 0, 0), new AxisAngle4d(0, 1, 0, 270), size, uv, rot, pos);
}
void drawPlane(Vector3d pos,AxisAngle4d rot,double scale,Vector2f uv,AxisAngle4d globalRot,Vector3d globalPos)
{
Tessellator.instance.startDrawingQuads();
GL11.glPushMatrix();
GL11.glTranslated(globalPos.x, globalPos.y, globalPos.z);
GL11.glTranslated(0.5 - scale / 2, 0.5 - scale / 2, 0.5 - scale / 2);
GL11.glTranslated(scale / 2, scale / 2, scale / 2);
GL11.glRotated(globalRot.angle,globalRot.x, globalRot.y, globalRot.z);
GL11.glTranslated(-scale / 2, -scale / 2, -scale / 2);
GL11.glScaled(scale, scale, scale);
GL11.glTranslated(pos.x, pos.y, pos.z);
GL11.glRotated(rot.angle, rot.x, rot.y, rot.z);
Vector2f uv1 = new Vector2f(1, 1);
uv1.add(uv);
uv1.scale(6 * texPixel);
Vector2f uv2 = new Vector2f(1, 0);
uv2.add(uv);
uv2.scale(6 * texPixel);
Vector2f uv3 = new Vector2f(0, 0);
uv3.add(uv);
uv3.scale(6 * texPixel);
Vector2f uv4 = new Vector2f(0, 1);
uv4.add(uv);
uv4.scale(6 * texPixel);
Vector3f normal = new Vector3f(0,0,-1);
addVertexWithUV(pv1, uv1.x, uv1.y);
addNormal(normal);
addVertexWithUV(pv2 ,uv2.x, uv2.y);
addNormal(normal);
addVertexWithUV(pv3, uv3.x, uv3.y);
addNormal(normal);
addVertexWithUV(pv4, uv4.x, uv4.y);
addNormal(normal);
Tessellator.instance.draw();
GL11.glPopMatrix();
}
void addVertexWithUV(Vector4d vec,float u,float v)
{
Tessellator.instance.addVertexWithUV(vec.x, vec.y, vec.z, u,v);
}
void addNormal(Vector3f vec)
{
Tessellator.instance.setNormal(vec.x, vec.y, vec.z);
}
}