CullLeaves 3.0.0 - Forge support & better Sodium compatibility

- Now utilizes the Architectury build system to provide support for Fabric, native Quilt and even Forge (No Architectury API needed!)
- Update to MidnightLib 1.0.0
- Better Sodium/Rubidium support:
   - Fix resourcepacks utilizing leaf culling flickering when using Sodium (Fixes #15)
   - Integrate Leaf Culling toggle into Sodium options screen
This commit is contained in:
Motschen
2022-11-12 18:38:52 +01:00
parent 8f2fdb6574
commit 24f654fd67
23 changed files with 160 additions and 18 deletions

View File

@@ -5,4 +5,6 @@ import eu.midnightdust.lib.config.MidnightConfig;
public class CullLeavesConfig extends MidnightConfig {
@Entry // Enable/Disable the mod. Requires Chunk Reload (F3 + A).
public static boolean enabled = true;
@Entry // Fixes resourcepacks utilizing leaf culling flickering when using Sodium
public static boolean sodiumBlockFaceCullingFix = true;
}

View File

@@ -0,0 +1,46 @@
package eu.midnightdust.cullleaves.mixin;
import eu.midnightdust.cullleaves.config.CullLeavesConfig;
import me.jellysquid.mods.sodium.client.gl.device.RenderDevice;
import me.jellysquid.mods.sodium.client.gl.util.ElementRange;
import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFacing;
import me.jellysquid.mods.sodium.client.model.vertex.type.ChunkVertexType;
import me.jellysquid.mods.sodium.client.render.chunk.*;
import me.jellysquid.mods.sodium.client.render.chunk.passes.BlockRenderPass;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.List;
@Mixin(value = RegionChunkRenderer.class, remap = false)
public abstract class MixinRegionChunkRenderer extends ShaderChunkRenderer {
@Shadow @Final private boolean isBlockFaceCullingEnabled;
@Shadow protected abstract void addDrawCall(ElementRange part, long baseIndexPointer, int baseVertexIndex);
@Unique private boolean doFix = false;
public MixinRegionChunkRenderer(RenderDevice device, ChunkVertexType vertexType) {
super(device, vertexType);
}
@Inject(method = "buildDrawBatches", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/render/chunk/RenderSection;getBounds()Lme/jellysquid/mods/sodium/client/render/chunk/data/ChunkRenderBounds;", ordinal = 0))
public void cullleaves$shouldApplyTransparentBlockFaceCullingFix(List<RenderSection> sections, BlockRenderPass pass, ChunkCameraContext camera, CallbackInfoReturnable<Boolean> cir) {
doFix = pass.getAlphaCutoff() != 0 && CullLeavesConfig.enabled && CullLeavesConfig.sodiumBlockFaceCullingFix && this.isBlockFaceCullingEnabled;
}
@Redirect(method = "buildDrawBatches", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/render/chunk/ChunkGraphicsState;getModelPart(Lme/jellysquid/mods/sodium/client/model/quad/properties/ModelQuadFacing;)Lme/jellysquid/mods/sodium/client/gl/util/ElementRange;", ordinal = 0))
public ElementRange cullleaves$fixTransparentBlockFaceCulling(ChunkGraphicsState state, ModelQuadFacing facing) {
if (doFix) {
long indexOffset = state.getIndexSegment().getOffset();
int baseVertex = state.getVertexSegment().getOffset() / this.vertexFormat.getStride();
for (ModelQuadFacing direction : ModelQuadFacing.DIRECTIONS) {
this.addDrawCall(state.getModelPart(direction), indexOffset, baseVertex);
}
}
return state.getModelPart(ModelQuadFacing.UNASSIGNED);
}
}

View File

@@ -0,0 +1,45 @@
package eu.midnightdust.cullleaves.mixin;
import eu.midnightdust.cullleaves.config.CullLeavesConfig;
import me.jellysquid.mods.sodium.client.gui.SodiumGameOptionPages;
import me.jellysquid.mods.sodium.client.gui.options.OptionFlag;
import me.jellysquid.mods.sodium.client.gui.options.OptionGroup;
import me.jellysquid.mods.sodium.client.gui.options.OptionImpact;
import me.jellysquid.mods.sodium.client.gui.options.OptionImpl;
import me.jellysquid.mods.sodium.client.gui.options.control.TickBoxControl;
import me.jellysquid.mods.sodium.client.gui.options.storage.SodiumOptionsStorage;
import net.minecraft.text.Text;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
import java.util.List;
@Mixin(value = SodiumGameOptionPages.class, remap = false)
public class MixinSodiumGameOptionPages {
@Shadow @Final private static SodiumOptionsStorage sodiumOpts;
@ModifyVariable(method = "performance", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/ImmutableList;copyOf(Ljava/util/Collection;)Lcom/google/common/collect/ImmutableList;"))
private static List<OptionGroup> cullleaves$addCullLeavesOption(List<OptionGroup> groups) {
groups.add(OptionGroup.createBuilder()
.add(OptionImpl.createBuilder(boolean.class, sodiumOpts)
.setName(Text.translatable("cullleaves.midnightconfig.enabled"))
.setTooltip(Text.translatable("cullleaves.midnightconfig.enabled.tooltip.sodium"))
.setControl(TickBoxControl::new)
.setBinding((opts, value) -> {
CullLeavesConfig.enabled = value;
CullLeavesConfig.write("cullleaves");
}, opts -> CullLeavesConfig.enabled)
.setFlags(OptionFlag.REQUIRES_RENDERER_RELOAD)
.setImpact(OptionImpact.MEDIUM)
.build()
)
.build()
);
return groups;
}
}