From cb6d4a14716ffd5278643bf09ec828a8fe2379ac Mon Sep 17 00:00:00 2001 From: NULL511 Date: Wed, 7 Feb 2024 09:44:33 -0500 Subject: [PATCH 1/3] separate camera and shadow frustum culling --- .../core/render/RenderBufferHandler.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java index ac06920ff..141e3295b 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java @@ -68,6 +68,7 @@ public class RenderBufferHandler implements AutoCloseable public F3Screen.MultiDynamicMessage f3Message; + private final IDhApiCullingFrustum cameraFrustum; private int visibleBufferCount; private int culledBufferCount; private int shadowVisibleBufferCount; @@ -82,14 +83,8 @@ public class RenderBufferHandler implements AutoCloseable public RenderBufferHandler(LodQuadTree lodQuadTree) { this.lodQuadTree = lodQuadTree; - this.culledBufferCount = 0; - - IDhApiCullingFrustum coreFrustum = DhApi.overrides.get(IDhApiCullingFrustum.class, IOverrideInjector.CORE_PRIORITY); - if (coreFrustum == null) - { - DhApi.overrides.bind(IDhApiCullingFrustum.class, new DhFrustumBounds()); - } + this.cameraFrustum = new DhFrustumBounds(); this.f3Message = new F3Screen.MultiDynamicMessage( () -> @@ -238,8 +233,13 @@ public class RenderBufferHandler implements AutoCloseable // update the frustum if necessary boolean enableFrustumCulling = !Config.Client.Advanced.Graphics.AdvancedGraphics.disableFrustumCulling.get(); - IDhApiCullingFrustum frustum = DhApi.overrides.get(IDhApiCullingFrustum.class, IOverrideInjector.CORE_PRIORITY); - if (enableFrustumCulling) + boolean isShadowPass = (IRIS_ACCESSOR != null && IRIS_ACCESSOR.isRenderingShadowPass()); + + IDhApiCullingFrustum frustum = isShadowPass + ? DhApi.overrides.get(IDhApiCullingFrustum.class, IOverrideInjector.CORE_PRIORITY) + : cameraFrustum; + + if (enableFrustumCulling && frustum != null) { int worldMinY = clientLevelWrapper.getMinHeight(); int worldHeight = clientLevelWrapper.getHeight(); @@ -253,7 +253,6 @@ public class RenderBufferHandler implements AutoCloseable // Update the section list // //=========================// - boolean isShadowPass = (IRIS_ACCESSOR != null && IRIS_ACCESSOR.isRenderingShadowPass()); if (isShadowPass) { this.shadowCulledBufferCount = 0; From bddf9c85e81bcbdeebd7e67518a020c291c79597 Mon Sep 17 00:00:00 2001 From: NULL511 Date: Wed, 7 Feb 2024 10:01:25 -0500 Subject: [PATCH 2/3] lava ID fix --- .../seibel/distanthorizons/core/render/RenderBufferHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java index 141e3295b..4cd37831a 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java @@ -277,7 +277,7 @@ public class RenderBufferHandler implements AutoCloseable try { - if (enableFrustumCulling) + if (enableFrustumCulling && frustum != null) { DhLodPos lodBounds = renderSection.pos.getSectionBBoxPos(); int blockMinX = lodBounds.getMinX().toBlockWidth(); From a9ccc6fa3489a881087759b28859dffef010c6a3 Mon Sep 17 00:00:00 2001 From: NULL511 Date: Sat, 10 Feb 2024 18:06:34 -0500 Subject: [PATCH 3/3] alter frustum culling api usage --- .../core/render/RenderBufferHandler.java | 43 ++++++++++++++----- .../core/render/renderer/LodRenderer.java | 9 +--- 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java index 4cd37831a..d0c80d1b6 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java @@ -24,6 +24,7 @@ import com.seibel.distanthorizons.api.interfaces.override.rendering.IDhApiCullin import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhApiRenderParam; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; +import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.enums.EDhDirection; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.logging.f3.F3Screen; @@ -35,12 +36,15 @@ import com.seibel.distanthorizons.core.render.renderer.LodRenderer; import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.util.objects.SortedArraySet; import com.seibel.distanthorizons.core.util.objects.quadTree.QuadNode; +import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IIrisAccessor; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.distanthorizons.coreapi.interfaces.dependencyInjection.IOverrideInjector; import com.seibel.distanthorizons.coreapi.util.math.Mat4f; +import com.seibel.distanthorizons.coreapi.util.math.Vec3d; import com.seibel.distanthorizons.coreapi.util.math.Vec3f; import org.apache.logging.log4j.Logger; +import org.joml.Matrix4f; import org.joml.Matrix4fc; import java.util.Comparator; @@ -56,6 +60,8 @@ public class RenderBufferHandler implements AutoCloseable { private static final Logger LOGGER = DhLoggerBuilder.getLogger(); + private static final IMinecraftRenderWrapper MC_RENDER = SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class); + private static final IIrisAccessor IRIS_ACCESSOR = ModAccessorInjector.INSTANCE.get(IIrisAccessor.class); /** contains all relevant data */ @@ -126,7 +132,7 @@ public class RenderBufferHandler implements AutoCloseable * TODO: This might get locked by update() causing move() call. Is there a way to avoid this? * Maybe dupe the base list and use atomic swap on render? Or is this not worth it? */ - public void buildRenderListAndUpdateSections(IClientLevelWrapper clientLevelWrapper, Matrix4fc matWorldViewProjection, Vec3f lookForwardVector) + public void buildRenderListAndUpdateSections(IClientLevelWrapper clientLevelWrapper, DhApiRenderParam renderEventParam, Vec3f lookForwardVector) { EDhDirection[] axisDirections = new EDhDirection[3]; @@ -234,17 +240,32 @@ public class RenderBufferHandler implements AutoCloseable // update the frustum if necessary boolean enableFrustumCulling = !Config.Client.Advanced.Graphics.AdvancedGraphics.disableFrustumCulling.get(); boolean isShadowPass = (IRIS_ACCESSOR != null && IRIS_ACCESSOR.isRenderingShadowPass()); - - IDhApiCullingFrustum frustum = isShadowPass - ? DhApi.overrides.get(IDhApiCullingFrustum.class, IOverrideInjector.CORE_PRIORITY) - : cameraFrustum; - if (enableFrustumCulling && frustum != null) + IDhApiCullingFrustum frustum = this.cameraFrustum; + + if (enableFrustumCulling) { - int worldMinY = clientLevelWrapper.getMinHeight(); - int worldHeight = clientLevelWrapper.getHeight(); - - frustum.update(worldMinY, worldMinY + worldHeight, new Mat4f(matWorldViewProjection)); + if (isShadowPass) { + frustum = DhApi.overrides.get(IDhApiCullingFrustum.class, IOverrideInjector.CORE_PRIORITY); + if (frustum == null) enableFrustumCulling = false; + } + else + { + int worldMinY = clientLevelWrapper.getMinHeight(); + int worldHeight = clientLevelWrapper.getHeight(); + + Vec3d cameraPos = MC_RENDER.getCameraExactPosition(); + + Matrix4fc matWorldView = new Matrix4f() + .setTransposed(renderEventParam.mcModelViewMatrix.getValuesAsArray()) + .translate(-(float) cameraPos.x, -(float) cameraPos.y, -(float) cameraPos.z); + + Matrix4fc matWorldViewProjection = new Matrix4f() + .setTransposed(renderEventParam.dhProjectionMatrix.getValuesAsArray()) + .mul(matWorldView); + + frustum.update(worldMinY, worldMinY + worldHeight, new Mat4f(matWorldViewProjection)); + } } @@ -277,7 +298,7 @@ public class RenderBufferHandler implements AutoCloseable try { - if (enableFrustumCulling && frustum != null) + if (enableFrustumCulling) { DhLodPos lodBounds = renderSection.pos.getSectionBBoxPos(); int blockMinX = lodBounds.getMinX().toBlockWidth(); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java index dac8d049b..6f2148976 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java @@ -351,14 +351,7 @@ public class LodRenderer if (renderingFirstPass) { - Matrix4f matWorldView = new Matrix4f() - .setTransposed(MC_RENDER.getWorldViewMatrix().getValuesAsArray()); - - Matrix4fc matWorldViewProjection = new Matrix4f() - .setTransposed(renderEventParam.dhProjectionMatrix.getValuesAsArray()) - .mul(matWorldView); - - this.bufferHandler.buildRenderListAndUpdateSections(clientLevelWrapper, matWorldViewProjection, MC_RENDER.getLookAtVector()); + this.bufferHandler.buildRenderListAndUpdateSections(clientLevelWrapper, renderEventParam, MC_RENDER.getLookAtVector()); transparencyEnabled = Config.Client.Advanced.Graphics.Quality.transparency.get().transparencyEnabled; fakeOceanFloor = Config.Client.Advanced.Graphics.Quality.transparency.get().fakeTransparencyEnabled;