/*
* 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 mods.railcraft.api.core.IPostConnection.ConnectStyle;
import net.minecraft.block.Block;
import net.minecraft.world.IBlockAccess;
import net.minecraft.item.ItemStack;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.util.IIcon;
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.aesthetics.post.PostConnectionHelper;
import mods.railcraft.common.blocks.signals.BlockSignalRailcraft;
import mods.railcraft.common.blocks.signals.TileSignalBase;
import mods.railcraft.common.plugins.forge.WorldPlugin;
import mods.railcraft.common.util.misc.Game;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.opengl.GL11;
public class RenderSignal implements ICombinedRenderer {
private SignalAspect defaultAspect;
private RenderInfo info = new RenderInfo();
public RenderSignal(SignalAspect defaultAspect) {
this.defaultAspect = defaultAspect;
info.template = RailcraftBlocks.getBlockSignal();
info.texture = new IIcon[6];
}
@Override
public void renderBlock(RenderBlocks renderblocks, IBlockAccess iBlockAccess, int x, int y, int z, Block block) {
TileSignalBase tile = (TileSignalBase) iBlockAccess.getTileEntity(x, y, z);
if (tile == null)
return;
float pix = RenderTools.PIXEL;
int facing = tile.getFacing().ordinal();
if (facing >= info.texture.length)
facing = 0;
// Main
float min = 3 * pix;
float max = 13 * pix;
info.setBlockBounds(min, 6 * pix, min, max, 1, max);
info.texture[0] = BlockSignalRailcraft.texturesSignalSingle[0];
info.texture[1] = BlockSignalRailcraft.texturesSignalSingle[0];
info.texture[2] = BlockSignalRailcraft.texturesSignalSingle[1];
info.texture[3] = BlockSignalRailcraft.texturesSignalSingle[1];
info.texture[4] = BlockSignalRailcraft.texturesSignalSingle[1];
info.texture[5] = BlockSignalRailcraft.texturesSignalSingle[1];
info.texture[facing] = BlockSignalRailcraft.texturesSignalSingle[2];
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
// Aspect
SignalAspect aspect = tile.getSignalAspect();
if (!aspect.isLit())
aspect = SignalAspect.OFF;
info.texture[facing] = BlockSignalRailcraft.texturesLampTop[aspect.getTextureIndex()];
info.setRenderSingleSide(facing);
info.brightness = aspect.getTextureBrightness();
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, (info.brightness < 0), false);
info.brightness = -1;
info.setRenderAllSides();
info.texture[facing] = BlockSignalRailcraft.texturesSignalSingle[2];
// Hood
if (facing == 2 || facing == 3) {
float size = 13 * pix;
if (facing == 2)
size = pix;
info.setBlockBounds(6 * pix, 13 * pix, size, 10 * pix, 14 * pix, size + 2 * pix);
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
info.setBlockBounds(5 * pix, 10 * pix, size, 6 * pix, 14 * pix, size + 2 * pix);
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
info.setBlockBounds(10 * pix, 10 * pix, size, 11 * pix, 14 * pix, size + 2 * pix);
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
} else if (facing == 4 || facing == 5) {
float size = 13 * pix;
if (facing == 4)
size = pix;
info.setBlockBounds(size, 13 * pix, 6 * pix, size + 2 * pix, 14 * pix, 10 * pix);
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
info.setBlockBounds(size, 10 * pix, 5 * pix, size + 2 * pix, 14 * pix, 6 * pix);
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
info.setBlockBounds(size, 10 * pix, 10 * pix, size + 2 * pix, 14 * pix, 11 * pix);
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
}
// Pillar
info.texture[0] = BlockSignalRailcraft.texturesSignalSingle[3];
info.texture[1] = BlockSignalRailcraft.texturesSignalSingle[3];
info.texture[2] = BlockSignalRailcraft.texturesSignalSingle[4];
info.texture[3] = BlockSignalRailcraft.texturesSignalSingle[4];
info.texture[4] = BlockSignalRailcraft.texturesSignalSingle[4];
info.texture[5] = BlockSignalRailcraft.texturesSignalSingle[4];
min = 6 * pix;
max = 10 * pix;
Block below = WorldPlugin.getBlock(iBlockAccess, x, y - 1, z);
World world = Game.getWorld();
if (PostConnectionHelper.connect(iBlockAccess, x, y, z, ForgeDirection.DOWN) != ConnectStyle.NONE
|| iBlockAccess.isSideSolid(x, y - 1, z, ForgeDirection.UP, true)
|| (below != null && below.canPlaceTorchOnTop(world, x, y - 1, z))) {
info.setBlockBounds(min, 0, min, max, 15 * pix, max);
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
}
// Post Connections
boolean east_west = false;
boolean north_south = false;
boolean west = PostConnectionHelper.connect(iBlockAccess, x, y, z, ForgeDirection.WEST) != ConnectStyle.NONE;
boolean east = PostConnectionHelper.connect(iBlockAccess, x, y, z, ForgeDirection.EAST) != ConnectStyle.NONE;
boolean north = PostConnectionHelper.connect(iBlockAccess, x, y, z, ForgeDirection.NORTH) != ConnectStyle.NONE;
boolean south = PostConnectionHelper.connect(iBlockAccess, x, y, z, ForgeDirection.SOUTH) != ConnectStyle.NONE;
if (east || west)
east_west = true;
if (north || south)
north_south = true;
if (!east_west && !north_south)
east_west = true;
float f = 0.4375F;
float f1 = 0.5625F;
float f2 = 11 * pix;
float f3 = 14 * pix;
float f4 = west ? 0 : f;
float f5 = east ? 1 : f1;
float f6 = north ? 0 : f;
float f7 = south ? 1 : f1;
if (east_west) {
info.setBlockBounds(f4, f2, f, f5, f3, f1);
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
}
if (north_south) {
info.setBlockBounds(f, f2, f6, f1, f3, f7);
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
}
f2 = 5 * pix;
f3 = 8 * pix;
if (east_west) {
info.setBlockBounds(f4, f2, f, f5, f3, f1);
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
}
if (north_south) {
info.setBlockBounds(f, f2, f6, f1, f3, f7);
RenderFakeBlock.renderBlock(info, iBlockAccess, x, y, z, true, false);
}
}
@Override
public void renderItem(RenderBlocks renderblocks, ItemStack item, ItemRenderType renderType) {
float pix = RenderTools.PIXEL;
float min = 6 * pix;
float max = 10 * pix;
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.texture[0] = BlockSignalRailcraft.texturesSignalSingle[3];
info.texture[1] = BlockSignalRailcraft.texturesSignalSingle[3];
info.texture[2] = BlockSignalRailcraft.texturesSignalSingle[4];
info.texture[3] = BlockSignalRailcraft.texturesSignalSingle[4];
info.texture[4] = BlockSignalRailcraft.texturesSignalSingle[4];
info.texture[5] = BlockSignalRailcraft.texturesSignalSingle[4];
info.setBlockBounds(min, 0, min, max, 15 * pix, max);
RenderFakeBlock.renderBlockOnInventory(renderblocks, info, 1);
info.texture[0] = BlockSignalRailcraft.texturesSignalSingle[0];
info.texture[1] = BlockSignalRailcraft.texturesSignalSingle[0];
info.texture[2] = BlockSignalRailcraft.texturesSignalSingle[1];
info.texture[3] = BlockSignalRailcraft.texturesSignalSingle[2];
info.texture[4] = BlockSignalRailcraft.texturesSignalSingle[1];
info.texture[5] = BlockSignalRailcraft.texturesSignalSingle[1];
min = 3 * pix;
max = 13 * pix;
info.setBlockBounds(min, 6 * pix, min, max, 1, max);
RenderFakeBlock.renderBlockOnInventory(renderblocks, info, 1);
info.texture[3] = BlockSignalRailcraft.texturesLampTop[defaultAspect.getTextureIndex()];
RenderFakeBlock.renderBlockOnInventory(renderblocks, info, 1, 3);
info.texture[3] = BlockSignalRailcraft.texturesSignalSingle[2];
float size = 13 * pix;
info.setBlockBounds(6 * pix, 13 * pix, size, 10 * pix, 14 * pix, size + 2 * pix);
RenderFakeBlock.renderBlockOnInventory(renderblocks, info, 1);
info.setBlockBounds(5 * pix, 10 * pix, size, 6 * pix, 14 * pix, size + 2 * pix);
RenderFakeBlock.renderBlockOnInventory(renderblocks, info, 1);
info.setBlockBounds(10 * pix, 10 * pix, size, 11 * pix, 14 * pix, size + 2 * pix);
RenderFakeBlock.renderBlockOnInventory(renderblocks, info, 1);
GL11.glPopAttrib();
}
}