From fdf3272fe0e92ee8b0d1018fc0fdcbd5fb6eccd5 Mon Sep 17 00:00:00 2001 From: AlgorithmX2 Date: Mon, 23 Jun 2014 22:55:16 -0500 Subject: [PATCH] Added Molecular Assembler Render. --- block/crafting/BlockMolecularAssembler.java | 9 + .../render/blocks/RenderBlockAssembler.java | 236 +++++++++++++++++- client/render/blocks/RenderQNB.java | 3 +- client/texture/ExtraBlockTextures.java | 2 + parts/networking/PartCable.java | 6 + tile/crafting/TileMolecularAssembler.java | 51 +++- 6 files changed, 296 insertions(+), 11 deletions(-) diff --git a/block/crafting/BlockMolecularAssembler.java b/block/crafting/BlockMolecularAssembler.java index fb6ca5a5f..ca8249657 100644 --- a/block/crafting/BlockMolecularAssembler.java +++ b/block/crafting/BlockMolecularAssembler.java @@ -28,6 +28,15 @@ public class BlockMolecularAssembler extends AEBaseBlock lightOpacity = 1; } + public static boolean booleanAlphaPass = false; + + @Override + public boolean canRenderInPass(int pass) + { + booleanAlphaPass = pass == 1; + return pass == 0 || pass == 1; + } + @Override @SideOnly(Side.CLIENT) public Class getRenderer() diff --git a/client/render/blocks/RenderBlockAssembler.java b/client/render/blocks/RenderBlockAssembler.java index b7c053de3..18955a387 100644 --- a/client/render/blocks/RenderBlockAssembler.java +++ b/client/render/blocks/RenderBlockAssembler.java @@ -1,15 +1,106 @@ package appeng.client.render.blocks; +import java.util.EnumSet; + import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import net.minecraftforge.common.util.ForgeDirection; +import appeng.api.networking.IGridHost; +import appeng.api.parts.IBoxProvider; +import appeng.api.parts.IPart; +import appeng.api.parts.IPartCollsionHelper; +import appeng.api.parts.IPartHost; +import appeng.api.util.IOrientable; import appeng.block.AEBaseBlock; +import appeng.block.crafting.BlockMolecularAssembler; import appeng.client.render.BaseBlockRender; +import appeng.client.render.BusRenderHelper; +import appeng.client.render.BusRenderer; +import appeng.client.texture.ExtraBlockTextures; +import appeng.client.texture.TaughtIcon; +import appeng.parts.networking.PartCable; +import appeng.tile.crafting.TileMolecularAssembler; +import appeng.util.Platform; -public class RenderBlockAssembler extends BaseBlockRender +public class RenderBlockAssembler extends BaseBlockRender implements IBoxProvider { + IIcon getConnectedCable(IBlockAccess world, int x, int y, int z, ForgeDirection d, boolean covered) + { + TileEntity ne = world.getTileEntity( x + d.offsetX, y + d.offsetY, z + d.offsetZ ); + if ( ne instanceof IGridHost && ne instanceof IPartHost ) + { + IPartHost ph = (IPartHost) ne; + IPart pcx = (IPart) ph.getPart( ForgeDirection.UNKNOWN ); + if ( pcx instanceof PartCable ) + { + PartCable pc = (PartCable) pcx; + if ( pc.isConnected( d.getOpposite() ) ) + { + if ( covered ) + return pc.getCoveredTexture( pc.getCableColor() ); + return pc.getGlassTexture( pc.getCableColor() ); + } + } + } + + return null; + } + + public void renderCableAt(double Thickness, IBlockAccess world, int x, int y, int z, AEBaseBlock block, RenderBlocks renderer, double pull, boolean covered) + { + IIcon texture = null; + + block.getRendererInstance().setTemporaryRenderIcon( texture = getConnectedCable( world, x, y, z, ForgeDirection.WEST, covered ) ); + if ( texture != null ) + { + renderer.setRenderBounds( 0.0D, 0.5D - Thickness, 0.5D - Thickness, 0.5D - Thickness - pull, 0.5D + Thickness, 0.5D + Thickness ); + renderer.renderStandardBlock( block, x, y, z ); + } + + block.getRendererInstance().setTemporaryRenderIcon( texture = getConnectedCable( world, x, y, z, ForgeDirection.EAST, covered ) ); + if ( texture != null ) + { + renderer.setRenderBounds( 0.5D + Thickness + pull, 0.5D - Thickness, 0.5D - Thickness, 1.0D, 0.5D + Thickness, 0.5D + Thickness ); + renderer.renderStandardBlock( block, x, y, z ); + } + + block.getRendererInstance().setTemporaryRenderIcon( texture = getConnectedCable( world, x, y, z, ForgeDirection.NORTH, covered ) ); + if ( texture != null ) + { + renderer.setRenderBounds( 0.5D - Thickness, 0.5D - Thickness, 0.0D, 0.5D + Thickness, 0.5D + Thickness, 0.5D - Thickness - pull ); + renderer.renderStandardBlock( block, x, y, z ); + } + + block.getRendererInstance().setTemporaryRenderIcon( texture = getConnectedCable( world, x, y, z, ForgeDirection.SOUTH, covered ) ); + if ( texture != null ) + { + renderer.setRenderBounds( 0.5D - Thickness, 0.5D - Thickness, 0.5D + Thickness + pull, 0.5D + Thickness, 0.5D + Thickness, 1.0D ); + renderer.renderStandardBlock( block, x, y, z ); + } + + block.getRendererInstance().setTemporaryRenderIcon( texture = getConnectedCable( world, x, y, z, ForgeDirection.DOWN, covered ) ); + if ( texture != null ) + { + renderer.setRenderBounds( 0.5D - Thickness, 0.0D, 0.5D - Thickness, 0.5D + Thickness, 0.5D - Thickness - pull, 0.5D + Thickness ); + renderer.renderStandardBlock( block, x, y, z ); + } + + block.getRendererInstance().setTemporaryRenderIcon( texture = getConnectedCable( world, x, y, z, ForgeDirection.UP, covered ) ); + if ( texture != null ) + { + renderer.setRenderBounds( 0.5D - Thickness, 0.5D + Thickness + pull, 0.5D - Thickness, 0.5D + Thickness, 1.0D, 0.5D + Thickness ); + renderer.renderStandardBlock( block, x, y, z ); + } + + block.getRendererInstance().setTemporaryRenderIcon( null ); + } + public RenderBlockAssembler() { super( false, 20 ); } @@ -18,17 +109,148 @@ public class RenderBlockAssembler extends BaseBlockRender public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type, Object[] obj) { renderer.setOverrideBlockTexture( blk.getIcon( 0, 0 ) ); - super.renderInventory( blk, is, renderer, type, obj ); + + setInvRenderBounds( renderer, 2, 14, 0, 14, 16, 2 ); + renderInvBlock( EnumSet.allOf( ForgeDirection.class ), blk, is, Tessellator.instance, 0xffffff, renderer ); + + setInvRenderBounds( renderer, 0, 14, 2, 2, 16, 14 ); + renderInvBlock( EnumSet.allOf( ForgeDirection.class ), blk, is, Tessellator.instance, 0xffffff, renderer ); + + setInvRenderBounds( renderer, 2, 0, 14, 14, 2, 16 ); + renderInvBlock( EnumSet.allOf( ForgeDirection.class ), blk, is, Tessellator.instance, 0xffffff, renderer ); + + setInvRenderBounds( renderer, 14, 0, 2, 16, 2, 14 ); + renderInvBlock( EnumSet.allOf( ForgeDirection.class ), blk, is, Tessellator.instance, 0xffffff, renderer ); + + setInvRenderBounds( renderer, 0, 0, 0, 16, 2, 2 ); + renderInvBlock( EnumSet.allOf( ForgeDirection.class ), blk, is, Tessellator.instance, 0xffffff, renderer ); + + setInvRenderBounds( renderer, 0, 2, 0, 2, 16, 2 ); + renderInvBlock( EnumSet.allOf( ForgeDirection.class ), blk, is, Tessellator.instance, 0xffffff, renderer ); + + setInvRenderBounds( renderer, 0, 0, 2, 2, 2, 16 ); + renderInvBlock( EnumSet.allOf( ForgeDirection.class ), blk, is, Tessellator.instance, 0xffffff, renderer ); + + setInvRenderBounds( renderer, 0, 14, 14, 16, 16, 16 ); + renderInvBlock( EnumSet.allOf( ForgeDirection.class ), blk, is, Tessellator.instance, 0xffffff, renderer ); + + setInvRenderBounds( renderer, 14, 0, 14, 16, 14, 16 ); + renderInvBlock( EnumSet.allOf( ForgeDirection.class ), blk, is, Tessellator.instance, 0xffffff, renderer ); + + setInvRenderBounds( renderer, 14, 14, 0, 16, 16, 14 ); + renderInvBlock( EnumSet.allOf( ForgeDirection.class ), blk, is, Tessellator.instance, 0xffffff, renderer ); + + setInvRenderBounds( renderer, 14, 2, 0, 16, 14, 2 ); + renderInvBlock( EnumSet.allOf( ForgeDirection.class ), blk, is, Tessellator.instance, 0xffffff, renderer ); + + setInvRenderBounds( renderer, 0, 2, 14, 2, 14, 16 ); + renderInvBlock( EnumSet.allOf( ForgeDirection.class ), blk, is, Tessellator.instance, 0xffffff, renderer ); + + setInvRenderBounds( renderer, 1, 1, 1, 15, 15, 15 ); + renderInvBlock( EnumSet.allOf( ForgeDirection.class ), blk, is, Tessellator.instance, 0xffffff, renderer ); + renderer.setOverrideBlockTexture( null ); } @Override - public boolean renderInWorld(AEBaseBlock blk, IBlockAccess world, int x, int y, int z, RenderBlocks renderer) + public boolean renderInWorld(AEBaseBlock block, IBlockAccess world, int x, int y, int z, RenderBlocks renderer) { - renderer.overrideBlockTexture = blk.getIcon( 0, 0 ); - boolean out = renderer.renderStandardBlock( blk, x, y, z ); - renderer.overrideBlockTexture = null; + BlockMolecularAssembler blk = (BlockMolecularAssembler) block; + TileMolecularAssembler tma = blk.getTileEntity( world, x, y, z ); - return out; + if ( BlockMolecularAssembler.booleanAlphaPass ) + { + if ( tma.isPowered() ) + { + renderBlockBounds( renderer, 1, 1, 1, 15, 15, 15, ForgeDirection.WEST, ForgeDirection.UP, ForgeDirection.SOUTH ); + TaughtIcon lights = new TaughtIcon( ExtraBlockTextures.BlockMolecularAssemblerLights.getIcon(), -2.0f ); + Tessellator.instance.setColorRGBA_F( 1, 1, 1, 0.3f ); + Tessellator.instance.setBrightness( 14 << 20 | 14 << 4 ); + renderer.renderFaceXNeg( blk, x, y, z, lights ); + renderer.renderFaceXPos( blk, x, y, z, lights ); + renderer.renderFaceYNeg( blk, x, y, z, lights ); + renderer.renderFaceYPos( blk, x, y, z, lights ); + renderer.renderFaceZNeg( blk, x, y, z, lights ); + renderer.renderFaceZPos( blk, x, y, z, lights ); + return true; + } + return false; + } + + BusRenderer.instance.renderer.blockAccess = renderer.blockAccess; + renderer = BusRenderer.instance.renderer; + + preRenderInWorld( block, world, x, y, z, renderer ); + + tma.lightCache = BusRenderHelper.instance.useSimpliedRendering( x, y, z, this, tma.lightCache ); + + IOrientable te = getOrientable( block, world, x, y, z ); + + ForgeDirection fdy = te.getUp(); + ForgeDirection fdz = te.getForward(); + ForgeDirection fdx = Platform.crossProduct( fdz, fdy ).getOpposite(); + + renderer.renderAllFaces = true; + + renderCableAt( 0.11D, world, x, y, z, block, renderer, 0.141D, false ); + renderCableAt( 0.188D, world, x, y, z, block, renderer, 0.1875D, true ); + + blk.getRendererInstance().setTemporaryRenderIcon( blk.getIcon( 0, 0 ) ); + + renderBlockBounds( renderer, 2, 14, 0, 14, 16, 2, fdx, fdy, fdz ); + renderer.renderStandardBlock( blk, x, y, z ); + + renderBlockBounds( renderer, 0, 14, 2, 2, 16, 14, fdx, fdy, fdz ); + renderer.renderStandardBlock( blk, x, y, z ); + + renderBlockBounds( renderer, 2, 0, 14, 14, 2, 16, fdx, fdy, fdz ); + renderer.renderStandardBlock( blk, x, y, z ); + + renderBlockBounds( renderer, 14, 0, 2, 16, 2, 14, fdx, fdy, fdz ); + renderer.renderStandardBlock( blk, x, y, z ); + + // sides... + renderBlockBounds( renderer, 0, 0, 0, 16, 2, 2, fdx, fdy, fdz ); + renderer.renderStandardBlock( blk, x, y, z ); + + renderBlockBounds( renderer, 0, 2, 0, 2, 16, 2, fdx, fdy, fdz ); + renderer.renderStandardBlock( blk, x, y, z ); + + renderBlockBounds( renderer, 0, 0, 2, 2, 2, 16, fdx, fdy, fdz ); + renderer.renderStandardBlock( blk, x, y, z ); + + renderBlockBounds( renderer, 0, 14, 14, 16, 16, 16, fdx, fdy, fdz ); + renderer.renderStandardBlock( blk, x, y, z ); + + renderBlockBounds( renderer, 14, 0, 14, 16, 14, 16, fdx, fdy, fdz ); + renderer.renderStandardBlock( blk, x, y, z ); + + renderBlockBounds( renderer, 14, 14, 0, 16, 16, 14, fdx, fdy, fdz ); + renderer.renderStandardBlock( blk, x, y, z ); + + renderBlockBounds( renderer, 14, 2, 0, 16, 14, 2, fdx, fdy, fdz ); + renderer.renderStandardBlock( blk, x, y, z ); + + renderBlockBounds( renderer, 0, 2, 14, 2, 14, 16, fdx, fdy, fdz ); + renderer.renderStandardBlock( blk, x, y, z ); + + renderBlockBounds( renderer, 1, 1, 1, 15, 15, 15, fdx, fdy, fdz ); + renderer.renderStandardBlock( blk, x, y, z ); + + BusRenderHelper.instance.normalRendering(); + + blk.getRendererInstance().setTemporaryRenderIcon( null ); + + renderer.renderAllFaces = false; + + postRenderInWorld( renderer ); + + return true; + } + + @Override + public void getBoxes(IPartCollsionHelper bch) + { + bch.addBox( 0, 0, 0, 16, 16, 16 ); } } diff --git a/client/render/blocks/RenderQNB.java b/client/render/blocks/RenderQNB.java index ca5053961..a860c499a 100644 --- a/client/render/blocks/RenderQNB.java +++ b/client/render/blocks/RenderQNB.java @@ -102,8 +102,7 @@ public class RenderQNB extends BaseBlockRender EnumSet sides = tqb.getConnections(); renderCableAt( 0.11D, world, x, y, z, block, renderer, cable.getIconIndex( cabldef.stack( AEColor.Transparent, 1 ) ), 0.141D, sides ); - renderCableAt( 0.188D, world, x, y, z, block, renderer, ccable.getIconIndex( ccabldef.stack( AEColor.Transparent, 1 ) ), 0.1875D, - tqb.getConnections() ); + renderCableAt( 0.188D, world, x, y, z, block, renderer, ccable.getIconIndex( ccabldef.stack( AEColor.Transparent, 1 ) ), 0.1875D, sides ); } float px = 2.0f / 16.0f; diff --git a/client/texture/ExtraBlockTextures.java b/client/texture/ExtraBlockTextures.java index c079ecdee..af4ef3086 100644 --- a/client/texture/ExtraBlockTextures.java +++ b/client/texture/ExtraBlockTextures.java @@ -20,6 +20,8 @@ public enum ExtraBlockTextures "BlockControllerColumnConflict"), BlockControllerConflict("BlockControllerConflict"), BlockControllerInsideA("BlockControllerInsideA"), BlockControllerInsideB( "BlockControllerInsideB"), + BlockMolecularAssemblerLights("BlockMolecularAssemblerLights"), + BlockChargerInside("BlockChargerInside"), BlockInterfaceAlternate("BlockInterfaceAlternate"), BlockInterfaceAlternateArrow("BlockInterfaceAlternateArrow"), diff --git a/parts/networking/PartCable.java b/parts/networking/PartCable.java index 7b71d7e0c..b761e8ac0 100644 --- a/parts/networking/PartCable.java +++ b/parts/networking/PartCable.java @@ -56,6 +56,12 @@ public class PartCable extends AEBasePart implements IPartCable proxy.myColor = AEColor.values()[((ItemMultiPart) is.getItem()).varientOf( is.getItemDamage() )]; } + @Override + public boolean isConnected(ForgeDirection side) + { + return connections.contains( side ); + } + @Override public BusSupport supportsBuses() { diff --git a/tile/crafting/TileMolecularAssembler.java b/tile/crafting/TileMolecularAssembler.java index 129bdce87..d386b8dcf 100644 --- a/tile/crafting/TileMolecularAssembler.java +++ b/tile/crafting/TileMolecularAssembler.java @@ -1,5 +1,8 @@ package appeng.tile.crafting; +import io.netty.buffer.ByteBuf; + +import java.io.IOException; import java.util.ArrayList; import net.minecraft.inventory.IInventory; @@ -17,13 +20,17 @@ import appeng.api.config.PowerMultiplier; import appeng.api.config.RedstoneMode; import appeng.api.config.Settings; import appeng.api.config.Upgrades; +import appeng.api.implementations.IPowerChannelState; import appeng.api.implementations.IUpgradeableHost; import appeng.api.implementations.tiles.ICraftingMachine; import appeng.api.networking.IGridNode; import appeng.api.networking.crafting.ICraftingPatternDetails; +import appeng.api.networking.events.MENetworkEventSubscribe; +import appeng.api.networking.events.MENetworkPowerStatusChange; import appeng.api.networking.ticking.IGridTickable; import appeng.api.networking.ticking.TickRateModulation; import appeng.api.networking.ticking.TickingRequest; +import appeng.api.parts.ISimplifiedBundle; import appeng.api.util.AECableType; import appeng.api.util.DimensionalCoord; import appeng.api.util.IConfigManager; @@ -44,7 +51,7 @@ import appeng.util.Platform; import cpw.mods.fml.common.FMLCommonHandler; public class TileMolecularAssembler extends AENetworkInvTile implements IAEAppEngInventory, ISidedInventory, IUpgradeableHost, IConfigManagerHost, - IGridTickable, ICraftingMachine + IGridTickable, ICraftingMachine, IPowerChannelState { static final int[] sides = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; @@ -63,6 +70,7 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IAEAppEn private boolean forcePlan = false; private boolean reboot = true; + public ISimplifiedBundle lightCache; public boolean pushPattern(ICraftingPatternDetails patternDetails, InventoryCrafting table, ForgeDirection where) { @@ -161,7 +169,21 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IAEAppEn { public TileMolecularAssemblerHandler() { - super( TileEventType.WORLD_NBT ); + super( TileEventType.WORLD_NBT, TileEventType.NETWORK ); + } + + @Override + public boolean readFromStream(ByteBuf data) throws IOException + { + boolean oldPower = isPowered; + isPowered = data.readBoolean(); + return isPowered != oldPower; + } + + @Override + public void writeToStream(ByteBuf data) throws IOException + { + data.writeBoolean( isPowered ); } @Override @@ -490,4 +512,29 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IAEAppEn return output; } + boolean isPowered = false; + + @MENetworkEventSubscribe + public void onPowerEvent(MENetworkPowerStatusChange p) + { + boolean newState = gridProxy.isActive(); + if ( newState != isPowered ) + { + isPowered = newState; + markForUpdate(); + } + } + + @Override + public boolean isPowered() + { + return isPowered; + } + + @Override + public boolean isActive() + { + return isPowered; + } + }