1
0
forked from Clones/Controlify

improve controller snapping

This commit is contained in:
isXander
2023-02-13 22:13:11 +00:00
parent 80c445b5a5
commit f1ba413f62
4 changed files with 19 additions and 16 deletions

View File

@ -31,7 +31,7 @@ public abstract class AbstractContainerScreenMixin<T extends AbstractContainerMe
@Override
public Set<SnapPoint> 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());
}
}

View File

@ -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()) {

View File

@ -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());
}

View File

@ -38,7 +38,8 @@ public class VirtualMouseHandler {
private boolean virtualMouseEnabled;
private Set<SnapPoint> 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);
}
}