package net.minecraft.src;

import org.lwjgl.opengl.GL11;

/**
 * Common rendering utils for PowerCraft
 * 
 * @author MightyPork
 * @copy (c) 2012
 */
public class PC_Renderer {

	/** Block with alternative terrain file */
	public static int swapTerrainRenderer = 0;
	/** block with rotated top face (gates and conveyors) */
	public static int rotatedBoxRenderer = 0;

	/**
	 * Render block by render type.<br>
	 * Works for swapTerrainRenderer and rotatedBoxRenderer
	 * 
	 * @param renderblocks block renderer
	 * @param blockAccess block access
	 * @param i x
	 * @param j y
	 * @param k z
	 * @param block the block
	 * @param rtype render type
	 * @return success
	 */
	public static boolean renderBlockByType(RenderBlocks renderblocks, IBlockAccess blockAccess, int i, int j, int k, Block block, int rtype) {
		if (rtype == swapTerrainRenderer) {
			return renderBlockSwapTerrain(renderblocks, blockAccess, i, j, k, block);
		} else if (rtype == rotatedBoxRenderer) { return renderBlockRotatedBox(renderblocks, blockAccess, i, j, k, block); }
		return false;
	}

	/**
	 * Render world block with swapped terrain - must implement PC_ISwapTerrain
	 * 
	 * @param renderblocks block renderer
	 * @param blockAccess block access
	 * @param i x
	 * @param j y
	 * @param k z
	 * @param block the block
	 * @param rtype render type
	 * @return success
	 */
	public static boolean renderBlockSwapTerrain(RenderBlocks renderblocks, IBlockAccess blockAccess, int i, int j, int k, Block block) {

		RenderEngine renderengine = ModLoader.getMinecraftInstance().renderEngine;
		Tessellator tessellator = Tessellator.instance;

		/**
		 * Standard block, but with swapped terrain
		 */
		if (block instanceof PC_ISwapTerrain) {
			tessellator.draw();
			tessellator.startDrawingQuads();
			renderengine.bindTexture(renderengine.getTexture(((PC_ISwapTerrain) block).getTerrainFile()));

			boolean gf = RenderBlocks.cfgGrassFix;
			RenderBlocks.cfgGrassFix = false;

			block.setBlockBoundsBasedOnState(blockAccess, i, j, k);
			renderblocks.renderStandardBlock(block, i, j, k);

			RenderBlocks.cfgGrassFix = gf;

			tessellator.draw();
			tessellator.startDrawingQuads();
			renderengine.bindTexture(renderengine.getTexture("/terrain.png"));
			return true;
		}

		return false;
	}

	/**
	 * Render world block as Rotated Box - must implement PC_IRotatedBox
	 * 
	 * @param renderblocks block renderer
	 * @param blockAccess block access
	 * @param i x
	 * @param j y
	 * @param k z
	 * @param block the block
	 * @param rtype render type
	 * @return success
	 */
	public static boolean renderBlockRotatedBox(RenderBlocks renderblocks, IBlockAccess blockAccess, int i, int j, int k, Block block) {

		RenderEngine renderengine = ModLoader.getMinecraftInstance().renderEngine;
		Tessellator tessellator = Tessellator.instance;
		int metaAt = blockAccess.getBlockMetadata(i, j, k);

		if (block instanceof PC_IRotatedBox) {

			tessellator.draw();
			tessellator.startDrawingQuads();

			if (block instanceof PC_ISwapTerrain) {
				renderengine.bindTexture(renderengine.getTexture(((PC_ISwapTerrain) block).getTerrainFile()));
			}

			block.setBlockBoundsBasedOnState(blockAccess, i, j, k);
			int l = ((PC_IRotatedBox) block).getRotation(metaAt);
			int i1 = l;
			renderblocks.renderStandardBlock(block, i, j, k);

			tessellator.setBrightness(block.getMixedBrightnessForBlock(blockAccess, i, j, k));
			tessellator.setColorOpaque_F(1.0F, 1.0F, 1.0F);
			tessellator.setNormal(0.0F, 1F, 0.0F);
			int k1 = block.getBlockTexture(blockAccess, i, j, k, 1);
			int l1 = (k1 & 0xf) << 4;
			int i2 = k1 & 0xf0;
			double d5 = l1 / 256F;
			double d6 = (l1 + 15.99F) / 256F;
			double d7 = i2 / 256F;
			double d8 = (i2 + 15.99F) / 256F;
			double d9 = (block.maxY);
			double d10 = i + block.maxX;
			double d11 = i + block.maxX;
			double d12 = i + block.minX;
			double d13 = i + block.minX;
			double d14 = k + block.minZ;
			double d15 = k + block.maxZ;
			double d16 = k + block.maxZ;
			double d17 = k + block.minZ;
			double d18 = j + d9;
			if (i1 == 2) {
				d10 = d11 = i + block.minX;
				d12 = d13 = i + block.maxX;
				d14 = d17 = k + block.maxZ;
				d15 = d16 = k + block.minZ;
			} else if (i1 == 3) {
				d10 = d13 = i + block.minX;
				d11 = d12 = i + block.maxX;
				d14 = d15 = k + block.minZ;
				d16 = d17 = k + block.maxZ;
			} else if (i1 == 1) {
				d10 = d13 = i + block.maxX;
				d11 = d12 = i + block.minX;
				d14 = d15 = k + block.maxZ;
				d16 = d17 = k + block.minZ;
			}

			tessellator.addVertexWithUV(d13, d18, d17, d5, d7);
			tessellator.addVertexWithUV(d12, d18, d16, d5, d8);
			tessellator.addVertexWithUV(d11, d18, d15, d6, d8);
			tessellator.addVertexWithUV(d10, d18, d14, d6, d7);

			tessellator.draw();
			tessellator.startDrawingQuads();
			if (block instanceof PC_ISwapTerrain) {
				renderengine.bindTexture(renderengine.getTexture("/terrain.png"));
			}

			return true;
		}

		return false;
	}

	/* ITEMS */

	public static void renderInvBlockByType(RenderBlocks renderblocks, Block block, int meta, int rtype) {
		if (rtype == swapTerrainRenderer) {
			renderInvBlockSwapTerrain(renderblocks, block, meta);
		} else if (rtype == rotatedBoxRenderer) {
			renderInvBlockRotatedBox(renderblocks, block, meta);
		}
		return;
	}

	/**
	 * Render block on inventory. Set it's bounds before rendering if you want.<br>
	 * Does not swap terrain, do it before and after calling it.
	 * 
	 * @param renderblocks
	 * @param block
	 * @param meta
	 */
	public static void renderInvBox(RenderBlocks renderblocks, Block block, int meta) {
		Tessellator tessellator = Tessellator.instance;

		GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
		tessellator.startDrawingQuads();
		tessellator.setNormal(0.0F, -1F, 0.0F);
		renderblocks.renderBottomFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(0, meta));
		tessellator.draw();
		tessellator.startDrawingQuads();
		tessellator.setNormal(0.0F, 1.0F, 0.0F);
		renderblocks.renderTopFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(1, meta));
		tessellator.draw();
		tessellator.startDrawingQuads();
		tessellator.setNormal(0.0F, 0.0F, -1F);
		renderblocks.renderEastFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(2, meta));
		tessellator.draw();
		tessellator.startDrawingQuads();
		tessellator.setNormal(0.0F, 0.0F, 1.0F);
		renderblocks.renderWestFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(3, meta));
		tessellator.draw();
		tessellator.startDrawingQuads();
		tessellator.setNormal(-1F, 0.0F, 0.0F);
		renderblocks.renderNorthFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(4, meta));
		tessellator.draw();
		tessellator.startDrawingQuads();
		tessellator.setNormal(1.0F, 0.0F, 0.0F);
		renderblocks.renderSouthFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(5, meta));
		tessellator.draw();
		GL11.glTranslatef(0.5F, 0.5F, 0.5F);
	}

	/**
	 * Render item block with swapped terrain.
	 * 
	 * @param renderblocks
	 * @param block
	 * @param meta
	 */
	public static void renderInvBlockSwapTerrain(RenderBlocks renderblocks, Block block, int meta) {
		RenderEngine renderengine = ModLoader.getMinecraftInstance().renderEngine;
		Tessellator tessellator = Tessellator.instance;

		if (block instanceof PC_ISwapTerrain) {
			int[] textures = new int[6];
			if (block instanceof PC_IInvTextures) {
				for (int a = 0; a < 6; a++) {
					textures[a] = ((PC_IInvTextures) block).getInvTexture(a, meta);
				}
			} else {
				for (int a = 0; a < 6; a++) {
					textures[a] = block.getBlockTextureFromSideAndMetadata(a, meta);
				}
			}

			renderengine.bindTexture(renderengine.getTexture(((PC_ISwapTerrain) block).getTerrainFile()));

			block.setBlockBoundsForItemRender();
			GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
			tessellator.startDrawingQuads();
			tessellator.setNormal(0.0F, -1F, 0.0F);
			renderblocks.renderBottomFace(block, 0.0D, 0.0D, 0.0D, textures[0]);
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(0.0F, 1.0F, 0.0F);
			renderblocks.renderTopFace(block, 0.0D, 0.0D, 0.0D, textures[1]);
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(0.0F, 0.0F, -1F);
			renderblocks.renderEastFace(block, 0.0D, 0.0D, 0.0D, textures[2]);
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(0.0F, 0.0F, 1.0F);
			renderblocks.renderWestFace(block, 0.0D, 0.0D, 0.0D, textures[3]);
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(-1F, 0.0F, 0.0F);
			renderblocks.renderNorthFace(block, 0.0D, 0.0D, 0.0D, textures[4]);
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(1.0F, 0.0F, 0.0F);
			renderblocks.renderSouthFace(block, 0.0D, 0.0D, 0.0D, textures[5]);
			tessellator.draw();
			GL11.glTranslatef(0.5F, 0.5F, 0.5F);

			renderengine.bindTexture(renderengine.getTexture("/terrain.png"));

			return;
		}
	}

	/**
	 * Render item block as rotated box
	 * 
	 * @param renderblocks
	 * @param block
	 * @param meta
	 */
	public static void renderInvBlockRotatedBox(RenderBlocks renderblocks, Block block, int meta) {
		RenderEngine renderengine = ModLoader.getMinecraftInstance().renderEngine;
		Tessellator tessellator = Tessellator.instance;

		if (block instanceof PC_IRotatedBox) {

			if (block instanceof PC_ISwapTerrain) {
				renderengine.bindTexture(renderengine.getTexture(((PC_ISwapTerrain) block).getTerrainFile()));
			}

			boolean asr = ((PC_IRotatedBox) block).allSidesRotate();

			block.setBlockBoundsForItemRender();
			GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
			tessellator.startDrawingQuads();
			tessellator.setNormal(0.0F, -1F, 0.0F);
			renderblocks.renderBottomFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(asr ? 0 : 0, meta));
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(0.0F, 1.0F, 0.0F);
			renderblocks.renderTopFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(asr ? 1 : 0, meta));
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(0.0F, 0.0F, -1F);
			renderblocks.renderEastFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(asr ? 2 : 0, meta));
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(0.0F, 0.0F, 1.0F);
			renderblocks.renderWestFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(asr ? 3 : 1, meta));
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(-1F, 0.0F, 0.0F);
			renderblocks.renderNorthFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(asr ? 4 : 0, meta));
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(1.0F, 0.0F, 0.0F);
			renderblocks.renderSouthFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(asr ? 5 : 0, meta));
			tessellator.draw();
			GL11.glTranslatef(0.5F, 0.5F, 0.5F);

			if (block instanceof PC_ISwapTerrain) {
				renderengine.bindTexture(renderengine.getTexture("/terrain.png"));
			}
			return;
		}
	}

}
