/** * Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team * http://www.mod-buildcraft.com * <p/> * BuildCraft is distributed under the terms of the Minecraft Mod Public * License 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.transport.render; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraftforge.common.util.ForgeDirection; import buildcraft.BuildCraftTransport; import buildcraft.api.core.render.ITextureStates; import buildcraft.api.transport.IPipeTile; import buildcraft.api.transport.pluggable.IFacadePluggable; import buildcraft.core.CoreConstants; import buildcraft.core.lib.render.FakeBlock; import buildcraft.core.lib.render.TextureStateManager; import buildcraft.core.lib.utils.MatrixTranformations; import buildcraft.transport.PipeIconProvider; import buildcraft.transport.TransportConstants; public final class FacadeRenderHelper { private static final float zFightOffset = 1F / 4096F; private static final float[][] zeroStateFacade = new float[3][2]; private static final float[][] zeroStateSupport = new float[3][2]; private static final float[] xOffsets = new float[6]; private static final float[] yOffsets = new float[6]; private static final float[] zOffsets = new float[6]; /** * Deactivate constructor */ private FacadeRenderHelper() { } static { // X START - END zeroStateFacade[0][0] = 0.0F; zeroStateFacade[0][1] = 1.0F; // Y START - END zeroStateFacade[1][0] = 0.0F; zeroStateFacade[1][1] = TransportConstants.FACADE_THICKNESS; // Z START - END zeroStateFacade[2][0] = 0.0F; zeroStateFacade[2][1] = 1.0F; // X START - END zeroStateSupport[0][0] = CoreConstants.PIPE_MIN_POS; zeroStateSupport[0][1] = CoreConstants.PIPE_MAX_POS; // Y START - END zeroStateSupport[1][0] = TransportConstants.FACADE_THICKNESS; zeroStateSupport[1][1] = CoreConstants.PIPE_MIN_POS; // Z START - END zeroStateSupport[2][0] = CoreConstants.PIPE_MIN_POS; zeroStateSupport[2][1] = CoreConstants.PIPE_MAX_POS; xOffsets[0] = zFightOffset; xOffsets[1] = zFightOffset; xOffsets[2] = 0; xOffsets[3] = 0; xOffsets[4] = 0; xOffsets[5] = 0; yOffsets[0] = 0; yOffsets[1] = 0; yOffsets[2] = zFightOffset; yOffsets[3] = zFightOffset; yOffsets[4] = 0; yOffsets[5] = 0; zOffsets[0] = zFightOffset; zOffsets[1] = zFightOffset; zOffsets[2] = 0; zOffsets[3] = 0; zOffsets[4] = 0; zOffsets[5] = 0; } private static void setRenderBounds(RenderBlocks renderblocks, float[][] rotated, ForgeDirection side) { renderblocks.setRenderBounds( rotated[0][0] + xOffsets[side.ordinal()], rotated[1][0] + yOffsets[side.ordinal()], rotated[2][0] + zOffsets[side.ordinal()], rotated[0][1] - xOffsets[side.ordinal()], rotated[1][1] - yOffsets[side.ordinal()], rotated[2][1] - zOffsets[side.ordinal()]); } public static void pipeFacadeRenderer(RenderBlocks renderblocks, ITextureStates blockStateMachine, IPipeTile tile, int renderPass, int x, int y, int z, ForgeDirection direction, IFacadePluggable pluggable) { ITextureStates textureManager = blockStateMachine; IIcon[] textures = ((TextureStateManager) textureManager.getTextureState()).popArray(); Block renderBlock = pluggable.getCurrentBlock(); if (renderBlock != null && tile != null) { IBlockAccess facadeBlockAccess = new FacadeBlockAccess(tile.getWorld(), direction); // If the facade is meant to render in the current pass if (renderBlock.canRenderInPass(renderPass)) { int renderMeta = pluggable.getCurrentMetadata(); for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { textures[side.ordinal()] = renderBlock.getIcon( facadeBlockAccess, tile.x(), tile.y(), tile.z(), side.ordinal() ); if (textures[side.ordinal()] == null) { textures[side.ordinal()] = renderBlock.getIcon(side.ordinal(), renderMeta); } if (side == direction || side == direction.getOpposite()) { blockStateMachine.setRenderSide(side, true); } else { if (!(tile.getPipePluggable(side) instanceof IFacadePluggable)) { blockStateMachine.setRenderSide(side, true); } else { IFacadePluggable pluggable2 = (IFacadePluggable) tile.getPipePluggable(side); blockStateMachine.setRenderSide(side, pluggable2.getCurrentBlock() == null); } } } if (renderBlock.getRenderType() == 31) { if ((renderMeta & 12) == 4) { renderblocks.uvRotateEast = 1; renderblocks.uvRotateWest = 1; renderblocks.uvRotateTop = 1; renderblocks.uvRotateBottom = 1; } else if ((renderMeta & 12) == 8) { renderblocks.uvRotateSouth = 1; renderblocks.uvRotateNorth = 1; } } ((FakeBlock) blockStateMachine.getBlock()).setColor(renderBlock.getRenderColor(renderMeta)); // Hollow facade if (pluggable.isHollow()) { renderblocks.field_152631_f = true; float[][] rotated = MatrixTranformations.deepClone(zeroStateFacade); rotated[0][0] = CoreConstants.PIPE_MIN_POS - zFightOffset * 4; rotated[0][1] = CoreConstants.PIPE_MAX_POS + zFightOffset * 4; rotated[2][0] = 0.0F; rotated[2][1] = CoreConstants.PIPE_MIN_POS - zFightOffset * 2; MatrixTranformations.transform(rotated, direction); setRenderBounds(renderblocks, rotated, direction); renderblocks.renderStandardBlockWithColorMultiplier(blockStateMachine.getBlock(), x, y, z, 1.0f, 1.0f, 1.0f); rotated = MatrixTranformations.deepClone(zeroStateFacade); rotated[0][0] = CoreConstants.PIPE_MIN_POS - zFightOffset * 4; rotated[0][1] = CoreConstants.PIPE_MAX_POS + zFightOffset * 4; rotated[2][0] = CoreConstants.PIPE_MAX_POS + zFightOffset * 2; MatrixTranformations.transform(rotated, direction); setRenderBounds(renderblocks, rotated, direction); renderblocks.renderStandardBlockWithColorMultiplier(blockStateMachine.getBlock(), x, y, z, 1.0f, 1.0f, 1.0f); rotated = MatrixTranformations.deepClone(zeroStateFacade); rotated[0][0] = 0.0F; rotated[0][1] = CoreConstants.PIPE_MIN_POS - zFightOffset * 2; MatrixTranformations.transform(rotated, direction); setRenderBounds(renderblocks, rotated, direction); renderblocks.renderStandardBlockWithColorMultiplier(blockStateMachine.getBlock(), x, y, z, 1.0f, 1.0f, 1.0f); rotated = MatrixTranformations.deepClone(zeroStateFacade); rotated[0][0] = CoreConstants.PIPE_MAX_POS + zFightOffset * 2; rotated[0][1] = 1F; MatrixTranformations.transform(rotated, direction); setRenderBounds(renderblocks, rotated, direction); renderblocks.renderStandardBlockWithColorMultiplier(blockStateMachine.getBlock(), x, y, z, 1.0f, 1.0f, 1.0f); renderblocks.field_152631_f = false; } else { // Solid facade float[][] rotated = MatrixTranformations.deepClone(zeroStateFacade); MatrixTranformations.transform(rotated, direction); setRenderBounds(renderblocks, rotated, direction); renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z); } ((FakeBlock) blockStateMachine.getBlock()).setColor(0xFFFFFF); if (renderBlock.getRenderType() == 31) { renderblocks.uvRotateSouth = 0; renderblocks.uvRotateEast = 0; renderblocks.uvRotateWest = 0; renderblocks.uvRotateNorth = 0; renderblocks.uvRotateTop = 0; renderblocks.uvRotateBottom = 0; } } } ((FakeBlock) blockStateMachine.getBlock()).setColor(0xFFFFFF); ((TextureStateManager) textureManager.getTextureState()).pushArray(); blockStateMachine.setRenderAllSides(); textureManager.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.PipeStructureCobblestone.ordinal())); // Structure Pipe // Always render connectors in pass 0 if (renderPass == 0 && !pluggable.isHollow() && renderBlock != null && renderBlock.getMaterial().isOpaque()) { float[][] rotated = MatrixTranformations.deepClone(zeroStateSupport); MatrixTranformations.transform(rotated, direction); renderblocks.setRenderBounds(rotated[0][0], rotated[1][0], rotated[2][0], rotated[0][1], rotated[1][1], rotated[2][1]); renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z); } } }