From fcdb56660c9f52350caf7382c9571bd5921ae1a4 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 20 Jun 2025 07:39:50 -0500 Subject: [PATCH] fix fog renderer again --- .../minecraft/MinecraftRenderWrapper.java | 53 ++++++++++++++--- .../mixins/client/MixinFogRenderer.java | 59 +++++++++++++------ 2 files changed, 87 insertions(+), 25 deletions(-) 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 c4076453b..12c62449f 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 @@ -33,9 +33,11 @@ import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.util.ColorUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper; -#if MC_VER >= MC_1_17_1 +#if MC_VER >= MC_1_17_1 && MC_VER < MC_1_21_6 import net.minecraft.client.renderer.FogRenderer; import com.mojang.blaze3d.systems.RenderSystem; +#else +import net.minecraft.client.renderer.fog.FogRenderer; #endif #if MC_VER < MC_1_19_4 @@ -43,8 +45,6 @@ import org.joml.Matrix4f; import org.joml.Vector3f; #else #endif -#if MC_VER >= MC_1_20_2 -#endif import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.AbstractOptifineAccessor; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; @@ -73,7 +73,6 @@ import org.joml.Vector4f; #if MC_VER >= MC_1_21_5 import com.mojang.blaze3d.opengl.GlTexture; -import org.lwjgl.opengl.GL32; #endif /** @@ -109,6 +108,8 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper public boolean colorTextureCastFailLogged = false; public boolean depthTextureCastFailLogged = false; + private static FogRenderer mcFogRenderer = null; + //=========// @@ -126,11 +127,22 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper /** Unless you really need to know if the player is blind, use {@link MinecraftRenderWrapper#isFogStateSpecial()}/{@link IMinecraftRenderWrapper#isFogStateSpecial()} instead */ public boolean playerHasBlindingEffect() { - return MC.player.getActiveEffectsMap().get(MobEffects.BLINDNESS) != null + if (MC.player == null) + { + return false; + } + else if (MC.player.getActiveEffectsMap() == null) + { + return false; + } + else + { + return MC.player.getActiveEffectsMap().get(MobEffects.BLINDNESS) != null #if MC_VER >= MC_1_19_2 - || MC.player.getActiveEffectsMap().get(MobEffects.DARKNESS) != null // Deep dark effect + || MC.player.getActiveEffectsMap().get(MobEffects.DARKNESS) != null // Deep dark effect #endif - ; + ; + } } @Override @@ -163,7 +175,7 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper Math.max(0f, Math.min(colorValues[2], 1f)), // b Math.max(0f, Math.min(colorValues[3], 1f)) // a ); - #else + #elif MC_VER < MC_1_21_6 Vector4f colorValues = FogRenderer.computeFogColor(MC.gameRenderer.getMainCamera(), partialTicks, MC.level, 1, MC.gameRenderer.getDarkenWorldAmount(partialTicks)); return new Color( Math.max(0f, Math.min(colorValues.x, 1f)), // r @@ -171,6 +183,31 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper Math.max(0f, Math.min(colorValues.z, 1f)), // b Math.max(0f, Math.min(colorValues.w, 1f)) // a ); + #else + + if (mcFogRenderer == null) + { + mcFogRenderer = new FogRenderer(); + } + + if (MC.level == null) + { + // shouldn't happen, but just in case + return Color.white; + } + + boolean isFoggy = + MC.level.effects().isFoggyAt( + MC.gameRenderer.getMainCamera().getBlockPosition().getX(), + MC.gameRenderer.getMainCamera().getBlockPosition().getZ()) + || MC.gui.getBossOverlay().shouldCreateWorldFog(); + Vector4f colorValues = mcFogRenderer.setupFog(MC.gameRenderer.getMainCamera(), MC.options.getEffectiveRenderDistance(), isFoggy, MC.deltaTracker, MC.gameRenderer.getDarkenWorldAmount(MC.deltaTracker.getGameTimeDeltaPartialTick(true)), MC.level); + return new Color( + Math.max(0f, Math.min(colorValues.x, 1f)), // r + Math.max(0f, Math.min(colorValues.y, 1f)), // g + Math.max(0f, Math.min(colorValues.z, 1f)), // b + Math.max(0f, Math.min(colorValues.w, 1f)) // a + ); #endif } // getSpecialFogColor() is the same as getFogColor() diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinFogRenderer.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinFogRenderer.java index 4effec708..422b1e5c2 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinFogRenderer.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinFogRenderer.java @@ -20,9 +20,11 @@ package com.seibel.distanthorizons.fabric.mixins.client; import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.mojang.blaze3d.buffers.Std140Builder; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; +import net.minecraft.client.Minecraft; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -55,8 +57,9 @@ import org.joml.Vector4f; #else import net.minecraft.world.level.material.FogType; import net.minecraft.client.renderer.fog.FogRenderer; -import net.minecraft.client.multiplayer.ClientLevel; import org.joml.Vector4f; + +import java.nio.ByteBuffer; #endif @Mixin(FogRenderer.class) @@ -80,14 +83,27 @@ public class MixinFogRenderer @Inject(at = @At("RETURN"), method = "setupFog", cancellable = true) private static void disableSetupFog(Camera camera, FogMode fogMode, Vector4f vector4f, float f, boolean bl, float g, CallbackInfoReturnable callback) #else - @ModifyReturnValue(at = @At("RETURN"), method = "computeFogColor") - private static Vector4f disableSetupFog(Vector4f fogReturnValue, Camera camera, float f, ClientLevel clientLevel, int i, float g, boolean bl) + @Inject(at = @At("RETURN"), method = "updateBuffer") + private static void disableSetupFog(ByteBuffer fogDataBuffer, int bufferStartPos, Vector4f fogColor, float environmentalStart, float environmentalEnd, float renderDistanceStart, float renderDistanceEnd, float skyEnd, float cloudEnd, CallbackInfo callback) #endif { #if MC_VER < MC_1_21_6 boolean cancelFog = cancelFog(camera, fogMode); - #else + #elif MC_VER < MC_1_21_6 boolean cancelFog = cancelFog(camera); + #else + // don't try disabling the "Empty fog" buffer, that one is already empty and + // will be called before the renderer is set up which can cause some weird null-pointer issues + if (fogColor.x == 0.0f // Red + && fogColor.y == 0.0f // Green + && fogColor.z == 0.0f // Blue + && fogColor.w == 0.0f // Alpha + ) + { + return; + } + + boolean cancelFog = cancelFog(); #endif if (cancelFog) @@ -101,19 +117,22 @@ public class MixinFogRenderer #elif MC_VER < MC_1_21_6 callback.setReturnValue(FogParameters.NO_FOG); #else - // set the fog color to invisible - fogReturnValue.x = 0; - fogReturnValue.y = 0; - fogReturnValue.z = 0; - fogReturnValue.w = 0; + // replace the fog data with our own info + fogDataBuffer.position(bufferStartPos); + Std140Builder.intoBuffer(fogDataBuffer) + .putVec4(fogColor) + //environmentalStart/End + .putFloat(A_REALLY_REALLY_BIG_VALUE).putFloat(A_EVEN_LARGER_VALUE) + //renderDistanceStart/End + .putFloat(A_REALLY_REALLY_BIG_VALUE).putFloat(A_EVEN_LARGER_VALUE) + + // sky and cloud should be unaffected otherwise the distant sky will render incorrectly + // (IE have a large fog-colored block in the sky) + .putFloat(skyEnd) + .putFloat(cloudEnd); #endif } - #if MC_VER < MC_1_21_6 - // no return value needed - #else - return fogReturnValue; - #endif } @@ -122,12 +141,18 @@ public class MixinFogRenderer #if MC_VER < MC_1_21_6 private static boolean cancelFog(Camera camera, FogMode fogMode) #else - private static boolean cancelFog(Camera camera) + private static boolean cancelFog() #endif { - boolean cameraNotInFluid = cameraNotInFluid(camera); - + #if MC_VER < MC_1_21_6 Entity entity = camera.getEntity(); + #else + Camera camera = Minecraft.getInstance().gameRenderer.getMainCamera(); + Entity entity = camera.getEntity(); + #endif + + + boolean cameraNotInFluid = cameraNotInFluid(camera); boolean isSpecialFog = (entity instanceof LivingEntity) && ((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS); boolean cancelFog = !isSpecialFog;