package com.carpentersblocks.renderer;
import static com.carpentersblocks.renderer.helper.VertexHelper.BOTTOM_LEFT;
import static com.carpentersblocks.renderer.helper.VertexHelper.BOTTOM_RIGHT;
import static com.carpentersblocks.renderer.helper.VertexHelper.TOP_LEFT;
import static com.carpentersblocks.renderer.helper.VertexHelper.TOP_RIGHT;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@SideOnly(Side.CLIENT)
public abstract class BlockHandlerSloped extends BlockHandlerBase {
/** Returns whether side is sloped face. */
public static boolean isSideSloped;
/** Identifies which render helper to use. */
protected int renderID = 0;
/** Holds AO values for all six faces. */
protected float[][] ao = new float[6][4];
/** Holds brightness values for all six faces. */
protected int[][] brightness = new int[6][4];
/** Holds offset AO values for all six faces. */
protected float[][] offset_ao = new float[6][4];
/** Holds offset brightness values for all six faces. */
protected int[][] offset_brightness = new int[6][4];
/**
* Sets renderID to identify which RenderHelper to use
* and passes control to delegateSideRender().
*/
protected final void setIDAndRender(ItemStack itemStack, int renderID, int x, int y, int z, int side)
{
this.renderID = renderID;
delegateSideRender(itemStack, x, y, z, side);
}
/**
* Prepares lighting for block and offset faces.
*/
protected void prepareLighting(ItemStack itemStack, int x, int y, int z)
{
for (int side = 0; side < 6; ++side) {
populateLighting(itemStack, x, y, z, side);
populateOffsetLighting(itemStack, x, y, z, side);
}
}
/**
* Fills ambient occlusion and brightness tables.
*/
private void populateLighting(ItemStack itemStack, int x, int y, int z, int side)
{
switch (side)
{
case DOWN:
lightingHelper.setupLightingYNeg(itemStack, x, y, z);
break;
case UP:
lightingHelper.setupLightingYPos(itemStack, x, y, z);
break;
case NORTH:
lightingHelper.setupLightingZNeg(itemStack, x, y, z);
break;
case SOUTH:
lightingHelper.setupLightingZPos(itemStack, x, y, z);
break;
case WEST:
lightingHelper.setupLightingXNeg(itemStack, x, y, z);
break;
case EAST:
lightingHelper.setupLightingXPos(itemStack, x, y, z);
break;
}
if (renderBlocks.enableAO)
{
ao[side][0] = lightingHelper.ao[TOP_LEFT];
ao[side][1] = lightingHelper.ao[BOTTOM_LEFT];
ao[side][2] = lightingHelper.ao[BOTTOM_RIGHT];
ao[side][3] = lightingHelper.ao[TOP_RIGHT];
brightness[side][0] = renderBlocks.brightnessTopLeft;
brightness[side][1] = renderBlocks.brightnessBottomLeft;
brightness[side][2] = renderBlocks.brightnessBottomRight;
brightness[side][3] = renderBlocks.brightnessTopRight;
}
}
/**
* Fills ambient occlusion and brightness tables for offset block coordinates.
*/
private void populateOffsetLighting(ItemStack itemStack, int x, int y, int z, int side)
{
double renderTemp;
switch (side)
{
case DOWN:
renderTemp = renderBlocks.renderMinY;
renderBlocks.renderMinY = 0.0D;
lightingHelper.setupLightingYNeg(itemStack, x, y + 1, z);
renderBlocks.renderMinY = renderTemp;
break;
case UP:
renderTemp = renderBlocks.renderMaxY;
renderBlocks.renderMaxY = 1.0D;
lightingHelper.setupLightingYPos(itemStack, x, y - 1, z);
renderBlocks.renderMaxY = renderTemp;
break;
case NORTH:
renderTemp = renderBlocks.renderMinZ;
renderBlocks.renderMinZ = 0.0D;
lightingHelper.setupLightingZNeg(itemStack, x, y, z + 1);
renderBlocks.renderMinZ = renderTemp;
break;
case SOUTH:
renderTemp = renderBlocks.renderMaxZ;
renderBlocks.renderMaxZ = 1.0D;
lightingHelper.setupLightingZPos(itemStack, x, y, z - 1);
renderBlocks.renderMaxZ = renderTemp;
break;
case WEST:
renderTemp = renderBlocks.renderMinX;
renderBlocks.renderMinX = 0.0D;
lightingHelper.setupLightingXNeg(itemStack, x + 1, y, z);
renderBlocks.renderMinX = renderTemp;
break;
case EAST:
renderTemp = renderBlocks.renderMaxX;
renderBlocks.renderMaxX = 1.0D;
lightingHelper.setupLightingXPos(itemStack, x - 1, y, z);
renderBlocks.renderMaxX = renderTemp;
break;
}
if (renderBlocks.enableAO)
{
offset_ao[side][0] = lightingHelper.ao[TOP_LEFT];
offset_ao[side][1] = lightingHelper.ao[BOTTOM_LEFT];
offset_ao[side][2] = lightingHelper.ao[BOTTOM_RIGHT];
offset_ao[side][3] = lightingHelper.ao[TOP_RIGHT];
offset_brightness[side][0] = renderBlocks.brightnessTopLeft;
offset_brightness[side][1] = renderBlocks.brightnessBottomLeft;
offset_brightness[side][2] = renderBlocks.brightnessBottomRight;
offset_brightness[side][3] = renderBlocks.brightnessTopRight;
}
}
/**
* A renderSide method that happens after checking if side cover is rendering.
*/
abstract void renderBaseSide(int x, int y, int z, int side, IIcon icon);
@Override
/**
* Renders side.
*/
protected final void render(int x, int y, int z, int side, IIcon icon)
{
if (coverRendering != 6) {
super.render(x, y, z, side, icon);
} else {
renderBaseSide(x, y, z, side, icon);
}
}
/**
* Renders the base cover block.
*/
abstract void renderBaseBlock(ItemStack itemStack, int x, int y, int z);
@Override
/**
* Renders the block.
*/
protected final void renderBlock(ItemStack itemStack, int x, int y, int z)
{
if (coverRendering != 6) {
super.renderBlock(itemStack, x, y, z);
} else {
renderBaseBlock(itemStack, x, y, z);
}
}
}