From 3a39b289a2a973bca370270e105980025d92a53c Mon Sep 17 00:00:00 2001 From: CovertJaguar Date: Tue, 8 Oct 2013 11:13:40 -0700 Subject: [PATCH] Moved Pipe Gate/Wire rendering to the TESR Should greatly improve performance of wire/gate switching. --- .../buildcraft/core/render/FluidRenderer.java | 4 +- .../core/render/RenderEntityBlock.java | 290 +++++++++++++----- .../transport/BlockGenericPipe.java | 4 +- .../buildcraft/transport/PipeRenderState.java | 9 +- .../buildcraft/transport/TileGenericPipe.java | 40 ++- .../transport/TransportProxyClient.java | 8 +- .../transport/pipes/PipeItemsDaizuli.java | 1 - .../transport/pipes/PipeItemsLapis.java | 1 - .../transport/pipes/PipeLogicIron.java | 2 +- .../transport/pipes/PipePowerIron.java | 1 - .../transport/render/PipeRendererTESR.java | 266 +++++++++++++++- .../transport/render/PipeRendererWorld.java | 213 +------------ .../transport/utils/ConnectionMatrix.java | 12 +- .../transport/utils/FacadeMatrix.java | 36 ++- .../transport/utils/TextureMatrix.java | 7 +- 15 files changed, 556 insertions(+), 338 deletions(-) diff --git a/common/buildcraft/core/render/FluidRenderer.java b/common/buildcraft/core/render/FluidRenderer.java index 905be09f..e5c3836b 100644 --- a/common/buildcraft/core/render/FluidRenderer.java +++ b/common/buildcraft/core/render/FluidRenderer.java @@ -7,7 +7,7 @@ */ package buildcraft.core.render; -import buildcraft.core.render.RenderEntityBlock.BlockInterface; +import buildcraft.core.render.RenderEntityBlock.RenderInfo; import java.util.HashMap; import java.util.Map; import net.minecraft.block.Block; @@ -31,7 +31,7 @@ public class FluidRenderer { private static Map flowingRenderCache = new HashMap(); private static Map stillRenderCache = new HashMap(); public static final int DISPLAY_STAGES = 100; - private static final BlockInterface liquidBlock = new BlockInterface(); + private static final RenderInfo liquidBlock = new RenderInfo(); public static Icon getFluidTexture(FluidStack fluidStack, boolean flowing) { if (fluidStack == null) { diff --git a/common/buildcraft/core/render/RenderEntityBlock.java b/common/buildcraft/core/render/RenderEntityBlock.java index cfb5089b..624e541c 100644 --- a/common/buildcraft/core/render/RenderEntityBlock.java +++ b/common/buildcraft/core/render/RenderEntityBlock.java @@ -8,6 +8,7 @@ package buildcraft.core.render; import buildcraft.core.EntityBlock; +import java.util.Arrays; import net.minecraft.block.Block; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.Render; @@ -20,7 +21,7 @@ import net.minecraft.world.World; import org.lwjgl.opengl.GL11; public class RenderEntityBlock extends Render { - + public static RenderEntityBlock INSTANCE = new RenderEntityBlock(); @Override @@ -28,7 +29,7 @@ public class RenderEntityBlock extends Render { throw new UnsupportedOperationException("Not supported yet."); } - public static class BlockInterface { + public static class RenderInfo { public double minX; public double minY; @@ -38,17 +39,81 @@ public class RenderEntityBlock extends Render { public double maxZ; public Block baseBlock = Block.sand; public Icon texture = null; + public Icon[] textureArray = null; + public boolean[] renderSide = new boolean[6]; + public float light = -1f; + public int brightness = -1; - public Icon getBlockTextureFromSide(int i) { - if (texture == null) - return baseBlock.getBlockTextureFromSide(i); - else - return texture; + public RenderInfo() { + setRenderAllSides(); + } + + public RenderInfo(Block template, Icon[] texture) { + this(); + this.baseBlock = template; + this.textureArray = texture; + } + + public RenderInfo(float minX, float minY, float minZ, float maxX, float maxY, float maxZ) { + this(); + setBounds(minX, minY, minZ, maxX, maxY, maxZ); } public float getBlockBrightness(IBlockAccess iblockaccess, int i, int j, int k) { return baseBlock.getBlockBrightness(iblockaccess, i, j, k); } + + public final void setBounds(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) { + this.minX = minX; + this.minY = minY; + this.minZ = minZ; + this.maxX = maxX; + this.maxY = maxY; + this.maxZ = maxZ; + } + + public final void setRenderSingleSide(int side) { + Arrays.fill(renderSide, false); + renderSide[side] = true; + } + + public final void setRenderAllSides() { + Arrays.fill(renderSide, true); + } + + public void rotate() { + double temp = minX; + minX = minZ; + minZ = temp; + + temp = maxX; + maxX = maxZ; + maxZ = temp; + } + + public void reverseX() { + double temp = minX; + minX = 1 - maxX; + maxX = 1 - temp; + } + + public void reverseZ() { + double temp = minZ; + minZ = 1 - maxZ; + maxZ = 1 - temp; + } + + public Icon getBlockTextureFromSide(int i) { + if (texture != null) + return texture; + if (textureArray == null || textureArray.length == 0) + return baseBlock.getBlockTextureFromSide(i); + else { + if (i >= textureArray.length) + i = 0; + return textureArray[i]; + } + } } private RenderEntityBlock() { @@ -65,7 +130,7 @@ public class RenderEntityBlock extends Render { shadowSize = entity.shadowSize; World world = entity.worldObj; - BlockInterface util = new BlockInterface(); + RenderInfo util = new RenderInfo(); util.texture = entity.texture; bindTexture(TextureMap.locationBlocksTexture); @@ -108,92 +173,169 @@ public class RenderEntityBlock extends Render { } } - public void renderBlock(BlockInterface block, IBlockAccess blockAccess, int i, int j, int k, boolean doLight, boolean doTessellating) { - float f = 0.5F; - float f1 = 1.0F; - float f2 = 0.8F; - float f3 = 0.6F; - - renderBlocks.renderMaxX = block.maxX; - renderBlocks.renderMinX = block.minX; - renderBlocks.renderMaxY = block.maxY; - renderBlocks.renderMinY = block.minY; - renderBlocks.renderMaxZ = block.maxZ; - renderBlocks.renderMinZ = block.minZ; - renderBlocks.enableAO = false; + public void renderBlock(RenderInfo info, IBlockAccess blockAccess, int x, int y, int z, boolean doLight, boolean doTessellating) { + renderBlock(info, blockAccess, x, y, z, x, y, z, doLight, doTessellating); + } + public void renderBlock(RenderInfo info, IBlockAccess blockAccess, double x, double y, double z, int lightX, int lightY, int lightZ, boolean doLight, boolean doTessellating) { + float lightBottom = 0.5F; + float lightTop = 1.0F; + float lightEastWest = 0.8F; + float lightNorthSouth = 0.6F; Tessellator tessellator = Tessellator.instance; - if (doTessellating) { + if (blockAccess == null) + doLight = false; + + if (doTessellating && !tessellator.isDrawing) tessellator.startDrawingQuads(); - } - - float f4 = 0, f5 = 0; + float light = 0; if (doLight) { - f4 = block.getBlockBrightness(blockAccess, i, j, k); - f5 = block.getBlockBrightness(blockAccess, i, j, k); - if (f5 < f4) { - f5 = f4; - } - tessellator.setColorOpaque_F(f * f5, f * f5, f * f5); + if (info.light < 0) { + light = info.baseBlock.getBlockBrightness(blockAccess, (int) lightX, (int) lightY, (int) lightZ); + light = light + ((1.0f - light) * 0.4f); + } else + light = info.light; + int brightness = 0; + if (info.brightness < 0) + brightness = info.baseBlock.getMixedBrightnessForBlock(blockAccess, lightX, lightY, lightZ); + else + brightness = info.brightness; + tessellator.setBrightness(brightness); + tessellator.setColorOpaque_F(lightBottom * light, lightBottom * light, lightBottom * light); + } else { + tessellator.setColorOpaque_F(1.0F, 1.0F, 1.0F); + if (info.brightness >= 0) + tessellator.setBrightness(info.brightness); } - renderBlocks.renderFaceYNeg(null, 0, 0, 0, block.getBlockTextureFromSide(0)); + renderBlocks.setRenderBounds(info.minX, info.minY, info.minZ, info.maxX, info.maxY, info.maxZ); - if (doLight) { - f5 = block.getBlockBrightness(blockAccess, i, j, k); - if (f5 < f4) { - f5 = f4; - } - tessellator.setColorOpaque_F(f1 * f5, f1 * f5, f1 * f5); - } + if (info.renderSide[0]) + renderBlocks.renderFaceYNeg(info.baseBlock, x, y, z, info.getBlockTextureFromSide(0)); - renderBlocks.renderFaceYPos(null, 0, 0, 0, block.getBlockTextureFromSide(1)); + if (doLight) + tessellator.setColorOpaque_F(lightTop * light, lightTop * light, lightTop * light); - if (doLight) { - f5 = block.getBlockBrightness(blockAccess, i, j, k); - if (f5 < f4) { - f5 = f4; - } - tessellator.setColorOpaque_F(f2 * f5, f2 * f5, f2 * f5); - } + if (info.renderSide[1]) + renderBlocks.renderFaceYPos(info.baseBlock, x, y, z, info.getBlockTextureFromSide(1)); - renderBlocks.renderFaceZNeg(null, 0, 0, 0, block.getBlockTextureFromSide(2)); + if (doLight) + tessellator.setColorOpaque_F(lightEastWest * light, lightEastWest * light, lightEastWest * light); - if (doLight) { - f5 = block.getBlockBrightness(blockAccess, i, j, k); - if (f5 < f4) { - f5 = f4; - } - tessellator.setColorOpaque_F(f2 * f5, f2 * f5, f2 * f5); - } + if (info.renderSide[2]) + renderBlocks.renderFaceZNeg(info.baseBlock, x, y, z, info.getBlockTextureFromSide(2)); - renderBlocks.renderFaceZPos(null, 0, 0, 0, block.getBlockTextureFromSide(3)); + if (doLight) + tessellator.setColorOpaque_F(lightEastWest * light, lightEastWest * light, lightEastWest * light); - if (doLight) { - f5 = block.getBlockBrightness(blockAccess, i, j, k); - if (f5 < f4) { - f5 = f4; - } - tessellator.setColorOpaque_F(f3 * f5, f3 * f5, f3 * f5); - } + if (info.renderSide[3]) + renderBlocks.renderFaceZPos(info.baseBlock, x, y, z, info.getBlockTextureFromSide(3)); - renderBlocks.renderFaceXNeg(null, 0, 0, 0, block.getBlockTextureFromSide(4)); + if (doLight) + tessellator.setColorOpaque_F(lightNorthSouth * light, lightNorthSouth * light, lightNorthSouth * light); - if (doLight) { - f5 = block.getBlockBrightness(blockAccess, i, j, k); - if (f5 < f4) { - f5 = f4; - } - tessellator.setColorOpaque_F(f3 * f5, f3 * f5, f3 * f5); - } + if (info.renderSide[4]) + renderBlocks.renderFaceXNeg(info.baseBlock, x, y, z, info.getBlockTextureFromSide(4)); - renderBlocks.renderFaceXPos(null, 0, 0, 0, block.getBlockTextureFromSide(5)); + if (doLight) + tessellator.setColorOpaque_F(lightNorthSouth * light, lightNorthSouth * light, lightNorthSouth * light); - if (doTessellating) { + if (info.renderSide[5]) + renderBlocks.renderFaceXPos(info.baseBlock, x, y, z, info.getBlockTextureFromSide(5)); + + if (doTessellating && tessellator.isDrawing) tessellator.draw(); - } } +// +// public void renderBlock(RenderInfo block, IBlockAccess blockAccess, int i, int j, int k, boolean doLight, boolean doTessellating) { +// float f = 0.5F; +// float f1 = 1.0F; +// float f2 = 0.8F; +// float f3 = 0.6F; +// +// renderBlocks.renderMaxX = block.maxX; +// renderBlocks.renderMinX = block.minX; +// renderBlocks.renderMaxY = block.maxY; +// renderBlocks.renderMinY = block.minY; +// renderBlocks.renderMaxZ = block.maxZ; +// renderBlocks.renderMinZ = block.minZ; +// renderBlocks.enableAO = false; +// +// +// Tessellator tessellator = Tessellator.instance; +// +// if (doTessellating) { +// tessellator.startDrawingQuads(); +// } +// +// float f4 = 0, f5 = 0; +// +// if (doLight) { +// f4 = block.getBlockBrightness(blockAccess, i, j, k); +// f5 = block.getBlockBrightness(blockAccess, i, j, k); +// if (f5 < f4) { +// f5 = f4; +// } +// tessellator.setColorOpaque_F(f * f5, f * f5, f * f5); +// } +// +// renderBlocks.renderFaceYNeg(null, 0, 0, 0, block.getBlockTextureFromSide(0)); +// +// if (doLight) { +// f5 = block.getBlockBrightness(blockAccess, i, j, k); +// if (f5 < f4) { +// f5 = f4; +// } +// tessellator.setColorOpaque_F(f1 * f5, f1 * f5, f1 * f5); +// } +// +// renderBlocks.renderFaceYPos(null, 0, 0, 0, block.getBlockTextureFromSide(1)); +// +// if (doLight) { +// f5 = block.getBlockBrightness(blockAccess, i, j, k); +// if (f5 < f4) { +// f5 = f4; +// } +// tessellator.setColorOpaque_F(f2 * f5, f2 * f5, f2 * f5); +// } +// +// renderBlocks.renderFaceZNeg(null, 0, 0, 0, block.getBlockTextureFromSide(2)); +// +// if (doLight) { +// f5 = block.getBlockBrightness(blockAccess, i, j, k); +// if (f5 < f4) { +// f5 = f4; +// } +// tessellator.setColorOpaque_F(f2 * f5, f2 * f5, f2 * f5); +// } +// +// renderBlocks.renderFaceZPos(null, 0, 0, 0, block.getBlockTextureFromSide(3)); +// +// if (doLight) { +// f5 = block.getBlockBrightness(blockAccess, i, j, k); +// if (f5 < f4) { +// f5 = f4; +// } +// tessellator.setColorOpaque_F(f3 * f5, f3 * f5, f3 * f5); +// } +// +// renderBlocks.renderFaceXNeg(null, 0, 0, 0, block.getBlockTextureFromSide(4)); +// +// if (doLight) { +// f5 = block.getBlockBrightness(blockAccess, i, j, k); +// if (f5 < f4) { +// f5 = f4; +// } +// tessellator.setColorOpaque_F(f3 * f5, f3 * f5, f3 * f5); +// } +// +// renderBlocks.renderFaceXPos(null, 0, 0, 0, block.getBlockTextureFromSide(5)); +// +// if (doTessellating) { +// tessellator.draw(); +// } +// } } diff --git a/common/buildcraft/transport/BlockGenericPipe.java b/common/buildcraft/transport/BlockGenericPipe.java index fec55a41..15d05963 100644 --- a/common/buildcraft/transport/BlockGenericPipe.java +++ b/common/buildcraft/transport/BlockGenericPipe.java @@ -42,7 +42,7 @@ import buildcraft.api.transport.ISolidSideTile; import buildcraft.core.BlockIndex; import buildcraft.core.proxy.CoreProxy; import buildcraft.core.utils.Utils; -import buildcraft.transport.render.PipeWorldRenderer; +import buildcraft.transport.render.PipeRendererWorld; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -167,7 +167,7 @@ public class BlockGenericPipe extends BlockContainer { super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); } - float facadeThickness = PipeWorldRenderer.facadeThickness; + float facadeThickness = PipeRendererWorld.facadeThickness; if (tileG.hasFacade(ForgeDirection.EAST)) { setBlockBounds(1 - facadeThickness, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); diff --git a/common/buildcraft/transport/PipeRenderState.java b/common/buildcraft/transport/PipeRenderState.java index 7448d50c..8f25c942 100644 --- a/common/buildcraft/transport/PipeRenderState.java +++ b/common/buildcraft/transport/PipeRenderState.java @@ -16,14 +16,11 @@ public class PipeRenderState implements IClientState { private boolean hasGate = false; private int gateIconIndex = 0; - public final ConnectionMatrix pipeConnectionMatrix = new ConnectionMatrix(); public final TextureMatrix textureMatrix = new TextureMatrix(); public final WireMatrix wireMatrix = new WireMatrix(); public final ConnectionMatrix plugMatrix = new ConnectionMatrix(); - public final FacadeMatrix facadeMatrix = new FacadeMatrix(); - private boolean dirty = true; /* @@ -58,14 +55,18 @@ public class PipeRenderState implements IClientState { dirty = false; pipeConnectionMatrix.clean(); textureMatrix.clean(); - wireMatrix.clean(); facadeMatrix.clean(); + wireMatrix.clean(); } public boolean isDirty() { return dirty || pipeConnectionMatrix.isDirty() || textureMatrix.isDirty() || wireMatrix.isDirty() || facadeMatrix.isDirty() || plugMatrix.isDirty(); } + public boolean needsRenderUpdate() { + return pipeConnectionMatrix.isDirty() || textureMatrix.isDirty() || facadeMatrix.isDirty() || plugMatrix.isDirty(); + } + @Override public void writeData(DataOutputStream data) throws IOException { data.writeBoolean(hasGate); diff --git a/common/buildcraft/transport/TileGenericPipe.java b/common/buildcraft/transport/TileGenericPipe.java index e9e38d46..4a94280e 100644 --- a/common/buildcraft/transport/TileGenericPipe.java +++ b/common/buildcraft/transport/TileGenericPipe.java @@ -35,7 +35,6 @@ import buildcraft.api.gates.ITrigger; import buildcraft.api.power.IPowerReceptor; import buildcraft.api.power.PowerHandler; import buildcraft.api.power.PowerHandler.PowerReceiver; -import buildcraft.transport.IPipeConnectionForced; import buildcraft.api.transport.IPipe; import buildcraft.api.transport.IPipeConnection; import buildcraft.api.transport.IPipeTile; @@ -52,6 +51,8 @@ import buildcraft.core.network.PacketTileState; import buildcraft.transport.Gate.GateKind; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.server.management.PlayerInstance; +import net.minecraft.world.WorldServer; public class TileGenericPipe extends TileEntity implements IPowerReceptor, IFluidHandler, IPipeTile, IOverrideDefaultTriggers, ITileBufferHolder, IDropControlInventory, IPipeRenderState, ISyncedTile, ISolidSideTile, IGuiReturnHandler { @@ -80,6 +81,7 @@ public class TileGenericPipe extends TileEntity implements IPowerReceptor, IFlui public boolean[] pipeConnectionsBuffer = new boolean[6]; public SafeTimeTracker networkSyncTracker = new SafeTimeTracker(); public Pipe pipe; + private boolean sendClientUpdate = false; private boolean blockNeighborChange = false; private boolean refreshRenderState = false; private boolean pipeBound = false; @@ -186,6 +188,17 @@ public class TileGenericPipe extends TileEntity implements IPowerReceptor, IFlui PowerReceiver provider = getPowerReceiver(null); if (provider != null) provider.update(); + + if (sendClientUpdate) { + sendClientUpdate = false; + if (worldObj instanceof WorldServer) { + WorldServer world = (WorldServer) worldObj; + PlayerInstance playerInstance = world.getPlayerManager().getOrCreateChunkWatcher(xCoord >> 4, zCoord >> 4, false); + if (playerInstance != null) { + playerInstance.sendToAllPlayersWatchingChunk(getDescriptionPacket()); + } + } + } } // PRECONDITION: worldObj must not be null @@ -244,8 +257,8 @@ public class TileGenericPipe extends TileEntity implements IPowerReceptor, IFlui } if (renderState.isDirty()) { - markBlockForUpdate(); renderState.clean(); + sendUpdateToClient(); } } @@ -363,6 +376,10 @@ public class TileGenericPipe extends TileEntity implements IPowerReceptor, IFlui return packet.getPacket(); } + public void sendUpdateToClient() { + sendClientUpdate = true; + } + @Override public LinkedList getTriggers() { LinkedList result = new LinkedList(); @@ -428,12 +445,12 @@ public class TileGenericPipe extends TileEntity implements IPowerReceptor, IFlui if (!BlockGenericPipe.isValid(pipe)) return false; - if(!(pipe instanceof IPipeConnectionForced) || !((IPipeConnectionForced) pipe).ignoreConnectionOverrides(side)) + if (!(pipe instanceof IPipeConnectionForced) || !((IPipeConnectionForced) pipe).ignoreConnectionOverrides(side)) if (with instanceof IPipeConnection) { IPipeConnection.ConnectOverride override = ((IPipeConnection) with).overridePipeConnection(pipe.transport.getPipeType(), side.getOpposite()); if (override != IPipeConnection.ConnectOverride.DEFAULT) return override == IPipeConnection.ConnectOverride.CONNECT ? true : false; - } + } if (with instanceof TileGenericPipe) { if (((TileGenericPipe) with).hasPlug(side.getOpposite())) @@ -618,9 +635,16 @@ public class TileGenericPipe extends TileEntity implements IPowerReceptor, IFlui pipe.gate = new GateVanilla(pipe); pipe.gate.kind = GateKind.values()[coreState.gateKind]; } + worldObj.markBlockForRenderUpdate(xCoord, yCoord, zCoord); break; + case 1: { + if (renderState.needsRenderUpdate()) { + worldObj.markBlockForRenderUpdate(xCoord, yCoord, zCoord); + renderState.clean(); + } + break; + } } - worldObj.markBlockForRenderUpdate(xCoord, yCoord, zCoord); } @Override @@ -690,11 +714,7 @@ public class TileGenericPipe extends TileEntity implements IPowerReceptor, IFlui public boolean isUseableByPlayer(EntityPlayer player) { return worldObj.getBlockTileEntity(xCoord, yCoord, zCoord) == this; } - - public void markBlockForUpdate() { - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - } - + @Override public void writeGuiData(DataOutputStream data) throws IOException { if (BlockGenericPipe.isValid(pipe) && pipe instanceof IGuiReturnHandler) diff --git a/common/buildcraft/transport/TransportProxyClient.java b/common/buildcraft/transport/TransportProxyClient.java index d75da5f0..b654f44d 100644 --- a/common/buildcraft/transport/TransportProxyClient.java +++ b/common/buildcraft/transport/TransportProxyClient.java @@ -3,23 +3,23 @@ package buildcraft.transport; import buildcraft.BuildCraftTransport; import buildcraft.transport.render.FacadeItemRenderer; import buildcraft.transport.render.PipeItemRenderer; -import buildcraft.transport.render.PipeWorldRenderer; +import buildcraft.transport.render.PipeRendererWorld; import buildcraft.transport.render.PlugItemRenderer; -import buildcraft.transport.render.RenderPipe; +import buildcraft.transport.render.PipeRendererTESR; import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.client.registry.RenderingRegistry; import net.minecraftforge.client.MinecraftForgeClient; public class TransportProxyClient extends TransportProxy { public final static PipeItemRenderer pipeItemRenderer = new PipeItemRenderer(); - public final static PipeWorldRenderer pipeWorldRenderer = new PipeWorldRenderer(); + public final static PipeRendererWorld pipeWorldRenderer = new PipeRendererWorld(); public final static FacadeItemRenderer facadeItemRenderer = new FacadeItemRenderer(); public final static PlugItemRenderer plugItemRenderer = new PlugItemRenderer(); @Override public void registerTileEntities() { super.registerTileEntities(); - RenderPipe rp = new RenderPipe(); + PipeRendererTESR rp = new PipeRendererTESR(); ClientRegistry.bindTileEntitySpecialRenderer(TileDummyGenericPipe.class, rp); ClientRegistry.bindTileEntitySpecialRenderer(TileDummyGenericPipe2.class, rp); ClientRegistry.bindTileEntitySpecialRenderer(TileGenericPipe.class, rp); diff --git a/common/buildcraft/transport/pipes/PipeItemsDaizuli.java b/common/buildcraft/transport/pipes/PipeItemsDaizuli.java index 7c030ef6..2d631529 100644 --- a/common/buildcraft/transport/pipes/PipeItemsDaizuli.java +++ b/common/buildcraft/transport/pipes/PipeItemsDaizuli.java @@ -72,7 +72,6 @@ public class PipeItemsDaizuli extends Pipe implements IPipeT if (color != c.ordinal()) { this.color = c.ordinal(); container.scheduleRenderUpdate(); - container.markBlockForUpdate(); } } diff --git a/common/buildcraft/transport/pipes/PipeItemsLapis.java b/common/buildcraft/transport/pipes/PipeItemsLapis.java index 10d83ff8..3966a23e 100644 --- a/common/buildcraft/transport/pipes/PipeItemsLapis.java +++ b/common/buildcraft/transport/pipes/PipeItemsLapis.java @@ -77,7 +77,6 @@ public class PipeItemsLapis extends Pipe implements IItemTra if (color.ordinal() != container.getBlockMetadata()) { container.worldObj.setBlockMetadataWithNotify(container.xCoord, container.yCoord, container.zCoord, color.ordinal(), 3); container.scheduleRenderUpdate(); - container.markBlockForUpdate(); } } diff --git a/common/buildcraft/transport/pipes/PipeLogicIron.java b/common/buildcraft/transport/pipes/PipeLogicIron.java index 9bce940a..486cdb0b 100644 --- a/common/buildcraft/transport/pipes/PipeLogicIron.java +++ b/common/buildcraft/transport/pipes/PipeLogicIron.java @@ -82,7 +82,7 @@ public abstract class PipeLogicIron { Item equipped = entityplayer.getCurrentEquippedItem() != null ? entityplayer.getCurrentEquippedItem().getItem() : null; if (equipped instanceof IToolWrench && ((IToolWrench) equipped).canWrench(entityplayer, pipe.container.xCoord, pipe.container.yCoord, pipe.container.zCoord)) { switchPosition(); - pipe.container.worldObj.markBlockForUpdate(pipe.container.xCoord, pipe.container.yCoord, pipe.container.zCoord); + pipe.container.scheduleRenderUpdate(); ((IToolWrench) equipped).wrenchUsed(entityplayer, pipe.container.xCoord, pipe.container.yCoord, pipe.container.zCoord); return true; diff --git a/common/buildcraft/transport/pipes/PipePowerIron.java b/common/buildcraft/transport/pipes/PipePowerIron.java index dbf942f0..2a6b30bd 100644 --- a/common/buildcraft/transport/pipes/PipePowerIron.java +++ b/common/buildcraft/transport/pipes/PipePowerIron.java @@ -99,7 +99,6 @@ public class PipePowerIron extends Pipe { if (mode.ordinal() != container.getBlockMetadata()) { container.worldObj.setBlockMetadataWithNotify(container.xCoord, container.yCoord, container.zCoord, mode.ordinal(), 3); container.scheduleRenderUpdate(); - container.markBlockForUpdate(); } } diff --git a/common/buildcraft/transport/render/PipeRendererTESR.java b/common/buildcraft/transport/render/PipeRendererTESR.java index 859f40d1..425cfde7 100644 --- a/common/buildcraft/transport/render/PipeRendererTESR.java +++ b/common/buildcraft/transport/render/PipeRendererTESR.java @@ -10,13 +10,16 @@ package buildcraft.transport.render; import buildcraft.BuildCraftCore; import buildcraft.BuildCraftCore.RenderMode; import buildcraft.BuildCraftTransport; +import buildcraft.api.transport.IPipe; +import buildcraft.api.transport.IPipe.WireColor; import buildcraft.core.render.FluidRenderer; import buildcraft.core.render.RenderEntityBlock; -import buildcraft.core.render.RenderEntityBlock.BlockInterface; +import buildcraft.core.render.RenderEntityBlock.RenderInfo; import buildcraft.core.utils.EnumColor; import buildcraft.core.utils.Utils; import buildcraft.transport.Pipe; import buildcraft.transport.PipeIconProvider; +import buildcraft.transport.PipeRenderState; import buildcraft.transport.PipeTransportFluids; import buildcraft.transport.PipeTransportItems; import buildcraft.transport.PipeTransportPower; @@ -26,6 +29,7 @@ import com.google.common.collect.Maps; import java.util.HashMap; import net.minecraft.block.Block; import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.texture.TextureMap; @@ -40,7 +44,7 @@ import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import org.lwjgl.opengl.GL11; -public class RenderPipe extends TileEntitySpecialRenderer { +public class PipeRendererTESR extends TileEntitySpecialRenderer { final static private int LIQUID_STAGES = 40; final static private int MAX_ITEMS_TO_RENDER = 10; @@ -61,7 +65,7 @@ public class RenderPipe extends TileEntitySpecialRenderer { public int[] displayPowerList = new int[POWER_STAGES]; public int[] displayPowerListOverload = new int[POWER_STAGES]; - public RenderPipe() { + public PipeRendererTESR() { customRenderItem = new RenderItem() { @Override public boolean shouldBob() { @@ -84,7 +88,7 @@ public class RenderPipe extends TileEntitySpecialRenderer { DisplayFluidList d = new DisplayFluidList(); displayFluidLists.put(liquidId, d); - BlockInterface block = new BlockInterface(); + RenderInfo block = new RenderInfo(); Fluid fluid = FluidRegistry.getFluid(liquidId); if (fluid.getBlockID() > 0) { @@ -185,7 +189,7 @@ public class RenderPipe extends TileEntitySpecialRenderer { initialized = true; - BlockInterface block = new BlockInterface(); + RenderInfo block = new RenderInfo(); block.texture = BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.Power_Normal.ordinal()); float size = Utils.pipeMaxPos - Utils.pipeMinPos; @@ -250,6 +254,8 @@ public class RenderPipe extends TileEntitySpecialRenderer { if (pipe.pipe == null) return; + renderGatesWires(pipe, x, y, z); + switch (pipe.getPipeType()) { case ITEM: renderSolids(pipe.pipe, x, y, z); @@ -263,6 +269,254 @@ public class RenderPipe extends TileEntitySpecialRenderer { } } + private void renderGatesWires(TileGenericPipe pipe, double x, double y, double z) { + PipeRenderState state = pipe.getRenderState(); + + if (state.wireMatrix.hasWire(WireColor.Red)) { + pipeWireRender(pipe, Utils.pipeMinPos, Utils.pipeMaxPos, Utils.pipeMinPos, IPipe.WireColor.Red, x, y, z); + } + + if (state.wireMatrix.hasWire(WireColor.Blue)) { + pipeWireRender(pipe, Utils.pipeMaxPos, Utils.pipeMaxPos, Utils.pipeMaxPos, IPipe.WireColor.Blue, x, y, z); + } + + if (state.wireMatrix.hasWire(WireColor.Green)) { + pipeWireRender(pipe, Utils.pipeMaxPos, Utils.pipeMinPos, Utils.pipeMinPos, IPipe.WireColor.Green, x, y, z); + } + + if (state.wireMatrix.hasWire(WireColor.Yellow)) { + pipeWireRender(pipe, Utils.pipeMinPos, Utils.pipeMinPos, Utils.pipeMaxPos, IPipe.WireColor.Yellow, x, y, z); + } + + if (state.hasGate()) { + pipeGateRender(pipe, x, y, z); + } + } + + private void pipeWireRender(TileGenericPipe pipe, float cx, float cy, float cz, IPipe.WireColor color, double x, double y, double z) { + + PipeRenderState state = pipe.getRenderState(); + + float minX = Utils.pipeMinPos; + float minY = Utils.pipeMinPos; + float minZ = Utils.pipeMinPos; + + float maxX = Utils.pipeMaxPos; + float maxY = Utils.pipeMaxPos; + float maxZ = Utils.pipeMaxPos; + + boolean foundX = false, foundY = false, foundZ = false; + + if (state.wireMatrix.isWireConnected(color, ForgeDirection.WEST)) { + minX = 0; + foundX = true; + } + + if (state.wireMatrix.isWireConnected(color, ForgeDirection.EAST)) { + maxX = 1; + foundX = true; + } + + if (state.wireMatrix.isWireConnected(color, ForgeDirection.DOWN)) { + minY = 0; + foundY = true; + } + + if (state.wireMatrix.isWireConnected(color, ForgeDirection.UP)) { + maxY = 1; + foundY = true; + } + + if (state.wireMatrix.isWireConnected(color, ForgeDirection.NORTH)) { + minZ = 0; + foundZ = true; + } + + if (state.wireMatrix.isWireConnected(color, ForgeDirection.SOUTH)) { + maxZ = 1; + foundZ = true; + } + + boolean center = false; + + if (minX == 0 && maxX != 1 && (foundY || foundZ)) + if (cx == Utils.pipeMinPos) { + maxX = Utils.pipeMinPos; + } else { + center = true; + } + + if (minX != 0 && maxX == 1 && (foundY || foundZ)) + if (cx == Utils.pipeMaxPos) { + minX = Utils.pipeMaxPos; + } else { + center = true; + } + + if (minY == 0 && maxY != 1 && (foundX || foundZ)) + if (cy == Utils.pipeMinPos) { + maxY = Utils.pipeMinPos; + } else { + center = true; + } + + if (minY != 0 && maxY == 1 && (foundX || foundZ)) + if (cy == Utils.pipeMaxPos) { + minY = Utils.pipeMaxPos; + } else { + center = true; + } + + if (minZ == 0 && maxZ != 1 && (foundX || foundY)) + if (cz == Utils.pipeMinPos) { + maxZ = Utils.pipeMinPos; + } else { + center = true; + } + + if (minZ != 0 && maxZ == 1 && (foundX || foundY)) + if (cz == Utils.pipeMaxPos) { + minZ = Utils.pipeMaxPos; + } else { + center = true; + } + + boolean found = foundX || foundY || foundZ; + + GL11.glPushMatrix(); + GL11.glPushAttrib(GL11.GL_ENABLE_BIT); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_CULL_FACE); + RenderHelper.disableStandardItemLighting(); + + GL11.glColor3f(1, 1, 1); + GL11.glTranslatef((float) x, (float) y, (float) z); + + bindTexture(TextureMap.locationBlocksTexture); + + RenderInfo box = new RenderInfo(); + box.texture = BuildCraftTransport.instance.wireIconProvider.getIcon(state.wireMatrix.getWireIconIndex(color)); + + // Z render + + if (minZ != Utils.pipeMinPos || maxZ != Utils.pipeMaxPos || !found) { + box.setBounds(cx == Utils.pipeMinPos ? cx - 0.05F : cx, cy == Utils.pipeMinPos ? cy - 0.05F : cy, minZ, cx == Utils.pipeMinPos ? cx + : cx + 0.05F, cy == Utils.pipeMinPos ? cy : cy + 0.05F, maxZ); + RenderEntityBlock.INSTANCE.renderBlock(box, pipe.worldObj, 0, 0, 0, pipe.xCoord, pipe.yCoord, pipe.zCoord, true, true); + } + + // X render + + if (minX != Utils.pipeMinPos || maxX != Utils.pipeMaxPos || !found) { + box.setBounds(minX, cy == Utils.pipeMinPos ? cy - 0.05F : cy, cz == Utils.pipeMinPos ? cz - 0.05F : cz, maxX, cy == Utils.pipeMinPos ? cy + : cy + 0.05F, cz == Utils.pipeMinPos ? cz : cz + 0.05F); + RenderEntityBlock.INSTANCE.renderBlock(box, pipe.worldObj, 0, 0, 0, pipe.xCoord, pipe.yCoord, pipe.zCoord, true, true); + } + + // Y render + + if (minY != Utils.pipeMinPos || maxY != Utils.pipeMaxPos || !found) { + box.setBounds(cx == Utils.pipeMinPos ? cx - 0.05F : cx, minY, cz == Utils.pipeMinPos ? cz - 0.05F : cz, cx == Utils.pipeMinPos ? cx + : cx + 0.05F, maxY, cz == Utils.pipeMinPos ? cz : cz + 0.05F); + RenderEntityBlock.INSTANCE.renderBlock(box, pipe.worldObj, 0, 0, 0, pipe.xCoord, pipe.yCoord, pipe.zCoord, true, true); + } + + if (center || !found) { + box.setBounds(cx == Utils.pipeMinPos ? cx - 0.05F : cx, cy == Utils.pipeMinPos ? cy - 0.05F : cy, cz == Utils.pipeMinPos ? cz - 0.05F : cz, + cx == Utils.pipeMinPos ? cx : cx + 0.05F, cy == Utils.pipeMinPos ? cy : cy + 0.05F, cz == Utils.pipeMinPos ? cz : cz + 0.05F); + RenderEntityBlock.INSTANCE.renderBlock(box, pipe.worldObj, 0, 0, 0, pipe.xCoord, pipe.yCoord, pipe.zCoord, true, true); + } + + RenderHelper.enableStandardItemLighting(); + + GL11.glPopAttrib(); + GL11.glPopMatrix(); + } + + private void pipeGateRender(TileGenericPipe pipe, double x, double y, double z) { + GL11.glPushMatrix(); + GL11.glPushAttrib(GL11.GL_ENABLE_BIT); +// GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_CULL_FACE); +// GL11.glDisable(GL11.GL_TEXTURE_2D); + RenderHelper.disableStandardItemLighting(); + + GL11.glColor3f(1, 1, 1); + GL11.glTranslatef((float) x, (float) y, (float) z); + + bindTexture(TextureMap.locationBlocksTexture); + + PipeRenderState state = pipe.getRenderState(); + + float min = Utils.pipeMinPos + 0.05F; + float max = Utils.pipeMaxPos - 0.05F; + + RenderInfo box = new RenderInfo(); + box.texture = BuildCraftTransport.instance.gateIconProvider.getIcon(state.getGateIconIndex()); + + if (shouldRenderNormalPipeSide(state, ForgeDirection.WEST)) { + box.setBounds(Utils.pipeMinPos - 0.10F, min, min, Utils.pipeMinPos + 0.001F, max, max); + RenderEntityBlock.INSTANCE.renderBlock(box, pipe.worldObj, 0, 0, 0, pipe.xCoord, pipe.yCoord, pipe.zCoord, true, true); + } + + if (shouldRenderNormalPipeSide(state, ForgeDirection.EAST)) { + box.setBounds(Utils.pipeMaxPos + 0.001F, min, min, Utils.pipeMaxPos + 0.10F, max, max); + RenderEntityBlock.INSTANCE.renderBlock(box, pipe.worldObj, 0, 0, 0, pipe.xCoord, pipe.yCoord, pipe.zCoord, true, true); + } + + if (shouldRenderNormalPipeSide(state, ForgeDirection.DOWN)) { + box.setBounds(min, Utils.pipeMinPos - 0.10F, min, max, Utils.pipeMinPos + 0.001F, max); + RenderEntityBlock.INSTANCE.renderBlock(box, pipe.worldObj, 0, 0, 0, pipe.xCoord, pipe.yCoord, pipe.zCoord, true, true); + } + + if (shouldRenderNormalPipeSide(state, ForgeDirection.UP)) { + box.setBounds(min, Utils.pipeMaxPos + 0.001F, min, max, Utils.pipeMaxPos + 0.10F, max); + RenderEntityBlock.INSTANCE.renderBlock(box, pipe.worldObj, 0, 0, 0, pipe.xCoord, pipe.yCoord, pipe.zCoord, true, true); + } + + if (shouldRenderNormalPipeSide(state, ForgeDirection.NORTH)) { + box.setBounds(min, min, Utils.pipeMinPos - 0.10F, max, max, Utils.pipeMinPos + 0.001F); + RenderEntityBlock.INSTANCE.renderBlock(box, pipe.worldObj, 0, 0, 0, pipe.xCoord, pipe.yCoord, pipe.zCoord, true, true); + } + + if (shouldRenderNormalPipeSide(state, ForgeDirection.SOUTH)) { + box.setBounds(min, min, Utils.pipeMaxPos + 0.001F, max, max, Utils.pipeMaxPos + 0.10F); + RenderEntityBlock.INSTANCE.renderBlock(box, pipe.worldObj, 0, 0, 0, pipe.xCoord, pipe.yCoord, pipe.zCoord, true, true); + } + + RenderHelper.enableStandardItemLighting(); + + GL11.glPopAttrib(); + GL11.glPopMatrix(); + } + + private boolean shouldRenderNormalPipeSide(PipeRenderState state, ForgeDirection direction) { + return !state.pipeConnectionMatrix.isConnected(direction) && state.facadeMatrix.getFacadeBlockId(direction) == 0 && !state.plugMatrix.isConnected(direction) && !isOpenOrientation(state, direction); + } + + public boolean isOpenOrientation(PipeRenderState state, ForgeDirection direction) { + int connections = 0; + + ForgeDirection targetOrientation = ForgeDirection.UNKNOWN; + + for (ForgeDirection o : ForgeDirection.VALID_DIRECTIONS) { + if (state.pipeConnectionMatrix.isConnected(o)) { + + connections++; + + if (connections == 1) + targetOrientation = o; + } + } + + if (connections > 1 || connections == 0) + return false; + + return targetOrientation.getOpposite() == direction; + } + private void renderPower(Pipe pipe, double x, double y, double z) { initializeDisplayPowerList(pipe.container.worldObj); @@ -449,7 +703,7 @@ public class RenderPipe extends TileEntitySpecialRenderer { customRenderItem.doRenderItem(dummyEntityItem, 0, 0, 0, 0, 0); if (color != null) { bindTexture(TextureMap.locationBlocksTexture); - BlockInterface block = new BlockInterface(); + RenderInfo block = new RenderInfo(); block.texture = PipeIconProvider.TYPE.ItemBox.getIcon(); diff --git a/common/buildcraft/transport/render/PipeRendererWorld.java b/common/buildcraft/transport/render/PipeRendererWorld.java index 31983f43..5cc1baef 100644 --- a/common/buildcraft/transport/render/PipeRendererWorld.java +++ b/common/buildcraft/transport/render/PipeRendererWorld.java @@ -2,8 +2,6 @@ package buildcraft.transport.render; import buildcraft.BuildCraftTransport; import buildcraft.api.core.IIconProvider; -import buildcraft.api.transport.IPipe; -import buildcraft.api.transport.IPipe.WireColor; import buildcraft.core.utils.Utils; import buildcraft.transport.BlockGenericPipe; import buildcraft.transport.IPipeRenderState; @@ -20,7 +18,7 @@ import net.minecraft.util.Icon; import net.minecraft.world.IBlockAccess; import net.minecraftforge.common.ForgeDirection; -public class PipeWorldRenderer implements ISimpleBlockRenderingHandler { +public class PipeRendererWorld implements ISimpleBlockRenderingHandler { public static final float facadeThickness = 1F / 16F; @@ -197,31 +195,6 @@ public class PipeWorldRenderer implements ISimpleBlockRenderingHandler { renderblocks.setRenderBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - if (state.wireMatrix.hasWire(WireColor.Red)) { - state.currentTexture = BuildCraftTransport.instance.wireIconProvider.getIcon(state.wireMatrix.getWireIconIndex(WireColor.Red)); - - pipeWireRender(renderblocks, block, state, Utils.pipeMinPos, Utils.pipeMaxPos, Utils.pipeMinPos, IPipe.WireColor.Red, x, y, z); - } - - if (state.wireMatrix.hasWire(WireColor.Blue)) { - state.currentTexture = BuildCraftTransport.instance.wireIconProvider.getIcon(state.wireMatrix.getWireIconIndex(WireColor.Blue)); - pipeWireRender(renderblocks, block, state, Utils.pipeMaxPos, Utils.pipeMaxPos, Utils.pipeMaxPos, IPipe.WireColor.Blue, x, y, z); - } - - if (state.wireMatrix.hasWire(WireColor.Green)) { - state.currentTexture = BuildCraftTransport.instance.wireIconProvider.getIcon(state.wireMatrix.getWireIconIndex(WireColor.Green)); - pipeWireRender(renderblocks, block, state, Utils.pipeMaxPos, Utils.pipeMinPos, Utils.pipeMinPos, IPipe.WireColor.Green, x, y, z); - } - - if (state.wireMatrix.hasWire(WireColor.Yellow)) { - state.currentTexture = BuildCraftTransport.instance.wireIconProvider.getIcon(state.wireMatrix.getWireIconIndex(WireColor.Yellow)); - pipeWireRender(renderblocks, block, state, Utils.pipeMinPos, Utils.pipeMinPos, Utils.pipeMaxPos, IPipe.WireColor.Yellow, x, y, z); - } - - if (state.hasGate()) { - pipeGateRender(renderblocks, block, state, x, y, z); - } - pipeFacadeRenderer(renderblocks, block, state, x, y, z); pipePlugRenderer(renderblocks, block, state, x, y, z); @@ -392,190 +365,6 @@ public class PipeWorldRenderer implements ISimpleBlockRenderingHandler { } - private void pipeWireRender(RenderBlocks renderblocks, Block block, PipeRenderState state, float cx, float cy, float cz, IPipe.WireColor color, int x, - int y, int z) { - - float minX = Utils.pipeMinPos; - float minY = Utils.pipeMinPos; - float minZ = Utils.pipeMinPos; - - float maxX = Utils.pipeMaxPos; - float maxY = Utils.pipeMaxPos; - float maxZ = Utils.pipeMaxPos; - - boolean foundX = false, foundY = false, foundZ = false; - - if (state.wireMatrix.isWireConnected(color, ForgeDirection.WEST)) { - minX = 0; - foundX = true; - } - - if (state.wireMatrix.isWireConnected(color, ForgeDirection.EAST)) { - maxX = 1; - foundX = true; - } - - if (state.wireMatrix.isWireConnected(color, ForgeDirection.DOWN)) { - minY = 0; - foundY = true; - } - - if (state.wireMatrix.isWireConnected(color, ForgeDirection.UP)) { - maxY = 1; - foundY = true; - } - - if (state.wireMatrix.isWireConnected(color, ForgeDirection.NORTH)) { - minZ = 0; - foundZ = true; - } - - if (state.wireMatrix.isWireConnected(color, ForgeDirection.SOUTH)) { - maxZ = 1; - foundZ = true; - } - - boolean center = false; - - if (minX == 0 && maxX != 1 && (foundY || foundZ)) - if (cx == Utils.pipeMinPos) { - maxX = Utils.pipeMinPos; - } else { - center = true; - } - - if (minX != 0 && maxX == 1 && (foundY || foundZ)) - if (cx == Utils.pipeMaxPos) { - minX = Utils.pipeMaxPos; - } else { - center = true; - } - - if (minY == 0 && maxY != 1 && (foundX || foundZ)) - if (cy == Utils.pipeMinPos) { - maxY = Utils.pipeMinPos; - } else { - center = true; - } - - if (minY != 0 && maxY == 1 && (foundX || foundZ)) - if (cy == Utils.pipeMaxPos) { - minY = Utils.pipeMaxPos; - } else { - center = true; - } - - if (minZ == 0 && maxZ != 1 && (foundX || foundY)) - if (cz == Utils.pipeMinPos) { - maxZ = Utils.pipeMinPos; - } else { - center = true; - } - - if (minZ != 0 && maxZ == 1 && (foundX || foundY)) - if (cz == Utils.pipeMaxPos) { - minZ = Utils.pipeMaxPos; - } else { - center = true; - } - - boolean found = foundX || foundY || foundZ; - - // Z render - - if (minZ != Utils.pipeMinPos || maxZ != Utils.pipeMaxPos || !found) { - renderblocks.setRenderBounds(cx == Utils.pipeMinPos ? cx - 0.05F : cx, cy == Utils.pipeMinPos ? cy - 0.05F : cy, minZ, cx == Utils.pipeMinPos ? cx - : cx + 0.05F, cy == Utils.pipeMinPos ? cy : cy + 0.05F, maxZ); - renderblocks.renderStandardBlock(block, x, y, z); - } - - // X render - - if (minX != Utils.pipeMinPos || maxX != Utils.pipeMaxPos || !found) { - renderblocks.setRenderBounds(minX, cy == Utils.pipeMinPos ? cy - 0.05F : cy, cz == Utils.pipeMinPos ? cz - 0.05F : cz, maxX, cy == Utils.pipeMinPos ? cy - : cy + 0.05F, cz == Utils.pipeMinPos ? cz : cz + 0.05F); - renderblocks.renderStandardBlock(block, x, y, z); - } - - // Y render - - if (minY != Utils.pipeMinPos || maxY != Utils.pipeMaxPos || !found) { - renderblocks.setRenderBounds(cx == Utils.pipeMinPos ? cx - 0.05F : cx, minY, cz == Utils.pipeMinPos ? cz - 0.05F : cz, cx == Utils.pipeMinPos ? cx - : cx + 0.05F, maxY, cz == Utils.pipeMinPos ? cz : cz + 0.05F); - renderblocks.renderStandardBlock(block, x, y, z); - } - - if (center || !found) { - renderblocks.setRenderBounds(cx == Utils.pipeMinPos ? cx - 0.05F : cx, cy == Utils.pipeMinPos ? cy - 0.05F : cy, cz == Utils.pipeMinPos ? cz - 0.05F : cz, - cx == Utils.pipeMinPos ? cx : cx + 0.05F, cy == Utils.pipeMinPos ? cy : cy + 0.05F, cz == Utils.pipeMinPos ? cz : cz + 0.05F); - renderblocks.renderStandardBlock(block, x, y, z); - } - - } - - private void pipeGateRender(RenderBlocks renderblocks, Block block, PipeRenderState state, int x, int y, int z) { - - state.currentTexture = BuildCraftTransport.instance.gateIconProvider.getIcon(state.getGateIconIndex()); - - float min = Utils.pipeMinPos + 0.05F; - float max = Utils.pipeMaxPos - 0.05F; - - if (shouldRenderNormalPipeSide(state, ForgeDirection.WEST)) { - renderblocks.setRenderBounds(Utils.pipeMinPos - 0.10F, min, min, Utils.pipeMinPos + 0.001F, max, max); - renderblocks.renderStandardBlock(block, x, y, z); - } - - if (shouldRenderNormalPipeSide(state, ForgeDirection.EAST)) { - renderblocks.setRenderBounds(Utils.pipeMaxPos + 0.001F, min, min, Utils.pipeMaxPos + 0.10F, max, max); - renderblocks.renderStandardBlock(block, x, y, z); - } - - if (shouldRenderNormalPipeSide(state, ForgeDirection.DOWN)) { - renderblocks.setRenderBounds(min, Utils.pipeMinPos - 0.10F, min, max, Utils.pipeMinPos + 0.001F, max); - renderblocks.renderStandardBlock(block, x, y, z); - } - - if (shouldRenderNormalPipeSide(state, ForgeDirection.UP)) { - renderblocks.setRenderBounds(min, Utils.pipeMaxPos + 0.001F, min, max, Utils.pipeMaxPos + 0.10F, max); - renderblocks.renderStandardBlock(block, x, y, z); - } - - if (shouldRenderNormalPipeSide(state, ForgeDirection.NORTH)) { - renderblocks.setRenderBounds(min, min, Utils.pipeMinPos - 0.10F, max, max, Utils.pipeMinPos + 0.001F); - renderblocks.renderStandardBlock(block, x, y, z); - } - - if (shouldRenderNormalPipeSide(state, ForgeDirection.SOUTH)) { - renderblocks.setRenderBounds(min, min, Utils.pipeMaxPos + 0.001F, max, max, Utils.pipeMaxPos + 0.10F); - renderblocks.renderStandardBlock(block, x, y, z); - } - } - - private boolean shouldRenderNormalPipeSide(PipeRenderState state, ForgeDirection direction) { - return !state.pipeConnectionMatrix.isConnected(direction) && state.facadeMatrix.getFacadeBlockId(direction) == 0 && !state.plugMatrix.isConnected(direction) && !isOpenOrientation(state, direction); - } - - public boolean isOpenOrientation(PipeRenderState state, ForgeDirection direction) { - int connections = 0; - - ForgeDirection targetOrientation = ForgeDirection.UNKNOWN; - - for (ForgeDirection o : ForgeDirection.VALID_DIRECTIONS) { - if (state.pipeConnectionMatrix.isConnected(o)) { - - connections++; - - if (connections == 1) - targetOrientation = o; - } - } - - if (connections > 1 || connections == 0) - return false; - - return targetOrientation.getOpposite() == direction; - } - @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { // TODO Auto-generated method stub diff --git a/common/buildcraft/transport/utils/ConnectionMatrix.java b/common/buildcraft/transport/utils/ConnectionMatrix.java index 778e7ba7..93acc280 100644 --- a/common/buildcraft/transport/utils/ConnectionMatrix.java +++ b/common/buildcraft/transport/utils/ConnectionMatrix.java @@ -8,9 +8,8 @@ import net.minecraftforge.common.ForgeDirection; public class ConnectionMatrix { - private final BitSet _connected = new BitSet(ForgeDirection.VALID_DIRECTIONS.length); + private BitSet _connected = new BitSet(ForgeDirection.VALID_DIRECTIONS.length); private final BitSetCodec _bitSetCodec = new BitSetCodec(); - private boolean dirty = false; public boolean isConnected(ForgeDirection direction) { @@ -18,7 +17,7 @@ public class ConnectionMatrix { } public void setConnected(ForgeDirection direction, boolean value) { - if (_connected.get(direction.ordinal()) != value){ + if (_connected.get(direction.ordinal()) != value) { _connected.set(direction.ordinal(), value); dirty = true; } @@ -37,6 +36,11 @@ public class ConnectionMatrix { } public void readData(DataInputStream data) throws IOException { - _bitSetCodec.decode(data.readByte(), _connected); + BitSet connection = new BitSet(ForgeDirection.VALID_DIRECTIONS.length); + _bitSetCodec.decode(data.readByte(), connection); + if (!_connected.equals(connection)) { + _connected = connection; + dirty = true; + } } } diff --git a/common/buildcraft/transport/utils/FacadeMatrix.java b/common/buildcraft/transport/utils/FacadeMatrix.java index 086eecc5..b4ce11d4 100644 --- a/common/buildcraft/transport/utils/FacadeMatrix.java +++ b/common/buildcraft/transport/utils/FacadeMatrix.java @@ -6,27 +6,27 @@ import java.io.IOException; import net.minecraftforge.common.ForgeDirection; public class FacadeMatrix { + private final int[] _blockIds = new int[ForgeDirection.VALID_DIRECTIONS.length]; private final int[] _blockMetas = new int[ForgeDirection.VALID_DIRECTIONS.length]; - private boolean dirty = false; public FacadeMatrix() { } - public void setFacade(ForgeDirection direction, int blockId, int blockMeta){ - if (_blockIds[direction.ordinal()] != blockId || _blockMetas[direction.ordinal()] != blockMeta){ + public void setFacade(ForgeDirection direction, int blockId, int blockMeta) { + if (_blockIds[direction.ordinal()] != blockId || _blockMetas[direction.ordinal()] != blockMeta) { _blockIds[direction.ordinal()] = blockId; _blockMetas[direction.ordinal()] = blockMeta; dirty = true; } } - - public int getFacadeBlockId(ForgeDirection direction){ + + public int getFacadeBlockId(ForgeDirection direction) { return _blockIds[direction.ordinal()]; } - - public int getFacadeMetaId(ForgeDirection direction){ + + public int getFacadeMetaId(ForgeDirection direction) { return _blockMetas[direction.ordinal()]; } @@ -38,17 +38,25 @@ public class FacadeMatrix { dirty = false; } - public void readData(DataInputStream data) throws IOException { - for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { - _blockIds[i] = data.readShort(); - _blockMetas[i] = data.readByte(); - } - } - public void writeData(DataOutputStream data) throws IOException { for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { data.writeShort(_blockIds[i]); data.writeByte(_blockMetas[i]); } } + + public void readData(DataInputStream data) throws IOException { + for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { + short id = data.readShort(); + if (_blockIds[i] != id) { + _blockIds[i] = id; + dirty = true; + } + byte meta = data.readByte(); + if (_blockMetas[i] != meta) { + _blockMetas[i] = meta; + dirty = true; + } + } + } } diff --git a/common/buildcraft/transport/utils/TextureMatrix.java b/common/buildcraft/transport/utils/TextureMatrix.java index eb535a9b..2da1e5d7 100644 --- a/common/buildcraft/transport/utils/TextureMatrix.java +++ b/common/buildcraft/transport/utils/TextureMatrix.java @@ -8,7 +8,6 @@ import net.minecraftforge.common.ForgeDirection; public class TextureMatrix { private final int[] _iconIndexes = new int[7]; - private boolean dirty = false; public int getTextureIndex(ForgeDirection direction) { @@ -38,7 +37,11 @@ public class TextureMatrix { public void readData(DataInputStream data) throws IOException { for (int i = 0; i < _iconIndexes.length; i++) { - _iconIndexes[i] = data.readByte(); + int icon = data.readByte(); + if (_iconIndexes[i] != icon) { + _iconIndexes[i] = icon; + dirty = true; + } } } }