From 7e287dab713126fad5516c3cf7403881aab155cb Mon Sep 17 00:00:00 2001 From: NULL511 Date: Thu, 25 Jan 2024 17:46:30 -0500 Subject: [PATCH 1/8] add frustum culling --- .../core/pos/DhFrustumBounds.java | 37 ++++++++++++++++++ .../core/render/RenderBufferHandler.java | 38 +++++++++++-------- .../core/render/renderer/LodRenderer.java | 16 +++++++- 3 files changed, 74 insertions(+), 17 deletions(-) create mode 100644 core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java diff --git a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java new file mode 100644 index 000000000..70a2be8d4 --- /dev/null +++ b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java @@ -0,0 +1,37 @@ +package com.seibel.distanthorizons.core.pos; + +import org.joml.Math; +import org.joml.Matrix4f; +import org.joml.Vector3f; + +public class DhFrustumBounds +{ + private final Vector3f boundsMin = new Vector3f(); + private final Vector3f boundsMax = new Vector3f(); + + + public DhFrustumBounds(Matrix4f matViewProjectionInv) + { + matViewProjectionInv.frustumAabb(this.boundsMin, this.boundsMax); + } + + public boolean Intersects(DhLodPos lodBounds) + { + // TODO + float worldMinY = 0f; + float worldMaxY = 0f; + + int lodPosX = lodBounds.getX().toBlockWidth(); + int lodPosZ = lodBounds.getZ().toBlockWidth(); + int lodSize = lodBounds.getBlockWidth(); + + Vector3f lodMin = new Vector3f(lodPosX, worldMinY, lodPosZ); + Vector3f lodMax = new Vector3f(lodPosX + lodSize, worldMaxY, lodPosZ + lodSize); + + if (lodMax.x < boundsMin.x || lodMin.x > boundsMax.x) return false; + //if (lodMax.y < boundsMin.y || lodMin.y > boundsMax.y) return false; + if (lodMax.z < boundsMin.z || lodMin.z > boundsMax.z) return false; + + return true; + } +} 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 f355d4d4a..cd19f38b6 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 @@ -23,14 +23,19 @@ import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.enums.EDhDirection; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.logging.f3.F3Screen; +import com.seibel.distanthorizons.core.pos.DhFrustumBounds; +import com.seibel.distanthorizons.core.pos.DhLodPos; import com.seibel.distanthorizons.core.pos.DhSectionPos; import com.seibel.distanthorizons.core.pos.Pos2D; 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.render.renderer.LodRenderer; +import com.seibel.distanthorizons.coreapi.util.math.Mat4f; import com.seibel.distanthorizons.coreapi.util.math.Vec3f; import org.apache.logging.log4j.Logger; +import org.joml.Matrix4f; +import org.joml.Vector3f; import java.util.Comparator; import java.util.Iterator; @@ -82,7 +87,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(Vec3f lookForwardVector) + public void buildRenderListAndUpdateSections(Matrix4f matViewProjectionInv, Vector3f lookForwardVector) { EDhDirection[] axisDirections = new EDhDirection[3]; @@ -187,6 +192,8 @@ public class RenderBufferHandler implements AutoCloseable // Build the sorted list this.loadedNearToFarBuffers = new SortedArraySet<>((a, b) -> -farToNearComparator.compare(a, b)); // TODO is the comparator named wrong? + DhFrustumBounds frustumBounds = new DhFrustumBounds(matViewProjectionInv); + // Update the sections boolean rebuildAllBuffers = this.rebuildAllBuffers.getAndSet(false); Iterator> nodeIterator = this.lodQuadTree.nodeIterator(); @@ -196,26 +203,25 @@ public class RenderBufferHandler implements AutoCloseable DhSectionPos sectionPos = node.sectionPos; LodRenderSection renderSection = node.value; + if (renderSection == null) continue; + try { + DhLodPos lodBounds = renderSection.pos.getSectionBBoxPos(); + if (!frustumBounds.Intersects(lodBounds)) continue; - if (renderSection != null) + if (rebuildAllBuffers) { - if (rebuildAllBuffers) - { - renderSection.markBufferDirty(); - } - renderSection.tryBuildAndSwapBuffer(); - - if (renderSection.isRenderingEnabled()) - { - AbstractRenderBuffer buffer = renderSection.activeRenderBufferRef.get(); - if (buffer != null) - { - this.loadedNearToFarBuffers.add(new LoadedRenderBuffer(buffer, sectionPos)); - } - } + renderSection.markBufferDirty(); } + + renderSection.tryBuildAndSwapBuffer(); + if (!renderSection.isRenderingEnabled()) continue; + + AbstractRenderBuffer buffer = renderSection.activeRenderBufferRef.get(); + if (buffer == null) continue; + + this.loadedNearToFarBuffers.add(new LoadedRenderBuffer(buffer, sectionPos)); } catch (Exception e) { 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 de8824a5e..df82adcf5 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 @@ -47,6 +47,8 @@ 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.LogManager; +import org.joml.Matrix4f; +import org.joml.Vector3f; import org.lwjgl.opengl.GL32; import java.awt.*; @@ -330,7 +332,19 @@ public class LodRenderer if (renderingFirstPass) { - this.bufferHandler.buildRenderListAndUpdateSections(this.getLookVector()); + final Vector3f WorldUp = new Vector3f(0f, 1f, 0f); + + Vec3f _lookAt = this.getLookVector(); + Vector3f lookAt = new Vector3f(_lookAt.x, _lookAt.y, _lookAt.z); + Vec3d cameraPos = MC_RENDER.getCameraExactPosition(); + + Matrix4f matViewProjectionInv = new Matrix4f() + .setTransposed(projectionMatrix.getValuesAsArray()) + .lookAlong(lookAt, WorldUp) + .translate(-(float)cameraPos.x, -(float)cameraPos.y, -(float)cameraPos.z) + .invert(); + + this.bufferHandler.buildRenderListAndUpdateSections(matViewProjectionInv, lookAt); transparencyEnabled = Config.Client.Advanced.Graphics.Quality.transparency.get().transparencyEnabled; fakeOceanFloor = Config.Client.Advanced.Graphics.Quality.transparency.get().fakeTransparencyEnabled; From 23b9f167471fc50ce8f9ce91314dde64954b4a93 Mon Sep 17 00:00:00 2001 From: NULL511 Date: Thu, 25 Jan 2024 18:34:17 -0500 Subject: [PATCH 2/8] aabb only --- .../core/pos/DhFrustumBounds.java | 26 ++++++++++++------- .../core/render/RenderBufferHandler.java | 7 +++-- .../core/render/renderer/LodRenderer.java | 17 +++++------- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java index 70a2be8d4..6bac2c3bd 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java @@ -1,26 +1,33 @@ package com.seibel.distanthorizons.core.pos; -import org.joml.Math; import org.joml.Matrix4f; import org.joml.Vector3f; + public class DhFrustumBounds { + //private final FrustumIntersection frustum; private final Vector3f boundsMin = new Vector3f(); private final Vector3f boundsMax = new Vector3f(); + private final float worldMinY; + private final float worldMaxY; - public DhFrustumBounds(Matrix4f matViewProjectionInv) + public DhFrustumBounds(Matrix4f matViewProjection, float minY, float maxY) { + Matrix4f matViewProjectionInv = new Matrix4f(matViewProjection); + matViewProjectionInv.invert(); + + //this.frustum = new FrustumIntersection(); + //this.frustum.set(matViewProjection); + matViewProjectionInv.frustumAabb(this.boundsMin, this.boundsMax); + this.worldMinY = minY; + this.worldMaxY = maxY; } public boolean Intersects(DhLodPos lodBounds) { - // TODO - float worldMinY = 0f; - float worldMaxY = 0f; - int lodPosX = lodBounds.getX().toBlockWidth(); int lodPosZ = lodBounds.getZ().toBlockWidth(); int lodSize = lodBounds.getBlockWidth(); @@ -28,10 +35,11 @@ public class DhFrustumBounds Vector3f lodMin = new Vector3f(lodPosX, worldMinY, lodPosZ); Vector3f lodMax = new Vector3f(lodPosX + lodSize, worldMaxY, lodPosZ + lodSize); - if (lodMax.x < boundsMin.x || lodMin.x > boundsMax.x) return false; - //if (lodMax.y < boundsMin.y || lodMin.y > boundsMax.y) return false; - if (lodMax.z < boundsMin.z || lodMin.z > boundsMax.z) return false; + if (lodMax.x < this.boundsMin.x || lodMin.x > this.boundsMax.x) return false; + if (lodMax.z < this.boundsMin.z || lodMin.z > this.boundsMax.z) return false; + if (this.worldMaxY < this.boundsMin.y || this.worldMinY > this.boundsMax.y) return false; + //return frustum.intersectAab(lodMin, lodMax) != FrustumIntersection.OUTSIDE; return true; } } 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 cd19f38b6..928a31341 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 @@ -31,6 +31,7 @@ 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.render.renderer.LodRenderer; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.distanthorizons.coreapi.util.math.Mat4f; import com.seibel.distanthorizons.coreapi.util.math.Vec3f; import org.apache.logging.log4j.Logger; @@ -87,7 +88,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(Matrix4f matViewProjectionInv, Vector3f lookForwardVector) + public void buildRenderListAndUpdateSections(IClientLevelWrapper clientLevelWrapper, Matrix4f matViewProjection, Vec3f lookForwardVector) { EDhDirection[] axisDirections = new EDhDirection[3]; @@ -192,7 +193,9 @@ public class RenderBufferHandler implements AutoCloseable // Build the sorted list this.loadedNearToFarBuffers = new SortedArraySet<>((a, b) -> -farToNearComparator.compare(a, b)); // TODO is the comparator named wrong? - DhFrustumBounds frustumBounds = new DhFrustumBounds(matViewProjectionInv); + float worldMinY = clientLevelWrapper.getMinHeight(); + float worldHeight = clientLevelWrapper.getHeight(); + DhFrustumBounds frustumBounds = new DhFrustumBounds(matViewProjection, worldMinY, worldMinY + worldHeight); // Update the sections boolean rebuildAllBuffers = this.rebuildAllBuffers.getAndSet(false); 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 df82adcf5..f4cbdbb50 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 @@ -48,7 +48,6 @@ import com.seibel.distanthorizons.coreapi.util.math.Vec3d; import com.seibel.distanthorizons.coreapi.util.math.Vec3f; import org.apache.logging.log4j.LogManager; import org.joml.Matrix4f; -import org.joml.Vector3f; import org.lwjgl.opengl.GL32; import java.awt.*; @@ -332,19 +331,15 @@ public class LodRenderer if (renderingFirstPass) { - final Vector3f WorldUp = new Vector3f(0f, 1f, 0f); + Vec3f viewDir = this.getLookVector(); + Vec3d viewPos = MC_RENDER.getCameraExactPosition(); - Vec3f _lookAt = this.getLookVector(); - Vector3f lookAt = new Vector3f(_lookAt.x, _lookAt.y, _lookAt.z); - Vec3d cameraPos = MC_RENDER.getCameraExactPosition(); - - Matrix4f matViewProjectionInv = new Matrix4f() + Matrix4f matViewProjection = new Matrix4f() .setTransposed(projectionMatrix.getValuesAsArray()) - .lookAlong(lookAt, WorldUp) - .translate(-(float)cameraPos.x, -(float)cameraPos.y, -(float)cameraPos.z) - .invert(); + .lookAlong(viewDir.x, viewDir.y, viewDir.z, 0f, 1f, 0f) + .translate(-(float)viewPos.x, -(float)viewPos.y, -(float)viewPos.z); - this.bufferHandler.buildRenderListAndUpdateSections(matViewProjectionInv, lookAt); + this.bufferHandler.buildRenderListAndUpdateSections(clientLevelWrapper, matViewProjection, viewDir); transparencyEnabled = Config.Client.Advanced.Graphics.Quality.transparency.get().transparencyEnabled; fakeOceanFloor = Config.Client.Advanced.Graphics.Quality.transparency.get().fakeTransparencyEnabled; From e771f8a53c88871901de627d5bc66986316842d8 Mon Sep 17 00:00:00 2001 From: NULL511 Date: Thu, 25 Jan 2024 19:14:02 -0500 Subject: [PATCH 3/8] fix frustum check --- .../core/pos/DhFrustumBounds.java | 24 +++++++++---------- .../core/render/RenderBufferHandler.java | 3 ++- .../core/render/renderer/LodRenderer.java | 4 +++- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java index 6bac2c3bd..77f28dbd7 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java @@ -1,26 +1,27 @@ package com.seibel.distanthorizons.core.pos; +import com.seibel.distanthorizons.coreapi.util.math.Mat4f; +import org.joml.FrustumIntersection; import org.joml.Matrix4f; +import org.joml.Matrix4fc; import org.joml.Vector3f; public class DhFrustumBounds { - //private final FrustumIntersection frustum; + private final FrustumIntersection frustum; private final Vector3f boundsMin = new Vector3f(); private final Vector3f boundsMax = new Vector3f(); private final float worldMinY; private final float worldMaxY; - public DhFrustumBounds(Matrix4f matViewProjection, float minY, float maxY) + public DhFrustumBounds(Matrix4fc matViewProjection, float minY, float maxY) { - Matrix4f matViewProjectionInv = new Matrix4f(matViewProjection); - matViewProjectionInv.invert(); - - //this.frustum = new FrustumIntersection(); - //this.frustum.set(matViewProjection); + this.frustum = new FrustumIntersection(); + this.frustum.set(matViewProjection); + Matrix4fc matViewProjectionInv = new Matrix4f(matViewProjection).invert(); matViewProjectionInv.frustumAabb(this.boundsMin, this.boundsMax); this.worldMinY = minY; this.worldMaxY = maxY; @@ -35,11 +36,10 @@ public class DhFrustumBounds Vector3f lodMin = new Vector3f(lodPosX, worldMinY, lodPosZ); Vector3f lodMax = new Vector3f(lodPosX + lodSize, worldMaxY, lodPosZ + lodSize); - if (lodMax.x < this.boundsMin.x || lodMin.x > this.boundsMax.x) return false; - if (lodMax.z < this.boundsMin.z || lodMin.z > this.boundsMax.z) return false; - if (this.worldMaxY < this.boundsMin.y || this.worldMinY > this.boundsMax.y) return false; + //if (lodMax.x < this.boundsMin.x || lodMin.x > this.boundsMax.x) return false; + //if (lodMax.z < this.boundsMin.z || lodMin.z > this.boundsMax.z) return false; + //if (this.worldMaxY < this.boundsMin.y || this.worldMinY > this.boundsMax.y) return false; - //return frustum.intersectAab(lodMin, lodMax) != FrustumIntersection.OUTSIDE; - return true; + return frustum.testAab(lodMin, lodMax); } } 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 928a31341..796c641d6 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 @@ -36,6 +36,7 @@ import com.seibel.distanthorizons.coreapi.util.math.Mat4f; import com.seibel.distanthorizons.coreapi.util.math.Vec3f; import org.apache.logging.log4j.Logger; import org.joml.Matrix4f; +import org.joml.Matrix4fc; import org.joml.Vector3f; import java.util.Comparator; @@ -88,7 +89,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, Matrix4f matViewProjection, Vec3f lookForwardVector) + public void buildRenderListAndUpdateSections(IClientLevelWrapper clientLevelWrapper, Matrix4fc matViewProjection, Vec3f lookForwardVector) { EDhDirection[] axisDirections = new EDhDirection[3]; 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 f4cbdbb50..3455e3ba4 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 @@ -48,6 +48,7 @@ import com.seibel.distanthorizons.coreapi.util.math.Vec3d; import com.seibel.distanthorizons.coreapi.util.math.Vec3f; import org.apache.logging.log4j.LogManager; import org.joml.Matrix4f; +import org.joml.Matrix4fc; import org.lwjgl.opengl.GL32; import java.awt.*; @@ -334,7 +335,8 @@ public class LodRenderer Vec3f viewDir = this.getLookVector(); Vec3d viewPos = MC_RENDER.getCameraExactPosition(); - Matrix4f matViewProjection = new Matrix4f() + // TODO: find proper way to get view matrix, this breaks when perfectly up/down + Matrix4fc matViewProjection = new Matrix4f() .setTransposed(projectionMatrix.getValuesAsArray()) .lookAlong(viewDir.x, viewDir.y, viewDir.z, 0f, 1f, 0f) .translate(-(float)viewPos.x, -(float)viewPos.y, -(float)viewPos.z); From 08483d02c698259a4eab633dfe82ad2005070846 Mon Sep 17 00:00:00 2001 From: NULL511 Date: Thu, 25 Jan 2024 19:27:52 -0500 Subject: [PATCH 4/8] re-enable aabb --- .../seibel/distanthorizons/core/pos/DhFrustumBounds.java | 7 +++---- .../distanthorizons/core/render/renderer/LodRenderer.java | 4 +++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java index 77f28dbd7..6968551fb 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java @@ -1,6 +1,5 @@ package com.seibel.distanthorizons.core.pos; -import com.seibel.distanthorizons.coreapi.util.math.Mat4f; import org.joml.FrustumIntersection; import org.joml.Matrix4f; import org.joml.Matrix4fc; @@ -36,9 +35,9 @@ public class DhFrustumBounds Vector3f lodMin = new Vector3f(lodPosX, worldMinY, lodPosZ); Vector3f lodMax = new Vector3f(lodPosX + lodSize, worldMaxY, lodPosZ + lodSize); - //if (lodMax.x < this.boundsMin.x || lodMin.x > this.boundsMax.x) return false; - //if (lodMax.z < this.boundsMin.z || lodMin.z > this.boundsMax.z) return false; - //if (this.worldMaxY < this.boundsMin.y || this.worldMinY > this.boundsMax.y) return false; + if (lodMax.x < this.boundsMin.x || lodMin.x > this.boundsMax.x) return false; + if (lodMax.z < this.boundsMin.z || lodMin.z > this.boundsMax.z) return false; + if (this.worldMaxY < this.boundsMin.y || this.worldMinY > this.boundsMax.y) return false; return frustum.testAab(lodMin, lodMax); } 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 3455e3ba4..143f74582 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 @@ -332,7 +332,7 @@ public class LodRenderer if (renderingFirstPass) { - Vec3f viewDir = this.getLookVector(); + Vec3f viewDir = MC_RENDER.getLookAtVector(); Vec3d viewPos = MC_RENDER.getCameraExactPosition(); // TODO: find proper way to get view matrix, this breaks when perfectly up/down @@ -340,6 +340,8 @@ public class LodRenderer .setTransposed(projectionMatrix.getValuesAsArray()) .lookAlong(viewDir.x, viewDir.y, viewDir.z, 0f, 1f, 0f) .translate(-(float)viewPos.x, -(float)viewPos.y, -(float)viewPos.z); + + // TODO: will also need a diff matrix for iris shadow pass! this.bufferHandler.buildRenderListAndUpdateSections(clientLevelWrapper, matViewProjection, viewDir); From 71536230b6f32b3574556910a382867fba9901b8 Mon Sep 17 00:00:00 2001 From: NULL511 Date: Thu, 25 Jan 2024 22:40:16 -0500 Subject: [PATCH 5/8] fix view matrix --- .../core/pos/DhFrustumBounds.java | 9 +++++---- .../core/render/RenderBufferHandler.java | 10 +++------- .../core/render/renderer/LodRenderer.java | 16 ++++++---------- .../minecraft/IMinecraftRenderWrapper.java | 3 +++ 4 files changed, 17 insertions(+), 21 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java index 6968551fb..d1b398abe 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java @@ -15,13 +15,14 @@ public class DhFrustumBounds private final float worldMaxY; - public DhFrustumBounds(Matrix4fc matViewProjection, float minY, float maxY) + public DhFrustumBounds(Matrix4fc matWorldViewProjection, float minY, float maxY) { this.frustum = new FrustumIntersection(); - this.frustum.set(matViewProjection); + this.frustum.set(matWorldViewProjection); + + Matrix4fc matWorldViewProjectionInv = new Matrix4f(matWorldViewProjection).invert(); + matWorldViewProjectionInv.frustumAabb(this.boundsMin, this.boundsMax); - Matrix4fc matViewProjectionInv = new Matrix4f(matViewProjection).invert(); - matViewProjectionInv.frustumAabb(this.boundsMin, this.boundsMax); this.worldMinY = minY; this.worldMaxY = maxY; } 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 796c641d6..ac2e9b207 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 @@ -19,7 +19,6 @@ package com.seibel.distanthorizons.core.render; -import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.enums.EDhDirection; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.logging.f3.F3Screen; @@ -27,17 +26,14 @@ import com.seibel.distanthorizons.core.pos.DhFrustumBounds; import com.seibel.distanthorizons.core.pos.DhLodPos; import com.seibel.distanthorizons.core.pos.DhSectionPos; import com.seibel.distanthorizons.core.pos.Pos2D; +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.render.renderer.LodRenderer; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; -import com.seibel.distanthorizons.coreapi.util.math.Mat4f; import com.seibel.distanthorizons.coreapi.util.math.Vec3f; import org.apache.logging.log4j.Logger; -import org.joml.Matrix4f; import org.joml.Matrix4fc; -import org.joml.Vector3f; import java.util.Comparator; import java.util.Iterator; @@ -89,7 +85,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 matViewProjection, Vec3f lookForwardVector) + public void buildRenderListAndUpdateSections(IClientLevelWrapper clientLevelWrapper, Matrix4fc matWorldViewProjection, Vec3f lookForwardVector) { EDhDirection[] axisDirections = new EDhDirection[3]; @@ -196,7 +192,7 @@ public class RenderBufferHandler implements AutoCloseable float worldMinY = clientLevelWrapper.getMinHeight(); float worldHeight = clientLevelWrapper.getHeight(); - DhFrustumBounds frustumBounds = new DhFrustumBounds(matViewProjection, worldMinY, worldMinY + worldHeight); + DhFrustumBounds frustumBounds = new DhFrustumBounds(matWorldViewProjection, worldMinY, worldMinY + worldHeight); // Update the sections boolean rebuildAllBuffers = this.rebuildAllBuffers.getAndSet(false); 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 143f74582..93a9570dd 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 @@ -332,18 +332,14 @@ public class LodRenderer if (renderingFirstPass) { - Vec3f viewDir = MC_RENDER.getLookAtVector(); - Vec3d viewPos = MC_RENDER.getCameraExactPosition(); - - // TODO: find proper way to get view matrix, this breaks when perfectly up/down - Matrix4fc matViewProjection = new Matrix4f() - .setTransposed(projectionMatrix.getValuesAsArray()) - .lookAlong(viewDir.x, viewDir.y, viewDir.z, 0f, 1f, 0f) - .translate(-(float)viewPos.x, -(float)viewPos.y, -(float)viewPos.z); - // TODO: will also need a diff matrix for iris shadow pass! - this.bufferHandler.buildRenderListAndUpdateSections(clientLevelWrapper, matViewProjection, viewDir); + Matrix4fc matWorldViewProjection = new Matrix4f() + .setTransposed(projectionMatrix.getValuesAsArray()) + .mul(MC_RENDER.getWorldViewMatrix()); + + Vec3f viewDir = this.getLookVector(); + this.bufferHandler.buildRenderListAndUpdateSections(clientLevelWrapper, matWorldViewProjection, viewDir); transparencyEnabled = Config.Client.Advanced.Graphics.Quality.transparency.get().transparencyEnabled; fakeOceanFloor = Config.Client.Advanced.Graphics.Quality.transparency.get().fakeTransparencyEnabled; diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java index fd0ee2371..4fcaf703d 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java @@ -36,6 +36,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory; import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.ISodiumAccessor; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import org.jetbrains.annotations.Nullable; +import org.joml.Matrix4f; /** * Contains everything related to @@ -54,6 +55,8 @@ public interface IMinecraftRenderWrapper extends IBindable Vec3d getCameraExactPosition(); + Matrix4f getWorldViewMatrix(); + Mat4f getDefaultProjectionMatrix(float partialTicks); double getGamma(); From 5e924a00b164d161547ef65263d094d5413b16df Mon Sep 17 00:00:00 2001 From: NULL511 Date: Thu, 25 Jan 2024 23:18:43 -0500 Subject: [PATCH 6/8] final --- .../com/seibel/distanthorizons/core/pos/DhFrustumBounds.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java index d1b398abe..f1960d483 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhFrustumBounds.java @@ -1,5 +1,6 @@ package com.seibel.distanthorizons.core.pos; +import org.jetbrains.annotations.NotNull; import org.joml.FrustumIntersection; import org.joml.Matrix4f; import org.joml.Matrix4fc; @@ -27,7 +28,8 @@ public class DhFrustumBounds this.worldMaxY = maxY; } - public boolean Intersects(DhLodPos lodBounds) + /** returns true if the LOD bounds intersect the frustum **/ + public boolean Intersects(@NotNull DhLodPos lodBounds) { int lodPosX = lodBounds.getX().toBlockWidth(); int lodPosZ = lodBounds.getZ().toBlockWidth(); From d0822213d5379413452cbd0de79c47072725b2f9 Mon Sep 17 00:00:00 2001 From: NULL511 Date: Fri, 26 Jan 2024 14:43:04 -0500 Subject: [PATCH 7/8] make frustum culling 1.19.4+ only --- .../distanthorizons/core/render/renderer/LodRenderer.java | 5 ++++- .../wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) 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 93a9570dd..60c6ba39e 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 @@ -334,9 +334,12 @@ public class LodRenderer { // TODO: will also need a diff matrix for iris shadow pass! + Matrix4f matWorldView = new Matrix4f() + .setTransposed(MC_RENDER.getWorldViewMatrix().getValuesAsArray()); + Matrix4fc matWorldViewProjection = new Matrix4f() .setTransposed(projectionMatrix.getValuesAsArray()) - .mul(MC_RENDER.getWorldViewMatrix()); + .mul(matWorldView); Vec3f viewDir = this.getLookVector(); this.bufferHandler.buildRenderListAndUpdateSections(clientLevelWrapper, matWorldViewProjection, viewDir); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java index 4fcaf703d..f9cfd4036 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java @@ -55,7 +55,7 @@ public interface IMinecraftRenderWrapper extends IBindable Vec3d getCameraExactPosition(); - Matrix4f getWorldViewMatrix(); + Mat4f getWorldViewMatrix(); Mat4f getDefaultProjectionMatrix(float partialTicks); From 0e0f5ec3ea59fa979ed6d0313ed458578edaec6a Mon Sep 17 00:00:00 2001 From: NULL511 Date: Fri, 26 Jan 2024 16:17:51 -0500 Subject: [PATCH 8/8] cleanup --- .../wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java index f9cfd4036..42d355520 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java @@ -36,7 +36,6 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory; import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.ISodiumAccessor; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import org.jetbrains.annotations.Nullable; -import org.joml.Matrix4f; /** * Contains everything related to