package com.pixelutilitys.models.renderers;
import com.pixelutilitys.config.PixelUtilitysBlocks;
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.EntityRenderer;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import org.lwjgl.opengl.GL11;
public class ConveyorRenderer implements ISimpleBlockRenderingHandler {
@Override
public void renderInventoryBlock(Block block, int meta, int modelID, RenderBlocks renderer) {
Tessellator tessellator = Tessellator.instance;
PixelUtilitysBlocks.BlockConveyor.canRenderInPass(0);
int color = block.getRenderColor(meta);
float red = (color >> 16 & 255) / 255.0F;
float green = (color >> 8 & 255) / 255.0F;
float blue = (color & 255) / 255.0F;
if (EntityRenderer.anaglyphEnable) {
float anaglyphRed = (red * 30.0F + green * 59.0F + blue * 11.0F) / 100.0F;
float anaglyphGreen = (red * 30.0F + green * 70.0F) / 100.0F;
float anaglyphBlue = (red * 30.0F + blue * 70.0F) / 100.0F;
red = anaglyphRed;
green = anaglyphGreen;
blue = anaglyphBlue;
}
IIcon iconBase, iconOverlay;
iconBase = block.getIcon(0, meta);
PixelUtilitysBlocks.BlockConveyor.canRenderInPass(1);
iconOverlay = block.getIcon(0, 0);
double minXBase = iconBase.getMinU();
double maxXBase = iconBase.getMaxU();
double minYBase = iconBase.getMinV();
double maxYBase = iconBase.getMaxV();
double minXOverlay = iconOverlay.getMinU();
double maxXOverlay = iconOverlay.getMaxU();
double minYOverlay = iconOverlay.getMinV();
double maxYOverlay = iconOverlay.getMaxV();
double xMin = 0, xMax = 1;
double yMin = 0, yMax = 1;
double zMid = 0.5;
GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
tessellator.startDrawingQuads();
tessellator.setColorOpaque_F(red, green, blue);
tessellator.addVertexWithUV(xMin, yMax, zMid, minXBase, minYBase);
tessellator.addVertexWithUV(xMin, yMin, zMid, minXBase, maxYBase);
tessellator.addVertexWithUV(xMax, yMin, zMid, maxXBase, maxYBase);
tessellator.addVertexWithUV(xMax, yMax, zMid, maxXBase, minYBase);
tessellator.setColorOpaque_F(1, 1, 1);
tessellator.addVertexWithUV(xMin, yMax, zMid, minXOverlay, minYOverlay);
tessellator.addVertexWithUV(xMin, yMin, zMid, minXOverlay, maxYOverlay);
tessellator.addVertexWithUV(xMax, yMin, zMid, maxXOverlay, maxYOverlay);
tessellator.addVertexWithUV(xMax, yMax, zMid, maxXOverlay, minYOverlay);
tessellator.draw();
GL11.glTranslatef(0.5F, 0.5F, 0.5F);
}
@Override
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
if (renderer.hasOverrideBlockTexture()) {
Tessellator tessellator = Tessellator.instance;
calculateVerts(world, x, y, z);
tessellator.setColorOpaque_F(1.0F, 1.0F, 1.0F);
draw(tessellator, renderer.overrideBlockTexture);
return true;
}
renderConveyorWorld(world, x, y, z, block);
return true;
}
@Override
public boolean shouldRender3DInInventory(int modelId) {
return false;
}
@Override
public int getRenderId() {
return 500;
}
private float vert1x, vert2x, vert3x, vert4x;
private float vert1z, vert2z, vert3z, vert4z;
private float vert1y, vert2y, vert3y, vert4y;
private void renderConveyorWorld(IBlockAccess world, int x, int y, int z, Block block) {
Tessellator tessellator = Tessellator.instance;
int color = block.colorMultiplier(world, x, y, z);
float red = (color >> 16 & 255) / 255.0F;
float green = (color >> 8 & 255) / 255.0F;
float blue = (color & 255) / 255.0F;
if (EntityRenderer.anaglyphEnable) {
float anaglyphRed = (red * 30.0F + green * 59.0F + blue * 11.0F) / 100.0F;
float anaglyphGreen = (red * 30.0F + green * 70.0F) / 100.0F;
float anaglyphBlue = (red * 30.0F + blue * 70.0F) / 100.0F;
red = anaglyphRed;
green = anaglyphGreen;
blue = anaglyphBlue;
}
calculateVerts(world, x, y, z);
tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z));
tessellator.setColorOpaque_F(red, green, blue);
draw(tessellator, block.getIcon(world, x, y, z, 0));
}
private void draw(Tessellator tessellator, IIcon texture) {
double uStart = texture.getInterpolatedU(0);
double uEnd = texture.getInterpolatedU(16);
double vStart = texture.getInterpolatedV(0);
double vEnd = texture.getInterpolatedV(16);
tessellator.addVertexWithUV(vert1x, vert1y, vert1z, uEnd, vStart);
tessellator.addVertexWithUV(vert2x, vert2y, vert2z, uEnd, vEnd);
tessellator.addVertexWithUV(vert3x, vert3y, vert3z, uStart, vEnd);
tessellator.addVertexWithUV(vert4x, vert4y, vert4z, uStart, vStart);
// TODO: thickness
tessellator.addVertexWithUV(vert4x, vert4y, vert4z, uStart, vStart);
tessellator.addVertexWithUV(vert3x, vert3y, vert3z, uStart, vEnd);
tessellator.addVertexWithUV(vert2x, vert2y, vert2z, uEnd, vEnd);
tessellator.addVertexWithUV(vert1x, vert1y, vert1z, uEnd, vStart);
}
private void calculateVerts(IBlockAccess iblockaccess, int blockX, int blockY, int blockZ) {
int conveyorMetadata = iblockaccess.getBlockMetadata(blockX, blockY, blockZ);
float renderHeight = 0.00625F;
vert1x = vert2x = blockX + 1;
vert3x = vert4x = blockX;
vert1z = vert4z = blockZ;
vert2z = vert3z = blockZ + 1;
vert1y = blockY + renderHeight;
vert2y = blockY + renderHeight;
vert3y = blockY + renderHeight;
vert4y = blockY + renderHeight;
if (conveyorMetadata == 0 || conveyorMetadata == 4 || conveyorMetadata == 8) {
vert1x = vert4x = blockX;
vert2x = vert3x = blockX + 1;
vert1z = vert2z = blockZ;
vert3z = vert4z = blockZ + 1;
if (conveyorMetadata == 4) {
vert2y++; // 1,0
vert3y++; // 1,1
}
if (conveyorMetadata == 8) {
vert1y++;
vert4y++;
}
} else if (conveyorMetadata == 1 || conveyorMetadata == 5 || conveyorMetadata == 9) {
vert1x = vert2x = blockX + 1;
vert3x = vert4x = blockX;
vert1z = vert4z = blockZ;
vert2z = vert3z = blockZ + 1;
if (conveyorMetadata == 5) {
vert3y++; // 0,1
vert2y++; // 1,1
}
if (conveyorMetadata == 9) {
vert1y++;
vert4y++;
}
} else if (conveyorMetadata == 2 || conveyorMetadata == 6 || conveyorMetadata == 10) {
vert1x = vert4x = blockX + 1;
vert2x = vert3x = blockX;
vert1z = vert2z = blockZ + 1;
vert3z = vert4z = blockZ;
if (conveyorMetadata == 6) {
vert2y++;
vert3y++;
}
if (conveyorMetadata == 10) {
vert4y++; // 1,0
vert1y++; // 1,1
}
} else if (conveyorMetadata == 3 || conveyorMetadata == 7 || conveyorMetadata == 11) {
vert1x = vert2x = blockX;
vert3x = vert4x = blockX + 1;
vert1z = vert4z = blockZ + 1;
vert2z = vert3z = blockZ;
if (conveyorMetadata == 7) {
vert2y++;
vert3y++;
}
if (conveyorMetadata == 11) {
vert1y++; // 0,1
vert4y++; // 1,1
}
}
}
}