From f1ba413f625782894e7ae1d95411b60a50e5d6d8 Mon Sep 17 00:00:00 2001 From: isXander Date: Mon, 13 Feb 2023 22:13:11 +0000 Subject: [PATCH] improve controller snapping --- .../AbstractContainerScreenMixin.java | 2 +- .../CreativeModeInventoryScreenMixin.java | 2 +- .../virtualmouse/snapping/ScreenMixin.java | 2 +- .../virtualmouse/VirtualMouseHandler.java | 29 ++++++++++--------- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/AbstractContainerScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/AbstractContainerScreenMixin.java index 5a016ae..cc8f9c7 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/AbstractContainerScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/AbstractContainerScreenMixin.java @@ -31,7 +31,7 @@ public abstract class AbstractContainerScreenMixin getSnapPoints() { return getMenu().slots.stream() - .map(slot -> new SnapPoint(new Vector2i(leftPos + slot.x + 8, topPos + slot.y + 8), 24)) + .map(slot -> new SnapPoint(new Vector2i(leftPos + slot.x + 8, topPos + slot.y + 8), 14)) .collect(Collectors.toSet()); } } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/CreativeModeInventoryScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/CreativeModeInventoryScreenMixin.java index 0e7ccdf..20ce045 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/CreativeModeInventoryScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/CreativeModeInventoryScreenMixin.java @@ -31,7 +31,7 @@ public abstract class CreativeModeInventoryScreenMixin extends AbstractContainer int x = leftPos + getTabX(tab); int y = topPos + (topRow ? -28 : imageHeight - 4); - points.add(new SnapPoint(new Vector2i(x + 13, y + 16), 38)); + points.add(new SnapPoint(new Vector2i(x + 13, y + 16), 18)); } if (canScroll()) { diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/ScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/ScreenMixin.java index 089208d..b4cbadc 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/ScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/ScreenMixin.java @@ -24,7 +24,7 @@ public abstract class ScreenMixin implements ISnapBehaviour { .map(AbstractWidget.class::cast) .map(widget -> new SnapPoint( new Vector2i(widget.getX() + widget.getWidth() / 2, widget.getY() + widget.getHeight() / 2), - Math.min(widget.getWidth(), widget.getHeight()) + 5 + Math.min(widget.getWidth(), widget.getHeight()) / 2 + 10 )) .collect(Collectors.toSet()); } diff --git a/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java b/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java index 1221ebe..2772be1 100644 --- a/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java +++ b/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java @@ -38,7 +38,8 @@ public class VirtualMouseHandler { private boolean virtualMouseEnabled; private Set snapPoints; - private SnapPoint snappedPoint, lastSnappedPoint; + private SnapPoint lastSnappedPoint; + private boolean snapping; public VirtualMouseHandler() { this.minecraft = Minecraft.getInstance(); @@ -70,21 +71,21 @@ public class VirtualMouseHandler { } else { snapPoints = Set.of(); } - if (!snapPoints.contains(snappedPoint)) - snappedPoint = null; // if just released stick, snap to nearest snap point if (leftStickX == 0 && leftStickY == 0) { if ((prevLeftStickX != 0 || prevLeftStickY != 0)) snapToClosestPoint(); } else { - snappedPoint = null; + snapping = false; } + var sensitivity = !snapping ? controller.config().virtualMouseSensitivity : 2f; + // quadratic function to make small movements smaller // abs to keep sign - targetX += leftStickX * Mth.abs(leftStickX) * 20f * controller.config().virtualMouseSensitivity; - targetY += leftStickY * Mth.abs(leftStickY) * 20f * controller.config().virtualMouseSensitivity; + targetX += leftStickX * Mth.abs(leftStickX) * 20f * sensitivity; + targetY += leftStickY * Mth.abs(leftStickY) * 20f * sensitivity; targetX = Mth.clamp(targetX, 0, minecraft.getWindow().getWidth()); targetY = Mth.clamp(targetY, 0, minecraft.getWindow().getHeight()); @@ -150,23 +151,24 @@ public class VirtualMouseHandler { var target = new Vector2d(targetX, targetY).mul(scaleFactor); if (lastSnappedPoint != null) { - if (lastSnappedPoint.position().distanceSquared(new Vector2i(target, RoundingMode.FLOOR)) > lastSnappedPoint.range() * lastSnappedPoint.range() * scaleFactor.x()) { + if (lastSnappedPoint.position().distanceSquared(new Vector2i(target, RoundingMode.FLOOR)) > (long) lastSnappedPoint.range() * lastSnappedPoint.range()) { lastSnappedPoint = null; } } var closestSnapPoint = snapPoints.stream() - .filter(snapPoint -> snapPoint != lastSnappedPoint) // don't snap to the point currently over snapped point + .filter(snapPoint -> !snapPoint.equals(lastSnappedPoint)) // don't snap to the point currently over snapped point .map(snapPoint -> new Pair<>(snapPoint, snapPoint.position().distanceSquared(new Vector2i(target, RoundingMode.FLOOR)))) // map with distance to current pos - .filter(point -> point.getSecond() <= point.getFirst().range() * point.getFirst().range() * scaleFactor.x()) // filter out of range options + .filter(point -> point.getSecond() <= (long) point.getFirst().range() * point.getFirst().range()) // filter out of range options .min(Comparator.comparingLong(Pair::getSecond)) // find the closest point .orElse(new Pair<>(null, Long.MAX_VALUE)).getFirst(); // retrieve point if (closestSnapPoint != null) { - snappedPoint = lastSnappedPoint = closestSnapPoint; + lastSnappedPoint = closestSnapPoint; + snapping = false; - targetX = snappedPoint.position().x() / scaleFactor.x(); - targetY = snappedPoint.position().y() / scaleFactor.y(); + targetX = closestSnapPoint.position().x() / scaleFactor.x(); + targetY = closestSnapPoint.position().y() / scaleFactor.y(); } } @@ -201,7 +203,8 @@ public class VirtualMouseHandler { if (DEBUG_SNAPPING) { for (var snapPoint : snapPoints) { - GuiComponent.fill(matrices, snapPoint.position().x() - 1, snapPoint.position().y() - 1, snapPoint.position().x() + 1, snapPoint.position().y() + 1, snapPoint == snappedPoint ? 0xFF00FF00 : snapPoint == lastSnappedPoint ? 0xFFFFFF00 : 0xFFFF0000); + GuiComponent.fill(matrices, snapPoint.position().x() - snapPoint.range(), snapPoint.position().y() - snapPoint.range(), snapPoint.position().x() + snapPoint.range(), snapPoint.position().y() + snapPoint.range(), 0x33FFFFFF); + GuiComponent.fill(matrices, snapPoint.position().x() - 1, snapPoint.position().y() - 1, snapPoint.position().x() + 1, snapPoint.position().y() + 1, snapPoint.equals(lastSnappedPoint) ? 0xFFFFFF00 : 0xFFFF0000); } }