Package appeng.client.render.blocks

Source Code of appeng.client.render.blocks.RenderBlockCraftingCPU

package appeng.client.render.blocks;

import java.util.EnumSet;

import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.AEApi;
import appeng.api.util.AEColor;
import appeng.block.AEBaseBlock;
import appeng.block.crafting.BlockCraftingMonitor;
import appeng.block.crafting.BlockCraftingUnit;
import appeng.client.render.BaseBlockRender;
import appeng.client.render.BusRenderHelper;
import appeng.client.render.BusRenderer;
import appeng.client.texture.ExtraBlockTextures;
import appeng.tile.crafting.TileCraftingMonitorTile;
import appeng.tile.crafting.TileCraftingTile;

public class RenderBlockCraftingCPU extends BaseBlockRender
{

  protected RenderBlockCraftingCPU(boolean useTesr, int range) {
    super( useTesr, range );
  }

  public RenderBlockCraftingCPU() {
    super( false, 20 );
  }

  @Override
  public boolean renderInWorld(AEBaseBlock blk, IBlockAccess w, int x, int y, int z, RenderBlocks renderer)
  {
    IIcon theIcon = null;
    boolean formed = false;
    boolean emitsLight = false;

    TileCraftingTile ct = blk.getTileEntity( w, x, y, z );
    if ( ct != null && ct.isFormed() )
    {
      formed = true;
      emitsLight = ct.isPowered();
    }
    int meta = w.getBlockMetadata( x, y, z ) & 3;

    boolean isMonitor = blk.getClass() == BlockCraftingMonitor.class;
    theIcon = blk.getIcon( ForgeDirection.SOUTH.ordinal(), meta | (formed ? 8 : 0) );

    IIcon nonForward = theIcon;
    if ( isMonitor )
      nonForward = AEApi.instance().blocks().blockCraftingUnit.block().getIcon( 0, meta | (formed ? 8 : 0) );

    if ( formed && renderer.overrideBlockTexture == null )
    {
      renderer = BusRenderer.instance.renderer;
      BusRenderHelper i = BusRenderHelper.instance;
      BusRenderer.instance.renderer.isFacade = true;

      renderer.blockAccess = w;
      i.setPass( 0 );
      i.setOrientation( ForgeDirection.EAST, ForgeDirection.UP, ForgeDirection.SOUTH );

      try
      {
        ct.lightCache = i.useSimplifiedRendering( x, y, z, null, ct.lightCache );
      }
      catch (Throwable ignored)
      {

      }

      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 );

        boolean LocalEmit = emitsLight;
        if ( blk instanceof BlockCraftingMonitor && !ct.getForward().equals( side ) )
          LocalEmit = false;

        handleSide( blk, meta, x, y, z, i, renderer, ct.getForward().equals( side ) ? theIcon : nonForward, LocalEmit, isMonitor, side, w );
      }

      BusRenderer.instance.renderer.isFacade = false;
      i.setFacesToRender( EnumSet.allOf( ForgeDirection.class ) );
      i.normalRendering();

      return true;
    }
    else
    {
      double a = 0.0 / 16.0;
      double o = 16.0 / 16.0;
      renderer.setRenderBounds( a, a, a, o, o, o );

      return renderer.renderStandardBlock( blk, x, y, z );
    }
  }

  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( ExtraBlockTextures.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(AEBaseBlock blk, int meta, int x, int y, int z, BusRenderHelper i, RenderBlocks renderer, IIcon color, boolean emitsLight,
      boolean isMonitor, ForgeDirection side, IBlockAccess w)
  {
    if ( isConnected( w, x, y, z, side ) )
      return;

    i.setFacesToRender( EnumSet.of( side ) );

    if ( meta == 0 && blk.getClass() == BlockCraftingUnit.class )
    {
      i.setTexture( ExtraBlockTextures.BlockCraftingUnitFit.getIcon() );
      i.renderBlockCurrentBounds( x, y, z, renderer );
    }
    else
    {
      if ( color == ExtraBlockTextures.BlockCraftingMonitorFit_Light.getIcon() )
        i.setTexture( ExtraBlockTextures.BlockCraftingMonitorOuter.getIcon() );
      else
        i.setTexture( ExtraBlockTextures.BlockCraftingFitSolid.getIcon() );

      i.renderBlockCurrentBounds( x, y, z, renderer );

      if ( color != null )
      {
        i.setTexture( color );

        if ( !emitsLight )
        {
          if ( color == ExtraBlockTextures.BlockCraftingMonitorFit_Light.getIcon() )
          {
            int b = w.getLightBrightnessForSkyBlocks( x + side.offsetX, y + side.offsetY, z + side.offsetZ, 0 );

            TileCraftingMonitorTile sr = blk.getTileEntity( w, x, y, z );
            AEColor col = sr.getColor();

            Tessellator.instance.setBrightness( b );
            Tessellator.instance.setColorOpaque_I( col.whiteVariant );
            i.renderFace( x, y, z, color, side, renderer );

            Tessellator.instance.setColorOpaque_I( col.mediumVariant );
            i.renderFace( x, y, z, ExtraBlockTextures.BlockCraftingMonitorFit_Medium.getIcon(), side, renderer );

            Tessellator.instance.setColorOpaque_I( col.blackVariant );
            i.renderFace( x, y, z, ExtraBlockTextures.BlockCraftingMonitorFit_Dark.getIcon(), side, renderer );
          }
          else
            i.renderBlockCurrentBounds( x, y, z, renderer );
        }
        else
        {
          if ( isMonitor )
          {
            TileCraftingMonitorTile sr = blk.getTileEntity( w, x, y, z );
            AEColor col = sr.getColor();

            Tessellator.instance.setColorOpaque_I( col.whiteVariant );
            Tessellator.instance.setBrightness( 13 << 20 | 13 << 4 );
            i.renderFace( x, y, z, color, side, renderer );

            Tessellator.instance.setColorOpaque_I( col.mediumVariant );
            Tessellator.instance.setBrightness( 13 << 20 | 13 << 4 );
            i.renderFace( x, y, z, ExtraBlockTextures.BlockCraftingMonitorFit_Medium.getIcon(), side, renderer );

            Tessellator.instance.setColorOpaque_I( col.blackVariant );
            Tessellator.instance.setBrightness( 13 << 20 | 13 << 4 );
            i.renderFace( x, y, z, ExtraBlockTextures.BlockCraftingMonitorFit_Dark.getIcon(), side, renderer );
          }
          else
          {
            Tessellator.instance.setColorOpaque_F( 1.0f, 1.0f, 1.0f );
            Tessellator.instance.setBrightness( 13 << 20 | 13 << 4 );
            i.renderFace( x, y, z, color, side, renderer );
          }
        }

      }
    }

    for (ForgeDirection a : ForgeDirection.VALID_DIRECTIONS)
    {
      if ( a == side || a == side.getOpposite() )
        continue;

      if ( (side.offsetX != 0 || side.offsetZ != 0)
          && (a == ForgeDirection.NORTH || a == ForgeDirection.EAST || a == ForgeDirection.WEST || a == ForgeDirection.SOUTH) )
        i.setTexture( ExtraBlockTextures.BlockCraftingUnitRingLongRotated.getIcon() );
      else if ( (side.offsetY != 0) && (a == ForgeDirection.EAST || a == ForgeDirection.WEST) )
        i.setTexture( ExtraBlockTextures.BlockCraftingUnitRingLongRotated.getIcon() );
      else
        i.setTexture( ExtraBlockTextures.BlockCraftingUnitRingLong.getIcon() );

      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 );
      }
    }
  }

  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;
  }
}
TOP

Related Classes of appeng.client.render.blocks.RenderBlockCraftingCPU

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.