diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftRenderWrapper.java b/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftRenderWrapper.java index 441ac280d..840bea89f 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftRenderWrapper.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftRenderWrapper.java @@ -264,4 +264,9 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper public boolean isFogStateInUnderWater() { return GAME_RENDERER.getMainCamera().getFluidInCamera() == FogType.WATER; } + + @Override + public boolean tryDisableVanillaFog() { + return true; // Handled via MixinFogRenderer in both Fabric and Forge + } } diff --git a/core b/core index bb22ad58b..976874e7a 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit bb22ad58bcfe095be21b5c74d820a744175db763 +Subproject commit 976874e7a3ad87c9eda7ec16c4058eebf9ba76ea diff --git a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinFogRenderer.java b/forge/src/main/java/com/seibel/lod/forge/mixins/MixinFogRenderer.java new file mode 100644 index 000000000..332e81edd --- /dev/null +++ b/forge/src/main/java/com/seibel/lod/forge/mixins/MixinFogRenderer.java @@ -0,0 +1,46 @@ +package com.seibel.lod.forge.mixins; + +import org.spongepowered.asm.mixin.Mixin; +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 com.seibel.lod.core.util.SingletonHandler; +import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton; + +import net.minecraft.client.Camera; +import net.minecraft.client.renderer.FogRenderer; +import net.minecraft.client.renderer.FogRenderer.FogMode; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.material.FogType; + +@Mixin(FogRenderer.class) +public class MixinFogRenderer { + // Using this instead of Float.MAX_VALUE because Sodium don't like it. (And just in case it's here also for forge) + private static final float A_REALLY_REALLY_BIG_VALUE = 420694206942069.F; + private static final float A_EVEN_LARGER_VALUE = 42069420694206942069.F; + + @Inject(at = @At("RETURN"), + method = "setupFog(Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/FogRenderer$FogMode;FZF)V", + remap = false) // Due to this being a forge added method + private static final void disableSetupFog(Camera camera, FogMode fogMode, float f, boolean bl, float tick, CallbackInfo callback) { + ILodConfigWrapperSingleton CONFIG; + try { + CONFIG = SingletonHandler.get(ILodConfigWrapperSingleton.class); + } catch (NullPointerException e) { + return; // Happens on forge not loading the mod before this. + } + FogType fogTypes = camera.getFluidInCamera(); + Entity entity = camera.getEntity(); + boolean isUnderWater = (entity instanceof LivingEntity) && ((LivingEntity)entity).hasEffect(MobEffects.BLINDNESS); + if (!isUnderWater) { + if (fogMode == FogMode.FOG_TERRAIN && fogTypes == FogType.NONE && CONFIG.client().graphics().fogQuality().getDisableVanillaFog()) { + RenderSystem.setShaderFogStart(A_REALLY_REALLY_BIG_VALUE); + RenderSystem.setShaderFogEnd(A_EVEN_LARGER_VALUE); + } + } + } +} diff --git a/forge/src/main/resources/lod.mixins.json b/forge/src/main/resources/lod.mixins.json index 9ee3060e8..b88cdffd1 100644 --- a/forge/src/main/resources/lod.mixins.json +++ b/forge/src/main/resources/lod.mixins.json @@ -7,7 +7,8 @@ ], "client": [ "MixinOptionsScreen", - "MixinWorldRenderer" + "MixinWorldRenderer", + "MixinFogRenderer" ], "server": [] }