|
1 | 1 | package me.flashyreese.mods.sodiumextra.mixin.fog; |
2 | 2 |
|
| 3 | +import com.mojang.blaze3d.buffers.GpuBuffer; |
| 4 | +import com.mojang.blaze3d.buffers.GpuBufferSlice; |
3 | 5 | import me.flashyreese.mods.sodiumextra.client.SodiumExtraClientMod; |
4 | | -import net.minecraft.client.Camera; |
5 | | -import net.minecraft.client.renderer.FogParameters; |
6 | | -import net.minecraft.client.renderer.FogRenderer; |
7 | | -import net.minecraft.world.entity.Entity; |
8 | | -import net.minecraft.world.level.material.FogType; |
9 | | -import org.jetbrains.annotations.Nullable; |
10 | | -import org.joml.Vector4f; |
| 6 | +import net.minecraft.client.Minecraft; |
| 7 | +import net.minecraft.client.renderer.fog.FogRenderer; |
| 8 | +import org.spongepowered.asm.mixin.Final; |
11 | 9 | import org.spongepowered.asm.mixin.Mixin; |
12 | 10 | import org.spongepowered.asm.mixin.Shadow; |
13 | 11 | import org.spongepowered.asm.mixin.injection.At; |
14 | 12 | import org.spongepowered.asm.mixin.injection.Inject; |
15 | 13 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; |
16 | 14 |
|
17 | 15 | @Mixin(FogRenderer.class) |
18 | | -public abstract class MixinFogRenderer { |
| 16 | +public class MixinFogRenderer { |
| 17 | + |
19 | 18 | @Shadow |
20 | | - @Nullable |
21 | | - private static FogRenderer.MobEffectFogFunction getPriorityFogFunction(Entity entity, float f) { |
22 | | - return null; |
23 | | - } |
| 19 | + @Final |
| 20 | + public static int FOG_UBO_SIZE; |
| 21 | + @Shadow |
| 22 | + @Final |
| 23 | + private GpuBuffer emptyBuffer; |
24 | 24 |
|
25 | | - @Inject(method = "setupFog", at = @At(value = "TAIL"), cancellable = true) |
26 | | - private static void applyFog(Camera camera, FogRenderer.FogMode fogMode, Vector4f vector4f, float f, boolean thickFog, float tickDelta, CallbackInfoReturnable<FogParameters> cir) { |
27 | | - Entity entity = camera.getEntity(); |
28 | | - SodiumExtraClientMod.options().renderSettings.dimensionFogDistanceMap.putIfAbsent(entity.level().dimensionType().effectsLocation(), 0); |
29 | | - int fogDistance = SodiumExtraClientMod.options().renderSettings.multiDimensionFogControl ? SodiumExtraClientMod.options().renderSettings.dimensionFogDistanceMap.get(entity.level().dimensionType().effectsLocation()) : SodiumExtraClientMod.options().renderSettings.fogDistance; |
30 | | - FogRenderer.MobEffectFogFunction mobEffectFogFunction = getPriorityFogFunction(entity, tickDelta); |
31 | | - if (fogDistance == 0 || mobEffectFogFunction != null) { |
32 | | - return; |
33 | | - } |
34 | | - if (camera.getFluidInCamera() == FogType.NONE && (thickFog || fogMode == FogRenderer.FogMode.FOG_TERRAIN)) { |
35 | | - float fogStart = (float) SodiumExtraClientMod.options().renderSettings.fogStart / 100; |
36 | | - if (fogDistance == 33) { |
37 | | - cir.setReturnValue(FogParameters.NO_FOG); |
38 | | - } else { |
39 | | - FogParameters ci = cir.getReturnValue(); |
40 | | - if (ci != null) { |
41 | | - FogParameters newFogParameters = new FogParameters(fogDistance * 16 * fogStart, (fogDistance + 1) * 16, ci.shape(), ci.red(), ci.green(), ci.blue(), ci.alpha()); |
42 | | - cir.setReturnValue(newFogParameters); |
43 | | - } |
44 | | - } |
| 25 | + @Inject(method = "getBuffer", at = @At(value = "HEAD"), cancellable = true) |
| 26 | + public void getBuffer(FogRenderer.FogMode fogMode, CallbackInfoReturnable<GpuBufferSlice> cir) { |
| 27 | + int fogDistance = SodiumExtraClientMod.options().renderSettings.multiDimensionFogControl |
| 28 | + ? SodiumExtraClientMod.options().renderSettings.dimensionFogDistanceMap.getOrDefault(Minecraft.getInstance().level.dimensionType().effectsLocation(), 0) |
| 29 | + : SodiumExtraClientMod.options().renderSettings.fogDistance; |
| 30 | + if (fogDistance == 33) { |
| 31 | + cir.setReturnValue(this.emptyBuffer.slice(0, FOG_UBO_SIZE)); |
45 | 32 | } |
46 | 33 | } |
| 34 | + |
| 35 | + /*@ModifyVariable(method = "updateBuffer(Ljava/nio/ByteBuffer;ILorg/joml/Vector4f;FFFFFF)V", |
| 36 | + at = @At("HEAD"), ordinal = 2, argsOnly = true) |
| 37 | + private float overrideEnvironmentalStart(float original) { |
| 38 | + System.out.println("rd start: " + original); |
| 39 | + if (SodiumExtraClientMod.options().renderSettings.fogDistance == 0) return original; |
| 40 | +
|
| 41 | + int fogDistance = SodiumExtraClientMod.options().renderSettings.multiDimensionFogControl |
| 42 | + ? SodiumExtraClientMod.options().renderSettings.dimensionFogDistanceMap.getOrDefault(Minecraft.getInstance().level.dimensionType().effectsLocation(), 0) |
| 43 | + : SodiumExtraClientMod.options().renderSettings.fogDistance; |
| 44 | + float fogStart = SodiumExtraClientMod.options().renderSettings.fogStart / 100.0F; |
| 45 | +
|
| 46 | + return fogDistance * 0.16F * fogStart; |
| 47 | + } |
| 48 | +
|
| 49 | + @ModifyVariable(method = "updateBuffer(Ljava/nio/ByteBuffer;ILorg/joml/Vector4f;FFFFFF)V", |
| 50 | + at = @At("HEAD"), ordinal = 3, argsOnly = true) |
| 51 | + private float overrideEnvironmentalEnd(float original) { |
| 52 | + System.out.println("rd end: " + original); |
| 53 | + if (SodiumExtraClientMod.options().renderSettings.fogDistance == 0) return original; |
| 54 | +
|
| 55 | + int fogDistance = SodiumExtraClientMod.options().renderSettings.multiDimensionFogControl |
| 56 | + ? SodiumExtraClientMod.options().renderSettings.dimensionFogDistanceMap.getOrDefault(Minecraft.getInstance().level.dimensionType().effectsLocation(), 0) |
| 57 | + : SodiumExtraClientMod.options().renderSettings.fogDistance; |
| 58 | + return (fogDistance + 1) * 0.16F; |
| 59 | + }*/ |
47 | 60 | } |
0 commit comments