package com.jaquadro.minecraft.gardenstuff.renderer;
import com.jaquadro.minecraft.gardencore.api.block.IChain;
import com.jaquadro.minecraft.gardencore.client.renderer.support.ModularBoxRenderer;
import com.jaquadro.minecraft.gardencore.util.RenderHelper;
import com.jaquadro.minecraft.gardenstuff.block.BlockCandelabra;
import com.jaquadro.minecraft.gardenstuff.block.tile.TileEntityCandelabra;
import com.jaquadro.minecraft.gardenstuff.core.ClientProxy;
import com.jaquadro.minecraft.gardenstuff.core.ModBlocks;
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.opengl.GL11;
public class CandelabraRenderer implements ISimpleBlockRenderingHandler
{
private ModularBoxRenderer boxrender = new ModularBoxRenderer();
@Override
public void renderInventoryBlock (Block block, int metadata, int modelId, RenderBlocks renderer) {
if (!(block instanceof BlockCandelabra))
return;
GL11.glRotatef(90, 0, 1, 0);
GL11.glTranslatef(-.5f, -.5f, -.5f);
renderInventoryBlock((BlockCandelabra) block, metadata, modelId, renderer);
GL11.glTranslatef(.5f, .5f, .5f);
}
private void renderInventoryBlock (BlockCandelabra block, int metadata, int modelId, RenderBlocks renderer) {
int level = metadata;
// Candelsticks
RenderHelper.instance.setRenderBounds(0, 0, 0, 1, 1, 1);
RenderHelper.instance.state.setRenderOffset(0, 0, 0);
renderCandle(renderer.blockAccess, block, metadata);
if (level >= 1) {
RenderHelper.instance.state.setRenderOffset(-.34375f, 0, 0);
renderCandle(renderer.blockAccess, block, metadata);
RenderHelper.instance.state.setRenderOffset(.34375f, 0, 0);
renderCandle(renderer.blockAccess, block, metadata);
}
if (level >= 2) {
RenderHelper.instance.state.setRenderOffset(0, 0, -.34375f);
renderCandle(renderer.blockAccess, block, metadata);
RenderHelper.instance.state.setRenderOffset(0, 0, .34375f);
renderCandle(renderer.blockAccess, block, metadata);
}
// Base
RenderHelper.instance.state.setRenderOffset(0, 0, 0);
RenderHelper.instance.renderCrossedSquares(block, metadata, block.getIconBase());
// Arms
if (level >= 1) {
RenderHelper.instance.state.setRenderOffset(0, 0, 0);
RenderHelper.instance.setRenderBounds(.5f, 0, .5f, 1, 1, 1);
RenderHelper.instance.renderFace(RenderHelper.ZNEG, renderer.blockAccess, block, block.getIconArmExt(), metadata);
RenderHelper.instance.state.setRenderOffset(.5f, 0, 0);
RenderHelper.instance.setRenderBounds(0, 0, 0, .5f, 1, .5f);
RenderHelper.instance.renderFace(RenderHelper.ZPOS, renderer.blockAccess, block, block.getIconArmExt(), metadata);
RenderHelper.instance.state.setRenderOffset(0, 0, 0);
RenderHelper.instance.setRenderBounds(0, 0, .5f, .5f, 1, 1);
RenderHelper.instance.renderFace(RenderHelper.ZNEG, renderer.blockAccess, block, block.getIconArmExt(), metadata);
RenderHelper.instance.state.setRenderOffset(-.5f, 0, 0);
RenderHelper.instance.setRenderBounds(.5f, 0, 0, 1, 1, .5f);
RenderHelper.instance.renderFace(RenderHelper.ZPOS, renderer.blockAccess, block, block.getIconArmExt(), metadata);
}
if (level >= 2) {
RenderHelper.instance.state.setRenderOffset(0, 0, -.5f);
RenderHelper.instance.setRenderBounds(.5f, 0, .5f, 1, 1, 1);
RenderHelper.instance.renderFace(RenderHelper.XNEG, renderer.blockAccess, block, block.getIconArmExt(), metadata);
RenderHelper.instance.state.setRenderOffset(0, 0, 0);
RenderHelper.instance.setRenderBounds(0, 0, 0, .5f, 1, .5f);
RenderHelper.instance.renderFace(RenderHelper.XPOS, renderer.blockAccess, block, block.getIconArmExt(), metadata);
RenderHelper.instance.state.setRenderOffset(0, 0, .5f);
RenderHelper.instance.setRenderBounds(.5f, 0, 0, 1, 1, .5f);
RenderHelper.instance.renderFace(RenderHelper.XNEG, renderer.blockAccess, block, block.getIconArmExt(), metadata);
RenderHelper.instance.state.setRenderOffset(0, 0, 0);
RenderHelper.instance.setRenderBounds(0, 0, .5f, .5f, 1, 1);
RenderHelper.instance.renderFace(RenderHelper.XPOS, renderer.blockAccess, block, block.getIconArmExt(), metadata);
}
RenderHelper.instance.state.clearRenderOffset();
}
private void renderCandle (IBlockAccess world, BlockCandelabra block, int meta) {
float unit = 0.0625f;
RenderHelper.instance.state.setColorMult(1, .9f, .8f, .5f);
boxrender.setUnit(0);
boxrender.setColor(ModularBoxRenderer.COLOR_WHITE);
boxrender.setIcon(block.getIconCandleTop(), 1);
for (int i = 2; i < 6; i++)
boxrender.setIcon(block.getIconCandleSide(), i);
int x = 0;
int y = 0;
int z = 0;
// Candle
boxrender.renderExterior(null, block, x, y, z, unit * 6.5f, unit * 7, unit * 6.5f, unit * 9.5f, unit * 13, unit * 9.5f, 0, ModularBoxRenderer.CUT_YNEG);
RenderHelper.instance.state.resetColorMult();
RenderHelper.instance.setRenderBounds(0, 0, 0, 1, 1, 1);
RenderHelper.instance.renderCrossedSquares(block, meta, block.getIconCandleSide());
// Holder
RenderHelper.instance.setRenderBounds(unit * 5.75f, 0, unit * 5.75f, unit * 10.25f, unit * 7, unit * 10.25f);
RenderHelper.instance.renderFace(RenderHelper.YPOS, world, block, ModBlocks.metalBlock.getIcon(0, 0), meta);
RenderHelper.instance.setRenderBounds(unit * 5.75f, unit * 7, unit * 5.75f, unit * 10.25f, 1, unit * 10.25f);
RenderHelper.instance.renderFace(RenderHelper.YNEG, world, block, ModBlocks.metalBlock.getIcon(0, 0), meta);
RenderHelper.instance.setRenderBounds(0, 0, 0, 1, 1, 1);
RenderHelper.instance.renderCrossedSquares(block, meta, block.getIconHolderSide());
}
@Override
public boolean renderWorldBlock (IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
if (!(block instanceof BlockCandelabra))
return false;
return renderWorldBlock(world, x, y, z, (BlockCandelabra) block, modelId, renderer);
}
private boolean renderWorldBlock (IBlockAccess world, int x, int y, int z, BlockCandelabra block, int modelId, RenderBlocks renderer) {
TileEntityCandelabra tile = (TileEntityCandelabra)world.getTileEntity(x, y, z);
if (tile == null)
return false;
RenderHelper.instance.setColorAndBrightness(world, block, x, y, z);
RenderHelper.instance.state.setRotateTransform(RenderHelper.ZNEG, tile.getDirection());
if (tile.isSconce())
renderSconce(world, x, y, z, block, tile.getLevel());
else
renderCandelabra(world, x, y, z, block, tile.getLevel());
RenderHelper.instance.state.clearRotateTransform();
return true;
}
private void renderCandle (IBlockAccess world, BlockCandelabra block, int x, int y, int z) {
float unit = 0.0625f;
RenderHelper.instance.state.setColorMult(1, .9f, .8f, .5f);
boxrender.setUnit(0);
boxrender.setColor(ModularBoxRenderer.COLOR_WHITE);
boxrender.setIcon(block.getIconCandleTop(), 1);
for (int i = 2; i < 6; i++)
boxrender.setIcon(block.getIconCandleSide(), i);
// Candle
boxrender.renderExterior(world, block, x, y, z, unit * 6.5f, unit * 7, unit * 6.5f, unit * 9.5f, unit * 13, unit * 9.5f, 0, ModularBoxRenderer.CUT_YNEG);
RenderHelper.instance.state.resetColorMult();
RenderHelper.instance.setRenderBounds(0, 0, 0, 1, 1, 1);
RenderHelper.instance.renderCrossedSquares(world, block, x, y, z, block.getIconCandleSide());
// Holder
RenderHelper.instance.setRenderBounds(unit * 5.75f, 0, unit * 5.75f, unit * 10.25f, unit * 7, unit * 10.25f);
RenderHelper.instance.renderFace(RenderHelper.YPOS, world, block, x, y, z, ModBlocks.metalBlock.getIcon(0, 0));
RenderHelper.instance.setRenderBounds(unit * 5.75f, unit * 7, unit * 5.75f, unit * 10.25f, 1, unit * 10.25f);
RenderHelper.instance.renderFace(RenderHelper.YNEG, world, block, x, y, z, ModBlocks.metalBlock.getIcon(0, 0));
RenderHelper.instance.setRenderBounds(0, 0, 0, 1, 1, 1);
RenderHelper.instance.drawCrossedSquares(block.getIconHolderSide(), x, y, z, 1);
}
private void renderCandelabra (IBlockAccess world, int x, int y, int z, BlockCandelabra block, int level) {
Block blockUpper = world.getBlock(x, y + 1, z);
boolean hanging = level > 0 && (blockUpper instanceof IChain || blockUpper.isSideSolid(world, x, y + 1, z, ForgeDirection.DOWN));
// Candelsticks
RenderHelper.instance.setRenderBounds(0, 0, 0, 1, 1, 1);
if (!hanging) {
RenderHelper.instance.state.setRenderOffset(0, .0625f, 0);
renderCandle(world, block, x, y, z);
}
if (level >= 1) {
RenderHelper.instance.state.setRenderOffset(-.34375f, 0, 0);
renderCandle(world, block, x, y, z);
RenderHelper.instance.state.setRenderOffset(.34375f, 0, 0);
renderCandle(world, block, x, y, z);
}
if (level >= 2) {
RenderHelper.instance.state.setRenderOffset(0, 0, -.34375f);
renderCandle(world, block, x, y, z);
RenderHelper.instance.state.setRenderOffset(0, 0, .34375f);
renderCandle(world, block, x, y, z);
}
// Hanger / Base
RenderHelper.instance.setRenderBounds(0, 0, 0, 1, 1, 1);
RenderHelper.instance.state.setRenderOffset(0, 0, 0);
if (hanging)
RenderHelper.instance.drawCrossedSquares(block.getIconHang(), x, y, z, 1);
else
RenderHelper.instance.drawCrossedSquares(block.getIconBase(), x, y, z, 1);
// Arms
if (level >= 1) {
RenderHelper.instance.state.setRenderOffset(0, 0, 0);
RenderHelper.instance.setRenderBounds(.5f, 0, .5f, 1, 1, 1);
RenderHelper.instance.renderFace(RenderHelper.ZNEG, world, block, x, y, z, block.getIconArmExt());
RenderHelper.instance.state.setRenderOffset(.5f, 0, 0);
RenderHelper.instance.setRenderBounds(0, 0, 0, .5f, 1, .5f);
RenderHelper.instance.renderFace(RenderHelper.ZPOS, world, block, x, y, z, block.getIconArmExt());
RenderHelper.instance.state.setRenderOffset(0, 0, 0);
RenderHelper.instance.setRenderBounds(0, 0, .5f, .5f, 1, 1);
RenderHelper.instance.renderFace(RenderHelper.ZNEG, world, block, x, y, z, block.getIconArmExt());
RenderHelper.instance.state.setRenderOffset(-.5f, 0, 0);
RenderHelper.instance.setRenderBounds(.5f, 0, 0, 1, 1, .5f);
RenderHelper.instance.renderFace(RenderHelper.ZPOS, world, block, x, y, z, block.getIconArmExt());
}
if (level >= 2) {
RenderHelper.instance.state.setRenderOffset(0, 0, -.5f);
RenderHelper.instance.setRenderBounds(.5f, 0, .5f, 1, 1, 1);
RenderHelper.instance.renderFace(RenderHelper.XNEG, world, block, x, y, z, block.getIconArmExt());
RenderHelper.instance.state.setRenderOffset(0, 0, 0);
RenderHelper.instance.setRenderBounds(0, 0, 0, .5f, 1, .5f);
RenderHelper.instance.renderFace(RenderHelper.XPOS, world, block, x, y, z, block.getIconArmExt());
RenderHelper.instance.state.setRenderOffset(0, 0, .5f);
RenderHelper.instance.setRenderBounds(.5f, 0, 0, 1, 1, .5f);
RenderHelper.instance.renderFace(RenderHelper.XNEG, world, block, x, y, z, block.getIconArmExt());
RenderHelper.instance.state.setRenderOffset(0, 0, 0);
RenderHelper.instance.setRenderBounds(0, 0, .5f, .5f, 1, 1);
RenderHelper.instance.renderFace(RenderHelper.XPOS, world, block, x, y, z, block.getIconArmExt());
}
RenderHelper.instance.state.clearRenderOffset();
}
private void renderSconce (IBlockAccess world, int x, int y, int z, BlockCandelabra block, int level) {
IIcon centerArmIcon = (level == 0) ? block.getIconArm() : block.getIconArmExt();
RenderHelper.instance.setRenderBounds(0, 0, 0, 1, 1, 1);
// Candlesticks
if (level == 0) {
RenderHelper.instance.state.setRenderOffset(0, -.005f, -.25f);
renderCandle(world, block, x, y, z);
}
if (level == 1 || level == 2) {
RenderHelper.instance.state.setRenderOffset(-.25f, -.005f, -.25f);
renderCandle(world, block, x, y, z);
RenderHelper.instance.state.setRenderOffset(.25f, -.005f, -.25f);
renderCandle(world, block, x, y, z);
}
if (level == 2) {
RenderHelper.instance.state.setRenderOffset(0, 0, -.125f);
renderCandle(world, block, x, y, z);
}
// Angled arms
if (level == 1 || level == 2) {
RenderHelper.instance.setRenderBounds(0, 0, 0, .5f, 1, .5f);
RenderHelper.instance.state.setRenderOffset(.5f, 0, 0);
RenderHelper.instance.drawCrossedSquaresBounded(block.getIconArm(), x, y, z, 1);
RenderHelper.instance.setRenderBounds(.5f, 0, 0, 1, 1, .5f);
RenderHelper.instance.state.setRenderOffset(-.5f, 0, 0);
RenderHelper.instance.drawCrossedSquaresBounded(block.getIconArm(), x, y, z, 1);
}
// Center arm
if (level == 0 || level == 2) {
RenderHelper.instance.setRenderBounds(.5f, 0, 0, 1, 1, .5f);
RenderHelper.instance.state.setRenderOffset(0, 0, .03125f);
RenderHelper.instance.renderFace(RenderHelper.XNEG, world, block, x, y, z, centerArmIcon);
RenderHelper.instance.setRenderBounds(0, 0, 0, .5f, 1, .5f);
RenderHelper.instance.state.setRenderOffset(0, 0, .03125f);
RenderHelper.instance.state.flipTexture = true;
RenderHelper.instance.renderFace(RenderHelper.XPOS, world, block, x, y, z, centerArmIcon);
RenderHelper.instance.state.flipTexture = false;
}
// Plate
RenderHelper.instance.setRenderBounds(.375f, .0625f, 0, 1 - .375f, .375f, .0625f);
RenderHelper.instance.state.clearRenderOffset();
RenderHelper.instance.renderBlock(world, ModBlocks.metalBlock, x, y, z);
RenderHelper.instance.state.clearRenderOffset();
}
@Override
public boolean shouldRender3DInInventory (int modelId) {
return true;
}
@Override
public int getRenderId () {
return ClientProxy.sconceRenderID;
}
}