/*
* Copyright (c) CovertJaguar, 2014 http://railcraft.info
*
* This code is the property of CovertJaguar
* and may only be used with explicit written
* permission unless otherwise specified on the
* license page at http://railcraft.info/wiki/info:license.
*/
package mods.railcraft.client.render;
import net.minecraft.block.Block;
import net.minecraft.world.IBlockAccess;
import net.minecraft.item.ItemStack;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import mods.railcraft.api.signals.SignalAspect;
import mods.railcraft.client.render.RenderFakeBlock.RenderInfo;
import mods.railcraft.common.blocks.RailcraftBlocks;
import mods.railcraft.common.blocks.signals.BlockSignalRailcraft;
import mods.railcraft.common.blocks.signals.TileBoxBase;
import net.minecraft.util.IIcon;
import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.opengl.GL11;
import static net.minecraftforge.common.util.ForgeDirection.*;
public class RenderSignalBox implements ICombinedRenderer {
private static final RenderInfo info = new RenderInfo();
private final IIconProvider iconProvider;
public RenderSignalBox(IIconProvider iconProvider) {
info.texture = new IIcon[6];
info.template = RailcraftBlocks.getBlockSignal();
this.iconProvider = iconProvider;
}
@Override
public void renderBlock(RenderBlocks renderblocks, IBlockAccess iBlockAccess, int x, int y, int z, Block block) {
TileBoxBase tile = (TileBoxBase) iBlockAccess.getTileEntity(x, y, z);
float pix = RenderTools.PIXEL;
if (renderblocks.hasOverrideBlockTexture())
info.override = renderblocks.overrideBlockTexture;
else
info.override = null;
info.texture[0] = BlockSignalRailcraft.texturesBox[2];
info.texture[1] = iconProvider.getIcon();
info.texture[2] = BlockSignalRailcraft.texturesBox[0];
info.texture[3] = BlockSignalRailcraft.texturesBox[0];
info.texture[4] = BlockSignalRailcraft.texturesBox[0];
info.texture[5] = BlockSignalRailcraft.texturesBox[0];
// info.setBlockBounds(pix, 13 * pix, pix, 15 * pix, 15 * pix, 15 * pix);
// RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
boolean eastWest = false;
boolean northSouth = false;
if (tile.isConnected(EAST) || tile.isConnected(WEST))
eastWest = true;
if (tile.isConnected(NORTH) || tile.isConnected(SOUTH))
northSouth = true;
boolean side2 = tile.isConnected(NORTH);
boolean side3 = tile.isConnected(SOUTH);
boolean side4 = tile.isConnected(WEST);
boolean side5 = tile.isConnected(EAST);
if (!eastWest && !northSouth)
eastWest = true;
if (side2)
info.texture[2] = BlockSignalRailcraft.texturesBox[1];
if (side3)
info.texture[3] = BlockSignalRailcraft.texturesBox[1];
if (side4)
info.texture[4] = BlockSignalRailcraft.texturesBox[1];
if (side5)
info.texture[5] = BlockSignalRailcraft.texturesBox[1];
info.setBlockBounds(2 * pix, 0, 2 * pix, 14 * pix, 15 * pix, 14 * pix);
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
info.renderSide[0] = false;
info.renderSide[1] = false;
// Aspect
for (int side = 2; side < 6; side++) {
SignalAspect aspect = tile.getBoxSignalAspect(ForgeDirection.getOrientation(side));
if (!aspect.isLit())
aspect = SignalAspect.OFF;
IIcon lamp = BlockSignalRailcraft.texturesLampBox[aspect.getTextureIndex()];
info.texture[2] = lamp;
info.texture[3] = lamp;
info.texture[4] = lamp;
info.texture[5] = lamp;
info.renderSide[2] = side == 2 && !side2;
info.renderSide[3] = side == 3 && !side3;
info.renderSide[4] = side == 4 && !side4;
info.renderSide[5] = side == 5 && !side5;
if (!renderblocks.hasOverrideBlockTexture())
info.brightness = aspect.getTextureBrightness();
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, (info.brightness < 0), false);
}
info.brightness = -1;
info.setRenderAllSides();
// Cap
if (!iBlockAccess.isAirBlock(x, y + 1, z)) {
info.texture[1] = BlockSignalRailcraft.texturesBox[3];
info.texture[2] = BlockSignalRailcraft.texturesBox[0];
info.texture[3] = BlockSignalRailcraft.texturesBox[0];
info.texture[4] = BlockSignalRailcraft.texturesBox[0];
info.texture[5] = BlockSignalRailcraft.texturesBox[0];
info.setBlockBounds(5 * pix, 15 * pix, 5 * pix, 11 * pix, 16 * pix, 11 * pix);
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
}
// Connections
info.texture[0] = BlockSignalRailcraft.texturesBox[4];
info.texture[1] = BlockSignalRailcraft.texturesBox[4];
info.texture[2] = BlockSignalRailcraft.texturesBox[5];
info.texture[3] = BlockSignalRailcraft.texturesBox[5];
info.texture[4] = BlockSignalRailcraft.texturesBox[5];
info.texture[5] = BlockSignalRailcraft.texturesBox[5];
float min = 7 * pix;
float max = 9 * pix;
float minY = 10 * pix;
float maxY = 12 * pix;
float minXEW = side4 ? 0.0F : min;
float maxXEW = side5 ? 1.0F : max;
float minZNS = side2 ? 0.0F : min;
float maxZNS = side3 ? 1.0F : max;
if (eastWest) {
info.setBlockBounds(minXEW, minY, min, maxXEW, maxY, max);
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
}
if (northSouth) {
info.setBlockBounds(min, minY, minZNS, max, maxY, maxZNS);
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
}
minY = 5 * pix;
maxY = 7 * pix;
if (eastWest) {
info.setBlockBounds(minXEW, minY, min, maxXEW, maxY, max);
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
}
if (northSouth) {
info.setBlockBounds(min, minY, minZNS, max, maxY, maxZNS);
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
}
}
@Override
public void renderItem(RenderBlocks renderblocks, ItemStack item, ItemRenderType renderType) {
GL11.glColor4f(1, 1, 1, 1);
GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
info.override = null;
float pix = RenderTools.PIXEL;
info.setBlockBounds(2 * pix, 0, 2 * pix, 14 * pix, 15 * pix, 14 * pix);
info.texture[0] = BlockSignalRailcraft.texturesBox[2];
info.texture[1] = iconProvider.getIcon();
info.texture[2] = BlockSignalRailcraft.texturesBox[0];
info.texture[3] = BlockSignalRailcraft.texturesBox[0];
info.texture[4] = BlockSignalRailcraft.texturesBox[0];
info.texture[5] = BlockSignalRailcraft.texturesBox[0];
RenderFakeBlock.renderBlockOnInventory(renderblocks, info, 1);
int texture = SignalAspect.RED.getTextureIndex();
info.renderSide[0] = false;
info.renderSide[1] = false;
info.texture[2] = BlockSignalRailcraft.texturesLampBox[texture];
info.texture[3] = BlockSignalRailcraft.texturesLampBox[texture];
info.texture[4] = BlockSignalRailcraft.texturesLampBox[texture];
info.texture[5] = BlockSignalRailcraft.texturesLampBox[texture];
RenderFakeBlock.renderBlockOnInventory(renderblocks, info, 1);
info.setRenderAllSides();
GL11.glPopAttrib();
}
}