Skip to content

Commit 93c6475

Browse files
committed
change: Initial fog rework
1 parent 310d3d3 commit 93c6475

9 files changed

Lines changed: 102 additions & 118 deletions

File tree

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package me.flashyreese.mods.sodiumextra.client.fog;
2+
3+
import net.minecraft.client.DeltaTracker;
4+
import net.minecraft.client.multiplayer.ClientLevel;
5+
import net.minecraft.client.renderer.fog.FogData;
6+
import net.minecraft.core.BlockPos;
7+
import net.minecraft.world.entity.Entity;
8+
import net.minecraft.world.level.material.FogType;
9+
10+
public interface FogEnvironmentExtended {
11+
void sodium_extra$applyFogSettings(FogType fogType, FogData fogData, Entity entity, BlockPos blockPos, ClientLevel clientLevel, float viewDistance, DeltaTracker deltaTracker);
12+
}

common/src/main/java/me/flashyreese/mods/sodiumextra/client/gui/SodiumExtraGameOptionPages.java

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,14 @@ public static OptionPage render() {
234234
List<OptionGroup> groups = new ArrayList<>();
235235

236236
groups.add(OptionGroup.createBuilder()
237+
.add(OptionImpl.createBuilder(boolean.class, sodiumExtraOpts)
238+
.setEnabled(() -> SodiumExtraClientMod.mixinConfig().getOptions().get("mixin.fog").isEnabled())
239+
.setName(Component.translatable("sodium-extra.option.fog"))
240+
.setTooltip(Component.translatable("sodium-extra.option.fog.tooltip"))
241+
.setControl(TickBoxControl::new)
242+
.setBinding((options, value) -> options.renderSettings.fog = value, options -> options.renderSettings.fog)
243+
.build()
244+
)
237245
.add(OptionImpl.createBuilder(boolean.class, sodiumExtraOpts)
238246
.setEnabled(() -> SodiumExtraClientMod.mixinConfig().getOptions().get("mixin.fog").isEnabled())
239247
.setName(Component.translatable("sodium-extra.option.multi_dimension_fog"))
@@ -242,29 +250,21 @@ public static OptionPage render() {
242250
.setBinding((options, value) -> options.renderSettings.multiDimensionFogControl = value, options -> options.renderSettings.multiDimensionFogControl)
243251
.build()
244252
)
245-
.add(OptionImpl.createBuilder(int.class, sodiumExtraOpts)
246-
.setEnabled(() -> SodiumExtraClientMod.mixinConfig().getOptions().get("mixin.fog_falloff").isEnabled())
247-
.setName(Component.translatable("sodium-extra.option.fog_start"))
248-
.setTooltip(Component.translatable("sodium-extra.option.fog_start.tooltip"))
249-
.setControl(option -> new SliderControlExtended(option, 0, 100, 1, ControlValueFormatter.percentage(), false))
250-
.setBinding((options, value) -> options.renderSettings.fogStart = value, options -> options.renderSettings.fogStart)
251-
.build()
252-
)
253253
.build());
254254

255255
if (SodiumExtraClientMod.options().renderSettings.multiDimensionFogControl) {
256256
WorldDimensions
257257
.keysInOrder(Stream.empty())
258-
.filter(dim -> !SodiumExtraClientMod.options().renderSettings.dimensionFogDistanceMap.containsKey(dim.location()))
259-
.forEach(dim -> SodiumExtraClientMod.options().renderSettings.dimensionFogDistanceMap.put(dim.location(), 0));
260-
groups.add(SodiumExtraClientMod.options().renderSettings.dimensionFogDistanceMap.keySet().stream()
258+
.filter(dim -> !SodiumExtraClientMod.options().renderSettings.dimensionFogStartMap.containsKey(dim.location()))
259+
.forEach(dim -> SodiumExtraClientMod.options().renderSettings.dimensionFogStartMap.put(dim.location(), 100));
260+
groups.add(SodiumExtraClientMod.options().renderSettings.dimensionFogStartMap.keySet().stream()
261261
.map(identifier -> OptionImpl.createBuilder(int.class, sodiumExtraOpts)
262262
.setEnabled(() -> SodiumExtraClientMod.mixinConfig().getOptions().get("mixin.fog").isEnabled())
263-
.setName(Component.translatable("sodium-extra.option.fog", translatableName(identifier, "dimensions").getString()))
264-
.setTooltip(Component.translatable("sodium-extra.option.fog.tooltip"))
265-
.setControl(option -> new SliderControlExtended(option, 0, 33, 1, ControlValueFormatterExtended.fogDistance(), false))
266-
.setBinding((opts, val) -> opts.renderSettings.dimensionFogDistanceMap.put(identifier, val),
267-
opts -> opts.renderSettings.dimensionFogDistanceMap.getOrDefault(identifier, 0))
263+
.setName(Component.translatable("sodium-extra.option.fog_start_dimension", translatableName(identifier, "dimensions").getString()))
264+
.setTooltip(Component.translatable("sodium-extra.option.fog_start_dimension.tooltip"))
265+
.setControl(option -> new SliderControlExtended(option, 0, 100, 1, ControlValueFormatter.percentage(), false))
266+
.setBinding((opts, val) -> opts.renderSettings.dimensionFogStartMap.put(identifier, val),
267+
opts -> opts.renderSettings.dimensionFogStartMap.getOrDefault(identifier, 100))
268268
.build()
269269
).collect(
270270
OptionGroup::createBuilder,
@@ -276,11 +276,11 @@ public static OptionPage render() {
276276
} else {
277277
groups.add(OptionGroup.createBuilder()
278278
.add(OptionImpl.createBuilder(int.class, sodiumExtraOpts)
279-
.setEnabled(() -> SodiumExtraClientMod.mixinConfig().getOptions().get("mixin.fog").isEnabled())
280-
.setName(Component.translatable("sodium-extra.option.single_fog"))
281-
.setTooltip(Component.translatable("sodium-extra.option.single_fog.tooltip"))
282-
.setControl(option -> new SliderControlExtended(option, 0, 33, 1, ControlValueFormatterExtended.fogDistance(), false))
283-
.setBinding((options, value) -> options.renderSettings.fogDistance = value, options -> options.renderSettings.fogDistance)
279+
.setEnabled(() -> SodiumExtraClientMod.mixinConfig().getOptions().get("mixin.fog_falloff").isEnabled())
280+
.setName(Component.translatable("sodium-extra.option.fog_start"))
281+
.setTooltip(Component.translatable("sodium-extra.option.fog_start.tooltip"))
282+
.setControl(option -> new SliderControlExtended(option, 0, 100, 1, ControlValueFormatter.percentage(), false))
283+
.setBinding((options, value) -> options.renderSettings.fogStart = value, options -> options.renderSettings.fogStart)
284284
.build()
285285
)
286286
.build());

common/src/main/java/me/flashyreese/mods/sodiumextra/client/gui/SodiumExtraGameOptions.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,11 @@ public DetailSettings() {
191191
}
192192

193193
public static class RenderSettings {
194-
public int fogDistance;
195-
public int fogStart;
196194
public boolean multiDimensionFogControl;
195+
public boolean fog;
196+
public int fogStart;
197197
@SerializedName("dimensionFogDistance")
198-
public Map<ResourceLocation, Integer> dimensionFogDistanceMap;
198+
public Map<ResourceLocation, Integer> dimensionFogStartMap;
199199
public boolean lightUpdates;
200200
public boolean itemFrame;
201201
public boolean armorStand;
@@ -208,10 +208,10 @@ public static class RenderSettings {
208208
public boolean playerNameTag;
209209

210210
public RenderSettings() {
211-
this.fogDistance = 0;
212-
this.fogStart = 100;
213211
this.multiDimensionFogControl = false;
214-
this.dimensionFogDistanceMap = new Object2IntArrayMap<>();
212+
this.fog = true;
213+
this.fogStart = 100;
214+
this.dimensionFogStartMap = new Object2IntArrayMap<>();
215215
this.lightUpdates = true;
216216
this.itemFrame = true;
217217
this.armorStand = true;

common/src/main/java/me/flashyreese/mods/sodiumextra/common/util/ControlValueFormatterExtended.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,6 @@ static ControlValueFormatter resolution() {
1717
};
1818
}
1919

20-
static ControlValueFormatter fogDistance() {
21-
return (v) -> {
22-
if (v == 0) {
23-
return Component.translatable("options.gamma.default");
24-
} else if (v == 33) {
25-
return Component.translatable("options.off");
26-
} else {
27-
return Component.translatable("options.chunks", v);
28-
}
29-
};
30-
}
31-
3220
static ControlValueFormatter ticks() {
3321
return (v) -> Component.translatable("sodium-extra.units.ticks", v);
3422
}

common/src/main/java/me/flashyreese/mods/sodiumextra/mixin/fog/MixinAtmosphericFogEnvironment.java

Lines changed: 0 additions & 44 deletions
This file was deleted.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package me.flashyreese.mods.sodiumextra.mixin.fog;
2+
3+
import me.flashyreese.mods.sodiumextra.client.SodiumExtraClientMod;
4+
import me.flashyreese.mods.sodiumextra.client.fog.FogEnvironmentExtended;
5+
import net.minecraft.client.DeltaTracker;
6+
import net.minecraft.client.multiplayer.ClientLevel;
7+
import net.minecraft.client.renderer.fog.FogData;
8+
import net.minecraft.client.renderer.fog.environment.FogEnvironment;
9+
import net.minecraft.core.BlockPos;
10+
import net.minecraft.world.entity.Entity;
11+
import net.minecraft.world.level.material.FogType;
12+
import org.spongepowered.asm.mixin.Mixin;
13+
14+
@Mixin(FogEnvironment.class)
15+
public abstract class MixinFogEnvironment implements FogEnvironmentExtended {
16+
17+
@Override
18+
public void sodium_extra$applyFogSettings(FogType fogType, FogData fogData, Entity entity, BlockPos blockPos, ClientLevel level, float viewDistance, DeltaTracker deltaTracker) {
19+
if (fogType == FogType.ATMOSPHERIC) {
20+
if (!SodiumExtraClientMod.options().renderSettings.fog) {
21+
fogData.environmentalStart = Float.MAX_VALUE;
22+
fogData.environmentalEnd = Float.MAX_VALUE;
23+
fogData.renderDistanceStart = Float.MAX_VALUE;
24+
fogData.renderDistanceEnd = Float.MAX_VALUE;
25+
return;
26+
}
27+
28+
float fogStart = (SodiumExtraClientMod.options().renderSettings.multiDimensionFogControl
29+
? SodiumExtraClientMod.options().renderSettings.dimensionFogStartMap.getOrDefault(level.dimensionType().effectsLocation(), 100)
30+
: SodiumExtraClientMod.options().renderSettings.fogStart) / 100.0F;
31+
32+
fogData.environmentalStart = fogData.environmentalStart * fogStart;
33+
fogData.renderDistanceStart = fogData.renderDistanceStart * fogStart;
34+
}
35+
}
36+
}
Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,39 @@
11
package me.flashyreese.mods.sodiumextra.mixin.fog;
22

3-
import me.flashyreese.mods.sodiumextra.client.SodiumExtraClientMod;
4-
import net.minecraft.client.Minecraft;
3+
import me.flashyreese.mods.sodiumextra.client.fog.FogEnvironmentExtended;
4+
import net.minecraft.client.Camera;
5+
import net.minecraft.client.DeltaTracker;
6+
import net.minecraft.client.multiplayer.ClientLevel;
57
import net.minecraft.client.renderer.fog.FogData;
68
import net.minecraft.client.renderer.fog.FogRenderer;
9+
import net.minecraft.client.renderer.fog.environment.FogEnvironment;
10+
import net.minecraft.world.entity.Entity;
11+
import net.minecraft.world.level.material.FogType;
12+
import org.joml.Vector4f;
13+
import org.spongepowered.asm.mixin.Final;
714
import org.spongepowered.asm.mixin.Mixin;
15+
import org.spongepowered.asm.mixin.Shadow;
816
import org.spongepowered.asm.mixin.injection.At;
9-
import org.spongepowered.asm.mixin.injection.Redirect;
17+
import org.spongepowered.asm.mixin.injection.Inject;
18+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
19+
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
20+
21+
import java.util.List;
1022

1123
@Mixin(value = FogRenderer.class, priority = 1300)
1224
public class MixinFogRenderer {
1325

14-
@Redirect(method = "setupFog", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/fog/FogData;renderDistanceStart:F", ordinal = 0))
15-
public void modifyRenderDistanceStart(FogData fogData, float renderDistanceStart) {
16-
int fogDistance = SodiumExtraClientMod.options().renderSettings.multiDimensionFogControl
17-
? SodiumExtraClientMod.options().renderSettings.dimensionFogDistanceMap.getOrDefault(Minecraft.getInstance().level.dimensionType().effectsLocation(), 0)
18-
: SodiumExtraClientMod.options().renderSettings.fogDistance;
19-
20-
if (fogDistance == 0) {
21-
fogData.renderDistanceStart = renderDistanceStart;
22-
} else if (fogDistance == 33) {
23-
fogData.renderDistanceStart = Float.MAX_VALUE;
24-
} else {
25-
float fogStart = SodiumExtraClientMod.options().renderSettings.fogStart / 100.0F;
26-
fogData.renderDistanceStart = fogDistance * fogStart * 16F;
27-
}
28-
}
29-
30-
@Redirect(method = "setupFog", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/fog/FogData;renderDistanceEnd:F", ordinal = 0))
31-
public void modifyRenderDistanceEnd(FogData fogData, float renderDistanceEnd) {
32-
int fogDistance = SodiumExtraClientMod.options().renderSettings.multiDimensionFogControl
33-
? SodiumExtraClientMod.options().renderSettings.dimensionFogDistanceMap.getOrDefault(Minecraft.getInstance().level.dimensionType().effectsLocation(), 0)
34-
: SodiumExtraClientMod.options().renderSettings.fogDistance;
26+
@Shadow
27+
@Final
28+
private static List<FogEnvironment> FOG_ENVIRONMENTS;
3529

36-
if (fogDistance == 0) {
37-
fogData.renderDistanceEnd = renderDistanceEnd;
38-
} else if (fogDistance == 33) {
39-
fogData.renderDistanceEnd = Float.MAX_VALUE;
40-
} else {
41-
fogData.renderDistanceEnd = (fogDistance + 1) * 16F;
30+
@Inject(method = "setupFog", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/fog/FogData;renderDistanceEnd:F", ordinal = 0, shift = At.Shift.AFTER), locals = LocalCapture.CAPTURE_FAILHARD)
31+
public void postFogSetup(Camera camera, int renderDistance, boolean thickFog, DeltaTracker deltaTracker, float f, ClientLevel level, CallbackInfoReturnable<Vector4f> cir, float g, Vector4f vector4f, float h, FogType fogType, Entity entity, FogData fogData) {
32+
for (FogEnvironment fogEnvironment : FOG_ENVIRONMENTS) {
33+
if (fogEnvironment.isApplicable(fogType, entity) && fogEnvironment instanceof FogEnvironmentExtended fogEnvironmentExtended) {
34+
fogEnvironmentExtended.sodium_extra$applyFogSettings(fogType, fogData, entity, camera.getBlockPosition(), level, h, deltaTracker);
35+
break;
36+
}
4237
}
4338
}
4439
}

common/src/main/java/me/flashyreese/mods/sodiumextra/mixin/sodium/fog/MixinOcclusionCuller.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,7 @@ private static int nearestToZero(int min, int max) {
2020

2121
@Inject(method = "isWithinRenderDistance", at = @At(value = "HEAD"), cancellable = true)
2222
private static void isWithinRenderDistance(CameraTransform camera, RenderSection section, float maxDistance, CallbackInfoReturnable<Boolean> cir) {
23-
int fogDistance = SodiumExtraClientMod.options().renderSettings.multiDimensionFogControl ?
24-
SodiumExtraClientMod.options().renderSettings.dimensionFogDistanceMap.getOrDefault(Minecraft.getInstance().level.dimensionType().effectsLocation(), 0) :
25-
SodiumExtraClientMod.options().renderSettings.fogDistance;
26-
if (fogDistance == 33) {
23+
if (!SodiumExtraClientMod.options().renderSettings.fog) {
2724
int ox = section.getOriginX() - camera.intX;
2825
int oz = section.getOriginZ() - camera.intZ;
2926
float dx = nearestToZero(ox, ox + 16) - camera.fracX;

common/src/main/resources/sodium-extra.mixins.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"biome_colors.MixinBiomeColors",
1414
"cloud.MixinDimensionType",
1515
"compat.MixinSodiumOptionsGUI",
16-
"fog.MixinAtmosphericFogEnvironment",
16+
"fog.MixinFogEnvironment",
1717
"fog.MixinFogRenderer",
1818
"fog_falloff.MixinFogRenderer",
1919
"gui.MinecraftClientAccessor",

0 commit comments

Comments
 (0)