75 Commits
Author SHA1 Message Date
Pixelplanet 22ed9e1ede fix(install): support case-insensitive Shortcuts key in shortcuts.vdf and copy install.sh from unpacked tarball v1.4.2 v1.4.1 2026-10-17 20:55:13 +02:00
Pixelplanet 7987fffed4 feat(vault): hidden vault, file actions submenu, dual controller models, and display sharpness
- 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.
v1.4.0
2026-10-17 18:06:19 +02:00
PixelplanetandCopilot 858293663b feat(install): one-command installer with automatic Steam library entry
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>
v1.3.0
2026-10-17 10:16:06 +02:00
PixelplanetandCopilot 6f9a9ac6b5 feat(ui): unified spatial UI with video thumbnails and richer settings
- 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>
v1.2.0
2026-10-17 09:55:48 +02:00
Pixelplanet ee95d79efe feat(input): trigger selects in the browser, grip toggles the laser, downloads window replaces the browser
- 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.
2026-10-15 20:52:38 +02:00
Pixelplanet e39fd5e77c feat(input): X/Y download buttons; bar clickable with A; Downloads window opens over the browser
- 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.
2026-10-15 20:35:23 +02:00
Pixelplanet 47836de7d8 docs: document the A-to-open / trigger-to-point control scheme and Download button v1.1.0 2026-10-15 20:25:38 +02:00
Pixelplanet 3164a84545 feat(input): A opens the browser selection, dedicated Download control-bar button
- 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.
2026-10-15 20:24:27 +02:00
Pixelplanet b31cc5a58e README: document the release install flow and current feature set v1.0.0 2026-10-15 20:09:09 +02:00
Pixelplanet 85b0ab69cc Control-bar clicks work while browsing (bar gated separately from viewpoint/transport); open file browser on launch when no clip given 2026-10-15 20:03:05 +02:00
Pixelplanet 1b9c931036 Keep control bar visible while the file browser is open (bar sits below the panel) so Downloads is reachable directly 2026-10-15 19:58:40 +02:00
Pixelplanet f045b7b340 Fix settings block brace after stick-select change 2026-10-15 19:52:32 +02:00
Pixelplanet 790e9e7352 Stick-select with trigger in browser+settings; no auto-play on download completion (fixes playback interruption); finished folder opens in browser 2026-10-15 19:51:53 +02:00
Pixelplanet df5174034a File browser stays interactive during downloads (was gated on isBusy which includes dlActive) 2026-10-15 19:44:41 +02:00
Pixelplanet 483f77ba13 Add navigation diagnostics (beginScan/defer/scan-complete) 2026-10-15 19:32:29 +02:00
Pixelplanet ffd21b56bf Do not auto-close the browser when a download starts (only show downloads window if browser closed) 2026-10-15 19:25:29 +02:00
Pixelplanet 398d8de4eb Remove auto-pause while browsing: child process has its own SMB session so downloads keep running 2026-10-15 19:11:51 +02:00
Pixelplanet a49ea9ad61 Folder download live progress (completed + in-flight file); auto-pause child while browsing so listing always responds 2026-10-15 19:06:44 +02:00
Pixelplanet d3f1f05ef3 Download child via posix_spawn (fork deadlocks in multithreaded process); stdin from /dev/null; log spawn cmd 2026-10-15 19:01:35 +02:00
Pixelplanet 20db824464 Download child uses smbclient (curl smb unsupported here); red X failed badge; larger browser rows (kRowH 0.105) 2026-10-15 18:58:50 +02:00
Pixelplanet 05ef47948e Downloads via curl child process (own SMB connection): concurrent SMB browsing + downloads, SIGSTOP/SIGCONT pause, SIGKILL stop 2026-10-15 18:54:07 +02:00
Pixelplanet 5659a43b51 Downloads: ETA shows --:-- when paused/stalled; auto-open downloads window and close browser on download start 2026-10-15 18:51:42 +02:00
Pixelplanet 772d91f6e9 Raycast: downloads panel/modal takes priority over browser (fix modal clicks); guard stale scanning_ flag 2026-10-15 18:42:47 +02:00
Pixelplanet 123650ed19 Downloads yield while browser open (fix unusable browser); log modal button hover 2026-10-15 18:32:57 +02:00
Pixelplanet 2665786657 Hide control bar during downloads modal (fix modal click); 1MiB SMB reads for throughput 2026-10-15 18:26:43 +02:00
Pixelplanet 3c48eb34e4 UI: content-sized centered buttons at panel bottom for downloads + confirm modal; bigger in-progress dot, smaller tick; darker model 2026-10-15 16:29:06 +02:00
Pixelplanet 7049ea6c1e Restore scanMutex_/scanResult_ declarations 2026-10-15 15:09:29 +02:00
Pixelplanet 587f8baebf Non-blocking navigation (no main-thread scan join); downloads dialog buttons + modal confirm with folder size; darker model; bigger badge 2026-10-15 15:09:10 +02:00
Pixelplanet a1e1cbff5e Fix missing total var in poll 2026-10-15 14:58:40 +02:00
Pixelplanet 3bd5904e84 Darker matte model; downloads: pause/stop/clear + click-to-play window, partial-file cleanup, browser scan priority during download 2026-10-15 14:58:26 +02:00
Pixelplanet fc8b958fb6 Skip status node again (tiny-square artifact); remove head-locked download line; download shows size/%/ETA (folder pre-walk); bigger badge 2026-10-15 14:50:52 +02:00
Pixelplanet 60b23fd8f6 Model darker matte + re-enable status screen node; wider panels/text; download yields SMB lock (responsive browser); drop post-completion status line 2026-10-15 14:44:15 +02:00
Pixelplanet c9dc24293f Model: matte black diffuse (no shimmer); browser rows show clamped name + size; Downloads window with speed/ETA + control-bar button with active/done badge 2026-10-15 14:34:12 +02:00
Pixelplanet 93ad194ef6 Declare Browser::focused() 2026-10-15 13:35:57 +02:00
Pixelplanet 90fba4520c Downloads: any file type + recursive folder copy with confirm; browser shows type/size; pointer drives selection; darker black model with highlighted labels 2026-10-15 13:35:43 +02:00
Pixelplanet d977641ade Fix model regression (always draw parts, guard degenerate node poses); add Downloads panel UI + keep browser hint/refusal message 2026-10-15 13:01:23 +02:00
Pixelplanet b9e246279d Render-model node animation: ordinal fallback when node names unavailable + skip status node; download refusal shown on-screen 2026-10-15 12:57:19 +02:00
Pixelplanet af1a940efb Native render-model node animation (xrGetRenderModelStateEXT) + asset node names; download logging/diagnostics + persistent background status 2026-10-15 12:53:40 +02:00
Pixelplanet 3629e10b4a Native model animation via glTF node INDEX (asset node names unavailable); skip stray 'status' LCD square; downloads: allow during scan + clearer feedback/hint 2026-10-15 12:44:01 +02:00
Pixelplanet 9a26d25961 Native controller animation (xrGetRenderModelStateEXT node poses -> button-press motion); downloads: hover-select fix, logging, downloads list 2026-10-15 12:40:18 +02:00
Pixelplanet dd641b8348 Controller: specular/rim shading; native-button remap (press-to-bind); downloads: destination setting + background status line + always-poll 2026-10-15 12:25:43 +02:00
Pixelplanet 6268424df9 Native frame profile: probe each binding path, keep accepted, log rejects (self-correcting) 2026-10-15 11:58:52 +02:00
Pixelplanet 3f571b355b Native Steam Frame controller: enable XR_VALVE_frame_controller_interaction + target /interaction_profiles/valve/frame_controller; log active profile 2026-10-15 11:33:31 +02:00
Pixelplanet 091f86ac68 Controller: tapered laser from front, pose smoothing, hemisphere shading 2026-10-15 11:04:33 +02:00
Pixelplanet 7c6dc52d6a Fix brace typo in controller-model placement 2026-10-15 10:29:10 +02:00
Pixelplanet 56a71a9e69 Controller models: place at runtime render-model space (fix position), connect laser to model, brighten matte-black skin 2026-10-15 10:28:07 +02:00
Pixelplanet c9a60b7468 Controller models: real PNG base-color textures (stb_image) with per-submesh materials + lit textured shader 2026-10-15 09:26:49 +02:00
Pixelplanet 6e52b544ec Controller models: add depth buffer (fix see-through) + render at grip pose (fix forward tilt) 2026-10-15 09:17:08 +02:00
Pixelplanet ceeff8483a Start real controller models: parse runtime glTF (cgltf) and upload the real mesh to the model pipeline (uint32 indices) 2026-10-15 08:54:40 +02:00
Pixelplanet 848e2661d7 Fix decode-fps underflow on reload (garbage number); enlarge decoded-frame queue to absorb bursty decode (reduces low-fps judder) 2026-10-15 08:43:13 +02:00