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