diff --git a/src/main/java/mod/chiselsandbits/config/ModConfig.java b/src/main/java/mod/chiselsandbits/config/ModConfig.java index 1e5fab64..5b0eab39 100644 --- a/src/main/java/mod/chiselsandbits/config/ModConfig.java +++ b/src/main/java/mod/chiselsandbits/config/ModConfig.java @@ -153,7 +153,13 @@ public class ModConfig extends Configuration @Configured( category = "Client Performance Settings" ) public static UseVBO useVBO; - @Configured( category = "Client Performance Settings" ) + @Configured( category = "Troublershooting" ) + public boolean useGetLightValue; + + @Configured( category = "Troublershooting" ) + public boolean enableFaceLightmapExtraction; + + @Configured( category = "Troublershooting" ) public boolean disableCustomVertexFormats; @Configured( category = "Client Performance Settings" ) @@ -186,6 +192,9 @@ public class ModConfig extends Configuration @Configured( category = "Client Performance Settings" ) public boolean dynamicRenderFullChunksOnly; + @Configured( category = "Client Performance Settings" ) + public boolean enableModelCompression; + @Configured( category = "Balance Settings" ) public boolean blacklistTickingBlocks; @@ -365,6 +374,9 @@ private void setDefaults() dynamicRenderFullChunksOnly = true; useVBO = UseVBO.AUTOMATIC; disableCustomVertexFormats = false; + enableModelCompression = true; + enableFaceLightmapExtraction = true; + useGetLightValue = true; showUsage = true; invertBitBagFullness = false; diff --git a/src/main/java/mod/chiselsandbits/render/chiseledblock/ChiseledBlockBaked.java b/src/main/java/mod/chiselsandbits/render/chiseledblock/ChiseledBlockBaked.java index 1a0c13a8..dc60ae85 100644 --- a/src/main/java/mod/chiselsandbits/render/chiseledblock/ChiseledBlockBaked.java +++ b/src/main/java/mod/chiselsandbits/render/chiseledblock/ChiseledBlockBaked.java @@ -28,6 +28,7 @@ import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ModelRotation; import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.client.renderer.vertex.VertexFormatElement; import net.minecraft.util.EnumFacing; @@ -228,6 +229,20 @@ public boolean isEmpty() return trulyEmpty; } + IFaceBuilder getBuilder( + VertexFormat format ) + { + if ( ChiseledBlockSmartModel.ForgePipelineDisabled() ) + { + if ( ChiselsAndBits.getConfig().enableModelCompression ) + return new ChiselsAndBitsBakedQuad.Builder( DefaultVertexFormats.ITEM, true ); + else + return new UnpackedQuadBuilderWrapper( DefaultVertexFormats.ITEM ); + } + + return new ChiselsAndBitsBakedQuad.Builder( format, ChiselsAndBits.getConfig().enableModelCompression ); + } + private void generateFaces( final ChiseledModelBuilder builder, final VoxelBlob blob, @@ -248,7 +263,8 @@ private void generateFaces( final float[] pos = new float[3]; // single reusable face builder. - final IFaceBuilder faceBuilder = format == ChiselsAndBitsBakedQuad.VERTEX_FORMAT ? new ChiselsAndBitsBakedQuad.Builder() : new UnpackedQuadBuilderWrapper(); + final IFaceBuilder darkBuilder = getBuilder( DefaultVertexFormats.ITEM ); + final IFaceBuilder litBuilder = format == ChiselsAndBitsBakedQuad.VERTEX_FORMAT ? getBuilder( format ) : darkBuilder; for ( final ArrayList src : rset ) { @@ -269,7 +285,10 @@ private void generateFaces( { for ( final ModelQuadLayer pc : mpc ) { - faceBuilder.begin( format ); + final IFaceBuilder faceBuilder = pc.light > 0 ? litBuilder : darkBuilder; + VertexFormat builderFormat = faceBuilder.getFormat(); + + faceBuilder.begin(); faceBuilder.setFace( myFace, pc.tint ); final float maxLightmap = 32.0f / 0xffff; @@ -278,9 +297,9 @@ private void generateFaces( // build it. for ( int vertNum = 0; vertNum < 4; vertNum++ ) { - for ( int elementIndex = 0; elementIndex < format.getElementCount(); elementIndex++ ) + for ( int elementIndex = 0; elementIndex < builderFormat.getElementCount(); elementIndex++ ) { - final VertexFormatElement element = format.getElement( elementIndex ); + final VertexFormatElement element = builderFormat.getElement( elementIndex ); switch ( element.getUsage() ) { case POSITION: diff --git a/src/main/java/mod/chiselsandbits/render/chiseledblock/ChiseledBlockSmartModel.java b/src/main/java/mod/chiselsandbits/render/chiseledblock/ChiseledBlockSmartModel.java index 67bca8fe..80943a93 100644 --- a/src/main/java/mod/chiselsandbits/render/chiseledblock/ChiseledBlockSmartModel.java +++ b/src/main/java/mod/chiselsandbits/render/chiseledblock/ChiseledBlockSmartModel.java @@ -111,7 +111,7 @@ private static VertexFormat getModelFormat() return ForgePipelineDisabled() ? DefaultVertexFormats.ITEM : ChiselsAndBitsBakedQuad.VERTEX_FORMAT; } - private static boolean ForgePipelineDisabled() + public static boolean ForgePipelineDisabled() { return FMLClientHandler.instance().hasOptifine() || !ForgeModContainer.forgeLightPipelineEnabled || ChiselsAndBits.getConfig().disableCustomVertexFormats; } diff --git a/src/main/java/mod/chiselsandbits/render/chiseledblock/ChiselsAndBitsBakedQuad.java b/src/main/java/mod/chiselsandbits/render/chiseledblock/ChiselsAndBitsBakedQuad.java index 947100a3..19bb4966 100644 --- a/src/main/java/mod/chiselsandbits/render/chiseledblock/ChiselsAndBitsBakedQuad.java +++ b/src/main/java/mod/chiselsandbits/render/chiseledblock/ChiselsAndBitsBakedQuad.java @@ -78,10 +78,12 @@ public ChiselsAndBitsBakedQuad( final float[][][] unpackedData, final int tint, final EnumFacing orientation, - final TextureAtlasSprite sprite ) + final TextureAtlasSprite sprite, + VertexFormat format, + boolean enableModelCompression ) { - super( OPTIFINE_WORKAROUND, tint, orientation, sprite, true, VERTEX_FORMAT ); - rawVertData = inMemoryCompressor.compress( unpackedData ); + super( OPTIFINE_WORKAROUND, tint, orientation, sprite, true, format ); + rawVertData = enableModelCompression ? inMemoryCompressor.compress( unpackedData ) : unpackedData; } public static class Colored extends ChiselsAndBitsBakedQuad @@ -90,9 +92,11 @@ public Colored( final float[][][] unpackedData, final int tint, final EnumFacing orientation, - final TextureAtlasSprite sprite ) + final TextureAtlasSprite sprite, + VertexFormat format, + boolean enableModelCompression ) { - super( unpackedData, tint, orientation, sprite ); + super( unpackedData, tint, orientation, sprite, format, enableModelCompression ); } } @@ -106,10 +110,21 @@ public static class Builder implements IVertexConsumer, IFaceBuilder private int vertices = 0; private int elements = 0; + private final VertexFormat format; + private final boolean enableModelCompression; + + public Builder( + VertexFormat format, + boolean enableModelCompression ) + { + this.format = format; + this.enableModelCompression = enableModelCompression; + } + @Override public VertexFormat getVertexFormat() { - return VERTEX_FORMAT; + return format; } @Override @@ -153,8 +168,7 @@ public void put( } @Override - public void begin( - final VertexFormat format ) + public void begin() { if ( format != getVertexFormat() ) { @@ -175,10 +189,10 @@ public BakedQuad create( { if ( isColored ) { - return new Colored( unpackedData, tint, orientation, sprite ); + return new Colored( unpackedData, tint, orientation, sprite, getFormat(), enableModelCompression ); } - return new ChiselsAndBitsBakedQuad( unpackedData, tint, orientation, sprite ); + return new ChiselsAndBitsBakedQuad( unpackedData, tint, orientation, sprite, getFormat(), enableModelCompression ); } @Override @@ -201,5 +215,11 @@ public void setTexture( final TextureAtlasSprite texture ) { } + + @Override + public VertexFormat getFormat() + { + return format; + } } } diff --git a/src/main/java/mod/chiselsandbits/render/chiseledblock/IFaceBuilder.java b/src/main/java/mod/chiselsandbits/render/chiseledblock/IFaceBuilder.java index 113fb91b..68e74bf4 100644 --- a/src/main/java/mod/chiselsandbits/render/chiseledblock/IFaceBuilder.java +++ b/src/main/java/mod/chiselsandbits/render/chiseledblock/IFaceBuilder.java @@ -16,10 +16,11 @@ void put( int element, float... args ); - void begin( - VertexFormat format ); + void begin(); BakedQuad create( TextureAtlasSprite sprite ); + VertexFormat getFormat(); + } diff --git a/src/main/java/mod/chiselsandbits/render/chiseledblock/UnpackedQuadBuilderWrapper.java b/src/main/java/mod/chiselsandbits/render/chiseledblock/UnpackedQuadBuilderWrapper.java index 871d4f64..90c70a37 100644 --- a/src/main/java/mod/chiselsandbits/render/chiseledblock/UnpackedQuadBuilderWrapper.java +++ b/src/main/java/mod/chiselsandbits/render/chiseledblock/UnpackedQuadBuilderWrapper.java @@ -8,12 +8,17 @@ public class UnpackedQuadBuilderWrapper implements IFaceBuilder { + private final VertexFormat format; + private UnpackedBakedQuad.Builder builder; - UnpackedBakedQuad.Builder builder; + public UnpackedQuadBuilderWrapper( + VertexFormat format ) + { + this.format = format; + } @Override - public void begin( - final VertexFormat format ) + public void begin() { builder = new UnpackedBakedQuad.Builder( format ); } @@ -43,4 +48,10 @@ public void put( builder.put( element, args ); } + @Override + public VertexFormat getFormat() + { + return format; + } + } diff --git a/src/main/java/mod/chiselsandbits/render/helpers/ModelLightMapReader.java b/src/main/java/mod/chiselsandbits/render/helpers/ModelLightMapReader.java index d531853c..7c5eec2d 100644 --- a/src/main/java/mod/chiselsandbits/render/helpers/ModelLightMapReader.java +++ b/src/main/java/mod/chiselsandbits/render/helpers/ModelLightMapReader.java @@ -3,22 +3,42 @@ import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.client.renderer.vertex.VertexFormatElement; +import net.minecraft.client.renderer.vertex.VertexFormatElement.EnumType; import net.minecraft.client.renderer.vertex.VertexFormatElement.EnumUsage; public class ModelLightMapReader extends BaseModelReader { public int lv = 0; + final float maxLightmap = 32.0f / 0xffff; + private VertexFormat format = DefaultVertexFormats.BLOCK; + boolean hasLightMap = false; - public ModelLightMapReader( - final int lightValue ) + public ModelLightMapReader() { - lv = lightValue; + } + + public void setVertexFormat( + VertexFormat format ) + { + hasLightMap = false; + + int eCount = format.getElementCount(); + for ( int x = 0; x < eCount; x++ ) + { + VertexFormatElement e = format.getElement( x ); + if ( e.getUsage() == EnumUsage.UV && e.getIndex() == 1 && e.getType() == EnumType.SHORT ) + { + hasLightMap = true; + } + } + + this.format = format; } @Override public VertexFormat getVertexFormat() { - return DefaultVertexFormats.BLOCK; + return format; } @Override @@ -27,12 +47,11 @@ public void put( final float... data ) { final VertexFormatElement e = getVertexFormat().getElement( element ); - final float maxLightmap = 32.0f / 0xffff; - if ( e.getUsage() == EnumUsage.UV && e.getIndex() == 1 && data.length > 1 ) + if ( e.getUsage() == EnumUsage.UV && e.getIndex() == 1 && e.getType() == EnumType.SHORT && data.length >= 2 && hasLightMap ) { - final int lvFromData_sky = (int) ( data[0] / maxLightmap ); - final int lvFromData_block = (int) ( data[1] / maxLightmap ); + final int lvFromData_sky = (int) ( data[0] / maxLightmap ) & 0xf; + final int lvFromData_block = (int) ( data[1] / maxLightmap ) & 0xf; lv = Math.max( lvFromData_sky, lv ); lv = Math.max( lvFromData_block, lv ); diff --git a/src/main/java/mod/chiselsandbits/render/helpers/ModelQuadLayer.java b/src/main/java/mod/chiselsandbits/render/helpers/ModelQuadLayer.java index af10976f..6b2770db 100644 --- a/src/main/java/mod/chiselsandbits/render/helpers/ModelQuadLayer.java +++ b/src/main/java/mod/chiselsandbits/render/helpers/ModelQuadLayer.java @@ -14,7 +14,7 @@ public class ModelQuadLayer public static class ModelQuadLayerBuilder { public final ModelQuadLayer cache = new ModelQuadLayer(); - public final ModelLightMapReader lv = new ModelLightMapReader( 0 ); + public final ModelLightMapReader lv; public ModelUVReader uvr; public ModelQuadLayerBuilder( @@ -23,6 +23,7 @@ public ModelQuadLayerBuilder( final int vCoord ) { cache.sprite = sprite; + lv = new ModelLightMapReader(); uvr = new ModelUVReader( sprite, uCoord, vCoord ); } diff --git a/src/main/java/mod/chiselsandbits/render/helpers/ModelUtil.java b/src/main/java/mod/chiselsandbits/render/helpers/ModelUtil.java index 565cc34d..1d4a7eb1 100644 --- a/src/main/java/mod/chiselsandbits/render/helpers/ModelUtil.java +++ b/src/main/java/mod/chiselsandbits/render/helpers/ModelUtil.java @@ -106,6 +106,7 @@ private static ModelQuadLayer[] getInnerCachedFace( { final IBlockState state = ModUtil.getStateById( stateID ); final IBakedModel model = ModelUtil.solveModel( state, weight, Minecraft.getMinecraft().getBlockRendererDispatcher().getBlockModelShapes().getModelForState( state ), layer ); + final int lv = ChiselsAndBits.getConfig().useGetLightValue ? DeprecationHelper.getLightValue( state ) : 0; final Fluid fluid = BlockBitInfo.getFluidFromBlock( state.getBlock() ); if ( fluid != null ) @@ -115,7 +116,7 @@ private static ModelQuadLayer[] getInnerCachedFace( final ModelQuadLayer[] mp = new ModelQuadLayer[1]; mp[0] = new ModelQuadLayer(); mp[0].color = fluid.getColor(); - mp[0].light = DeprecationHelper.getLightValue( state ); + mp[0].light = lv; final float V = 0.5f; final float Uf = 1.0f; @@ -174,7 +175,7 @@ else if ( xf.getAxis() == Axis.X ) for ( int z = 0; z < x.size(); z++ ) { - mp[z] = x.get( z ).build( stateID, color, DeprecationHelper.getLightValue( state ), state.getBlock() == Blocks.GRASS || state.getBlock() instanceof BlockLeaves ); + mp[z] = x.get( z ).build( stateID, color, lv, state.getBlock() == Blocks.GRASS || state.getBlock() instanceof BlockLeaves ); } cache.put( cacheV, mp ); @@ -298,7 +299,12 @@ private static void processFaces( } q.pipe( b.uvr ); - q.pipe( b.lv ); + + if ( ChiselsAndBits.getConfig().enableFaceLightmapExtraction ) + { + b.lv.setVertexFormat( q.getFormat() ); + q.pipe( b.lv ); + } } catch ( final Exception e ) { diff --git a/src/main/resources/assets/chiselsandbits/lang/en_us.lang b/src/main/resources/assets/chiselsandbits/lang/en_us.lang index 228b9cfa..fb728ae4 100644 --- a/src/main/resources/assets/chiselsandbits/lang/en_us.lang +++ b/src/main/resources/assets/chiselsandbits/lang/en_us.lang @@ -232,6 +232,10 @@ mod.chiselsandbits.config.ironChiselUses=Iron Chisel Uses mod.chiselsandbits.config.diamondChiselUses=Diamond Chisel Uses mod.chiselsandbits.config.goldChiselUses=Gold Chisel uses mod.chiselsandbits.config.wrenchUses=Wrench Uses +mod.chiselsandbits.config.disableCustomVertexFormats=Disable Using Custom Vertex Formats +mod.chiselsandbits.config.enableModelCompression=Compress Vertex Data In Memory +mod.chiselsandbits.config.useGetLightValue=Use Get Light Value to get light value of blocks. +mod.chiselsandbits.config.enableFaceLightmapExtraction=Use Model Analysis to get Lightmap Data. mod.chiselsandbits.config.enableRightClickModeChange=Cycle Chisel mode on right click mod.chiselsandbits.config.enableSetBitCommand=Enable /setbit Command mod.chiselsandbits.config.maxMillisecondsPerBlock=Max Milliseconds Per Block