fix(deck-slice): make the cut threshold body-relative and forgiving #910
Closed
lytedev
wants to merge 2 commits from
deck-slice-cut into deck-slice-framing
pull from: deck-slice-cut
merge into: lytedev:deck-slice-framing
lytedev:main
lytedev:propose/module-directory-scanner
lytedev:propose/special-args-cleanup
lytedev:propose/limine-fallback
lytedev:propose/household-kiosk
lytedev:propose/xwayland-ei-display-from-client
lytedev:propose/steamdeck-mouse-steps-aside-for-games
lytedev:propose/assistant-watch
lytedev:propose/lpcamm-watch
lytedev:propose/agents-where-information-lives
lytedev:propose/tuwunel-1.9.2
lytedev:propose/pin-flake-registry
lytedev:propose/headscale-0-29-3
lytedev:propose/canary-freshness-per-repo
lytedev:propose/boot-guard-efivars-fix
lytedev:propose/deck-dock-panel-under-niri
lytedev:propose/admindevice-ssh-anything
lytedev:propose/kdeconnect-announce
lytedev:steamdeck-mgba
lytedev:propose/doorbell-no-internet
lytedev:propose/ha-list-tasks
lytedev:propose/ha-music-not-found
lytedev:propose/bc250-40cu-measured
lytedev:propose/multiboot-foxtrot-dragon
lytedev:propose/pitft-stmpe-drive
lytedev:propose/foxtrot-multiboot-prep
lytedev:propose/pitft-no-smartd
lytedev:propose/kexec-luks-reboot
lytedev:propose/foxtrot-multiboot
lytedev:propose/model-eval
lytedev:propose/foxtrot-vm-seats
lytedev:iamb-sender
lytedev:propose/calendar-alarms
lytedev:pinephone-niri
lytedev:push-tsntxvxynzps
lytedev:propose/spoof-reject-cleanups
lytedev:propose/finance-pipeline
lytedev:steamframe-plan
lytedev:pinephone-buildable
lytedev:deck-pose-wip
lytedev:aerc-open-html
lytedev:local-auth-unification
lytedev:iamb-dotfiles
lytedev:esphome-music-panel
lytedev:wifi-system-profile
lytedev:gauge-history
lytedev:validate-gate-fix2
lytedev:validate-slot-no-hugepages
lytedev:pinephone-reenable
lytedev:cyberdeck-research
lytedev:git-anon-ratelimit
lytedev:headscale-basedomain
lytedev:ssd-fast-tier
lytedev:hold-impermanence-flip
lytedev:gate-dummy-eval
lytedev:zen-browser
lytedev:initrd-remote-unlock
lytedev:beefcake-rpool-backup
lytedev:sec-sso-plan
lytedev:sec-mail
lytedev:flab-lid-wake
lytedev:hearth-k8s
lytedev:zulip
lytedev:router-guest-vlan
lytedev:headscale-extra-records
lytedev:beefcake-advertise-lan
lytedev:push-qrvuuqmxtznv
lytedev:voxtype-per-host-model
lytedev:cleanup
lytedev:push-kanidm-opt-in
lytedev:push-voxtype-flake-fix
lytedev:push-uvqqknxvqlvy
lytedev:push-qrqsxkmlrevert
lytedev:fix-kanidm-uid-attr-map
lytedev:nix-on-droid
lytedev:self-hosted-dns
lytedev:fix-runner-tmpfs-revert
lytedev:beefcake-email
lytedev:beefcake-immich
lytedev:firefox-nightly-devedition
lytedev:fix-bun-baseline
lytedev:flab-stuff
lytedev:printer-sftp
lytedev:dragon-vr-monado
lytedev:clever-vr-game-clamshell-mode-detection
lytedev:wireguard-mesh
lytedev:rescue-beefcake-unpushed-nix
No reviewers
Labels
No labels
bug
enhancement
question
scary
upstream
Milestone
Clear milestone
No items
No milestone
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
lytedev/nix!910
Loading…
Reference in a new issue
No description provided.
Delete branch "deck-slice-cut"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Fixes the unforgiving cut threshold Daniel hit playing #909: "feels much less responsive than it did before and 'fast enough to count as a cut' seems to be a bit unforgiving with the lerping at play so sometimes I move fast but still not enough for the game?"
Stacked on #909. Base is
deck-slice-framing.Root cause — more specific than "it was never retuned"
The unit has now been wrong twice, which is the argument for the third one.
Body-relative — yes, and here is why
You asked me to decide and say why. Body-relative, definitely. A swing is a physical motion of a physical arm; measuring it against the player's own apparent size makes it independent of the window, the letterbox, the capture resolution, and how far from the camera they stand. The old scheme was silently distance-dependent — someone further from the camera faced a higher effective threshold. It is also the unit the daemon's gesture thresholds already use, so the two now agree instead of each having a private idea of "fast", and it should not need retuning the next time the framing changes.
Retuned down, with numbers rather than vibes
Default is now 0.8 body-heights/sec, against measurements:
swipegesture threshold: 1.50.8 is roughly a quarter of the old value and well under any deliberate motion. Biased forgiving as you asked: a missed slice is far more frustrating than an accidental one, and the only cost of generosity here is the occasional unintended bomb.
--cut-speedflagExposed for the same reason as the One Euro parameters — tuned by feel, so a rebuild per attempt makes tuning impractical.
No config file, deliberately: the game has no config mechanism today, there is exactly one tunable, and live tuning is what a flag is for. Say the word if you want one anyway and I will add it.
Diagnostics — so this stops being unfalsifiable
DECK_SLICE_DEBUG=1now reports peak observed hand speed against the current threshold, and logs any swing that passed through a target while judged too slow — which is precisely the number the threshold should sit below:Second cause checked — it was not rendering
You asked me to confirm the framing work did not slow the game down. Measured over identical 1200-frame runs against the same synthetic stream:
Within noise. "Less responsive" was the threshold, not a render regression — the self-view, vignette and edge glows cost nothing measurable.
Stack rebased onto the fixed #907
You were right that #908/#909 were branched from #907 before the flock fix, so they carried the original publisher. Rebased with
--ignore-immutable(change IDs preserved, no divergence); all three game branches now have it:Untested
MISSdiagnostic has only fired against synthetic motion.692d9aad7478c0c116caSuperseded by #915, which consolidates the whole markerless-pose-input program into a single WIP branch against
main. Every commit from this PR is preserved there — nothing was squashed, so the root-cause writeups in the commit messages are intact. Closing here; review happens on #915.Pull request closed