From cb8de92575b39d00c366eab5b7a35b0d3a5f65ee Mon Sep 17 00:00:00 2001 From: noramibu <50046813+noramibu@users.noreply.github.com> Date: Sun, 22 Feb 2026 09:58:26 +0300 Subject: [PATCH 1/3] Fix view bobbing affecting StorageESP while using shaders --- .../meteorclient/mixin/GameRendererMixin.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java index e47e37756d..9bd21b1baa 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java @@ -116,11 +116,10 @@ private void onRenderWorld(RenderTickCounter tickCounter, CallbackInfo ci, @Loca Profilers.get().push(MeteorClient.MOD_ID + "_render"); - // Create renderer and event + // Create renderers if (renderer == null) renderer = new Renderer3D(MeteorRenderPipelines.WORLD_COLORED_LINES, MeteorRenderPipelines.WORLD_COLORED); if (depthRenderer == null) depthRenderer = new Renderer3D(MeteorRenderPipelines.WORLD_COLORED_LINES_DEPTH, MeteorRenderPipelines.WORLD_COLORED_DEPTH); - Render3DEvent event = Render3DEvent.get(matrixStack, renderer, depthRenderer, tickDelta, camera.getCameraPos().x, camera.getCameraPos().y, camera.getCameraPos().z); // Update model view matrix @@ -133,7 +132,6 @@ private void onRenderWorld(RenderTickCounter tickCounter, CallbackInfo ci, @Loca Matrix4f inverseBob = new Matrix4f(matrices.peek().getPositionMatrix()).invert(); RenderSystem.getModelViewStack().mul(inverseBob); - matrices.pop(); // Call utility classes (apply bob correction when Iris shaders are active) @@ -141,13 +139,16 @@ private void onRenderWorld(RenderTickCounter tickCounter, CallbackInfo ci, @Loca RenderUtils.updateScreenCenter(projection, correctedPosition); NametagUtils.onRender(position); - // Render + // use our matrices with bob transform, not vanilla's matrixStack which is identity when Iris is active + Render3DEvent event = Render3DEvent.get(matrices, renderer, depthRenderer, tickDelta, camera.getCameraPos().x, camera.getCameraPos().y, camera.getCameraPos().z); renderer.begin(); depthRenderer.begin(); MeteorClient.EVENT_BUS.post(event); - renderer.render(matrixStack); - depthRenderer.render(matrixStack); + renderer.render(matrices); + depthRenderer.render(matrices); + + matrices.pop(); // Revert model view matrix From ef48b4e5d47805fbc2c0c85c54d48c27f696e812 Mon Sep 17 00:00:00 2001 From: Sophie Date: Wed, 25 Feb 2026 12:56:27 +0100 Subject: [PATCH 2/3] Add matrices without bob transform for Iris shader compatibility --- .../meteorclient/events/render/Render3DEvent.java | 4 +++- .../meteorclient/mixin/GameRendererMixin.java | 13 ++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/events/render/Render3DEvent.java b/src/main/java/meteordevelopment/meteorclient/events/render/Render3DEvent.java index 3c212c7057..9ccadcf3db 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/render/Render3DEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/render/Render3DEvent.java @@ -13,14 +13,16 @@ public class Render3DEvent { private static final Render3DEvent INSTANCE = new Render3DEvent(); public MatrixStack matrices; + public MatrixStack matricesNoBob; public Renderer3D renderer; public Renderer3D depthRenderer; public double frameTime; public float tickDelta; public double offsetX, offsetY, offsetZ; - public static Render3DEvent get(MatrixStack matrices, Renderer3D renderer, Renderer3D depthRenderer, float tickDelta, double offsetX, double offsetY, double offsetZ) { + public static Render3DEvent get(MatrixStack matrices, MatrixStack matricesNoBob, Renderer3D renderer, Renderer3D depthRenderer, float tickDelta, double offsetX, double offsetY, double offsetZ) { INSTANCE.matrices = matrices; + INSTANCE.matricesNoBob = matricesNoBob; INSTANCE.renderer = renderer; INSTANCE.depthRenderer = depthRenderer; INSTANCE.frameTime = Utils.frameTime; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java index 9bd21b1baa..e326ff9ef7 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java @@ -133,22 +133,29 @@ private void onRenderWorld(RenderTickCounter tickCounter, CallbackInfo ci, @Loca Matrix4f inverseBob = new Matrix4f(matrices.peek().getPositionMatrix()).invert(); RenderSystem.getModelViewStack().mul(inverseBob); + // Matrices without bob transform (for tracers, etc.) + MatrixStack matricesNoBob = new MatrixStack(); + matricesNoBob.push(); + tiltViewWhenHurt(matricesNoBob, camera.getLastTickProgress()); + Matrix4f inverseTilt = new Matrix4f(matricesNoBob.peek().getPositionMatrix()).invert(); + // Call utility classes (apply bob correction when Iris shaders are active) Matrix4f correctedPosition = MixinPlugin.isIrisPresent && RenderUtils.isShaderPackInUse() ? new Matrix4f(position).mul(inverseBob) : position; - RenderUtils.updateScreenCenter(projection, correctedPosition); + Matrix4f correctedPositionNoBob = MixinPlugin.isIrisPresent && RenderUtils.isShaderPackInUse() ? new Matrix4f(position).mul(inverseTilt) : position; + RenderUtils.updateScreenCenter(projection, correctedPositionNoBob); NametagUtils.onRender(position); // use our matrices with bob transform, not vanilla's matrixStack which is identity when Iris is active - Render3DEvent event = Render3DEvent.get(matrices, renderer, depthRenderer, tickDelta, camera.getCameraPos().x, camera.getCameraPos().y, camera.getCameraPos().z); + Render3DEvent event = Render3DEvent.get(matrices, matricesNoBob, renderer, depthRenderer, tickDelta, camera.getCameraPos().x, camera.getCameraPos().y, camera.getCameraPos().z); renderer.begin(); depthRenderer.begin(); MeteorClient.EVENT_BUS.post(event); renderer.render(matrices); depthRenderer.render(matrices); - matrices.pop(); + matricesNoBob.pop(); // Revert model view matrix From d99b457c9d1c0e227fd474d3100843af2967d465 Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Thu, 26 Feb 2026 21:38:10 +0000 Subject: [PATCH 3/3] cleanup --- .../meteorclient/mixin/GameRendererMixin.java | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java index e326ff9ef7..a0784701f6 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java @@ -9,8 +9,8 @@ import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.systems.RenderSystem; -import meteordevelopment.meteorclient.MixinPlugin; import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.MixinPlugin; import meteordevelopment.meteorclient.events.render.GetFovEvent; import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.events.render.RenderAfterWorldEvent; @@ -80,6 +80,9 @@ public abstract class GameRendererMixin { @Unique private final MatrixStack matrices = new MatrixStack(); + @Unique + private final MatrixStack matricesNoBob = new MatrixStack(); + @Shadow protected abstract void bobView(MatrixStack matrices, float tickDelta); @@ -111,7 +114,7 @@ public abstract class GameRendererMixin { } @Inject(method = "renderWorld", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", args = {"ldc=hand"})) - private void onRenderWorld(RenderTickCounter tickCounter, CallbackInfo ci, @Local(ordinal = 0) Matrix4f projection, @Local(ordinal = 1) Matrix4f position, @Local(ordinal = 0) float tickDelta, @Local MatrixStack matrixStack) { + private void onRenderWorld(RenderTickCounter tickCounter, CallbackInfo ci, @Local(ordinal = 0) Matrix4f projection, @Local(ordinal = 1) Matrix4f position) { if (!Utils.canUpdate()) return; Profilers.get().push(MeteorClient.MOD_ID + "_render"); @@ -134,20 +137,28 @@ private void onRenderWorld(RenderTickCounter tickCounter, CallbackInfo ci, @Loca RenderSystem.getModelViewStack().mul(inverseBob); // Matrices without bob transform (for tracers, etc.) - MatrixStack matricesNoBob = new MatrixStack(); + matricesNoBob.push(); tiltViewWhenHurt(matricesNoBob, camera.getLastTickProgress()); Matrix4f inverseTilt = new Matrix4f(matricesNoBob.peek().getPositionMatrix()).invert(); // Call utility classes (apply bob correction when Iris shaders are active) - Matrix4f correctedPosition = MixinPlugin.isIrisPresent && RenderUtils.isShaderPackInUse() ? new Matrix4f(position).mul(inverseBob) : position; Matrix4f correctedPositionNoBob = MixinPlugin.isIrisPresent && RenderUtils.isShaderPackInUse() ? new Matrix4f(position).mul(inverseTilt) : position; RenderUtils.updateScreenCenter(projection, correctedPositionNoBob); NametagUtils.onRender(position); // use our matrices with bob transform, not vanilla's matrixStack which is identity when Iris is active - Render3DEvent event = Render3DEvent.get(matrices, matricesNoBob, renderer, depthRenderer, tickDelta, camera.getCameraPos().x, camera.getCameraPos().y, camera.getCameraPos().z); + Render3DEvent event = Render3DEvent.get( + matrices, + matricesNoBob, + renderer, + depthRenderer, + tickCounter.getTickProgress(true), + camera.getCameraPos().x, + camera.getCameraPos().y, + camera.getCameraPos().z + ); renderer.begin(); depthRenderer.begin();