From d117301ba8e85480567827af34c6062bba1fb51f Mon Sep 17 00:00:00 2001 From: lowercasebtw Date: Wed, 5 Aug 2026 19:28:29 -0400 Subject: [PATCH 1/2] Add oneconfig dep --- src/main/resources/fabric.mod.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 82524d8..858470a 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -27,6 +27,7 @@ "depends": { "minecraft": "${minecraft_version_range}", "fabricloader": ">=${loader_version}", - "fabric-language-kotlin": "*" + "fabric-language-kotlin": "*", + "oneconfigv1": "*" } } From d8f7977c5a3513bec6b9828c7e280252c044db14 Mon Sep 17 00:00:00 2001 From: lowercasebtw Date: Wed, 5 Aug 2026 19:30:14 -0400 Subject: [PATCH 2/2] Fix iris compat on hand (#14) --- .../mixin/client/Mixin_ApplyPhosphorBlur.java | 6 ++- .../client/Mixin_CaptureWorldMatrices.java | 18 +++++---- .../polyblur/client/blur/BlurSettings.kt | 12 ++++++ .../polyblur/client/blur/FrameClock.kt | 4 ++ .../polyblur/client/compat/IrisCompat.kt | 39 +++++++++++++++++++ 5 files changed, 70 insertions(+), 9 deletions(-) create mode 100644 src/main/kotlin/org/polyfrost/polyblur/client/blur/BlurSettings.kt create mode 100644 src/main/kotlin/org/polyfrost/polyblur/client/compat/IrisCompat.kt diff --git a/src/main/java/org/polyfrost/polyblur/mixin/client/Mixin_ApplyPhosphorBlur.java b/src/main/java/org/polyfrost/polyblur/mixin/client/Mixin_ApplyPhosphorBlur.java index 420addb..c5e84d9 100644 --- a/src/main/java/org/polyfrost/polyblur/mixin/client/Mixin_ApplyPhosphorBlur.java +++ b/src/main/java/org/polyfrost/polyblur/mixin/client/Mixin_ApplyPhosphorBlur.java @@ -12,6 +12,8 @@ import com.mojang.blaze3d.systems.RenderSystem; import org.polyfrost.polyblur.client.PolyBlurConfig; import org.polyfrost.polyblur.client.blur.FrameClock; +//? if >=1.21.5 +import org.polyfrost.polyblur.client.blur.BlurSettings; import org.polyfrost.polyblur.client.blur.phosphor.PhosphorBlur; //? if >1.21.5 import org.polyfrost.polyblur.client.blur.phosphor.HybridHandPhosphor; @@ -90,7 +92,7 @@ public class Mixin_ApplyPhosphorBlur { //?} elif >1.21.5 && <26.2 { //?} elif =1.21.5 { - /*if (useMotion && !PolyBlurConfig.INSTANCE.getVelocityBuffer()) MotionBlur.render(this.minecraft.getMainRenderTarget(), this.resourcePool); + /*if (useMotion && !BlurSettings.getVelocityBuffer()) MotionBlur.render(this.minecraft.getMainRenderTarget(), this.resourcePool); *///?} else { /*if (useMotion) MotionBlur.render(this.minecraft.getMainRenderTarget(), this.resourcePool); else PhosphorBlur.render(this.minecraft.getMainRenderTarget(), this.resourcePool); @@ -130,7 +132,7 @@ public class Mixin_ApplyPhosphorBlur { //?} if (blurType != 1) return; if (!PolyBlurConfig.INSTANCE.getBlurHand()) return; - if (PolyBlurConfig.INSTANCE.getVelocityBuffer()) { + if (BlurSettings.getVelocityBuffer()) { if (!WorldCamera.INSTANCE.getVelocitySettled()) { MotionBlurReproject.render(target); } diff --git a/src/main/java/org/polyfrost/polyblur/mixin/client/Mixin_CaptureWorldMatrices.java b/src/main/java/org/polyfrost/polyblur/mixin/client/Mixin_CaptureWorldMatrices.java index 3c27031..1c629ca 100644 --- a/src/main/java/org/polyfrost/polyblur/mixin/client/Mixin_CaptureWorldMatrices.java +++ b/src/main/java/org/polyfrost/polyblur/mixin/client/Mixin_CaptureWorldMatrices.java @@ -12,6 +12,7 @@ import org.joml.Matrix4f; import org.joml.Vector4f; import org.polyfrost.polyblur.client.PolyBlurConfig; +import org.polyfrost.polyblur.client.blur.BlurSettings; import org.polyfrost.polyblur.client.blur.motion.HybridWorldPass; import org.polyfrost.polyblur.client.blur.motion.MotionBlur; import org.polyfrost.polyblur.client.blur.motion.MotionBlurReproject; @@ -34,6 +35,7 @@ import org.joml.Matrix4fc; import org.joml.Vector4f; import org.polyfrost.polyblur.client.PolyBlurConfig; +import org.polyfrost.polyblur.client.blur.BlurSettings; import org.polyfrost.polyblur.client.blur.motion.HybridWorldPass; import org.polyfrost.polyblur.client.blur.motion.MotionBlur; import org.polyfrost.polyblur.client.blur.motion.MotionBlurReproject; @@ -57,6 +59,7 @@ import net.minecraft.client.renderer.GameRenderer; import org.joml.Matrix4f; import org.polyfrost.polyblur.client.PolyBlurConfig; +import org.polyfrost.polyblur.client.blur.BlurSettings; import org.polyfrost.polyblur.client.blur.motion.MotionBlurReproject; import org.polyfrost.polyblur.client.blur.motion.MotionVelocityPass; import org.polyfrost.polyblur.client.blur.motion.ResourcePoolHolder; @@ -99,7 +102,7 @@ public class Mixin_CaptureWorldMatrices { if (blurType != 1) { return; } - if (PolyBlurConfig.INSTANCE.getVelocityBuffer() && !WorldCamera.INSTANCE.getVelocitySettled()) { + if (BlurSettings.getVelocityBuffer() && !WorldCamera.INSTANCE.getVelocitySettled()) { MotionVelocityPass.run(Minecraft.getInstance().getMainRenderTarget()); // Hand sharp -> blur pre-hand. (1.21.5 global blur stays post-GUI.) if (!PolyBlurConfig.INSTANCE.getBlurHand()) { @@ -210,7 +213,7 @@ public class Mixin_CaptureWorldMatrices { } if (blurType == 2) { - if (PolyBlurConfig.INSTANCE.getVelocityBuffer()) { + if (BlurSettings.getVelocityBuffer()) { HybridWorldPass.run(Minecraft.getInstance().getMainRenderTarget()); } else { CrossFrameResourcePool pool = ResourcePoolHolder.INSTANCE.getPool(); @@ -226,14 +229,14 @@ public class Mixin_CaptureWorldMatrices { return; } - if (PolyBlurConfig.INSTANCE.getVelocityBuffer()) { + if (BlurSettings.getVelocityBuffer()) { if (!WorldCamera.INSTANCE.getVelocitySettled()) { MotionVelocityPass.run(Minecraft.getInstance().getMainRenderTarget()); } } if (!PolyBlurConfig.INSTANCE.getBlurHand()) { - if (PolyBlurConfig.INSTANCE.getVelocityBuffer()) { + if (BlurSettings.getVelocityBuffer()) { if (!WorldCamera.INSTANCE.getVelocitySettled()) { MotionBlurReproject.render(Minecraft.getInstance().getMainRenderTarget()); } @@ -273,13 +276,14 @@ public class Mixin_CaptureWorldMatrices { } if (blurType == 2) { - if (PolyBlurConfig.INSTANCE.getVelocityBuffer()) { + if (BlurSettings.getVelocityBuffer()) { HybridWorldPass.run(mainTarget); } else { CrossFrameResourcePool pool = ResourcePoolHolder.INSTANCE.getPool(); if (pool != null) { MotionBlur.render(mainTarget, pool); } + WorldSnapshotTracker.INSTANCE.capture(mainTarget); } return; } @@ -288,14 +292,14 @@ public class Mixin_CaptureWorldMatrices { return; } - if (PolyBlurConfig.INSTANCE.getVelocityBuffer()) { + if (BlurSettings.getVelocityBuffer()) { if (!WorldCamera.INSTANCE.getVelocitySettled()) { MotionVelocityPass.run(mainTarget); } } if (!PolyBlurConfig.INSTANCE.getBlurHand()) { - if (PolyBlurConfig.INSTANCE.getVelocityBuffer()) { + if (BlurSettings.getVelocityBuffer()) { if (!WorldCamera.INSTANCE.getVelocitySettled()) { MotionBlurReproject.render(mainTarget); } diff --git a/src/main/kotlin/org/polyfrost/polyblur/client/blur/BlurSettings.kt b/src/main/kotlin/org/polyfrost/polyblur/client/blur/BlurSettings.kt new file mode 100644 index 0000000..dba02a5 --- /dev/null +++ b/src/main/kotlin/org/polyfrost/polyblur/client/blur/BlurSettings.kt @@ -0,0 +1,12 @@ +package org.polyfrost.polyblur.client.blur + +//? if >=1.21.5 { +import org.polyfrost.polyblur.client.PolyBlurConfig +import org.polyfrost.polyblur.client.compat.IrisCompat + +object BlurSettings { + @JvmStatic + val velocityBuffer: Boolean + get() = PolyBlurConfig.velocityBuffer && !IrisCompat.shadersActive +} +//?} diff --git a/src/main/kotlin/org/polyfrost/polyblur/client/blur/FrameClock.kt b/src/main/kotlin/org/polyfrost/polyblur/client/blur/FrameClock.kt index cd6dc00..3cd0432 100644 --- a/src/main/kotlin/org/polyfrost/polyblur/client/blur/FrameClock.kt +++ b/src/main/kotlin/org/polyfrost/polyblur/client/blur/FrameClock.kt @@ -8,6 +8,9 @@ object FrameClock { var dt = 1f / REF_FPS private set + var frame = 0L + private set + val timeScale: Float get() = (1f / REF_FPS) / dt @@ -16,6 +19,7 @@ object FrameClock { @JvmStatic fun tick() { + frame++ val now = System.nanoTime() if (lastNs != 0L) { dt = ((now - lastNs) / 1_000_000_000.0).toFloat().coerceIn(0.001f, 0.1f) diff --git a/src/main/kotlin/org/polyfrost/polyblur/client/compat/IrisCompat.kt b/src/main/kotlin/org/polyfrost/polyblur/client/compat/IrisCompat.kt new file mode 100644 index 0000000..3b6c34c --- /dev/null +++ b/src/main/kotlin/org/polyfrost/polyblur/client/compat/IrisCompat.kt @@ -0,0 +1,39 @@ +package org.polyfrost.polyblur.client.compat + +import org.polyfrost.polyblur.client.blur.FrameClock +import java.lang.reflect.Method + +object IrisCompat { + private val probe: Probe? by lazy { resolve() } + + private var cachedFrame = -1L + private var cached = false + + @JvmStatic + val shadersActive: Boolean + get() { + val probe = probe ?: return false + val frame = FrameClock.frame + if (frame != cachedFrame) { + cached = probe.query() + cachedFrame = frame + } + return cached + } + + private fun resolve(): Probe? = try { + val apiClass = Class.forName("net.irisshaders.iris.api.v0.IrisApi") + val instance = apiClass.getMethod("getInstance").invoke(null) + Probe(apiClass.getMethod("isShaderPackInUse"), instance) + } catch (_: Throwable) { + null + } + + private class Probe(private val method: Method, private val instance: Any) { + fun query(): Boolean = try { + method.invoke(instance) as Boolean + } catch (_: Throwable) { + false + } + } +}