- Prevent in.selectHeld and trigger activity from resetting hudDismissed_ after manual dismiss
- Add App::dismissHud() to reset activity anchors to current controller poses and establish a 500ms cooldown
- Center transport recessed island background at cx=0.0f, hw=0.34f, giving symmetrical 34mm padding across all 5 buttons
- Add hover tooltip pills for [Hide UI] and [Stop]
- Add Hidden Vault system:
- Secure directory storage under ~/.pixelvr_vault with 0700 permissions.
- Cheat-code combo unlocking triggered on full grip squeeze (A-B-B-A-X-Y default, customizable).
- Headset removal / face detection gating and inactivity auto-lock.
- Automatic download history clearing upon vault lock.
- Add File Actions Submenu (Button Y):
- In-browser file/folder submenu with Move to Vault, Delete, Move, and Rename.
- Recursive folder move to vault with collision handling.
- Folder deletion with confirmation dialog.
- Enhance VR controllers and interactions:
- Dynamic left and right Steam Frame controller render models.
- Single laser pointer priority with hand swapping via full grip squeeze.
- Fix video format detection:
- Correct auto-detection and default projection for high-resolution VR180 SBS media (e.g. 7200x3600).
- Visual sharpness & rendering stability:
- Render swapchain at native 2160x2160 per eye.
- SDF font rendering with RMS pixel footprint and stem darkening.
- Razor-sharp procedural UI anti-aliasing and crisp border highlights without distortion.
- Add unit test suite (tests/test_vault.cpp) and documentation specs.
Users can now install with a single command, either piped or from the
release tarball:
curl -fsSL .../tools/install.sh | sh
./install.sh
Tools/install.sh downloads the latest (or a pinned) ARM64 release, verifies
the published checksum, installs to ~/PixelVRPlayer, and registers
"Pixel VR Player" as a Non-Steam Game by editing shortcuts.vdf through an
embedded binary-KeyValues helper (existing shortcuts are preserved, the file
is backed up, and unsupported files are left untouched). Options cover
--dir, --version, --no-steam, --restart-steam and --uninstall. Upgrades never
touch ~/.config/pixelvr or ~/.cache/pixelvr.
Also:
- package-release.sh ships install.sh and a VERSION file in the tarball.
- The release workflow publishes .sha256 checksums and syntax-checks the
installer before building.
- Docs describe the one-command path for end users.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add ThumbnailCache: a worker thread extracts 256x144 thumbnails and media
metadata with FFmpeg, SBS-aware cropping, and an on-disk cache under
~/.cache/pixelvr/thumbs.
- Draw thumbnails on browser cards through a new rounded-corner thumb.frag
pipeline with per-card descriptor sets.
- Redesign the browser as a sidebar + card grid, with horizontal stick
navigation and direct shortcuts to Network/Home/Videos/Downloads/Drives.
- Expand Settings: screen curvature, UI text scale and colour, accent colour
and UI distance, organised into sections.
- Downloads window: per-job state, progress, speed and ETA, plus pause/resume
and cancel-active controls.
- Decoder: multi-threaded software decode and four V4L2 output buffers.
- docs: unified UI concept, redesign plan and mockups.
Release packaging is now reproducible: tools/run.sh is the shipped launcher,
tools/package-release.sh assembles the tarball, and a GitHub Actions workflow
builds it natively on ARM64 for every v* tag. Stop committing release tarballs;
they are attached to releases instead.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Restore trigger-to-select in the file browser (it is the intuitive gesture);
A remains an alternative for thumbstick/d-pad navigation. Both skip when the
laser is resting on a control-bar button, which owns that click.
- Grip now toggles that hand's laser pointer, SteamVR-style: turn one off to
drive a panel with the stick without the beam fighting it, and to pick the
pointing hand. The raycast and the beam both honour it per hand.
- Recenter moves from Grip to Bumper (saved grip bindings migrate), since Grip
is now the laser toggle.
- The downloads window replaces the browser panel instead of stacking over it,
and browser input is suspended while it (or the confirm dialog) is open.
- X (or Y) downloads the entry highlighted in the browser. A dedicated
physical button means the trigger never has to double as a pointer click.
- The control bar now accepts A as well as the trigger, and A prefers the
pointed-at bar button over the browser entry, so the bar always works.
- The downloads window was gated on !browser_.isOpen(), so pressing its bar
button while browsing appeared to do nothing; it now opens over the browser.
- Log control-bar clicks to make input routing diagnosable.
- The trigger was overloaded (control bar + list activation), so the bar was
unreachable while the file browser was open. A now opens/activates the
highlighted entry; the trigger is pointer-only.
- New CtrlButton::Download in the control bar downloads the focused entry
(folders still prompt with the size). Downloads window button gets its own
list icon so the two are distinguishable.
- Fix the raycast: panel hit tests used an early 'continue' when the ray missed
the panel, which swallowed rays aimed at the control bar (drawn below the
panel) and at the timeline/time readout. They now fall through to the bar.