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 330f4d5d..47cc95a4 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,25 +113,35 @@ public void update( for ( final EnumFacing f : EnumFacing.VALUES ) { - assert f != null; + final BlockPos oPos = pos.offset( f ); - final TileEntityBlockChiseled tebc = ModUtil.getChiseledTileEntity( access, pos.offset( f ) ); + final TileEntityBlockChiseled tebc = ModUtil.getChiseledTileEntity( access, oPos ); + assert f != null; 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; } @@ -138,9 +150,27 @@ 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( final VoxelBlobStateReference data ) { 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 ) {