Moved Pipe Gate/Wire rendering to the TESR

Should greatly improve performance of wire/gate switching.
This commit is contained in:
CovertJaguar 2013-10-08 11:13:40 -07:00
parent fb0ee91183
commit 3a39b289a2
15 changed files with 556 additions and 338 deletions

View file

@ -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<Fluid, int[]> flowingRenderCache = new HashMap<Fluid, int[]>();
private static Map<Fluid, int[]> stillRenderCache = new HashMap<Fluid, int[]>();
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) {

View file

@ -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();
// }
// }
}

View file

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

View file

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

View file

@ -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<ITrigger> getTriggers() {
LinkedList<ITrigger> result = new LinkedList<ITrigger>();
@ -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)

View file

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

View file

@ -72,7 +72,6 @@ public class PipeItemsDaizuli extends Pipe<PipeTransportItems> implements IPipeT
if (color != c.ordinal()) {
this.color = c.ordinal();
container.scheduleRenderUpdate();
container.markBlockForUpdate();
}
}

View file

@ -77,7 +77,6 @@ public class PipeItemsLapis extends Pipe<PipeTransportItems> implements IItemTra
if (color.ordinal() != container.getBlockMetadata()) {
container.worldObj.setBlockMetadataWithNotify(container.xCoord, container.yCoord, container.zCoord, color.ordinal(), 3);
container.scheduleRenderUpdate();
container.markBlockForUpdate();
}
}

View file

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

View file

@ -99,7 +99,6 @@ public class PipePowerIron extends Pipe<PipeTransportPower> {
if (mode.ordinal() != container.getBlockMetadata()) {
container.worldObj.setBlockMetadataWithNotify(container.xCoord, container.yCoord, container.zCoord, mode.ordinal(), 3);
container.scheduleRenderUpdate();
container.markBlockForUpdate();
}
}

View file

@ -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<PipeTransportPower> 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();

View file

@ -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

View file

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

View file

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

View file

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