From b8ee08bf81987daf16f4f5442a5ea1b8f9d73f3e Mon Sep 17 00:00:00 2001 From: Martin Prokoph Date: Sun, 28 Sep 2025 13:46:09 +0200 Subject: [PATCH] feat: support more mouse cursor styles --- .../client/MidnightControlsClient.java | 2 - .../client/MidnightInput.java | 3 - .../client/gui/MidnightControlsRenderer.java | 82 ------------------ .../client/gui/cursor/CursorRenderer.java | 24 +++++ ...gnedTexturedQuadGuiElementRenderState.java | 2 +- .../gui/cursor/VirtualCursorRenderer.java | 67 ++++++++++++++ .../gui/cursor/WaylandCursorRenderer.java | 52 +++++++++++ .../client/mixin/CursorMixin.java | 17 ++++ .../client/mixin/GameRendererMixin.java | 6 +- .../gui/sprites/cursor/dark/mouse_arrow.png | Bin 0 -> 311 bytes .../gui/sprites/cursor/dark/mouse_ibeam.png | Bin 0 -> 298 bytes .../gui/sprites/cursor/dark/mouse_pointer.png | Bin 4346 -> 0 bytes .../cursor/dark/mouse_pointing_hand.png | Bin 0 -> 341 bytes .../gui/sprites/cursor/light/mouse_arrow.png | Bin 0 -> 312 bytes .../gui/sprites/cursor/light/mouse_ibeam.png | Bin 0 -> 296 bytes .../sprites/cursor/light/mouse_pointer.png | Bin 4647 -> 0 bytes .../cursor/light/mouse_pointing_hand.png | Bin 0 -> 339 bytes .../textures/gui/sprites/icon/unbind.png | Bin 0 -> 261 bytes .../resources/midnightcontrols.mixins.json | 2 + 19 files changed, 167 insertions(+), 90 deletions(-) create mode 100644 common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/cursor/CursorRenderer.java rename common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/{render => cursor}/UnalignedTexturedQuadGuiElementRenderState.java (96%) create mode 100644 common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/cursor/VirtualCursorRenderer.java create mode 100644 common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/cursor/WaylandCursorRenderer.java create mode 100644 common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/CursorMixin.java create mode 100644 common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/cursor/dark/mouse_arrow.png create mode 100644 common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/cursor/dark/mouse_ibeam.png delete mode 100644 common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/cursor/dark/mouse_pointer.png create mode 100644 common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/cursor/dark/mouse_pointing_hand.png create mode 100644 common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/cursor/light/mouse_arrow.png create mode 100644 common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/cursor/light/mouse_ibeam.png delete mode 100644 common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/cursor/light/mouse_pointer.png create mode 100644 common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/cursor/light/mouse_pointing_hand.png create mode 100644 common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/icon/unbind.png diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java index 7fd71c2..35576a3 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java @@ -69,8 +69,6 @@ public class MidnightControlsClient extends MidnightControls { public static final Identifier CONTROLLER_BUTTONS = id("textures/gui/controller_buttons.png"); public static final Identifier CONTROLLER_EXPANDED = id("textures/gui/controller_expanded.png"); public static final Identifier CONTROLLER_AXIS = id("textures/gui/controller_axis.png"); - public static final Identifier WAYLAND_CURSOR_TEXTURE_LIGHT = id("cursor/light/mouse_pointer"); - public static final Identifier WAYLAND_CURSOR_TEXTURE_DARK = id("cursor/dark/mouse_pointer"); public static final File MAPPINGS_FILE = new File("config/gamecontrollercustommappings.txt"); public static MinecraftClient client = MinecraftClient.getInstance(); public static final MidnightInput input = new MidnightInput(); diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java index 4db2c66..04cfae9 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java @@ -58,9 +58,6 @@ import net.minecraft.client.gui.screen.advancement.AdvancementTab; import net.minecraft.client.gui.screen.advancement.AdvancementsScreen; import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.gui.screen.ingame.MerchantScreen; -import net.minecraft.client.gui.screen.ingame.StonecutterScreen; -import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; import net.minecraft.client.gui.screen.multiplayer.MultiplayerServerListWidget; import net.minecraft.client.gui.screen.world.WorldListWidget; import net.minecraft.text.TranslatableTextContent; diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsRenderer.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsRenderer.java index b9d3b28..d1fc1ff 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsRenderer.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsRenderer.java @@ -9,44 +9,25 @@ package eu.midnightdust.midnightcontrols.client.gui; -import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.textures.GpuTextureView; -import eu.midnightdust.midnightcontrols.ControlsMode; import eu.midnightdust.midnightcontrols.client.enums.ControllerType; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; import eu.midnightdust.midnightcontrols.client.MidnightInput; import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; -import eu.midnightdust.midnightcontrols.client.enums.VirtualMouseSkin; -import eu.midnightdust.midnightcontrols.client.gui.render.UnalignedTexturedQuadGuiElementRenderState; -import eu.midnightdust.midnightcontrols.client.mixin.DrawContextAccessor; import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gl.RenderPipelines; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.render.state.TexturedQuadGuiElementRenderState; -import net.minecraft.client.render.*; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.texture.Sprite; -import net.minecraft.client.texture.TextureSetup; -import net.minecraft.client.util.SpriteIdentifier; import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; import net.minecraft.util.Atlases; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.ColorHelper; import org.jetbrains.annotations.NotNull; -import org.joml.Matrix3x2f; -import org.joml.Matrix4f; import org.lwjgl.glfw.GLFW; -import java.util.function.Function; - import static eu.midnightdust.midnightcontrols.MidnightControls.id; -import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.client; /** * Represents the midnightcontrols renderer. @@ -213,69 +194,6 @@ public class MidnightControlsRenderer { private static int getButtonTipWidth(@NotNull String action, @NotNull TextRenderer textRenderer) { return 15 + 5 + textRenderer.getWidth(action); } - public static void renderWaylandCursor(@NotNull DrawContext context, @NotNull MinecraftClient client) { - if (MidnightControlsConfig.virtualMouse || client.currentScreen == null || MidnightControlsConfig.controlsMode != ControlsMode.CONTROLLER) return; - - float mouseX = (float) client.mouse.getX() * client.getWindow().getScaledWidth() / client.getWindow().getWidth(); - float mouseY = (float) client.mouse.getY() * client.getWindow().getScaledHeight() / client.getWindow().getHeight(); - - try { - Identifier spritePath = MidnightControlsClient.WAYLAND_CURSOR_TEXTURE_LIGHT; - if (MidnightControlsConfig.virtualMouseSkin == VirtualMouseSkin.DEFAULT_DARK || MidnightControlsConfig.virtualMouseSkin == VirtualMouseSkin.SECOND_DARK) - spritePath = MidnightControlsClient.WAYLAND_CURSOR_TEXTURE_DARK; - - Sprite sprite = client.getAtlasManager().getAtlasTexture(Atlases.GUI).getSprite(spritePath); - drawUnalignedTexturedQuad(RenderPipelines.GUI_TEXTURED, sprite.getAtlasId(), context, mouseX, mouseX + 8, mouseY, mouseY + 8, sprite.getMinU(), sprite.getMaxU(), sprite.getMinV(), sprite.getMaxV()); - } catch (IllegalStateException ignored) {} - } - - public static void renderVirtualCursor(@NotNull DrawContext context, @NotNull MinecraftClient client) { - if (!MidnightControlsConfig.virtualMouse || (client.currentScreen == null - || MidnightInput.isScreenInteractive(client.currentScreen))) - return; - - float mouseX = (float) client.mouse.getX() * client.getWindow().getScaledWidth() / client.getWindow().getWidth(); - float mouseY = (float) client.mouse.getY() * client.getWindow().getScaledHeight() / client.getWindow().getHeight(); - - boolean hoverSlot = false; - - if (client.currentScreen instanceof HandledScreenAccessor inventoryScreen) { - int guiLeft = inventoryScreen.getX(); - int guiTop = inventoryScreen.getY(); - - Slot slot = inventoryScreen.midnightcontrols$getSlotAt(mouseX, mouseY); - - if (slot != null) { - mouseX = guiLeft + slot.x; - mouseY = guiTop + slot.y; - hoverSlot = true; - } - } - - if (!hoverSlot && client.currentScreen != null) { - var slot = MidnightControlsCompat.getSlotAt(client.currentScreen, (int) mouseX, (int) mouseY); - - if (slot != null) { - mouseX = slot.x(); - mouseY = slot.y(); - hoverSlot = true; - } - } - - if (!hoverSlot) { - mouseX -= 8; - mouseY -= 8; - } - - try { - Sprite sprite = client.getAtlasManager().getAtlasTexture(Atlases.GUI).getSprite(id(MidnightControlsConfig.virtualMouseSkin.getSpritePath() + (hoverSlot ? "_slot" : ""))); - drawUnalignedTexturedQuad(RenderPipelines.GUI_TEXTURED, sprite.getAtlasId(), context, mouseX, mouseX + 16, mouseY, mouseY + 16, sprite.getMinU(), sprite.getMaxU(), sprite.getMinV(), sprite.getMaxV()); - } catch (IllegalStateException ignored) {} - } - private static void drawUnalignedTexturedQuad(RenderPipeline pipeline, Identifier texture, DrawContext context, float x1, float x2, float y1, float y2, float u1, float u2, float v1, float v2) { - DrawContextAccessor accessor = (DrawContextAccessor) context; - accessor.getState().addSimpleElement(new UnalignedTexturedQuadGuiElementRenderState(pipeline, TextureSetup.withoutGlTexture(client.getTextureManager().getTexture(texture).getGlTextureView()), new Matrix3x2f(context.getMatrices()), x1, y1, x2, y2, u1, u2, v1, v2, 0xffffffff, accessor.getScissorStack().peekLast())); - } public record ButtonSize(int length, int height) { } diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/cursor/CursorRenderer.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/cursor/CursorRenderer.java new file mode 100644 index 0000000..9cf03ed --- /dev/null +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/cursor/CursorRenderer.java @@ -0,0 +1,24 @@ +package eu.midnightdust.midnightcontrols.client.gui.cursor; + +import com.mojang.blaze3d.pipeline.RenderPipeline; +import eu.midnightdust.midnightcontrols.client.mixin.DrawContextAccessor; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.cursor.Cursor; +import net.minecraft.client.texture.TextureSetup; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.NotNull; +import org.joml.Matrix3x2f; + +import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.client; + +public abstract class CursorRenderer { + public static Cursor currentCursorStyle = Cursor.DEFAULT; + + public abstract void renderCursor(@NotNull DrawContext context, @NotNull MinecraftClient client); + + public static void drawUnalignedTexturedQuad(RenderPipeline pipeline, Identifier texture, DrawContext context, float x1, float x2, float y1, float y2, float u1, float u2, float v1, float v2) { + DrawContextAccessor accessor = (DrawContextAccessor) context; + accessor.getState().addSimpleElement(new UnalignedTexturedQuadGuiElementRenderState(pipeline, TextureSetup.withoutGlTexture(client.getTextureManager().getTexture(texture).getGlTextureView()), new Matrix3x2f(context.getMatrices()), x1, y1, x2, y2, u1, u2, v1, v2, 0xffffffff, accessor.getScissorStack().peekLast())); + } +} diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/render/UnalignedTexturedQuadGuiElementRenderState.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/cursor/UnalignedTexturedQuadGuiElementRenderState.java similarity index 96% rename from common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/render/UnalignedTexturedQuadGuiElementRenderState.java rename to common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/cursor/UnalignedTexturedQuadGuiElementRenderState.java index 7246030..78e36fa 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/render/UnalignedTexturedQuadGuiElementRenderState.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/cursor/UnalignedTexturedQuadGuiElementRenderState.java @@ -1,4 +1,4 @@ -package eu.midnightdust.midnightcontrols.client.gui.render; +package eu.midnightdust.midnightcontrols.client.gui.cursor; import com.mojang.blaze3d.pipeline.RenderPipeline; import net.fabricmc.api.EnvType; diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/cursor/VirtualCursorRenderer.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/cursor/VirtualCursorRenderer.java new file mode 100644 index 0000000..c0ae1e9 --- /dev/null +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/cursor/VirtualCursorRenderer.java @@ -0,0 +1,67 @@ +package eu.midnightdust.midnightcontrols.client.gui.cursor; + +import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; +import eu.midnightdust.midnightcontrols.client.MidnightInput; +import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat; +import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gl.RenderPipelines; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.texture.Sprite; +import net.minecraft.screen.slot.Slot; +import net.minecraft.util.Atlases; +import org.jetbrains.annotations.NotNull; + +import static eu.midnightdust.midnightcontrols.MidnightControls.id; + +public class VirtualCursorRenderer extends CursorRenderer { + private static final VirtualCursorRenderer INSTANCE = new VirtualCursorRenderer(); + + public static VirtualCursorRenderer getInstance() { + return INSTANCE; + } + + public void renderCursor(@NotNull DrawContext context, @NotNull MinecraftClient client) { + if (!MidnightControlsConfig.virtualMouse || (client.currentScreen == null + || MidnightInput.isScreenInteractive(client.currentScreen))) + return; + + float mouseX = (float) client.mouse.getX() * client.getWindow().getScaledWidth() / client.getWindow().getWidth(); + float mouseY = (float) client.mouse.getY() * client.getWindow().getScaledHeight() / client.getWindow().getHeight(); + + boolean hoverSlot = false; + + if (client.currentScreen instanceof HandledScreenAccessor inventoryScreen) { + int guiLeft = inventoryScreen.getX(); + int guiTop = inventoryScreen.getY(); + + Slot slot = inventoryScreen.midnightcontrols$getSlotAt(mouseX, mouseY); + + if (slot != null) { + mouseX = guiLeft + slot.x; + mouseY = guiTop + slot.y; + hoverSlot = true; + } + } + + if (!hoverSlot && client.currentScreen != null) { + var slot = MidnightControlsCompat.getSlotAt(client.currentScreen, (int) mouseX, (int) mouseY); + + if (slot != null) { + mouseX = slot.x(); + mouseY = slot.y(); + hoverSlot = true; + } + } + + if (!hoverSlot) { + mouseX -= 8; + mouseY -= 8; + } + + try { + Sprite sprite = client.getAtlasManager().getAtlasTexture(Atlases.GUI).getSprite(id(MidnightControlsConfig.virtualMouseSkin.getSpritePath() + (hoverSlot ? "_slot" : ""))); + drawUnalignedTexturedQuad(RenderPipelines.GUI_TEXTURED, sprite.getAtlasId(), context, mouseX, mouseX + 16, mouseY, mouseY + 16, sprite.getMinU(), sprite.getMaxU(), sprite.getMinV(), sprite.getMaxV()); + } catch (IllegalStateException ignored) {} + } +} diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/cursor/WaylandCursorRenderer.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/cursor/WaylandCursorRenderer.java new file mode 100644 index 0000000..52723eb --- /dev/null +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/cursor/WaylandCursorRenderer.java @@ -0,0 +1,52 @@ +package eu.midnightdust.midnightcontrols.client.gui.cursor; + +import eu.midnightdust.midnightcontrols.ControlsMode; +import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; +import eu.midnightdust.midnightcontrols.client.enums.VirtualMouseSkin; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gl.RenderPipelines; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.cursor.StandardCursors; +import net.minecraft.client.texture.Sprite; +import net.minecraft.util.Atlases; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.NotNull; + +import static eu.midnightdust.midnightcontrols.MidnightControls.id; + +public class WaylandCursorRenderer extends CursorRenderer { + private static final WaylandCursorRenderer INSTANCE = new WaylandCursorRenderer(); + + public static final Identifier WAYLAND_CURSOR_ARROW_LIGHT = id("cursor/light/mouse_arrow"); + public static final Identifier WAYLAND_CURSOR_ARROW_DARK = id("cursor/dark/mouse_arrow"); + public static final Identifier WAYLAND_CURSOR_POINTING_LIGHT = id("cursor/light/mouse_pointing_hand"); + public static final Identifier WAYLAND_CURSOR_POINTING_DARK = id("cursor/dark/mouse_pointing_hand"); + public static final Identifier WAYLAND_CURSOR_IBEAM_LIGHT = id("cursor/light/mouse_ibeam"); + public static final Identifier WAYLAND_CURSOR_IBEAM_DARK = id("cursor/dark/mouse_ibeam"); + + public static WaylandCursorRenderer getInstance() { + return INSTANCE; + } + + public void renderCursor(@NotNull DrawContext context, @NotNull MinecraftClient client) { + if (MidnightControlsConfig.virtualMouse || client.currentScreen == null || MidnightControlsConfig.controlsMode != ControlsMode.CONTROLLER) return; + + float mouseX = (float) client.mouse.getX() * client.getWindow().getScaledWidth() / client.getWindow().getWidth(); + float mouseY = (float) client.mouse.getY() * client.getWindow().getScaledHeight() / client.getWindow().getHeight(); + + try { + Sprite sprite = getSprite(client); + drawUnalignedTexturedQuad(RenderPipelines.GUI_TEXTURED, sprite.getAtlasId(), context, mouseX - 2, mouseX + 6, mouseY - 2, mouseY + 6, sprite.getMinU(), sprite.getMaxU(), sprite.getMinV(), sprite.getMaxV()); + } catch (IllegalStateException ignored) {} + } + + private static Sprite getSprite(@NotNull MinecraftClient client) { + boolean isDark = MidnightControlsConfig.virtualMouseSkin == VirtualMouseSkin.DEFAULT_DARK || MidnightControlsConfig.virtualMouseSkin == VirtualMouseSkin.SECOND_DARK; + Identifier spritePath; + if (CursorRenderer.currentCursorStyle == StandardCursors.POINTING_HAND) spritePath = isDark ? WAYLAND_CURSOR_POINTING_DARK : WAYLAND_CURSOR_POINTING_LIGHT; + else if (CursorRenderer.currentCursorStyle == StandardCursors.IBEAM) spritePath = isDark ? WAYLAND_CURSOR_IBEAM_DARK : WAYLAND_CURSOR_IBEAM_LIGHT; + else spritePath = isDark ? WAYLAND_CURSOR_ARROW_DARK : WAYLAND_CURSOR_ARROW_LIGHT; + + return client.getAtlasManager().getAtlasTexture(Atlases.GUI).getSprite(spritePath); + } +} diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/CursorMixin.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/CursorMixin.java new file mode 100644 index 0000000..9965589 --- /dev/null +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/CursorMixin.java @@ -0,0 +1,17 @@ +package eu.midnightdust.midnightcontrols.client.mixin; + +import eu.midnightdust.midnightcontrols.client.gui.cursor.CursorRenderer; +import net.minecraft.client.gui.cursor.Cursor; +import net.minecraft.client.util.Window; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Cursor.class) +public abstract class CursorMixin { + @Inject(method = "applyTo", at = @At("TAIL")) + public void midnightcontrols$applyCursorStyle(Window window, CallbackInfo ci) { + CursorRenderer.currentCursorStyle = ((Cursor) (Object) this); + } +} 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 ff8faee..a6fdfce 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 @@ -15,6 +15,8 @@ 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; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; @@ -39,8 +41,8 @@ public abstract class GameRendererMixin { } @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;renderWithTooltip(Lnet/minecraft/client/gui/DrawContext;IIF)V", shift = At.Shift.AFTER)) private void midnightcontrols$renderVirtualCursor(RenderTickCounter tickCounter, boolean tick, CallbackInfo ci, @Local DrawContext drawContext) { - MidnightControlsRenderer.renderVirtualCursor(drawContext, client); - if (MidnightControlsClient.isWayland) MidnightControlsRenderer.renderWaylandCursor(drawContext, client); + 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") diff --git a/common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/cursor/dark/mouse_arrow.png b/common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/cursor/dark/mouse_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..0bdd44799e7a4878f17ba3e1e891f573ec70858d GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6XVU3I`u#fOS+@4BLl<6 ze(pbstU$g(vPY0F14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>Fdh=l2e9T!>ZQhlPgfD+SA1` z#NzbZD~5ax3OuYA;y(+k`5pSpf1x+}rIMOj=&eUD14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>Fdh=l2e9TOPKcn$7-NZo~Mgr zh{fr*Qw+Hp0(hK*1+BiS?ED{CG|9enRd;h&Q~ca3+qX7O&@ns{5}L?vY+PcX$3ICs zP^e0BTYrax%LA>$n`Wu(u)ZTZY1iv_YI{!S|B&8yd&8~kfb{{D}7K${snUHx3vIVCg!02aksg#Z8m literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/cursor/dark/mouse_pointer.png b/common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/cursor/dark/mouse_pointer.png deleted file mode 100644 index dd957f0f06dc1b475fe8d6564ccb75043d455227..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4346 zcmeHKe{dAl9p6g`iBXUUHKIvfR@*@6-u}3~AG?zaBzG5bmXS9&F70G!*TjTwjO5##f1bH-d$kN1jWj%~~MP5)K5&w4uke1R{v+z=j?E##a|tyw&&-0+~*zO3T7^?p;;?5O8p_4GAmN64WPxjps^t}47B``B~$UAfX% zety;2kB2MfxpnSH)eUd#l;1mg%h8ihyfE0i+c&iI4@>WFu1URBwDs1Po;`5oQS$`q zk2f4^>U+{x|DzjU?zj+b=iTQPoZI*Gg~u87?)}EubNg4^yMM#7;i0u_I#>No`b*jE zzkm1#jkESVwS}*KzU)^ks$Q$#^{?6AAC^xsJMNgba_+W@YxmVZ@aew?uYQ<0*e)A; ze?F&)IK({mPp))YPk-#p`olk|{7rAcmEHXd51oI`vvKFLxBgy9_f5MlQCNPeGIF}m znc29fD&RpY|8a6oY0-yYZ9BZ6c(dL={Kt0v(uRRrV(!K2?!tQUs(Cet`!M9rdXT2|H}i;SYUmhw}d zz5EJAYO0@F>5j0GbO3c}jeQ1M-q+lw^sQ4wm0DC=T9cK4Ac-uQ%q9~lQ_A`&n^yuG zyBUhKA=WxS)dBM;pc{x3oPv|3Ls_kdr)o>d8bggqt-*#o1-$vGF3U zH{uK@iXy}E4A0Ympv~TtC1>fBc^jt4aRia67+TuW^c0CX<*43m`6&wO$&vVy=}2Uh zK4s=r06mzjoMt#D%OsP`_!g!W>H(5`KwsO!Z0k)UrWKibx1pd=4@z0Lji*qR(e~+X zBVi9mRTz{&Nr0NrD>tD_yy8Y%UkD~>*$kIM9=c5&m+oSk+kE#gb zII3{UwB(e6FcpwHHQ@0gUi2y)OCvAqp#=eWL>KR(IgcWGxu~j&yfBVpnW4d~loR8l z!c;0y@rsBzQC8`wE2_|f*C*3a86nyyL{-5h3T({B*;J|`HRwiChIDF4IgXfgDsER` z!KJ#Eu%B`{*)dN`LbhViz)v-4sqXApMVppH%PkqJ$$5E>7u-C{`8+N!>m38NBg2H5 z=%?~~r(J{7BEeulSQ*b#Ah7)~7AasL+0ui;mC_}r;s`d5{7fD3YhN=95XUJopXjDlK^15r=2mD?hD<`*_?Rc=7QAY1 zRHN*s9Db2c@9pIOtRcPt4KwfHW1y$gG;NjI)C3F6w>xHyPi z12=)Q*a}BN#h(|C?+x^Q>w|AiK%LAW(@0};&2mVT=J3H2G rm~m#4>-elM7BAU14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>Fdh=l2e9TM~Ta2y*N;4rl*Tz zh{fr*Qw;eIEAY7PS5{fJzmPlrfOPuznHCPaO$3z|IyNqJwpGlT*CH?R8bg=d#Wzp$PzyI&|3p literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/cursor/light/mouse_arrow.png b/common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/cursor/light/mouse_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..ec832d9de016386373620ff667d2875b946820af GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6XVU3I`u#fOS+@4BLl<6 ze(pbstU$g(vPY0F14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>Fdh=l2e9TM6u9d#9wgpxc7McA|-H)KANA)`HCXjV=xL4;@{cTsEDXe<@j$ zbI?pOgXJ!QkoY=d#Wzp$P!!0bXtZ literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/cursor/light/mouse_ibeam.png b/common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/cursor/light/mouse_ibeam.png new file mode 100644 index 0000000000000000000000000000000000000000..df1cdaadeb5dace5d0e584e88dc005918c780959 GIT binary patch literal 296 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 StkA&(A{tp4eyO=@>;C}ew+@*A diff --git a/common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/cursor/light/mouse_pointing_hand.png b/common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/cursor/light/mouse_pointing_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..b5f89db8b80d3ecaf3ddb717393188cc1351eacd GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6XVU3I`u#fOS+@4BLl<6 ze(pbstU$g(vPY0F14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>Fdh=l2e9Tl-XmY(PyC0bWaz@ z5R21qCmrNHtia>yd*o_&&9g*Cwq!ZuhR7DiJHe|=yhLvOxZwPc^`x8swE3O$cCa@v z8ko=Mn9=cvr}sCL@qH;RIiE`I9TnCc>Ag|fQ-kcj-KgddKd?d6$z{o^_i5R^GiDx> zIC5r6@w_G>hTzcK>1%WEYyM`)F$+JCde_(Mq-)pir~ldORMU?YSTxP6owv*J{T_y0 Xzh@QbpDpwPI+4NC)z4*}Q$iB}U59XT literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/icon/unbind.png b/common/src/main/resources/assets/midnightcontrols/textures/gui/sprites/icon/unbind.png new file mode 100644 index 0000000000000000000000000000000000000000..5f37eb32871f19c2f299b9030b5f6d20fa1da29c GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$0wn*`OvwRKjKx9jPK-BC>eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE z?e4;0m;J_WCXmNj;1OBOz`!jG!i)^F=12eq*-JcqUD;o9%5WO#T`}kA1q%6kx;TbN zT%Ov0n)iSLkMmsF8SUrdo+Y+lXPzIWp!m>R$=*6>NwlkULYNQ3rOR*2l{_c>G|z5k vH#4Z>{!q+z$8193Ru7(#YK@ggK7Qp-D6&0}F^4}CXfT7PtDnm{r-UW|@;yn- literal 0 HcmV?d00001 diff --git a/common/src/main/resources/midnightcontrols.mixins.json b/common/src/main/resources/midnightcontrols.mixins.json index cdd9a8b..812f294 100644 --- a/common/src/main/resources/midnightcontrols.mixins.json +++ b/common/src/main/resources/midnightcontrols.mixins.json @@ -12,6 +12,7 @@ "ClickableWidgetAccessor", "ClientPlayerEntityMixin", "CreativeInventoryScreenAccessor", + "CursorMixin", "DrawContextAccessor", "GameOptionsScreenMixin", "GameRendererMixin", @@ -20,6 +21,7 @@ "InputUtilMixin", "KeyBindingIDAccessor", "KeyBindingMixin", + "KeyboardAccessor", "KeyboardMixin", "MinecraftClientMixin", "MouseAccessor",