Skip to content

Commit

Permalink
Resolve #315
Browse files Browse the repository at this point in the history
  • Loading branch information
AlgorithmX2 committed Jan 3, 2018
1 parent bc51f04 commit 2040dec
Show file tree
Hide file tree
Showing 10 changed files with 126 additions and 33 deletions.
14 changes: 13 additions & 1 deletion src/main/java/mod/chiselsandbits/config/ModConfig.java
Expand Up @@ -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" )
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -365,6 +374,9 @@ private void setDefaults()
dynamicRenderFullChunksOnly = true;
useVBO = UseVBO.AUTOMATIC;
disableCustomVertexFormats = false;
enableModelCompression = true;
enableFaceLightmapExtraction = true;
useGetLightValue = true;

showUsage = true;
invertBitBagFullness = false;
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand All @@ -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<FaceRegion> src : rset )
{
Expand All @@ -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;
Expand All @@ -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:
Expand Down
Expand Up @@ -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;
}
Expand Down
Expand Up @@ -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
Expand All @@ -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 );
}
}

Expand All @@ -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
Expand Down Expand Up @@ -153,8 +168,7 @@ public void put(
}

@Override
public void begin(
final VertexFormat format )
public void begin()
{
if ( format != getVertexFormat() )
{
Expand All @@ -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
Expand All @@ -201,5 +215,11 @@ public void setTexture(
final TextureAtlasSprite texture )
{
}

@Override
public VertexFormat getFormat()
{
return format;
}
}
}
Expand Up @@ -16,10 +16,11 @@ void put(
int element,
float... args );

void begin(
VertexFormat format );
void begin();

BakedQuad create(
TextureAtlasSprite sprite );

VertexFormat getFormat();

}
Expand Up @@ -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 );
}
Expand Down Expand Up @@ -43,4 +48,10 @@ public void put(
builder.put( element, args );
}

@Override
public VertexFormat getFormat()
{
return format;
}

}
Expand Up @@ -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
Expand All @@ -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 );
Expand Down
Expand Up @@ -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(
Expand All @@ -23,6 +23,7 @@ public ModelQuadLayerBuilder(
final int vCoord )
{
cache.sprite = sprite;
lv = new ModelLightMapReader();
uvr = new ModelUVReader( sprite, uCoord, vCoord );
}

Expand Down
12 changes: 9 additions & 3 deletions src/main/java/mod/chiselsandbits/render/helpers/ModelUtil.java
Expand Up @@ -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 )
Expand All @@ -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;
Expand Down Expand Up @@ -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 );
Expand Down Expand Up @@ -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 )
{
Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/assets/chiselsandbits/lang/en_us.lang
Expand Up @@ -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
Expand Down

0 comments on commit 2040dec

Please sign in to comment.