From 1d9a4287d712c5f8a4e86a0cfbfb9462a25aa54a Mon Sep 17 00:00:00 2001 From: Martin Prokoph Date: Wed, 1 Oct 2025 16:55:55 +0200 Subject: [PATCH] fix: touchscreen interaction finger outline --- .../client/mixin/GameRendererMixin.java | 4 +-- .../client/mixin/MinecraftClientMixin.java | 2 +- .../client/mixin/WorldRendererMixin.java | 28 ++++++------------- 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/GameRendererMixin.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/GameRendererMixin.java index a6fdfce..f51aba6 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/GameRendererMixin.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/GameRendererMixin.java @@ -14,7 +14,6 @@ import com.mojang.blaze3d.systems.RenderSystem; import eu.midnightdust.midnightcontrols.ControlsMode; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; -import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsRenderer; import eu.midnightdust.midnightcontrols.client.gui.cursor.VirtualCursorRenderer; import eu.midnightdust.midnightcontrols.client.gui.cursor.WaylandCursorRenderer; import eu.midnightdust.midnightcontrols.client.touch.TouchUtils; @@ -43,10 +42,9 @@ public abstract class GameRendererMixin { private void midnightcontrols$renderVirtualCursor(RenderTickCounter tickCounter, boolean tick, CallbackInfo ci, @Local DrawContext drawContext) { VirtualCursorRenderer.getInstance().renderCursor(drawContext, client); if (MidnightControlsClient.isWayland) WaylandCursorRenderer.getInstance().renderCursor(drawContext, client); - //drawContext.draw(); } @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/GameRenderer;renderHand(FZLorg/joml/Matrix4f;)V"), method = "renderWorld") - private void midnigtcontrols$captureMatrices(RenderTickCounter tickCounter, CallbackInfo ci, @Local(ordinal = 1) Matrix4f projectionMatrix, @Local(ordinal = 1) Matrix4f worldSpaceMatrix) { + private void midnigtcontrols$captureMatrices(RenderTickCounter tickCounter, CallbackInfo ci, @Local(ordinal = 0) Matrix4f projectionMatrix, @Local(ordinal = 1) Matrix4f worldSpaceMatrix) { TouchUtils.lastProjMat.set(projectionMatrix); TouchUtils.lastModMat.set(RenderSystem.getModelViewMatrix()); TouchUtils.lastWorldSpaceMatrix.set(worldSpaceMatrix); diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java index 0b941c5..fbfe54d 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java @@ -56,7 +56,7 @@ public abstract class MinecraftClientMixin { @Shadow public abstract void setScreen(Screen screen); - @Shadow public int attackCooldown; + @Shadow protected int attackCooldown; @Shadow protected abstract void handleInputEvents(); diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/WorldRendererMixin.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/WorldRendererMixin.java index e173aba..8b76024 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/WorldRendererMixin.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/WorldRendererMixin.java @@ -34,7 +34,6 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.awt.*; @@ -55,30 +54,21 @@ public abstract class WorldRendererMixin { @Shadow private ClientWorld world; - @Shadow - @Final - private BufferBuilderStorage bufferBuilders; - - @Inject(method = "renderTargetBlockOutline", at = @At("HEAD"), cancellable = true) - private void dontRenderOutline(VertexConsumerProvider.Immediate immediate, MatrixStack matrices, boolean renderBlockOutline, WorldRenderState renderStates, CallbackInfo ci) { - if (MidnightControlsConfig.controlsMode == ControlsMode.TOUCHSCREEN && MidnightControlsConfig.touchMode == TouchMode.FINGER_POS) { - ci.cancel(); - } - } - @Inject( method = "renderTargetBlockOutline", - at = @At("HEAD") + at = @At("HEAD"), + cancellable = true ) private void onOutlineRender(VertexConsumerProvider.Immediate immediate, MatrixStack matrices, boolean renderBlockOutline, WorldRenderState renderStates, CallbackInfo ci) { if (((MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && MidnightControlsConfig.touchInControllerMode) || MidnightControlsConfig.controlsMode == ControlsMode.TOUCHSCREEN) && MidnightControlsConfig.touchMode == TouchMode.FINGER_POS) { - this.midnightcontrols$renderFingerOutline(matrices, client.gameRenderer.getCamera()); + this.midnightcontrols$renderFingerOutline(immediate, matrices, client.gameRenderer.getCamera()); + ci.cancel(); } - this.midnightcontrols$renderReacharoundOutline(matrices, client.gameRenderer.getCamera()); + this.midnightcontrols$renderReacharoundOutline(immediate, matrices, client.gameRenderer.getCamera()); } @Unique - private void midnightcontrols$renderFingerOutline(MatrixStack matrices, Camera camera) { + private void midnightcontrols$renderFingerOutline(VertexConsumerProvider.Immediate immediate, MatrixStack matrices, Camera camera) { if (TouchInput.firstHitResult == null || TouchInput.firstHitResult.getType() != HitResult.Type.BLOCK) return; BlockHitResult result = (BlockHitResult) TouchInput.firstHitResult; @@ -89,14 +79,14 @@ public abstract class WorldRendererMixin { if (MidnightControlsConfig.touchOutlineColorHex.isEmpty()) rgb = RainbowColor.radialRainbow(1,1); var pos = camera.getPos(); matrices.push(); - var vertexConsumer = this.bufferBuilders.getEntityVertexConsumers().getBuffer(RenderLayer.getLines()); + var vertexConsumer = immediate.getBuffer(RenderLayer.getLines()); VertexRendering.drawOutline(matrices, vertexConsumer, outlineShape, blockPos.getX() - pos.getX(), blockPos.getY() - pos.getY(), blockPos.getZ() - pos.getZ(), ColorHelper.withAlpha(MidnightControlsConfig.touchOutlineColorAlpha, rgb.getRGB())); matrices.pop(); } } @Unique - private void midnightcontrols$renderReacharoundOutline(MatrixStack matrices, Camera camera) { + private void midnightcontrols$renderReacharoundOutline(VertexConsumerProvider.Immediate immediate, MatrixStack matrices, Camera camera) { if (this.client.crosshairTarget == null || this.client.crosshairTarget.getType() != HitResult.Type.MISS || !MidnightControlsConfig.shouldRenderReacharoundOutline) return; var result = reacharound.getLastReacharoundResult(); @@ -121,7 +111,7 @@ public abstract class WorldRendererMixin { Color rgb = MidnightColorUtil.hex2Rgb(MidnightControlsConfig.reacharoundOutlineColorHex); if (MidnightControlsConfig.reacharoundOutlineColorHex.isEmpty()) rgb = RainbowColor.radialRainbow(1,1); matrices.push(); - var vertexConsumer = this.bufferBuilders.getEntityVertexConsumers().getBuffer(RenderLayer.getLines()); + var vertexConsumer = immediate.getBuffer(RenderLayer.getLines()); VertexRendering.drawOutline(matrices, vertexConsumer, outlineShape, blockPos.getX() - pos.getX(), blockPos.getY() - pos.getY(), blockPos.getZ() - pos.getZ(), ColorHelper.withAlpha(MidnightControlsConfig.touchOutlineColorAlpha, rgb.getRGB())); matrices.pop();