diff --git a/src/main/java/com/seibel/lod/core/builders/lodBuilding/bufferBuilding/LodBufferBuilderFactory.java b/src/main/java/com/seibel/lod/core/builders/lodBuilding/bufferBuilding/LodBufferBuilderFactory.java index 699485acd..af82c2899 100644 --- a/src/main/java/com/seibel/lod/core/builders/lodBuilding/bufferBuilding/LodBufferBuilderFactory.java +++ b/src/main/java/com/seibel/lod/core/builders/lodBuilding/bufferBuilding/LodBufferBuilderFactory.java @@ -192,6 +192,13 @@ public class LodBufferBuilderFactory { lodDim, renderRegions==null ? "NULL" : renderRegions.toString()); long startTime = System.currentTimeMillis(); + boolean doCaveCulling = CONFIG.client().graphics().advancedGraphics().getEnableCaveCulling(); + doCaveCulling &= !lodDim.dimension.hasCeiling(); + doCaveCulling &= lodDim.dimension.hasSkyLight(); + doCaveCulling &= playerY > CONFIG.client().graphics().advancedGraphics().getCaveCullingHeight() + 5; + int playerSkylight = MC.getPlayerSkylight(); // if fail returns -1. + doCaveCulling &= playerSkylight > 7; + try { updateRingList(playerX, playerZ, lodDim.getWidth()); @@ -229,7 +236,8 @@ public class LodBufferBuilderFactory { } CompletableFuture newFuture = - r.updateStatus(bufferUploadThread, bufferBuilderThreads, fullRegen, playerX, playerZ).orElse(null); + r.updateStatus(bufferUploadThread, bufferBuilderThreads, fullRegen, + playerX, playerZ, doCaveCulling).orElse(null); if (newFuture != null) { future = CompletableFuture.allOf(future, newFuture); numOfJobs++; diff --git a/src/main/java/com/seibel/lod/core/objects/opengl/RenderRegion.java b/src/main/java/com/seibel/lod/core/objects/opengl/RenderRegion.java index 310816b8b..d91bd87fe 100644 --- a/src/main/java/com/seibel/lod/core/objects/opengl/RenderRegion.java +++ b/src/main/java/com/seibel/lod/core/objects/opengl/RenderRegion.java @@ -96,7 +96,7 @@ public class RenderRegion implements AutoCloseable needRegen.set(2); } - public Optional> updateStatus(Executor bufferUploader, Executor bufferBuilder, boolean alwaysRegen, int playerPosX, int playerPosZ) { + public Optional> updateStatus(Executor bufferUploader, Executor bufferBuilder, boolean alwaysRegen, int playerPosX, int playerPosZ, boolean doCaveCulling) { if (alwaysRegen) setNeedRegen(); BackState state = backState.get(); @@ -120,7 +120,7 @@ public class RenderRegion implements AutoCloseable return Optional.empty(); } needRegen.decrementAndGet(); - return Optional.of(startBuid(bufferUploader, bufferBuilder, r, lodDim, playerPosX, playerPosZ)); + return Optional.of(startBuid(bufferUploader, bufferBuilder, r, lodDim, playerPosX, playerPosZ, doCaveCulling)); } public boolean render(LodDimension renderDim, @@ -167,7 +167,7 @@ public class RenderRegion implements AutoCloseable : null; //new ComplexRenderRegion(regPos); } - private CompletableFuture startBuid(Executor bufferUploader, Executor bufferBuilder, LodRegion region, LodDimension lodDim, int playerPosX, int playerPosZ) { + private CompletableFuture startBuid(Executor bufferUploader, Executor bufferBuilder, LodRegion region, LodDimension lodDim, int playerPosX, int playerPosZ, boolean doCaveCulling) { EVENT_LOGGER.trace("RenderRegion startBuild @ {}", regionPos); LodRegion[] adjRegions = new LodRegion[4]; try { @@ -187,13 +187,10 @@ public class RenderRegion implements AutoCloseable return CompletableFuture.supplyAsync(() -> { try { EVENT_LOGGER.trace("RenderRegion start QuadBuild @ {}", regionPos); - boolean useSkylightCulling = CONFIG.client().graphics().advancedGraphics().getEnableCaveCulling(); - useSkylightCulling &= !lodDim.dimension.hasCeiling(); - useSkylightCulling &= lodDim.dimension.hasSkyLight(); int skyLightCullingBelow = CONFIG.client().graphics().advancedGraphics().getCaveCullingHeight(); // FIXME: Clamp also to the max world height. skyLightCullingBelow = Math.max(skyLightCullingBelow, LodBuilder.MIN_WORLD_HEIGHT); - LodQuadBuilder builder = new LodQuadBuilder(useSkylightCulling, skyLightCullingBelow); + LodQuadBuilder builder = new LodQuadBuilder(doCaveCulling, skyLightCullingBelow); Runnable buildRun = ()->{ makeLodRenderData(builder, region, adjRegions, playerPosX, playerPosZ); }; diff --git a/src/main/java/com/seibel/lod/core/wrapperInterfaces/minecraft/IMinecraftClientWrapper.java b/src/main/java/com/seibel/lod/core/wrapperInterfaces/minecraft/IMinecraftClientWrapper.java index a01cd3bf9..4fbfd135e 100644 --- a/src/main/java/com/seibel/lod/core/wrapperInterfaces/minecraft/IMinecraftClientWrapper.java +++ b/src/main/java/com/seibel/lod/core/wrapperInterfaces/minecraft/IMinecraftClientWrapper.java @@ -97,6 +97,8 @@ public interface IMinecraftClientWrapper extends IBindable float getSkyDarken(float partialTicks); boolean connectedToServer(); + + int getPlayerSkylight(); /** Returns all worlds available to the server */ ArrayList getAllServerWorlds();