20 Commits
Author SHA1 Message Date
MichaelScottsmanandClaude Opus 5.5 d9d73383c2 Ship glassd and native mode on by default: install works out of the box
- native/glassd/prebuilt/glassd: the Frame's glassd built from these sources, shipped by sync.
- glass.py install: the shipped binary in place first, then a build from source over it (kept on a failed
  build), then a check that glassd is ready.
- lgs_shell start: puts the shipped binary in place when glassd is missing, so the Liquid Glass toggle run
  during an install never starts CSS-only (what left the glass transparent).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:27:55 -04:00
MichaelScottsman 056f69d418 Rename the app to LiquidAss: launcher entry, toasts and icon; README updated
Install paths and internal identifiers keep the glass-shell name so existing installs carry over.
Steam's program row is matched by the new name, with the old one still accepted.
2026-10-09 15:57:11 -04:00
MichaelScottsman 072461cf13 Stereo on the bar, frame menu and footer; VR Settings no longer makes the bar and frame menu glass jump
- glassd took the window's scale from any surface placed by Steam's main overlay; SteamVR's panels
  (vr.settings 1858 px, vr.ctl 488 px) are placed by it too, so while VR Settings showed, the bar's and the
  frame menu's glass were rescaled x2.58 / x9.86 by turns every geometry fetch (the flicker). The scale now
  comes from the main surface only.
- Cropped surfaces are stereo: lgs_sg.js reports each panel's u range (beat crops), the daemon passes it
  as surfaces[].crop, glassd builds the eye pair around the crop (right copy shifted by the crop width,
  each eye clipped to its crop) and the cover panel spans the pair.
2026-10-09 15:04:37 -04:00
MichaelScottsman af4e73c1d3 Stereo glass: each eye sees the room behind the window glass from where it is; tuner fits its popup; the sidebar keeps native glass without the laser; Home leaves on the route exit
Stereo (glassd cap stereo, flag glassStereo, on)
- The window glass was one image both eyes saw on the glass plane, so the room behind it read as a picture
  pasted on the glass. glassd now renders each eye's view (SteamVR's eye-to-head offsets, refreshed every
  5 s): every region of a stereo surface's texture is a pair, left eye's copy then right eye's, and the
  scene graph's panel spans the pair with stereoscopy Parallel.
- Measured on the device with a lab probe (lgs_sg test.stereoProbe): SteamVR splits a Parallel panel at
  the middle of the panel's own uv rect, not at the texture's halves; hence the pair layout, and stereo only
  where the scene graph shows a surface whole (main, SteamVR's panels). The bar, the frame menu and popups
  show crops and stay mono. A slab clipped sideways is left out while it is.
- GPU about 2.9 -> 3.5 ms a frame.

Sidebar without the laser
- frame.menu is no longer laser-only: SteamVR shows it in gamepad mode (laser mouse off) and beside its own
  pages; keyed on the gamepad flag its native glass went off and the CSS glass showed. Verified with the
  flag forced to gamepad on Home and in VR Settings: the cover stays.

Home -> Library
- The shell stamps the leaving Home view with the moment it starts leaving (only on a way out of Home, kept
  across Steam's /library redirect); Home fades on the route exit and the reporter lets its plates go on
  that clock. Measured: all Home discs reported leaving in the first report, gone with the page.
- Plates whose element leaves the DOM are reported leaving from the mutation itself (no measuring), not
  after a frame-driven tick the new route's render starves.

Glass tuner
- The popup fits Steam's 600 px bar popup cap (rows 76 px: label and value on one line over a 40 px slider);
  open()/close() for tests.
2026-10-09 14:51:41 -04:00
MichaelScottsman 5af91fc1bd Glass leaves with its page; the sidebar keeps native glass in VR Settings; Friends clears the search row; a paintbrush on the bar tunes the glass
Route changes
- Plates fade with their content: the reporter reads a running opacity fade on a plate or its ancestors
  (Home -> Friends: the route's 150 ms exit) and reports exitAt/exitMs; glassd fades the plate's coverage
  linearly on that clock, optics unchanged (cap exitAt); the daemon keeps a leaving plate for exactly
  that fade. A plate whose element left the DOM (Home -> Library stays in one /library route: no fade,
  Home unmounts when Library has rendered) goes in 90 ms instead of the 350 ms dematerialize ramp that
  left Home's discs over the Library grid.
- The window cover arrives with the route: the shell sets the new route's glass mode in the history
  change itself, the reporter reports the mode flip at once (tickNow) with the time it happened, and
  glassd springs a kept surface's new cover from then (appearAt now also for main gaining its cover).
- A disc popped at the switch belongs to the page that leaves: it never flips the new page to the crops
  layout and goes with the page's fade (lgs_sg.js routeOut).

Sidebar in VR Settings
- The frame menu is a laser-only surface keyed on Steam's gamepad-nav flag, which goes stale on
  SteamVR's own pages (the laser works SteamVR's page): the native glass went on and off with every
  input Steam saw, its CSS glass in between. On a SteamVR page (the frame's VR Settings action active)
  the rule does not apply.

Friends
- The page starts at y 108 (C1a's pad + 40, as Settings' list): the sidebar platter no longer sits
  under the search capsule.

Glass tuner (flag glassTune, on)
- A paintbrush circle after the system capsule (its own glass piece and native cover) opens a bar popup
  through Steam's own bar popup button: colour (8 swatches) and tint strength, Glass intensity (the
  dial), Refraction, Frost, Highlights, Reset to default.
- Daemon action glass.tune (kind ui, its own 40 ms rate, outside the global window): glassd.json at once,
  ~/.config/glass-shell/tune.json 400 ms after the last change (kept across reboots by request; the
  defaults delete it; RT-6 allows exactly this file), the dial file mirrored for the SteamVR pages.
- glassd: tune {refract, frost, light, hue, hueK} applied in drawGlass, eased (40 ms) like the dial now
  is; the glass body's neutral moves toward the hue (uHue), per-piece tints stay on top (cap tune).
- The CSS glass follows live: a style per Steam window sets --lgs-dial / --lgs-tune-hue; the material
  tints mix the colour in.
2026-10-09 14:06:10 -04:00
MichaelScottsman 2d120d51dc glassd: each surface's place from the head in glassd-out.json (view: offDeg, distM)
The lab's headset-view checks wait for the wearer to face the dashboard before they grab.
2026-10-09 02:27:00 -04:00
MichaelScottsman 2893a513f1 glassd: the background behind the glass moves fluidly
- every room update is rendered (within the fps cap), not at most ~6 Hz: glass redraws 6 -> ~40/s with the head still
- feed 36 -> 60 Hz while the glass shows (room updates 27 -> ~40/s measured)
- room EMA 0.22 -> 0.45 while the dashboard shows: changes behind the glass come through in ~2 frames, not ~200 ms
2026-10-09 01:39:44 -04:00
MichaelScottsman 481411fd6a glassd: keep the room map across restarts (/dev/shm/lgs/glassd-room.bin)
A restarted glassd (SteamVR restart, watchdog, update) began with an empty room map, so every glass showed the
flat unknown-room fill until the wearer looked around again. The map is saved every 10 s while it changes and
at exit, and loaded at start.
2026-10-09 01:36:19 -04:00
MichaelScottsman 7d9924aaec glassd: back to a room fill per feed frame and 4x feed decimation
The lazy (~15 Hz) fill and the 8x feed made the glass's background visibly slow to follow the room and flatter.
2026-10-09 01:29:34 -04:00
MichaelScottsman 12722f00e8 glassd: lazy room fill, 8x feed; contract docs for native-only glass
- The room map's fill (push-pull, row fill, mips) runs before a render that
  samples it, at most ~15 Hz, instead of after every feed frame (room GPU per
  feed frame 0.7 -> 0.19 ms); the feed is decimated 8x (240x135, the room map
  sampled it about that coarse already).
- reporter.md, glassd.md, daemon.md: armed/pooled/appearAt, optimistic marks,
  standby surfaces and the panel watch, lgs-native per session.
2026-10-08 23:56:55 -04:00
MichaelScottsman 9becb5a5c3 Native-only glass: no CSS-to-native swaps; popups armed ahead; menus cut the page out
Phase 1 (no handoff):
- lgs-native on every Steam window while native mode is live (daemon NATIVE_JS
  `all`, lgs_core sets it at injection), pooled popups included.
- Covers and plates are marked glassd's as soon as they are reported (optimistic),
  CSS glass back only if never acked within 1.5 s.
- Covers/plates that appear while animating are reported at their end state
  (seekEnd over all running animations) with appear timing; glassd ramps them
  from the page's own start time (appearAt).
- Pooled popups stay in the report while hidden and are measured as their content
  mounts ("armed"): glassd draws the glass ahead, lgs_sg builds the nodes in the
  same scene-graph update Steam inserts its panel in (panel watch), the hidden
  cover elements are pre-marked, glassd clears a surface's texture on hide.
- Plates inserted by a route are reported synchronously, ahead of the scroll
  deferral.

Phase 2 (menus):
- While a menu, alert or sheet is open in native mode, the page under it is cut
  out of Steam's texture (data-lgs-hole mask, faded on a registered property),
  held through the slab's out-ramp; the slab is transparent glass from the open.
- Modal layers are reported at once (no 607 ms settle wait).
2026-10-08 23:33:29 -04:00
MichaelScottsman dc3071aac0 Smooth transitions: sidebar width morph, window glass materialize, launcher plate exit
- Frame menu: measured expanded width so Steam's width transition animates;
  reporter sends cover.morph end shape + start time, glassd morphs the glass
  on the same spring (70 ms native lead).
- Main window: glass-mode change reported from the mutation callback and the
  cover marked data-lgs-cover="pending" (no opaque CSS window); glassd springs
  covers in/out; daemon keeps lgs-native 1.5 s between modes.
- Launcher: the name plate dissolves in place, then the label fades back.
2026-10-08 23:04:35 -04:00
MichaelScottsman ca69915d8f Platform packages P1-P10 built, reviewed and fixed (R1); P7 anchor fix (texture uv) and popup curvature; context round in progress 2026-10-07 12:42:46 -04:00
MichaelScottsman dd4f775645 WIP checkpoint: platform packages built (M3), core contexts C1a/C1c/C2a at M2, C4a at M3 2026-10-07 08:21:40 -04:00
MichaelScottsman 65ab8fc09b WIP checkpoint: phase 2 build round R1 interrupted by usage limit (contracts M1 for P1-P10, partial platform code, context M0 work) 2026-10-07 05:03:08 -04:00
MichaelScottsman 24dd796135 glassd material v2: edges from shape and light, not outlines; prism lensing, glass-over-glass, unknown-room fill, materialize phase, test backdrop 2026-10-07 02:46:19 -04:00
MichaelScottsman dfd77ec82d Native layer: glassd renderer, SteamVR scene-graph compositor + lgs-shell daemon, layer reporter + native CSS (built, reviewed, fixed; native mode opt-in) 2026-10-07 01:28:45 -04:00
MichaelScottsman 6dd9c9f052 SteamVR pages: mapped, themed, reviewed and fixed (frame controls, grab bar, Now Playing, settings, bindings, keyboard, overlays) 2026-10-07 00:31:50 -04:00
MichaelScottsman 5e924d3458 Phase 1 checkpoint: Steam UI theme areas, SteamVR page themes, native layer in progress 2026-10-06 23:49:43 -04:00
MichaelScottsman 7ee1310d18 native spikes: scene-graph layering + dmabuf overlays proven
- IVROverlayView reads system overlays (systemui, HeadsetView) but not
  Steam's dmabuf-backed panels
- SteamVR systemui scene graph accepts injected nodes (DOM elements with
  buildNode; submit via module 5723's scheduler): reparent-to-panel +
  panel-anchor + transform + panel shows live crops of Steam's window at
  any 3D offset, and our own dmabuf overlays (needs SetOverlayMouseScale)
- hvgrab: headset-view capture for verification
2026-10-06 22:53:36 -04:00