Applied-Energistics-2-tiler.../client/render/blocks/RenderBlockCrafting.java

271 lines
8.7 KiB
Java
Raw Normal View History

2014-05-14 04:42:14 +02:00
package appeng.client.render.blocks;
import java.util.EnumSet;
2014-05-14 04:42:14 +02:00
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
2014-05-14 04:42:14 +02:00
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.common.util.ForgeDirection;
2014-05-14 04:42:14 +02:00
import appeng.block.AEBaseBlock;
import appeng.block.crafting.BlockCraftingUnit;
import appeng.block.crafting.ItemBlockCraftingUnit;
2014-05-14 04:42:14 +02:00
import appeng.client.render.BaseBlockRender;
import appeng.client.render.BusRenderHelper;
import appeng.client.render.BusRenderer;
2014-05-14 04:42:14 +02:00
import appeng.client.texture.ExtraTextures;
import appeng.tile.crafting.TileCraftingTile;
public class RenderBlockCrafting extends BaseBlockRender
{
public RenderBlockCrafting() {
super( false, 20 );
}
@Override
public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type, Object[] obj)
{
if ( is.getItemDamage() == BlockCraftingUnit.BASE_STORAGE )
{
ItemBlockCraftingUnit ibcu = (ItemBlockCraftingUnit) is.getItem();
int bytes = (int) ibcu.getStorageBytes( is );
final int k = 1024;
switch (bytes)
{
case k:
renderer.setOverrideBlockTexture( ExtraTextures.BlockCraftingStorage1k.getIcon() );
break;
case 4 * k:
renderer.setOverrideBlockTexture( ExtraTextures.BlockCraftingStorage4k.getIcon() );
break;
case 16 * k:
renderer.setOverrideBlockTexture( ExtraTextures.BlockCraftingStorage16k.getIcon() );
break;
case 64 * k:
renderer.setOverrideBlockTexture( ExtraTextures.BlockCraftingStorage64k.getIcon() );
break;
}
}
else
renderer.setOverrideBlockTexture( blk.getIcon( 0, is.getItemDamage() ) );
2014-05-14 04:42:14 +02:00
super.renderInventory( blk, is, renderer, type, obj );
renderer.setOverrideBlockTexture( null );
}
@Override
public boolean renderInWorld(AEBaseBlock blk, IBlockAccess w, int x, int y, int z, RenderBlocks renderer)
2014-05-14 04:42:14 +02:00
{
IIcon theIcon = null;
boolean formed = false;
TileCraftingTile ct = blk.getTileEntity( w, x, y, z );
2014-05-14 04:42:14 +02:00
if ( ct != null && ct.isFormed() )
formed = true;
int meta = w.getBlockMetadata( x, y, z ) & 7;
if ( meta == BlockCraftingUnit.BASE_STORAGE )
2014-05-14 04:42:14 +02:00
{
TileCraftingTile tct = (TileCraftingTile) blk.getTileEntity( w, x, y, z );
2014-05-14 04:42:14 +02:00
final int k = 1024;
switch ((int) tct.getStorageBytes())
{
case k:
theIcon = formed ? ExtraTextures.BlockCraftingStorage1kFit.getIcon() : ExtraTextures.BlockCraftingStorage1k.getIcon();
break;
case 4 * k:
theIcon = formed ? ExtraTextures.BlockCraftingStorage4kFit.getIcon() : ExtraTextures.BlockCraftingStorage4k.getIcon();
break;
case 16 * k:
theIcon = formed ? ExtraTextures.BlockCraftingStorage16kFit.getIcon() : ExtraTextures.BlockCraftingStorage16k.getIcon();
break;
case 64 * k:
theIcon = formed ? ExtraTextures.BlockCraftingStorage64kFit.getIcon() : ExtraTextures.BlockCraftingStorage64k.getIcon();
break;
}
}
else
theIcon = blk.getIcon( 0, meta | (formed ? 8 : 0) );
if ( formed )
{
renderer = BusRenderer.instance.renderer;
BusRenderHelper i = BusRenderHelper.instance;
renderer.blockAccess = w;
i.setPass( 0 );
i.ax = ForgeDirection.EAST;
i.ay = ForgeDirection.UP;
i.az = ForgeDirection.SOUTH;
try
{
ct.lightCache = i.useSimpliedRendering( x, y, z, null, ct.lightCache );
}
catch (Throwable t)
{
t.printStackTrace();
}
float highX = isConnected( w, x, y, z, ForgeDirection.EAST ) ? 16 : 13.01f;
float lowX = isConnected( w, x, y, z, ForgeDirection.WEST ) ? 0 : 2.99f;
float highY = isConnected( w, x, y, z, ForgeDirection.UP ) ? 16 : 13.01f;
float lowY = isConnected( w, x, y, z, ForgeDirection.DOWN ) ? 0 : 2.99f;
float highZ = isConnected( w, x, y, z, ForgeDirection.SOUTH ) ? 16 : 13.01f;
float lowZ = isConnected( w, x, y, z, ForgeDirection.NORTH ) ? 0 : 2.99f;
renderCorner( i, renderer, w, x, y, z, ForgeDirection.UP, ForgeDirection.EAST, ForgeDirection.NORTH );
renderCorner( i, renderer, w, x, y, z, ForgeDirection.UP, ForgeDirection.EAST, ForgeDirection.SOUTH );
renderCorner( i, renderer, w, x, y, z, ForgeDirection.UP, ForgeDirection.WEST, ForgeDirection.NORTH );
renderCorner( i, renderer, w, x, y, z, ForgeDirection.UP, ForgeDirection.WEST, ForgeDirection.SOUTH );
renderCorner( i, renderer, w, x, y, z, ForgeDirection.DOWN, ForgeDirection.EAST, ForgeDirection.NORTH );
renderCorner( i, renderer, w, x, y, z, ForgeDirection.DOWN, ForgeDirection.EAST, ForgeDirection.SOUTH );
renderCorner( i, renderer, w, x, y, z, ForgeDirection.DOWN, ForgeDirection.WEST, ForgeDirection.NORTH );
renderCorner( i, renderer, w, x, y, z, ForgeDirection.DOWN, ForgeDirection.WEST, ForgeDirection.SOUTH );
for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS)
{
i.setBounds( fso( side, lowX, ForgeDirection.WEST ), fso( side, lowY, ForgeDirection.DOWN ), fso( side, lowZ, ForgeDirection.NORTH ),
fso( side, highX, ForgeDirection.EAST ), fso( side, highY, ForgeDirection.UP ), fso( side, highZ, ForgeDirection.SOUTH ) );
i.prepareBounds( renderer );
handleSide( x, y, z, i, renderer, theIcon, side, w );
}
i.setFacesToRender( EnumSet.allOf( ForgeDirection.class ) );
i.normalRendering();
return true;
2014-05-14 04:42:14 +02:00
}
else
{
renderer.setOverrideBlockTexture( theIcon );
double a = 0.0 / 16.0;
double o = 16.0 / 16.0;
renderer.setRenderBounds( a, a, a, o, o, o );
2014-05-14 04:42:14 +02:00
boolean out = renderer.renderStandardBlock( blk, x, y, z );
renderer.overrideBlockTexture = null;
return out;
}
}
private void renderCorner(BusRenderHelper i, RenderBlocks renderer, IBlockAccess w, int x, int y, int z, ForgeDirection up, ForgeDirection east,
ForgeDirection south)
{
if ( isConnected( w, x, y, z, up ) )
return;
if ( isConnected( w, x, y, z, east ) )
return;
if ( isConnected( w, x, y, z, south ) )
return;
i.setBounds( gso( east, 3, ForgeDirection.WEST ), gso( up, 3, ForgeDirection.DOWN ), gso( south, 3, ForgeDirection.NORTH ),
gso( east, 13, ForgeDirection.EAST ), gso( up, 13, ForgeDirection.UP ), gso( south, 13, ForgeDirection.SOUTH ) );
i.prepareBounds( renderer );
i.setTexture( ExtraTextures.BlockCraftingUnitRing.getIcon() );
i.renderBlockCurrentBounds( x, y, z, renderer );
}
private float gso(ForgeDirection side, float def, ForgeDirection target)
{
if ( side != target )
{
if ( side.offsetX > 0 || side.offsetY > 0 || side.offsetZ > 0 )
return 16;
return 0;
}
return def;
}
private float fso(ForgeDirection side, float def, ForgeDirection target)
{
if ( side == target )
{
if ( side.offsetX > 0 || side.offsetY > 0 || side.offsetZ > 0 )
return 16;
return 0;
}
return def;
}
private void handleSide(int x, int y, int z, BusRenderHelper i, RenderBlocks renderer, IIcon theIcon, ForgeDirection side, IBlockAccess w)
{
if ( isConnected( w, x, y, z, side ) )
return;
i.setFacesToRender( EnumSet.of( side ) );
i.setTexture( ExtraTextures.BlockCraftingHeatVent.getIcon() );
i.renderBlockCurrentBounds( x, y, z, renderer );
i.setTexture( ExtraTextures.BlockCraftingUnitRingLong.getIcon() );
for (ForgeDirection a : ForgeDirection.VALID_DIRECTIONS)
{
if ( a == side || a == side.getOpposite() )
continue;
double width = 3.0 / 16.0;
if ( !(i.getBound( a ) < 0.001 || i.getBound( a ) > 15.999) )
{
switch (a)
{
case DOWN:
renderer.renderMinY = 0;
renderer.renderMaxY = width;
break;
case EAST:
renderer.renderMaxX = 1;
renderer.renderMinX = 1.0 - width;
renderer.uvRotateTop = 1;
renderer.uvRotateBottom = 1;
renderer.uvRotateWest = 1;
renderer.uvRotateEast = 1;
break;
case NORTH:
renderer.renderMinZ = 0;
renderer.renderMaxZ = width;
renderer.uvRotateWest = 1;
renderer.uvRotateNorth = 1;
renderer.uvRotateSouth = 1;
break;
case SOUTH:
renderer.renderMaxZ = 1;
renderer.renderMinZ = 1.0 - width;
renderer.uvRotateNorth = 1;
renderer.uvRotateSouth = 1;
break;
case UP:
renderer.renderMaxY = 1;
renderer.renderMinY = 1.0 - width;
break;
case WEST:
renderer.renderMinX = 0;
renderer.renderMaxX = width;
renderer.uvRotateTop = 1;
renderer.uvRotateBottom = 1;
renderer.uvRotateWest = 1;
renderer.uvRotateEast = 1;
break;
case UNKNOWN:
default:
}
i.renderBlockCurrentBounds( x, y, z, renderer );
i.prepareBounds( renderer );
renderer.uvRotateBottom = renderer.uvRotateEast = renderer.uvRotateNorth = renderer.uvRotateSouth = renderer.uvRotateWest = renderer.uvRotateTop = 0;
}
}
}
private boolean isConnected(IBlockAccess w, int x, int y, int z, ForgeDirection side)
{
return w.getTileEntity( x + side.offsetX, y + side.offsetY, z + side.offsetZ ) instanceof TileCraftingTile;
}
2014-05-14 04:42:14 +02:00
}