From 9e092091d2511c6d85cf2e3d9bfa4d93a74c1d6c Mon Sep 17 00:00:00 2001 From: James Seibel Date: Tue, 2 Jun 2026 17:40:58 -0500 Subject: [PATCH] Fix camera position off-by-one with immersive portals --- .../openGl/generic/GlGenericObjectRenderer.java | 6 ++---- .../openGl/postProcessing/fog/GlDhFogShader.java | 2 +- .../minecraft/MinecraftRenderWrapper.java | 16 ++++++++++++++-- coreSubProjects | 2 +- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/generic/GlGenericObjectRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/generic/GlGenericObjectRenderer.java index 8c47d4ee8..aad4dd4a4 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/generic/GlGenericObjectRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/generic/GlGenericObjectRenderer.java @@ -450,8 +450,6 @@ public class GlGenericObjectRenderer implements IDhGenericRenderer this.boxIndexBuffer.bind(); - DhVec3d camPos = MC_RENDER.getCameraExactPosition(); - // rendering // @@ -512,11 +510,11 @@ public class GlGenericObjectRenderer implements IDhGenericRenderer { if (this.instancedRenderingAvailable) { - this.renderBoxGroupInstanced(shaderProgram, renderEventParam, boxGroup, camPos, profiler); + this.renderBoxGroupInstanced(shaderProgram, renderEventParam, boxGroup, renderEventParam.exactCameraPosition, profiler); } else { - this.renderBoxGroupDirect(shaderProgram, renderEventParam, boxGroup, camPos, profiler); + this.renderBoxGroupDirect(shaderProgram, renderEventParam, boxGroup, renderEventParam.exactCameraPosition, profiler); } } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/postProcessing/fog/GlDhFogShader.java b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/postProcessing/fog/GlDhFogShader.java index 183eeb233..46738c2cb 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/postProcessing/fog/GlDhFogShader.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/postProcessing/fog/GlDhFogShader.java @@ -208,7 +208,7 @@ public class GlDhFogShader extends GlAbstractShaderRenderer this.shader.setUniform(this.uHeightFogAppliesDown, heightFogDirection.fogAppliesDown); this.shader.setUniform(this.uUseSphericalFog, useSphericalFog); this.shader.setUniform(this.uHeightFogMixingMode, heightFogMixingMode.value); - this.shader.setUniform(this.uCameraBlockYPos, (float)MC_RENDER.getCameraExactPosition().y); + this.shader.setUniform(this.uCameraBlockYPos, (float)renderParams.exactCameraPosition.y); } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java index 85b7e5edb..a7dd370a6 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java @@ -22,6 +22,7 @@ package com.seibel.distanthorizons.common.wrappers.minecraft; import java.awt.Color; import java.util.concurrent.ConcurrentHashMap; +import com.seibel.distanthorizons.core.render.RenderThreadTaskHandler; import org.jetbrains.annotations.Nullable; #if MC_VER > MC_1_12_2 @@ -216,10 +217,21 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper @Override public DhVec3d getCameraExactPosition() { - if (DelayedAccessors.IMMERSIVE_PORTALS != null) + // When immersive portals is enabled getting the camera position + // outside the render thread means you may get the camera for any one of the dimensions + // immersive portals is currently rendering, which isn't what DH wants. + // We want the camera that the player is currently looking through. + if (DelayedAccessors.IMMERSIVE_PORTALS != null + && !RenderThreadTaskHandler.INSTANCE.isCurrentThread()) { + // this camera position will likely be delayed by 1 frame, so it shouldn't + // be used for rendering, + // but anything else that doesn't require that level of percision is fine. DhVec3d cameraPos = DelayedAccessors.IMMERSIVE_PORTALS.getActualCameraPos(); - if (cameraPos != null) return cameraPos; + if (cameraPos != null) + { + return cameraPos; + } } #if MC_VER <= MC_1_12_2 diff --git a/coreSubProjects b/coreSubProjects index 44aed79e7..c28cf643b 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 44aed79e78722a53f88adfc13458679a7507bb67 +Subproject commit c28cf643b39c43f790ed130c2976084e5f8d85e2