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 dc915bef5..a8abb87cc 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 @@ -10,7 +10,9 @@ import com.seibel.lod.common.wrappers.misc.LightMapWrapper; import com.seibel.lod.core.handlers.IReflectionHandler; import com.seibel.lod.core.handlers.ReflectionHandler; import com.seibel.lod.core.util.LodUtil; +import net.minecraft.client.renderer.FogRenderer; import net.minecraft.client.renderer.LightTexture; +import net.minecraft.world.level.material.FogType; import org.lwjgl.opengl.GL20; import com.mojang.math.Vector3f; @@ -95,7 +97,8 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper } @Override - public Color getFogColor() { + public Color getFogColor(float partialTicks) { + FogRenderer.setupColor(GAME_RENDERER.getMainCamera(), partialTicks, MC.level, 1, GAME_RENDERER.getDarkenWorldAmount(partialTicks)); float[] colorValues = RenderSystem.getShaderFogColor(); return new Color(colorValues[0], colorValues[1], colorValues[2], colorValues[3]); } @@ -266,4 +269,9 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper return glFormat; } + + @Override + public boolean isFogStateInUnderWater() { + return GAME_RENDERER.getMainCamera().getFluidInCamera() == FogType.WATER; + } } diff --git a/core b/core index 6ea7ecd21..975c24c8a 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 6ea7ecd215876201ef5642c433de92100fd22553 +Subproject commit 975c24c8a9650dcfa9bd817d4c803c108ff1123a diff --git a/fabric/src/main/java/com/seibel/lod/fabric/mixins/MixinFogRenderer.java b/fabric/src/main/java/com/seibel/lod/fabric/mixins/MixinFogRenderer.java index e6cb796a6..45b07f87d 100644 --- a/fabric/src/main/java/com/seibel/lod/fabric/mixins/MixinFogRenderer.java +++ b/fabric/src/main/java/com/seibel/lod/fabric/mixins/MixinFogRenderer.java @@ -5,12 +5,18 @@ 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.common.wrappers.minecraft.MinecraftRenderWrapper; 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 { @@ -18,7 +24,14 @@ public class MixinFogRenderer { @Inject(at = @At("RETURN"), method = "setupFog(Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/FogRenderer$FogMode;FZ)V") private static final void disableSetupFog(Camera camera, FogMode fogMode, float f, boolean bl, CallbackInfo callback) { - if (CONFIG.client().graphics().fogQuality().getDisableVanillaFog()) - FogRenderer.setupNoFog(); + 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(Float.MAX_VALUE); + RenderSystem.setShaderFogEnd(Float.MAX_VALUE); + } + } } -} \ No newline at end of file +} 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..ac804cce0 --- /dev/null +++ b/forge/src/main/java/com/seibel/lod/forge/mixins/MixinFogRenderer.java @@ -0,0 +1,37 @@ +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.common.wrappers.minecraft.MinecraftRenderWrapper; +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 { + private static final ILodConfigWrapperSingleton CONFIG = SingletonHandler.get(ILodConfigWrapperSingleton.class); + + @Inject(at = @At("RETURN"), method = "setupFog(Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/FogRenderer$FogMode;FZ)V") + private static final void disableSetupFog(Camera camera, FogMode fogMode, float f, boolean bl, CallbackInfo callback) { + 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(Float.MAX_VALUE); + RenderSystem.setShaderFogEnd(Float.MAX_VALUE); + } + } + } +} diff --git a/forge/src/main/resources/lod.mixins.json b/forge/src/main/resources/lod.mixins.json index c7cb17105..7f44aef2f 100644 --- a/forge/src/main/resources/lod.mixins.json +++ b/forge/src/main/resources/lod.mixins.json @@ -4,8 +4,9 @@ "compatibilityLevel": "JAVA_16", "refmap": "DistantHorizons-forge-refmap.json", "client": [ - "MixinWorldRenderer", - "MixinOptionsScreen" + "MixinWorldRenderer", + "MixinOptionsScreen", + "MixinFogRenderer" ], "mixins": [], "minVersion": "0.8"