package com.amadornes.framez.client;
import java.awt.Rectangle;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.Direction;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer;
import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.opengl.GL11;
import uk.co.qmunity.lib.client.render.RenderHelper;
import uk.co.qmunity.lib.texture.Layout;
import uk.co.qmunity.lib.vec.Vec3d;
import uk.co.qmunity.lib.vec.Vec3dCube;
import com.amadornes.framez.api.movement.IMovement;
import com.amadornes.framez.api.movement.IMovement.IMovementSlide;
import com.amadornes.framez.ref.ModInfo;
import com.amadornes.framez.ref.References;
import com.amadornes.framez.tile.TileMotor;
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@SideOnly(Side.CLIENT)
public class RenderMotor extends TileEntitySpecialRenderer implements ISimpleBlockRenderingHandler, IItemRenderer {
public static final int RENDER_ID = RenderingRegistry.getNextAvailableRenderId();
// Item rendering
@Override
public boolean handleRenderType(ItemStack item, ItemRenderType type) {
return true;
}
@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
return true;
}
@Override
public boolean shouldRender3DInInventory(int modelId) {
return true;
}
@Override
public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
Tessellator t = Tessellator.instance;
boolean blend = GL11.glGetBoolean(GL11.GL_BLEND);
boolean alpha = GL11.glGetBoolean(GL11.GL_ALPHA_TEST);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glEnable(GL11.GL_ALPHA_TEST);
GL11.glPushMatrix();
{
if (type == ItemRenderType.INVENTORY)
GL11.glTranslated(0, -0.0625, 0);
if (type == ItemRenderType.ENTITY)
GL11.glTranslated(-0.5, -0.45, -0.5);
t.startDrawingQuads();
RenderHelper renderer = RenderHelper.instance;
renderer.fullReset();
IIcon border = IconSupplier.motor_border;
IIcon center = IconSupplier.motor_center;
renderer.renderBox(new Vec3dCube(0, 0, 0, 1, 1, 1), border);
renderer.setRenderFromInside(true);
{
renderer.renderBox(new Vec3dCube(0, 2 / 16D, 2 / 16D, 1, 14 / 16D, 14 / 16D), border);
renderer.renderBox(new Vec3dCube(2 / 16D, 0, 2 / 16D, 14 / 16D, 1, 14 / 16D), border);
renderer.renderBox(new Vec3dCube(2 / 16D, 2 / 16D, 0, 14 / 16D, 14 / 16D, 1), border);
}
renderer.renderBox(new Vec3dCube(1 / 16D, 1 / 16D, 1 / 16D, 15 / 16D, 15 / 16D, 15 / 16D), center);
renderer.setRenderFromInside(false);
renderer.renderBox(new Vec3dCube(1 / 16D, 1 / 16D, 1 / 16D, 15 / 16D, 15 / 16D, 15 / 16D), center);
t.draw();
}
GL11.glPopMatrix();
if (!blend)
GL11.glDisable(GL11.GL_BLEND);
if (!alpha)
GL11.glDisable(GL11.GL_ALPHA_TEST);
}
@Override
public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
}
// Static rendering
@Override
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks rb) {
TileEntity tile = world.getTileEntity(x, y, z);
if (tile == null || !(tile instanceof TileMotor))
return false;
TileMotor te = (TileMotor) tile;
RenderHelper renderer = RenderHelper.instance;
renderer.fullReset();
renderer.setRenderCoords(world, x, y, z);
IIcon border = IconSupplier.motor_border;
IIcon center = IconSupplier.motor_center;
renderer.renderBox(new Vec3dCube(0, 0, 0, 1, 1, 1), border);
renderer.setRenderFromInside(true);
{
renderer.renderBox(new Vec3dCube(0, 2 / 16D, 2 / 16D, 1, 14 / 16D, 14 / 16D), border);
renderer.renderBox(new Vec3dCube(2 / 16D, 0, 2 / 16D, 14 / 16D, 1, 14 / 16D), border);
renderer.renderBox(new Vec3dCube(2 / 16D, 2 / 16D, 0, 14 / 16D, 14 / 16D, 1), border);
}
AxisAlignedBB box = new Vec3dCube(1 / 16D, 1 / 16D, 1 / 16D, 15 / 16D, 15 / 16D, 15 / 16D).toAABB();
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
if (world.getBlock(x * dir.offsetX, y * dir.offsetY, z * dir.offsetZ).canConnectRedstone(world, x, y, z,
Direction.getMovementDirection(dir.offsetX, dir.offsetZ)))
box = box.addCoord(dir.offsetX * (1 / 16D - 0.001), dir.offsetY * (1 / 16D - 0.001), dir.offsetZ * (1 / 16D - 0.001));
renderer.renderBox(new Vec3dCube(box), center);
renderer.setRenderFromInside(false);
renderer.renderBox(new Vec3dCube(box), center);
// Render arrows
{
renderer.setColor(0xFF0000);
IMovement movement = te.getMovement();
if (movement != null) {
if (movement instanceof IMovementSlide) {
ForgeDirection face = te.getFace();
ForgeDirection mdir = ((IMovementSlide) movement).getDirection();
ForgeDirection dir = null;
int rot = 0;
boolean flip = false;
for (ForgeDirection d : ForgeDirection.VALID_DIRECTIONS) {
if (d != face && d != face.getOpposite() && d != mdir && d != mdir.getOpposite()) {
dir = d;
if (d == ForgeDirection.NORTH || d == ForgeDirection.SOUTH) {
if (face == ForgeDirection.DOWN && mdir == ForgeDirection.EAST)
flip = true;
if (face == ForgeDirection.UP) {
rot = 2;
if (mdir == ForgeDirection.WEST)
flip = true;
}
if (face == ForgeDirection.WEST) {
rot = 3;
if (mdir == ForgeDirection.DOWN)
flip = true;
}
if (face == ForgeDirection.EAST) {
rot = 1;
if (mdir == ForgeDirection.UP)
flip = true;
}
}
if (d == ForgeDirection.EAST || d == ForgeDirection.WEST) {
if (face == ForgeDirection.DOWN) {
rot = 1;
if (mdir == ForgeDirection.NORTH)
flip = true;
}
if (face == ForgeDirection.UP) {
rot = 3;
if (mdir == ForgeDirection.SOUTH)
flip = true;
}
if (face == ForgeDirection.NORTH) {
rot = 2;
if (mdir == ForgeDirection.UP)
flip = true;
}
if (face == ForgeDirection.SOUTH && mdir == ForgeDirection.DOWN)
flip = true;
}
if (d == ForgeDirection.DOWN || d == ForgeDirection.UP) {
if (face == ForgeDirection.SOUTH && mdir == ForgeDirection.EAST)
flip = true;
if (face == ForgeDirection.NORTH) {
rot = 2;
if (mdir == ForgeDirection.WEST)
flip = true;
}
if (face == ForgeDirection.EAST) {
rot = 1;
if (mdir == ForgeDirection.NORTH)
flip = true;
}
if (face == ForgeDirection.WEST) {
rot = 3;
if (mdir == ForgeDirection.SOUTH)
flip = true;
}
}
break;
}
}
Layout layout = new Layout("/assets/" + ModInfo.MODID + "/textures/blocks/" + References.Texture.MOTOR_ARROW_SLIDE);
double pixel = 1 / (double) layout.getLayout(0xFF0000).getWidth();
for (Rectangle r : layout.getSimplifiedLayout(0xFF0000).getRectangles())
renderer.renderBox(
new Vec3dCube(flip ? (1 - r.getMinX() * pixel) : r.getMinX() * pixel, 1 / 64D, r.getMinY() * pixel,
flip ? (1 - r.getMaxX() * pixel) : r.getMaxX() * pixel, 63 / 64D, r.getMaxY() * pixel).rotate(0,
rot * 90, 0, Vec3d.center).rotate(dir, Vec3d.center), center);
}
}
}
return true;
}
@Override
public int getRenderId() {
return RENDER_ID;
}
// Dynamic rendering
@Override
public void renderTileEntityAt(TileEntity te, double x, double y, double z, float frame) {
}
}