From c335020c2fb2ed04c12646eb9cd0dffe99894468 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 4 Jul 2025 09:05:42 -0500 Subject: [PATCH] Fix sodium fog for MC 1.21.7 --- .../distanthorizons/fabric/FabricMain.java | 7 -- .../mixins/client/MixinFogRenderer.java | 78 ++++++++++-------- .../mixins/client/MixinFogRenderer.java | 79 +++++++++++-------- 3 files changed, 90 insertions(+), 74 deletions(-) diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricMain.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricMain.java index 68a4f4019..81a6dd485 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricMain.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricMain.java @@ -150,13 +150,6 @@ public class FabricMain extends AbstractModInitializer implements ClientModIniti if (SingletonInjector.INSTANCE.get(IModChecker.class).isModLoaded("sodium")) { ModAccessorInjector.INSTANCE.get(ISodiumAccessor.class).setFogOcclusion(false); - - #if MC_VER < MC_1_21_6 - #else - LOGGER.warn("Sodium detected: Vanilla fog cannot be disabled. Forcing vanilla fade 'on' and overdraw prevention to 'auto' to circumvent the issue."); - Config.Client.Advanced.Graphics.Quality.vanillaFadeMode.setApiValue(EDhApiMcRenderingFadeMode.DOUBLE_PASS); - Config.Client.Advanced.Graphics.Culling.overdrawPrevention.setApiValue(0.0); - #endif } #endif 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 6977a6578..fe570912e 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 @@ -26,10 +26,6 @@ import net.minecraft.client.Minecraft; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.Camera; import net.minecraft.world.effect.MobEffects; @@ -40,10 +36,18 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.material.FluidState; import net.minecraft.client.renderer.FogRenderer; import net.minecraft.client.renderer.FogRenderer.FogMode; +import com.mojang.blaze3d.systems.RenderSystem; + +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; #elif MC_VER < MC_1_21_3 import net.minecraft.world.level.material.FogType; import net.minecraft.client.renderer.FogRenderer; import net.minecraft.client.renderer.FogRenderer.FogMode; +import com.mojang.blaze3d.systems.RenderSystem; + +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; #elif MC_VER < MC_1_21_6 import net.minecraft.world.level.material.FogType; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -52,13 +56,17 @@ import net.minecraft.client.renderer.FogRenderer; import net.minecraft.client.renderer.FogRenderer.FogMode; import net.minecraft.client.renderer.FogParameters; import org.joml.Vector4f; +import com.mojang.blaze3d.systems.RenderSystem; + +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; #else -import com.mojang.blaze3d.buffers.Std140Builder; import net.minecraft.world.level.material.FogType; import net.minecraft.client.renderer.fog.FogRenderer; -import org.joml.Vector4f; +import net.minecraft.client.renderer.fog.FogData; -import java.nio.ByteBuffer; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; #endif @Mixin(FogRenderer.class) @@ -82,8 +90,8 @@ 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 - @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) + @Unique + private static void unused() #endif { #if MC_VER < MC_1_21_6 @@ -91,17 +99,6 @@ public class MixinFogRenderer #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 @@ -116,25 +113,40 @@ public class MixinFogRenderer #elif MC_VER < MC_1_21_6 callback.setReturnValue(FogParameters.NO_FOG); #else - // 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 + #else + + @WrapOperation( + method = "setupFog", + at = @At( + value = "FIELD", + target = "Lnet/minecraft/client/renderer/fog/FogData;renderDistanceEnd:F", + opcode = org.objectweb.asm.Opcodes.PUTFIELD + ) + ) + private void onSetRenderDistanceEnd(FogData instance, float value, Operation original) + { + if (cancelFog()) + { + instance.environmentalStart = A_REALLY_REALLY_BIG_VALUE; + instance.environmentalEnd = A_EVEN_LARGER_VALUE; + + instance.renderDistanceStart = A_REALLY_REALLY_BIG_VALUE; + instance.renderDistanceEnd = A_EVEN_LARGER_VALUE; + } + + // Always call the original with the modified or original value + original.call(instance, value); + } + + #endif + @Unique #if MC_VER < MC_1_21_6 diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinFogRenderer.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinFogRenderer.java index 0ed696574..15b910326 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinFogRenderer.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinFogRenderer.java @@ -19,7 +19,6 @@ package com.seibel.distanthorizons.neoforge.mixins.client; -import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; @@ -27,10 +26,6 @@ import net.minecraft.client.Minecraft; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.Camera; import net.minecraft.world.effect.MobEffects; @@ -41,10 +36,18 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.material.FluidState; import net.minecraft.client.renderer.FogRenderer; import net.minecraft.client.renderer.FogRenderer.FogMode; +import com.mojang.blaze3d.systems.RenderSystem; + +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; #elif MC_VER < MC_1_21_3 import net.minecraft.world.level.material.FogType; import net.minecraft.client.renderer.FogRenderer; import net.minecraft.client.renderer.FogRenderer.FogMode; +import com.mojang.blaze3d.systems.RenderSystem; + +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; #elif MC_VER < MC_1_21_6 import net.minecraft.world.level.material.FogType; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -53,13 +56,17 @@ import net.minecraft.client.renderer.FogRenderer; import net.minecraft.client.renderer.FogRenderer.FogMode; import net.minecraft.client.renderer.FogParameters; import org.joml.Vector4f; +import com.mojang.blaze3d.systems.RenderSystem; + +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; #else -import com.mojang.blaze3d.buffers.Std140Builder; import net.minecraft.world.level.material.FogType; import net.minecraft.client.renderer.fog.FogRenderer; -import org.joml.Vector4f; +import net.minecraft.client.renderer.fog.FogData; -import java.nio.ByteBuffer; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; #endif @Mixin(FogRenderer.class) @@ -83,8 +90,8 @@ 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 - @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) + @Unique + private static void unused() #endif { #if MC_VER < MC_1_21_6 @@ -92,17 +99,6 @@ public class MixinFogRenderer #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 @@ -117,25 +113,40 @@ public class MixinFogRenderer #elif MC_VER < MC_1_21_6 callback.setReturnValue(FogParameters.NO_FOG); #else - // 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 + #else + + @WrapOperation( + method = "setupFog", + at = @At( + value = "FIELD", + target = "Lnet/minecraft/client/renderer/fog/FogData;renderDistanceEnd:F", + opcode = org.objectweb.asm.Opcodes.PUTFIELD + ) + ) + private void onSetRenderDistanceEnd(FogData instance, float value, Operation original) + { + if (cancelFog()) + { + instance.environmentalStart = A_REALLY_REALLY_BIG_VALUE; + instance.environmentalEnd = A_EVEN_LARGER_VALUE; + + instance.renderDistanceStart = A_REALLY_REALLY_BIG_VALUE; + instance.renderDistanceEnd = A_EVEN_LARGER_VALUE; + } + + // Always call the original with the modified or original value + original.call(instance, value); + } + + #endif + @Unique #if MC_VER < MC_1_21_6