From 695fa67270950a6f2a5d2ca183debcb4b3e6b099 Mon Sep 17 00:00:00 2001 From: Martin Prokoph Date: Fri, 28 Mar 2025 23:35:46 +0100 Subject: [PATCH] feat: various improvements - Update to MidnightLib 1.7.0 and use its features to make the config screen more reliable - Fix background gradient being opaque briefly when fading out while not in a world - Fix 1.21.5 compat (still compatible with 1.21.4 as well :D) --- .../main/java/eu/midnightdust/blur/Blur.java | 12 ++++----- .../midnightdust/blur/config/BlurConfig.java | 6 +++++ .../blur/mixin/MixinHandledScreen.java | 2 +- .../blur/mixin/MixinInGameHud.java | 1 - .../mixin/MixinMidnightConfig$EntryInfo.java | 26 +++++++++++++++++++ ...igScreen.java => MixinMidnightConfig.java} | 8 +++--- .../blur/mixin/MixinMidnightSliderWidget.java | 21 --------------- .../midnightdust/blur/mixin/MixinScreen.java | 2 +- common/src/main/resources/blur.mixins.json | 4 +-- gradle.properties | 6 ++--- 10 files changed, 48 insertions(+), 40 deletions(-) create mode 100644 common/src/main/java/eu/midnightdust/blur/mixin/MixinMidnightConfig$EntryInfo.java rename common/src/main/java/eu/midnightdust/blur/mixin/{MixinMidnightConfigScreen.java => MixinMidnightConfig.java} (81%) delete mode 100644 common/src/main/java/eu/midnightdust/blur/mixin/MixinMidnightSliderWidget.java diff --git a/common/src/main/java/eu/midnightdust/blur/Blur.java b/common/src/main/java/eu/midnightdust/blur/Blur.java index 0a9ebad..72b788b 100644 --- a/common/src/main/java/eu/midnightdust/blur/Blur.java +++ b/common/src/main/java/eu/midnightdust/blur/Blur.java @@ -23,7 +23,8 @@ public class Blur { public static boolean doFade = false; - public static void onRender(DrawContext context, int width, int height, MinecraftClient client) { + static float lastDelta; + public static void onRender(DrawContext context, int width, int height, MinecraftClient client, float delta) { if (!BlurInfo.doTest && BlurInfo.screenChanged) { // After the tests for blur and background color have been completed Blur.onScreenChange(); BlurInfo.screenChanged = false; @@ -31,9 +32,9 @@ public class Blur { if (BlurInfo.start >= 0 && !BlurInfo.screenHasBlur && BlurInfo.prevScreenHasBlur) { // Fade out in non-blurred screens client.gameRenderer.renderBlur(); - client.getFramebuffer().beginWrite(false); - if (BlurInfo.prevScreenHasBackground) Blur.renderRotatedGradient(context, width, height); + if (BlurInfo.prevScreenHasBackground && BlurConfig.useGradient && lastDelta != delta) Blur.renderRotatedGradient(context, width, height); + lastDelta = delta; } BlurInfo.doTest = false; // Set the test state to completed, as tests will happen in the same tick. } @@ -78,10 +79,7 @@ public class Blur { int b = (col.getRGB() >> 8) & 0xFF; int g = col.getRGB() & 0xFF; float prog = progress; - a *= prog; - r *= prog; - g *= prog; - b *= prog; + a *= prog; r *= prog; g *= prog; b *= prog; return a << 24 | r << 16 | b << 8 | g; } public static int getRotation() { diff --git a/common/src/main/java/eu/midnightdust/blur/config/BlurConfig.java b/common/src/main/java/eu/midnightdust/blur/config/BlurConfig.java index aa5073b..6124019 100644 --- a/common/src/main/java/eu/midnightdust/blur/config/BlurConfig.java +++ b/common/src/main/java/eu/midnightdust/blur/config/BlurConfig.java @@ -19,6 +19,7 @@ public class BlurConfig extends MidnightConfig { public static boolean blurContainers = true; @Entry(category = SCREENS) public static boolean blurTitleScreen = false; + @Condition(requiredOption = "blurTitleScreen", visibleButLocked = true) @Entry(category = SCREENS) public static boolean darkenTitleScreen = false; @Entry(category = ANIMATIONS, min = 0, max = 2000, isSlider = true) @@ -31,14 +32,19 @@ public class BlurConfig extends MidnightConfig { public static int radius = 5; @Entry(category = STYLE) public static boolean useGradient = true; + @Condition(requiredOption = "useGradient", visibleButLocked = true) @Entry(category = STYLE, isColor = true, width = 7, min = 7) public static String gradientStart = "#000000"; + @Condition(requiredOption = "useGradient", visibleButLocked = true) @Entry(category = STYLE, isSlider = true, min = 0, max = 255) public static int gradientStartAlpha = 75; + @Condition(requiredOption = "useGradient", visibleButLocked = true) @Entry(category = STYLE, isColor = true, width = 7, min = 7) public static String gradientEnd = "#000000"; + @Condition(requiredOption = "useGradient", visibleButLocked = true) @Entry(category = STYLE, isSlider = true, min = 0, max = 255) public static int gradientEndAlpha = 75; + @Condition(requiredOption = "useGradient", visibleButLocked = true) @Entry(category = STYLE, isSlider = true, min = 0, max = 360) public static int gradientRotation = 0; @Entry(category = STYLE) diff --git a/common/src/main/java/eu/midnightdust/blur/mixin/MixinHandledScreen.java b/common/src/main/java/eu/midnightdust/blur/mixin/MixinHandledScreen.java index 14fb1f3..052b33d 100644 --- a/common/src/main/java/eu/midnightdust/blur/mixin/MixinHandledScreen.java +++ b/common/src/main/java/eu/midnightdust/blur/mixin/MixinHandledScreen.java @@ -24,6 +24,6 @@ public class MixinHandledScreen extends Screen { } @Inject(at = @At("HEAD"), method = "render") public void blur$processScreenChange(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { - if (PlatformFunctions.getPlatformName().equals("neoforge")) Blur.onRender(context, width, height, this.client); + if (PlatformFunctions.getPlatformName().equals("neoforge")) Blur.onRender(context, width, height, this.client, delta); } } diff --git a/common/src/main/java/eu/midnightdust/blur/mixin/MixinInGameHud.java b/common/src/main/java/eu/midnightdust/blur/mixin/MixinInGameHud.java index d663e5e..f94e155 100644 --- a/common/src/main/java/eu/midnightdust/blur/mixin/MixinInGameHud.java +++ b/common/src/main/java/eu/midnightdust/blur/mixin/MixinInGameHud.java @@ -23,7 +23,6 @@ public class MixinInGameHud { BlurInfo.doTest = false; BlurInfo.screenChanged = false; this.client.gameRenderer.renderBlur(); - this.client.getFramebuffer().beginWrite(false); if (BlurInfo.prevScreenHasBackground) Blur.renderRotatedGradient(context, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight()); } diff --git a/common/src/main/java/eu/midnightdust/blur/mixin/MixinMidnightConfig$EntryInfo.java b/common/src/main/java/eu/midnightdust/blur/mixin/MixinMidnightConfig$EntryInfo.java new file mode 100644 index 0000000..36e43dd --- /dev/null +++ b/common/src/main/java/eu/midnightdust/blur/mixin/MixinMidnightConfig$EntryInfo.java @@ -0,0 +1,26 @@ +package eu.midnightdust.blur.mixin; + +import eu.midnightdust.blur.Blur; +import eu.midnightdust.lib.config.MidnightConfig; +import net.minecraft.client.MinecraftClient; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Objects; + +@Mixin(value = MidnightConfig.EntryInfo.class, remap = false) +public abstract class MixinMidnightConfig$EntryInfo { + @Shadow @Final public String modid; + @Shadow @Final public String fieldName; + @Shadow Object value; + + @Inject(at = @At(value = "TAIL"), method = "updateFieldValue") + private void blur$instantlyApplyRadius(CallbackInfo ci) { + if (Objects.equals(modid, Blur.MOD_ID) && Objects.equals(fieldName, "radius")) + MinecraftClient.getInstance().options.getMenuBackgroundBlurriness().setValue((int) value); + } +} diff --git a/common/src/main/java/eu/midnightdust/blur/mixin/MixinMidnightConfigScreen.java b/common/src/main/java/eu/midnightdust/blur/mixin/MixinMidnightConfig.java similarity index 81% rename from common/src/main/java/eu/midnightdust/blur/mixin/MixinMidnightConfigScreen.java rename to common/src/main/java/eu/midnightdust/blur/mixin/MixinMidnightConfig.java index 330ec79..d665c1c 100644 --- a/common/src/main/java/eu/midnightdust/blur/mixin/MixinMidnightConfigScreen.java +++ b/common/src/main/java/eu/midnightdust/blur/mixin/MixinMidnightConfig.java @@ -8,10 +8,10 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(MidnightConfig.MidnightConfigScreen.class) -public abstract class MixinMidnightConfigScreen { - @Inject(at = @At(value = "INVOKE", target = "Lcom/google/gson/Gson;fromJson(Ljava/io/Reader;Ljava/lang/Class;)Ljava/lang/Object;", shift = At.Shift.AFTER), remap = false, method = "loadValues") - private void blur$syncRadius(CallbackInfo ci) { +@Mixin(MidnightConfig.class) +public abstract class MixinMidnightConfig { + @Inject(at = @At(value = "INVOKE", target = "Lcom/google/gson/Gson;fromJson(Ljava/io/Reader;Ljava/lang/Class;)Ljava/lang/Object;", shift = At.Shift.AFTER), remap = false, method = "loadValuesFromJson") + private static void blur$syncRadius(CallbackInfo ci) { BlurConfig.radius = MinecraftClient.getInstance().options.getMenuBackgroundBlurrinessValue(); } } \ No newline at end of file diff --git a/common/src/main/java/eu/midnightdust/blur/mixin/MixinMidnightSliderWidget.java b/common/src/main/java/eu/midnightdust/blur/mixin/MixinMidnightSliderWidget.java deleted file mode 100644 index 4926302..0000000 --- a/common/src/main/java/eu/midnightdust/blur/mixin/MixinMidnightSliderWidget.java +++ /dev/null @@ -1,21 +0,0 @@ -package eu.midnightdust.blur.mixin; - -import eu.midnightdust.lib.config.MidnightConfig; -import net.minecraft.client.MinecraftClient; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(value = MidnightConfig.MidnightSliderWidget.class) -public abstract class MixinMidnightSliderWidget { - @Shadow(remap = false) @Final private MidnightConfig.EntryInfo info; - - @Inject(at = @At(value = "TAIL"), method = "applyValue") - private void blur$instantlyApplyRadius(CallbackInfo ci) { - // TODO: Make more fields in MidnightLib protected instead of private and improve this - MinecraftClient.getInstance().options.getMenuBackgroundBlurriness().setValue(Integer.parseInt(this.info.toTemporaryValue())); - } -} diff --git a/common/src/main/java/eu/midnightdust/blur/mixin/MixinScreen.java b/common/src/main/java/eu/midnightdust/blur/mixin/MixinScreen.java index 2616cbb..f2bf18a 100755 --- a/common/src/main/java/eu/midnightdust/blur/mixin/MixinScreen.java +++ b/common/src/main/java/eu/midnightdust/blur/mixin/MixinScreen.java @@ -26,7 +26,7 @@ public abstract class MixinScreen { @Inject(at = @At("HEAD"), method = "render") public void blur$processScreenChange(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { - Blur.onRender(context, width, height, this.client); + Blur.onRender(context, width, height, this.client, delta); } @Inject(at = @At("HEAD"), method = "renderInGameBackground") public void blur$getBackgroundEnabled(DrawContext context, CallbackInfo ci) { diff --git a/common/src/main/resources/blur.mixins.json b/common/src/main/resources/blur.mixins.json index 4fa8729..9c8dd35 100644 --- a/common/src/main/resources/blur.mixins.json +++ b/common/src/main/resources/blur.mixins.json @@ -8,8 +8,8 @@ "MixinGameRenderer", "MixinHandledScreen", "MixinInGameHud", - "MixinMidnightConfigScreen", - "MixinMidnightSliderWidget", + "MixinMidnightConfig", + "MixinMidnightConfig$EntryInfo", "MixinMinecraftClient", "MixinScreen", "MixinTitleScreen", diff --git a/gradle.properties b/gradle.properties index af75488..dc32266 100755 --- a/gradle.properties +++ b/gradle.properties @@ -3,12 +3,12 @@ org.gradle.jvmargs=-Xmx2G org.gradle.parallel=true minecraft_version=1.21.4 -supported_versions= +supported_versions=1.21.5 yarn_mappings=1.21.4+build.1 enabled_platforms=fabric,neoforge # Mod Properties -mod_version=5.1.3 +mod_version=5.2.0 maven_group=eu.midnightdust.blur archives_base_name=blur release_type=release @@ -23,5 +23,5 @@ neoforge_version=21.4.10-beta yarn_mappings_patch_neoforge_version = 1.21+build.4 # Libraries -midnightlib_version = 1.6.7 +midnightlib_version = 1.7.0+1.21.4 modmenu_version = 11.0.2