From b1d8c008661638b653a3d0e995f87e29e8c6267b Mon Sep 17 00:00:00 2001 From: Saad Nadeem Date: Fri, 9 Oct 2026 21:24:02 -0400 Subject: [PATCH] fix(legacy): draw panorama behind loading screen --- .../mixin/client/MixinProgressRenderer.java | 33 +++++++++++++++++++ .../polyplus/client/gui/MenuPanorama.kt | 21 ++++++++---- src/main/resources/mixins.polyplus.json | 2 ++ 3 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/polyfrost/polyplus/mixin/client/MixinProgressRenderer.java diff --git a/src/main/java/org/polyfrost/polyplus/mixin/client/MixinProgressRenderer.java b/src/main/java/org/polyfrost/polyplus/mixin/client/MixinProgressRenderer.java new file mode 100644 index 00000000..01504644 --- /dev/null +++ b/src/main/java/org/polyfrost/polyplus/mixin/client/MixinProgressRenderer.java @@ -0,0 +1,33 @@ +package org.polyfrost.polyplus.mixin.client; + +//? if = 1.8.9 { +/*import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import net.minecraft.client.Minecraft; +import net.minecraft.client.render.ProgressRenderer; +import net.minecraft.client.render.Window; +import net.minecraft.client.render.pipeline.RenderTarget; +import org.polyfrost.polyplus.client.PolyPlusMainMenuConfig; +import org.polyfrost.polyplus.client.gui.MenuPanorama; +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(ProgressRenderer.class) +public class MixinProgressRenderer { + @Shadow + private Minecraft minecraft; + + @ModifyExpressionValue(method = "progressStagePercentage", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/ProgressRenderer;target:Lnet/minecraft/client/render/pipeline/RenderTarget;")) + private RenderTarget polyplus$useMainTarget(RenderTarget original) { + return PolyPlusMainMenuConfig.getPanoramaInAllMenus() ? this.minecraft.getRenderTarget() : original; + } + + @Inject(method = "progressStagePercentage", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/vertex/Tesselator;end()V", ordinal = 0, shift = At.Shift.AFTER)) + private void polyplus$drawBackdrop(int percentage, CallbackInfo ci) { + Window window = new Window(this.minecraft); + MenuPanorama.drawLoadingBackdrop(window.getWidth(), window.getHeight()); + } +} +*///?} diff --git a/src/main/kotlin/org/polyfrost/polyplus/client/gui/MenuPanorama.kt b/src/main/kotlin/org/polyfrost/polyplus/client/gui/MenuPanorama.kt index fc9ddcb3..c39b1a97 100644 --- a/src/main/kotlin/org/polyfrost/polyplus/client/gui/MenuPanorama.kt +++ b/src/main/kotlin/org/polyfrost/polyplus/client/gui/MenuPanorama.kt @@ -134,7 +134,7 @@ object MenuPanorama { fun drawBackdrop(screen: Screen, onPanoramaPass: Boolean): Boolean { if (!backdropWanted(screen, onPanoramaPass)) return false if (drawnThisPass) return true - if (!panoramaBackdrop() || !drawLegacyPanorama(screen)) { + if (!panoramaBackdrop() || !drawLegacyPanorama(screen.width, screen.height)) { GuiElement.fill(0, 0, screen.width, screen.height, BASE_COLOR) filledThisFrame = true } @@ -143,6 +143,15 @@ object MenuPanorama { return drew } + @JvmStatic + fun drawLoadingBackdrop(width: Int, height: Int) { + if (!PolyPlusMainMenuConfig.panoramaInAllMenus) return + if (!panoramaBackdrop() || !drawLegacyPanorama(width, height)) { + GuiElement.fill(0, 0, width, height, BASE_COLOR) + } + MenuBackgroundPass.renderInline(panoramaBackdrop(), this) + } + private const val WASH_TOP = 0x80FFFFFF.toInt() private const val WASH_BOTTOM = 0x00FFFFFF private const val SHADE_TOP = 0x00000000 @@ -162,7 +171,7 @@ object MenuPanorama { return title } - private fun drawLegacyPanorama(screen: Screen): Boolean { + private fun drawLegacyPanorama(width: Int, height: Int): Boolean { val title = legacyPanorama() ?: return false val now = System.currentTimeMillis() if (now - lastPanoramaTick > 1000L) lastPanoramaTick = now @@ -170,16 +179,16 @@ object MenuPanorama { title.tick() lastPanoramaTick += 50L } - title.width = screen.width - title.height = screen.height + title.width = width + title.height = height panoramaGlState.capture() try { GlStateManager.disableAlphaTest() (title as TitleScreenInvoker).`polyplus$drawBackground`(0, 0, (now - lastPanoramaTick) / 50f) GlStateManager.enableAlphaTest() val gradients = title as GuiElementInvoker - gradients.`polyplus$fillGradient`(0, 0, screen.width, screen.height, WASH_TOP, WASH_BOTTOM) - gradients.`polyplus$fillGradient`(0, 0, screen.width, screen.height, SHADE_TOP, SHADE_BOTTOM) + gradients.`polyplus$fillGradient`(0, 0, width, height, WASH_TOP, WASH_BOTTOM) + gradients.`polyplus$fillGradient`(0, 0, width, height, SHADE_TOP, SHADE_BOTTOM) } finally { panoramaGlState.restore() } diff --git a/src/main/resources/mixins.polyplus.json b/src/main/resources/mixins.polyplus.json index 4574d7a7..ca6f18a7 100644 --- a/src/main/resources/mixins.polyplus.json +++ b/src/main/resources/mixins.polyplus.json @@ -49,6 +49,8 @@ //? if <26.3 //"client.MixinPauseScreen", "client.MixinPlayerTabOverlay", + //? if = 1.8.9 + //"client.MixinProgressRenderer", "client.MixinRenderTarget", "client.MixinScreen", "client.MixinServerSelectionList",