diff --git a/minecraft/src/main/java/org/polyfrost/oneconfig/internal/OneConfig.java b/minecraft/src/main/java/org/polyfrost/oneconfig/internal/OneConfig.java index 657b96b87..ed4c8a16b 100644 --- a/minecraft/src/main/java/org/polyfrost/oneconfig/internal/OneConfig.java +++ b/minecraft/src/main/java/org/polyfrost/oneconfig/internal/OneConfig.java @@ -184,14 +184,10 @@ public static void render(GuiGraphicsExtractor graphics, float partial) { HudManager.targetPixelHeight = Platform.screen().viewportHeight(); //~ if < 1.21.8 '.suppressInGameHudRender' -> '.shouldSuppressInGameHudRender()' - if (!SkiaCtx.INSTANCE.suppressInGameHudRender) { + boolean hudRendersLive = !SkiaCtx.INSTANCE.suppressInGameHudRender; + if (hudRendersLive || !org.polyfrost.oneconfig.internal.ui.hud.LegacyHudOffscreen.INSTANCE.render()) { LegacyHudRenderer.INSTANCE.renderLive(graphics); } - //? if >= 26.1 { - else org.polyfrost.oneconfig.internal.ui.hud.LegacyHudOffscreen.INSTANCE.render(); - //? } else { - /*else LegacyHudRenderer.INSTANCE.renderLive(graphics); - *///? } // records the F3 overlay offscreen so Skia can put it above the Compose UI instead of below the // blur and it must run every frame regardless of the HUD dirty gate org.polyfrost.oneconfig.internal.ui.hud.DebugOverlayOffscreen.INSTANCE.render(); diff --git a/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/SkiaOffscreenTarget.kt b/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/SkiaOffscreenTarget.kt new file mode 100644 index 000000000..7741254de --- /dev/null +++ b/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/SkiaOffscreenTarget.kt @@ -0,0 +1,103 @@ +package org.polyfrost.oneconfig.internal.ui + +import com.mojang.blaze3d.pipeline.RenderTarget +import com.mojang.blaze3d.pipeline.TextureTarget +import org.jetbrains.skia.BackendRenderTarget +import org.jetbrains.skia.ColorSpace +import org.jetbrains.skia.Surface +import org.jetbrains.skia.SurfaceOrigin +import org.polyfrost.oneconfig.internal.ui.compose.SkiaCtx +import org.slf4j.LoggerFactory + +/** Owns a Minecraft render target and its Skia surface, cached by size. */ +class SkiaOffscreenTarget { + init { + live += this + } + + var target: RenderTarget? = null + private set + private var brt: BackendRenderTarget? = null + var surface: Surface? = null + private set + private var lastW = -1 + private var lastH = -1 + + fun resolveTarget(w: Int, h: Int): Boolean { + if (target != null && lastW == w && lastH == h && surface != null) return true + destroy() + val svc = SkiaCtx.vulkanService ?: return false + try { + //? if >= 26.2 { + val rt = TextureTarget(null, w, h, true, com.mojang.blaze3d.GpuFormat.RGBA8_UNORM) + //?} else if >= 1.21.5 { + /*val rt = TextureTarget(null, w, h, true) + *///?} else if >= 1.21.4 { + /*val rt = TextureTarget(w, h, true) + *///?} else { + /*val rt = TextureTarget(w, h, true, net.minecraft.client.Minecraft.ON_OSX) + *///?} + target = rt + //? if < 1.21.5 + //rt.setClearColor(0f, 0f, 0f, 0f) + if (!SkiaCtx.isVulkanMode && RenderTargetFbo.getFboId(rt) <= 0) { + destroy() + return false + } + val (b, colorFmt) = svc.makeOffscreenBRT(rt, w, h) + brt = b + val origin = if (SkiaCtx.isDeferredComposeBackend) SurfaceOrigin.TOP_LEFT else SurfaceOrigin.BOTTOM_LEFT + surface = Surface.makeFromBackendRenderTarget( + SkiaCtx.directContext, b, origin, colorFmt, ColorSpace.sRGB, null, + ) + if (surface == null) { + destroy() + return false + } + lastW = w; lastH = h + return true + } catch (t: Throwable) { + LOG.warn("Failed to create offscreen target", t) + destroy() + return false + } + } + + fun clearTarget() { + val rt = target ?: return + //? if >= 26.2 { + val colorTex = rt.colorTexture ?: return + com.mojang.blaze3d.systems.RenderSystem.getDevice().createCommandEncoder() + .clearColorTexture(colorTex, org.joml.Vector4f(0f, 0f, 0f, 0f)) + //? } else if >= 1.21.5 { + /*val colorTex = rt.colorTexture ?: return + val encoder = com.mojang.blaze3d.systems.RenderSystem.getDevice().createCommandEncoder() + encoder.clearColorTexture(colorTex, 0) + //? if < 1.21.10 { + /*//1.21.5 does not clear depth, and 1.21.8 clears it only after rendering the before-blur range + rt.depthTexture?.let { encoder.clearDepthTexture(it, 1.0) } + *///?} + *///?} elif >= 1.21.4 { + /*rt.clear() + *///?} else { + /*rt.clear(net.minecraft.client.Minecraft.ON_OSX) + *///?} + } + + fun destroy() { + surface?.close(); surface = null + brt?.close(); brt = null + target?.destroyBuffers(); target = null + lastW = -1; lastH = -1 + } + + companion object { + private val LOG = LoggerFactory.getLogger("OneConfig/SkiaOffscreenTarget") + + private val live = ArrayList(2) + + fun destroyAll() { + for (t in live) t.destroy() + } + } +} diff --git a/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/compose/SkiaCtx.kt b/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/compose/SkiaCtx.kt index 239e78d74..52e6346a2 100644 --- a/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/compose/SkiaCtx.kt +++ b/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/compose/SkiaCtx.kt @@ -572,6 +572,7 @@ object SkiaCtx { } destroyHudTarget() destroyComposeTarget() + org.polyfrost.oneconfig.internal.ui.SkiaOffscreenTarget.destroyAll() } private fun flushToTarget(draws: List<() -> Unit>, surface: Surface, flipY: Boolean = false) { @@ -762,6 +763,7 @@ object SkiaCtx { composeAllocFailedAt = System.currentTimeMillis() destroyComposeTarget() destroyHudTarget() + org.polyfrost.oneconfig.internal.ui.SkiaOffscreenTarget.destroyAll() if (isVulkanMode) invalidateVkSurfaces() runCatching { directContext.flush() } LOG.error("SkiaCtx: failed to allocate the {}x{} compose target; skipping compose frames", w, h, error) diff --git a/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/compose/impls/OneConfigUIScreen.kt b/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/compose/impls/OneConfigUIScreen.kt index 5045879e5..421319ae1 100644 --- a/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/compose/impls/OneConfigUIScreen.kt +++ b/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/compose/impls/OneConfigUIScreen.kt @@ -200,6 +200,7 @@ class OneConfigUIScreen @JvmOverloads constructor( SkiaCtx.suppressInGameHudRender = false HudManager.overrideShowInScreens = false HudManager.isConfigUiOpen = false + org.polyfrost.oneconfig.internal.ui.SkiaOffscreenTarget.destroyAll() UiSounds.releaseAmbience() // writing every registered tree hitches and Minecraft only re-grabs the cursor once this returns SAVE_EXECUTOR.execute { diff --git a/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/hud/DebugOverlayOffscreen.kt b/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/hud/DebugOverlayOffscreen.kt index 5363fcb84..4a4eec1df 100644 --- a/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/hud/DebugOverlayOffscreen.kt +++ b/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/hud/DebugOverlayOffscreen.kt @@ -1,6 +1,6 @@ package org.polyfrost.oneconfig.internal.ui.hud -import com.mojang.blaze3d.pipeline.TextureTarget +import com.mojang.blaze3d.pipeline.RenderTarget import net.minecraft.client.Minecraft import net.minecraft.client.gui.GuiGraphicsExtractor //? if >= 26.1 { @@ -12,12 +12,9 @@ import org.polyfrost.oneconfig.internal.mixin.render.GuiRendererAccessor import org.polyfrost.oneconfig.internal.mixin.render.GameRendererAccessor import org.polyfrost.oneconfig.internal.mixin.render.GuiRendererAccessor *///? } -import org.jetbrains.skia.BackendRenderTarget -import org.jetbrains.skia.ColorSpace import org.jetbrains.skia.Paint -import org.jetbrains.skia.Surface -import org.jetbrains.skia.SurfaceOrigin import org.polyfrost.oneconfig.api.platform.v1.Platform +import org.polyfrost.oneconfig.internal.ui.SkiaOffscreenTarget import org.polyfrost.oneconfig.internal.ui.compose.ComposeScreen import org.polyfrost.oneconfig.internal.ui.compose.SkiaCtx import org.slf4j.LoggerFactory @@ -33,11 +30,7 @@ object DebugOverlayOffscreen { private val LOG = LoggerFactory.getLogger("OneConfig/DebugOverlayOffscreen") private val client get() = Minecraft.getInstance() - private var target: TextureTarget? = null - private var brt: BackendRenderTarget? = null - private var surface: Surface? = null - private var lastW = -1 - private var lastH = -1 + private val offscreen = SkiaOffscreenTarget() @Volatile private var hasContent = false @Volatile private var failed = false @@ -67,8 +60,8 @@ object DebugOverlayOffscreen { if (w <= 0 || h <= 0) return try { - if (!resolveTarget(w, h)) return - val rt = target ?: return + if (!offscreen.resolveTarget(w, h)) return + val rt = offscreen.target ?: return //? if >= 1.21.8 { renderRecorded(rt) //? } else if >= 1.21.5 { @@ -81,13 +74,12 @@ object DebugOverlayOffscreen { LOG.warn("Debug overlay offscreen render failed; disabling", t) failed = true capturing = false - //? if >= 1.21.5 GuiTargetRedirect.target = null } } //? if >= 1.21.8 { - private fun renderRecorded(rt: TextureTarget) { + private fun renderRecorded(rt: RenderTarget) { val guiRenderer = (client.gameRenderer as GameRendererAccessor).`oneconfig$getGuiRenderer`() val accessor = guiRenderer as GuiRendererAccessor @@ -95,7 +87,7 @@ object DebugOverlayOffscreen { //? if >= 1.21.11 { val ext = GuiGraphicsExtractor(client, state, Platform.screen().guiWidth(), Platform.screen().guiHeight()) //? } else - /*val ext = GuiGraphicsExtractor(client, state)*/ + //val ext = GuiGraphicsExtractor(client, state) capturing = true try { //~ if >= 26.1 'render' -> 'extractRenderState' @@ -104,7 +96,7 @@ object DebugOverlayOffscreen { capturing = false } - clearTarget(rt) + offscreen.clearTarget() val prevState = accessor.`oneconfig$getRenderState`() GuiTargetRedirect.target = rt @@ -123,11 +115,9 @@ object DebugOverlayOffscreen { } } //? } else if >= 1.21.5 { - - /* - private fun renderImmediate(rt: TextureTarget) { + /*private fun renderImmediate(rt: RenderTarget) { val graphics = GuiGraphicsExtractor(client, client.renderBuffers().bufferSource()) - clearTarget(rt) + offscreen.clearTarget() capturing = true GuiTargetRedirect.target = rt try { @@ -139,89 +129,26 @@ object DebugOverlayOffscreen { } } *///? } else { - - /* - private fun renderImmediateLegacy(rt: TextureTarget) { + /*private fun renderImmediateLegacy(rt: RenderTarget) { val graphics = GuiGraphicsExtractor(client, client.renderBuffers().bufferSource()) - clearTarget(rt) + offscreen.clearTarget() capturing = true - rt.bindWrite(true) + GuiTargetRedirect.target = rt try { + rt.bindWrite(true) client.debugOverlay.render(graphics) graphics.flush() } finally { + GuiTargetRedirect.target = null client.mainRenderTarget.bindWrite(true) capturing = false } } *///? } - private fun clearTarget(rt: TextureTarget) { - //? if >= 26.2 { - val colorTex = rt.colorTexture ?: return - com.mojang.blaze3d.systems.RenderSystem.getDevice().createCommandEncoder() - .clearColorTexture(colorTex, org.joml.Vector4f(0f, 0f, 0f, 0f)) - //? } else if >= 1.21.5 { - /*val colorTex = rt.colorTexture ?: return - com.mojang.blaze3d.systems.RenderSystem.getDevice().createCommandEncoder() - .clearColorTexture(colorTex, 0) - *///? } else if >= 1.21.4 { - /*rt.clear() - *///? } else { - /*rt.clear(Minecraft.ON_OSX) - *///? } - } - - private fun resolveTarget(w: Int, h: Int): Boolean { - if (target != null && lastW == w && lastH == h && surface != null) return true - destroy() - try { - //? if >= 26.2 { - val rt = TextureTarget(null, w, h, true, com.mojang.blaze3d.GpuFormat.RGBA8_UNORM) - //? } else if >= 1.21.5 { - /*val rt = TextureTarget(null, w, h, true) - *///? } else if >= 1.21.4 { - /*val rt = TextureTarget(w, h, true) - *///? } else { - /*val rt = TextureTarget(w, h, true, Minecraft.ON_OSX) - *///? } - target = rt - //? if < 1.21.5 - /*rt.setClearColor(0f, 0f, 0f, 0f)*/ - val svc = SkiaCtx.vulkanService ?: return false - if (!SkiaCtx.isVulkanMode) { - //? if >= 1.21.5 { - val fboId = org.polyfrost.oneconfig.internal.ui.RenderTargetFbo.getFboId(rt) - //? } else - /*val fboId = rt.frameBufferId*/ - if (fboId <= 0) { - target = null - rt.destroyBuffers() - return false - } - } - val (b, colorFmt) = svc.makeOffscreenBRT(rt, w, h) - brt = b - val origin = if (SkiaCtx.isDeferredComposeBackend) SurfaceOrigin.TOP_LEFT else SurfaceOrigin.BOTTOM_LEFT - surface = Surface.makeFromBackendRenderTarget( - SkiaCtx.directContext, b, origin, colorFmt, ColorSpace.sRGB, null, - ) - if (surface == null) { - b.close(); brt = null - return false - } - lastW = w; lastH = h - return true - } catch (t: Throwable) { - LOG.warn("Failed to create debug overlay offscreen target", t) - destroy() - return false - } - } - private fun drawInto(canvas: org.jetbrains.skia.Canvas) { if (!hasContent) return - val s = surface ?: return + val s = offscreen.surface ?: return try { s.notifyContentWillChange(org.jetbrains.skia.ContentChangeMode.RETAIN) s.draw(canvas, 0, 0, blitPaint) @@ -229,16 +156,4 @@ object DebugOverlayOffscreen { LOG.debug("debug overlay blit failed", t) } } - - private fun destroy() { - surface?.close(); surface = null - brt?.close(); brt = null - target?.destroyBuffers(); target = null - lastW = -1; lastH = -1 - } - - fun invalidate() { - destroy() - hasContent = false - } } diff --git a/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/hud/LegacyHudOffscreen.kt b/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/hud/LegacyHudOffscreen.kt index 20916c74a..ceb98945c 100644 --- a/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/hud/LegacyHudOffscreen.kt +++ b/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/hud/LegacyHudOffscreen.kt @@ -1,22 +1,22 @@ -//? if >= 26.1 { package org.polyfrost.oneconfig.internal.ui.hud -import com.mojang.blaze3d.pipeline.TextureTarget +import com.mojang.blaze3d.pipeline.RenderTarget import net.minecraft.client.Minecraft import net.minecraft.client.gui.GuiGraphicsExtractor -import net.minecraft.client.gui.render.GuiRenderer +//? if >= 26.1 { import net.minecraft.client.renderer.state.gui.GuiRenderState import org.polyfrost.oneconfig.internal.mixin.render.GameRendererAccessor import org.polyfrost.oneconfig.internal.mixin.render.GuiRendererAccessor -import org.jetbrains.skia.BackendRenderTarget -import org.jetbrains.skia.ColorSpace +//?} elif >= 1.21.8 { +/*import net.minecraft.client.gui.render.state.GuiRenderState +import org.polyfrost.oneconfig.internal.mixin.render.GameRendererAccessor +import org.polyfrost.oneconfig.internal.mixin.render.GuiRendererAccessor +*///?} import org.jetbrains.skia.Paint -import org.jetbrains.skia.Surface -import org.jetbrains.skia.SurfaceOrigin -import org.polyfrost.oneconfig.api.hud.v1.Hud import org.polyfrost.oneconfig.api.hud.v1.HudManager import org.polyfrost.oneconfig.api.hud.v1.LegacyHud import org.polyfrost.oneconfig.api.platform.v1.Platform +import org.polyfrost.oneconfig.internal.ui.SkiaOffscreenTarget import org.polyfrost.oneconfig.internal.ui.compose.SkiaCtx import org.slf4j.LoggerFactory @@ -24,11 +24,7 @@ object LegacyHudOffscreen { private val LOG = LoggerFactory.getLogger("OneConfig/LegacyHudOffscreen") private val client get() = Minecraft.getInstance() - private var target: TextureTarget? = null - private var brt: BackendRenderTarget? = null - private var surface: Surface? = null - private var lastW = -1 - private var lastH = -1 + private val offscreen = SkiaOffscreenTarget() @Volatile private var hasContent = false @Volatile private var failed = false @@ -39,128 +35,97 @@ object LegacyHudOffscreen { LegacyHudOverlayBridge.painter = { c -> drawInto(c) } } - private fun resolveTarget(w: Int, h: Int): Boolean { - if (target != null && lastW == w && lastH == h && surface != null) return true - destroy() + fun render(): Boolean { + hasContent = false + if (failed) return false + if (java.lang.Boolean.getBoolean("oneconfig.disable.legacyHudOffscreen")) return false + if (HudManager.activeInstances.none { it is LegacyHud } && !CompatOverlayRenderer.hasHooks()) return true + if (!SkiaCtx.isReady) return true + val w = Platform.screen().viewportWidth() + val h = Platform.screen().viewportHeight() + if (w <= 0 || h <= 0) return true + try { - //? if >= 26.2 { - val rt = TextureTarget(null, w, h, true, com.mojang.blaze3d.GpuFormat.RGBA8_UNORM) - //? } else { - /*val rt = TextureTarget(null, w, h, true) - *///? } - target = rt - val svc = SkiaCtx.vulkanService ?: return false - if (!SkiaCtx.isVulkanMode) { - val fboId = org.polyfrost.oneconfig.internal.ui.RenderTargetFbo.getFboId(rt) - if (fboId <= 0) { - target = null - rt.destroyBuffers() - return false - } - } - val (b, colorFmt) = svc.makeOffscreenBRT(rt, w, h) - brt = b - val origin = if (SkiaCtx.isDeferredComposeBackend) SurfaceOrigin.TOP_LEFT else SurfaceOrigin.BOTTOM_LEFT - surface = Surface.makeFromBackendRenderTarget( - SkiaCtx.directContext, b, origin, colorFmt, ColorSpace.sRGB, null, - ) - if (surface == null) { - b.close(); brt = null - return false - } - lastW = w; lastH = h + if (!offscreen.resolveTarget(w, h)) return true + val rt = offscreen.target ?: return true + //? if >= 1.21.8 { + renderRecorded(rt) + //?} elif >= 1.21.5 { + /*renderImmediate(rt) + *///?} else { + /*renderImmediateLegacy(rt) + *///?} + hasContent = true return true } catch (t: Throwable) { - LOG.warn("Failed to create legacy HUD offscreen target", t) - destroy() + LOG.warn("Legacy HUD offscreen render failed; disabling", t) + failed = true + GuiTargetRedirect.target = null return false } } - private fun activeLegacyHuds(): List = - HudManager.activeInstances.mapNotNull { hud: Hud -> - (hud as? LegacyHud)?.takeUnless { - it.hidden && !HudManager.isEditing && !SkiaCtx.suppressInGameHudRender - } - } - - fun render() { - hasContent = false - if (failed) return - if (java.lang.Boolean.getBoolean("oneconfig.disable.legacyHudOffscreen")) return - val huds = activeLegacyHuds() - if (huds.isEmpty() && !CompatOverlayRenderer.hasHooks()) return - if (!SkiaCtx.isReady) return - val w = Platform.screen().viewportWidth() - val h = Platform.screen().viewportHeight() - if (w <= 0 || h <= 0) return - - try { - if (!resolveTarget(w, h)) return - val rt = target ?: return - val guiRenderer = (client.gameRenderer as GameRendererAccessor).`oneconfig$getGuiRenderer`() - val accessor = guiRenderer as GuiRendererAccessor - - val guiW = Platform.screen().guiWidth() - val guiH = Platform.screen().guiHeight() + //? if >= 1.21.8 { + private fun renderRecorded(rt: RenderTarget) { + val guiRenderer = (client.gameRenderer as GameRendererAccessor).`oneconfig$getGuiRenderer`() + val accessor = guiRenderer as GuiRendererAccessor - val state = GuiRenderState() - val ext = GuiGraphicsExtractor(client, state, guiW, guiH) - for (hud in huds) { - try { - val scale = hud.effectiveScale - hud.renderedW = hud.width * scale - hud.renderedH = hud.height * scale - val pose = ext.pose() - pose.pushMatrix() - try { - pose.translate(hud.x, hud.y) - if (scale != 1f) pose.scale(scale, scale) - hud.render(ext) - } finally { - pose.popMatrix() - } - } catch (t: Throwable) { - LOG.debug("legacy hud render (record) failed", t) - } - } + val state = GuiRenderState() + //? if >= 1.21.11 { + val ext = GuiGraphicsExtractor(client, state, Platform.screen().guiWidth(), Platform.screen().guiHeight()) + //?} else + //val ext = GuiGraphicsExtractor(client, state) + LegacyHudRenderer.renderLive(ext) - if (CompatOverlayRenderer.oneConfigScreenOpen()) CompatOverlayRenderer.render(ext) + offscreen.clearTarget() - val colorTex = rt.colorTexture ?: return - val encoder = com.mojang.blaze3d.systems.RenderSystem.getDevice().createCommandEncoder() + val prevState = accessor.`oneconfig$getRenderState`() + GuiTargetRedirect.target = rt + try { + accessor.`oneconfig$setRenderState`(state) //? if >= 26.2 { - encoder.clearColorTexture(colorTex, org.joml.Vector4f(0f, 0f, 0f, 0f)) - //? } else { - /*encoder.clearColorTexture(colorTex, 0) - *///? } - - val prevState = accessor.`oneconfig$getRenderState`() - GuiTargetRedirect.target = rt - try { - accessor.`oneconfig$setRenderState`(state) - //? if >= 26.2 { - guiRenderer.render() - //? } else { - /*val fog = (client.gameRenderer as GameRendererAccessor).`oneconfig$getFogRenderer`() - .getBuffer(net.minecraft.client.renderer.fog.FogRenderer.FogMode.NONE) - guiRenderer.render(fog) - *///? } - } finally { - GuiTargetRedirect.target = null - accessor.`oneconfig$setRenderState`(prevState) - } - hasContent = true - } catch (t: Throwable) { - LOG.warn("Legacy HUD offscreen render failed; disabling", t) - failed = true + guiRenderer.render() + //?} else { + /*val fog = (client.gameRenderer as GameRendererAccessor).`oneconfig$getFogRenderer`() + .getBuffer(net.minecraft.client.renderer.fog.FogRenderer.FogMode.NONE) + guiRenderer.render(fog) + *///?} + } finally { + GuiTargetRedirect.target = null + accessor.`oneconfig$setRenderState`(prevState) + } + } + //?} elif >= 1.21.5 { + /*private fun renderImmediate(rt: RenderTarget) { + val graphics = GuiGraphicsExtractor(client, client.renderBuffers().bufferSource()) + offscreen.clearTarget() + GuiTargetRedirect.target = rt + try { + LegacyHudRenderer.renderLive(graphics) + graphics.flush() + } finally { + GuiTargetRedirect.target = null + } + } + *///?} else { + /*private fun renderImmediateLegacy(rt: RenderTarget) { + val graphics = GuiGraphicsExtractor(client, client.renderBuffers().bufferSource()) + offscreen.clearTarget() + GuiTargetRedirect.target = rt + try { + rt.bindWrite(true) + LegacyHudRenderer.renderLive(graphics) + graphics.flush() + } finally { GuiTargetRedirect.target = null + client.mainRenderTarget.bindWrite(true) } } + *///?} fun drawInto(canvas: org.jetbrains.skia.Canvas) { if (!hasContent) return - val s = surface ?: return + val s = offscreen.surface ?: return try { s.notifyContentWillChange(org.jetbrains.skia.ContentChangeMode.RETAIN) val surfaceRatio = Platform.screen().surfaceRatio().coerceAtLeast(0.0001f) @@ -172,17 +137,4 @@ object LegacyHudOffscreen { LOG.debug("legacy hud blit failed", t) } } - - private fun destroy() { - surface?.close(); surface = null - brt?.close(); brt = null - target?.destroyBuffers(); target = null - lastW = -1; lastH = -1 - } - - fun invalidate() { - destroy() - hasContent = false - } } -//? } diff --git a/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/hud/LegacyHudRenderer.kt b/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/hud/LegacyHudRenderer.kt index 18a360668..7c09f48a1 100644 --- a/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/hud/LegacyHudRenderer.kt +++ b/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/hud/LegacyHudRenderer.kt @@ -38,17 +38,20 @@ object LegacyHudRenderer { } private fun renderLiveHuds(graphics: GuiGraphicsExtractor) { + if (!HudManager.masterHudEnabled && !HudManager.isEditing) return frame.clear() for (hud in HudManager.activeInstances) { if (hud !is LegacyHud) continue - if (hud.hidden && !HudManager.isEditing) continue - if (HudManager.isGuiHidden && !HudManager.isEditing) continue - if (HudManager.isDebugScreenVisible && !hud.showInF3) continue - if (HudManager.isTabListVisible && !hud.showInTab) continue - if (!HudManager.overrideShowInScreens && !HudManager.isEditing) { - if (HudManager.isChatScreenOpen) { - if (!hud.showInChat) continue - } else if (HudManager.isGuiScreenOpen && !hud.showInScreens) continue + if (!HudManager.isEditing) { + if (hud.hidden) continue + if (HudManager.isGuiHidden) continue + if (HudManager.isDebugScreenVisible && !hud.showInF3) continue + if (HudManager.isTabListVisible && !hud.showInTab) continue + if (!HudManager.overrideShowInScreens) { + if (HudManager.isChatScreenOpen) { + if (!hud.showInChat) continue + } else if (HudManager.isGuiScreenOpen && !hud.showInScreens) continue + } } frame.add(hud) } diff --git a/modules/hud/src/main/kotlin/org/polyfrost/oneconfig/api/hud/v1/HudManager.kt b/modules/hud/src/main/kotlin/org/polyfrost/oneconfig/api/hud/v1/HudManager.kt index 7ddea03c8..719bd1322 100644 --- a/modules/hud/src/main/kotlin/org/polyfrost/oneconfig/api/hud/v1/HudManager.kt +++ b/modules/hud/src/main/kotlin/org/polyfrost/oneconfig/api/hud/v1/HudManager.kt @@ -499,12 +499,13 @@ object HudManager { /** Everything [shouldDraw] checks apart from the HUD's own hidden flag */ private fun isShown(hud: Hud): Boolean { - if (!masterHudEnabled && !isEditing) return false if (hud is LegacyHudMarker) return false - if (isGuiHidden && !isEditing) return false + if (isEditing) return true + if (!masterHudEnabled) return false + if (isGuiHidden) return false if (isDebugScreenVisible && !hud.showInF3) return false if (isTabListVisible && !hud.showInTab) return false - if (!overrideShowInScreens && !isEditing) { + if (!overrideShowInScreens) { // chat has its own toggle so it is never governed by "Show in GUIs" if (isChatScreenOpen) { if (!hud.showInChat) return false @@ -698,6 +699,7 @@ object HudManager { key = key * 31L + (if (isChatScreenOpen) 1 else 0) key = key * 31L + (if (isGuiHidden) 1 else 0) key = key * 31L + (if (overrideShowInScreens) 1 else 0) + key = key * 31L + (if (masterHudEnabled) 1 else 0) key = key * 31L + (if (isEditing) 1 else 0) key = key * 31L + (if (inWorld) 1 else 0) key = key * 31L + targetPixelWidth