diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/EDhRenderDepth.java b/core/src/main/java/com/seibel/distanthorizons/core/render/EDhRenderDepth.java
new file mode 100644
index 000000000..d5bdfef43
--- /dev/null
+++ b/core/src/main/java/com/seibel/distanthorizons/core/render/EDhRenderDepth.java
@@ -0,0 +1,32 @@
+package com.seibel.distanthorizons.core.render;
+
+/**
+ * FORWARD_Z,
+ * REVERSE_Z,
+ */
+public enum EDhRenderDepth
+{
+ /**
+ * AKA Zero to One
+ * MC 26.1.2 and older (OpenGL) = false (near = 0.0f, far = 1.0f)
+ */
+ FORWARD_Z(0.0f, 1.0f),
+ /**
+ * AKA One to Zero
+ * MC 26.2.0 and newer (Vulkan/GL) = true (near = 1.0f, far = 0.0f)
+ */
+ REVERSE_Z(1.0f, 0.0f);
+
+
+ public final float nearDepth;
+ public final float farDepth;
+
+ EDhRenderDepth(float nearDepth, float farDepth)
+ {
+ this.nearDepth = nearDepth;
+ this.farDepth = farDepth;
+ }
+
+
+
+}
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/util/RenderUtil.java b/core/src/main/java/com/seibel/distanthorizons/core/util/RenderUtil.java
index 807fe6ca7..639daf84e 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/util/RenderUtil.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/util/RenderUtil.java
@@ -27,9 +27,11 @@ import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.logging.DhLogger;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
+import com.seibel.distanthorizons.core.render.EDhRenderDepth;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IIrisAccessor;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRenderApiDefinition;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.distanthorizons.coreapi.util.MathUtil;
import com.seibel.distanthorizons.core.util.math.Mat4f;
@@ -45,6 +47,7 @@ public class RenderUtil
private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
private static final IMinecraftRenderWrapper MC_RENDER = SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class);
private static final IIrisAccessor IRIS_ACCESSOR = ModAccessorInjector.INSTANCE.get(IIrisAccessor.class);
+ private static final AbstractDhRenderApiDefinition RENDER_API_DEF = SingletonInjector.INSTANCE.get(AbstractDhRenderApiDefinition.class);
/**
* all speeds are measured in blocks per second
@@ -91,8 +94,18 @@ public class RenderUtil
// Create a copy of the current matrix, so it won't be modified.
Mat4f lodProj = new Mat4f(mcProjMat);
+
+
// Set new far and near clip plane values.
- lodProj.setClipPlanes(nearClipDist, farClipDist);
+ if (RENDER_API_DEF.getRenderDepth() == EDhRenderDepth.FORWARD_Z)
+ {
+ lodProj.setClipPlanes(nearClipDist, farClipDist, true);
+ }
+ else
+ {
+ lodProj.setClipPlanes(farClipDist, nearClipDist, false);
+ }
+
return lodProj;
}
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/util/math/Mat4f.java b/core/src/main/java/com/seibel/distanthorizons/core/util/math/Mat4f.java
index 8672afc7d..f5be3daa6 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/util/math/Mat4f.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/util/math/Mat4f.java
@@ -20,6 +20,8 @@
package com.seibel.distanthorizons.core.util.math;
import com.seibel.distanthorizons.api.objects.math.DhApiMat4f;
+import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRenderApiDefinition;
import org.joml.Matrix4f;
import org.joml.Matrix4fc;
@@ -234,14 +236,11 @@ public class Mat4f extends DhApiMat4f
* @param nearClip New near clipping plane value.
* @param farClip New far clipping plane value.
*/
- public void setClipPlanes(float nearClip, float farClip)
+ public void setClipPlanes(float nearClip, float farClip, boolean zZeroToOne)
{
- //convert to matrix values, formula copied from a textbook / openGL specification.
- float matNearClip = -((farClip + nearClip) / (farClip - nearClip));
- float matFarClip = -((2 * farClip * nearClip) / (farClip - nearClip));
- //set new values for the clip planes.
- this.m22 = matNearClip;
- this.m23 = matFarClip;
+ //convert to matrix values, formula copied JOML's implementation to match Minecraft
+ this.m22 = (zZeroToOne ? farClip : farClip + nearClip) / (nearClip - farClip);
+ this.m23 = (zZeroToOne ? farClip : farClip + farClip) * nearClip / (nearClip - farClip);
}
public Mat4f copy() { return new Mat4f(this); }
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/AbstractDhRenderApiDefinition.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/AbstractDhRenderApiDefinition.java
index 9ba46d34d..6a695b821 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/AbstractDhRenderApiDefinition.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/AbstractDhRenderApiDefinition.java
@@ -2,6 +2,7 @@ package com.seibel.distanthorizons.core.wrapperInterfaces.render;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.jar.EPlatform;
+import com.seibel.distanthorizons.core.render.EDhRenderDepth;
import com.seibel.distanthorizons.core.render.renderer.AbstractDebugWireframeRenderer;
import com.seibel.distanthorizons.core.wrapperInterfaces.render.objects.IDhGenericObjectVertexBufferContainer;
import com.seibel.distanthorizons.core.wrapperInterfaces.render.objects.ILodContainerUniformBufferWrapper;
@@ -29,6 +30,8 @@ public abstract class AbstractDhRenderApiDefinition implements IBindable
*/
public boolean useSingleIbo() { return this.useSingleIbo; }
+ public abstract EDhRenderDepth getRenderDepth();
+
//endregion