From e5844f00fb2e76f6a0776c6b9d2589dffe2c2d4f Mon Sep 17 00:00:00 2001 From: AlgorithmX2 Date: Sun, 15 Jan 2017 15:26:44 -0600 Subject: [PATCH] Trigger updates related to full blocks properly for C&B Tiles. --- .../data/VoxelBlobStateReference.java | 4 +- .../data/VoxelNeighborRenderTracker.java | 39 +++++++++++++++++-- .../chiselsandbits/core/ChiselsAndBits.java | 2 +- .../mod/chiselsandbits/helpers/IStateRef.java | 10 +++++ .../render/chiseledblock/BlockStateRef.java | 36 +++++++++++++++++ .../chiseledblock/ChiseledBlockBaked.java | 7 ++-- .../chiseledblock/ModelRenderState.java | 9 +++-- 7 files changed, 94 insertions(+), 13 deletions(-) create mode 100644 src/main/java/mod/chiselsandbits/helpers/IStateRef.java create mode 100644 src/main/java/mod/chiselsandbits/render/chiseledblock/BlockStateRef.java diff --git a/src/main/java/mod/chiselsandbits/chiseledblock/data/VoxelBlobStateReference.java b/src/main/java/mod/chiselsandbits/chiseledblock/data/VoxelBlobStateReference.java index 5d7058cd..9cb0d8d3 100644 --- a/src/main/java/mod/chiselsandbits/chiseledblock/data/VoxelBlobStateReference.java +++ b/src/main/java/mod/chiselsandbits/chiseledblock/data/VoxelBlobStateReference.java @@ -8,10 +8,11 @@ import java.util.WeakHashMap; import mod.chiselsandbits.chiseledblock.BoxType; +import mod.chiselsandbits.helpers.IStateRef; import net.minecraft.util.math.AxisAlignedBB; import net.minecraftforge.fml.common.FMLCommonHandler; -public final class VoxelBlobStateReference implements Comparable +public final class VoxelBlobStateReference implements Comparable, IStateRef { private static Map> serverRefs = Collections.synchronizedMap( new WeakHashMap>() ); @@ -98,6 +99,7 @@ public byte[] getByteArray() return data.voxelBytes; } + @Override public VoxelBlob getVoxelBlob() { return data.getBlob(); diff --git a/src/main/java/mod/chiselsandbits/chiseledblock/data/VoxelNeighborRenderTracker.java b/src/main/java/mod/chiselsandbits/chiseledblock/data/VoxelNeighborRenderTracker.java index bd2420fd..bdfffee4 100644 --- a/src/main/java/mod/chiselsandbits/chiseledblock/data/VoxelNeighborRenderTracker.java +++ b/src/main/java/mod/chiselsandbits/chiseledblock/data/VoxelNeighborRenderTracker.java @@ -5,7 +5,9 @@ import mod.chiselsandbits.chiseledblock.BlockChiseled; import mod.chiselsandbits.chiseledblock.TileEntityBlockChiseled; import mod.chiselsandbits.core.ChiselsAndBits; +import mod.chiselsandbits.helpers.IStateRef; import mod.chiselsandbits.helpers.ModUtil; +import mod.chiselsandbits.render.chiseledblock.BlockStateRef; import mod.chiselsandbits.render.chiseledblock.ModelRenderState; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; @@ -111,23 +113,34 @@ public void update( for ( final EnumFacing f : EnumFacing.VALUES ) { - final TileEntityBlockChiseled tebc = ModUtil.getChiseledTileEntity( access, pos.offset( f ) ); + final BlockPos oPos = pos.offset( f ); + + final TileEntityBlockChiseled tebc = ModUtil.getChiseledTileEntity( access, oPos ); if ( tebc != null ) { update( f, tebc.getBasicState().getValue( BlockChiseled.UProperty_VoxelBlob ) ); } else { - update( f, null ); + final int stateid = ModUtil.getStateId( access.getBlockState( oPos ) ); + + if ( stateid == 0 ) + { + update( f, null ); + } + else + { + update( f, new BlockStateRef( stateid ) ); + } } } } private void update( final EnumFacing f, - final VoxelBlobStateReference value ) + final IStateRef value ) { - if ( sides.get( f ) == value ) + if ( sameValue( sides.get( f ), value ) ) { return; } @@ -136,7 +149,25 @@ private void update( { sides.put( f, value ); lrs = null; + triggerUpdate(); + } + } + + private boolean sameValue( + final IStateRef iStateRef, + final IStateRef value ) + { + if ( iStateRef == value ) + { + return true; + } + + if ( iStateRef == null || value == null ) + { + return false; } + + return value.equals( iStateRef ); } public ModelRenderState getRenderState( diff --git a/src/main/java/mod/chiselsandbits/core/ChiselsAndBits.java b/src/main/java/mod/chiselsandbits/core/ChiselsAndBits.java index 9e164f71..88ca219c 100644 --- a/src/main/java/mod/chiselsandbits/core/ChiselsAndBits.java +++ b/src/main/java/mod/chiselsandbits/core/ChiselsAndBits.java @@ -55,7 +55,7 @@ public class ChiselsAndBits { public static final String MODNAME = "Chisels & Bits"; public static final String MODID = "chiselsandbits"; - public static final String VERSION = "@VERSION@"; + public static final String VERSION = "11.2"; public static final String DEPENDENCIES = "required-after:Forge@[12.17.0.1909,);after:mcmultipart;after:JEI@[3.7.8.234,)"; // buildVersion diff --git a/src/main/java/mod/chiselsandbits/helpers/IStateRef.java b/src/main/java/mod/chiselsandbits/helpers/IStateRef.java new file mode 100644 index 00000000..1a152066 --- /dev/null +++ b/src/main/java/mod/chiselsandbits/helpers/IStateRef.java @@ -0,0 +1,10 @@ +package mod.chiselsandbits.helpers; + +import mod.chiselsandbits.chiseledblock.data.VoxelBlob; + +public interface IStateRef +{ + + VoxelBlob getVoxelBlob(); + +} diff --git a/src/main/java/mod/chiselsandbits/render/chiseledblock/BlockStateRef.java b/src/main/java/mod/chiselsandbits/render/chiseledblock/BlockStateRef.java new file mode 100644 index 00000000..c2685fd6 --- /dev/null +++ b/src/main/java/mod/chiselsandbits/render/chiseledblock/BlockStateRef.java @@ -0,0 +1,36 @@ +package mod.chiselsandbits.render.chiseledblock; + +import mod.chiselsandbits.chiseledblock.data.VoxelBlob; +import mod.chiselsandbits.helpers.IStateRef; + +public class BlockStateRef implements IStateRef +{ + final int stateID; + + public BlockStateRef( + final int sid ) + { + stateID = sid; + } + + @Override + public boolean equals( + final Object obj ) + { + if ( obj instanceof BlockStateRef ) + { + return stateID == ( (BlockStateRef) obj ).stateID; + } + + return false; + } + + @Override + public VoxelBlob getVoxelBlob() + { + final VoxelBlob b = new VoxelBlob(); + b.fill( stateID ); + return b; + } + +}; \ No newline at end of file diff --git a/src/main/java/mod/chiselsandbits/render/chiseledblock/ChiseledBlockBaked.java b/src/main/java/mod/chiselsandbits/render/chiseledblock/ChiseledBlockBaked.java index d8a2d4be..0255566d 100644 --- a/src/main/java/mod/chiselsandbits/render/chiseledblock/ChiseledBlockBaked.java +++ b/src/main/java/mod/chiselsandbits/render/chiseledblock/ChiseledBlockBaked.java @@ -13,6 +13,7 @@ import mod.chiselsandbits.client.culling.ICullTest; import mod.chiselsandbits.core.ChiselsAndBits; import mod.chiselsandbits.core.ClientSide; +import mod.chiselsandbits.helpers.IStateRef; import mod.chiselsandbits.helpers.ModUtil; import mod.chiselsandbits.render.BaseBakedBlockModel; import mod.chiselsandbits.render.helpers.ModelQuadLayer; @@ -392,7 +393,7 @@ private void processXFaces( for ( final EnumFacing myFace : X_Faces ) { - final VoxelBlobStateReference nextToState = mrs != null && myLayer != ChiselLayer.SOLID ? mrs.get( myFace ) : null; + final IStateRef nextToState = mrs != null && myLayer != ChiselLayer.SOLID ? mrs.get( myFace ) : null; VoxelBlob nextTo = nextToState == null ? null : nextToState.getVoxelBlob(); if ( !myLayer.filter( nextTo ) ) @@ -454,7 +455,7 @@ private void processYFaces( for ( final EnumFacing myFace : Y_Faces ) { - final VoxelBlobStateReference nextToState = mrs != null && myLayer != ChiselLayer.SOLID ? mrs.get( myFace ) : null; + final IStateRef nextToState = mrs != null && myLayer != ChiselLayer.SOLID ? mrs.get( myFace ) : null; VoxelBlob nextTo = nextToState == null ? null : nextToState.getVoxelBlob(); if ( !myLayer.filter( nextTo ) ) @@ -516,7 +517,7 @@ private void processZFaces( for ( final EnumFacing myFace : Z_Faces ) { - final VoxelBlobStateReference nextToState = mrs != null && myLayer != ChiselLayer.SOLID ? mrs.get( myFace ) : null; + final IStateRef nextToState = mrs != null && myLayer != ChiselLayer.SOLID ? mrs.get( myFace ) : null; VoxelBlob nextTo = nextToState == null ? null : nextToState.getVoxelBlob(); if ( !myLayer.filter( nextTo ) ) diff --git a/src/main/java/mod/chiselsandbits/render/chiseledblock/ModelRenderState.java b/src/main/java/mod/chiselsandbits/render/chiseledblock/ModelRenderState.java index dcb29d4e..be9ece06 100644 --- a/src/main/java/mod/chiselsandbits/render/chiseledblock/ModelRenderState.java +++ b/src/main/java/mod/chiselsandbits/render/chiseledblock/ModelRenderState.java @@ -1,14 +1,15 @@ package mod.chiselsandbits.render.chiseledblock; -import mod.chiselsandbits.chiseledblock.data.VoxelBlobStateReference; +import mod.chiselsandbits.helpers.IStateRef; import net.minecraft.util.EnumFacing; public class ModelRenderState { + // less objects/garbage to clean up, and less memory usage. - private VoxelBlobStateReference north, south, east, west, up, down; + private IStateRef north, south, east, west, up, down; - public VoxelBlobStateReference get( + public IStateRef get( final EnumFacing side ) { switch ( side ) @@ -33,7 +34,7 @@ public VoxelBlobStateReference get( public void put( final EnumFacing side, - final VoxelBlobStateReference value ) + final IStateRef value ) { switch ( side ) {