Files
T
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

170 lines
5.0 KiB
CSS

/* Glass Shell: the paintbrush on the bar (the glass tuner, device/rt/33-tune.js, flag glassTune) and
its bar popup. Wrapped as html.lgs-on { ... }.
- .lgs-tune: a glass piece of its own after the system capsule, the Home circle's glass and size
(30-bar.css §1: liquid over the room, 80 pp). Its native cover is in theme/layers/30-bar.json.
The button inside is Steam's small bar button (VRDashboardBarSmallButton > Highlight), so
30-bar.css §1.2 lights it like the other discs (laser hover, gamepad focus, the white disc while
its popup is open).
- .lgs-tune-panel: the popup (%{DashboardBarPopupContents}: 30-bar.css §2 draws its panel glass).
One 300 pp column: the colour swatches, then Steam's sliders. Selection is light, never a ring
(P-42, P-43): the chosen colour carries a white dot and the white glow. */
/* 1. The circle */
.lgs-tune {
position: relative;
flex: none;
display: flex;
align-items: center;
justify-content: center;
box-sizing: border-box;
width: 80px;
height: 80px;
background: var(--lgs-mat-liquid-room-bg);
box-shadow: var(--lgs-mat-liquid-shade);
border-radius: var(--lgs-r-capsule);
--lgs-edge: liquid;
}
/* 56 pp disc at a 64 pp pitch, as in the system capsule */
.lgs-tune .VRDashboardBarSmallButton {
font-size: 28px;
padding: 0 4px;
}
.lgs-tune-icon {
display: flex;
width: 24px;
height: 24px;
}
.lgs-tune-icon svg {
display: block;
width: 24px;
height: 24px;
}
/* 2. The panel: about 560 pp tall: Steam's bar popup contents stop at 600 (max-height, overflow hidden) */
.lgs-tune-panel {
box-sizing: border-box;
width: 300px;
max-width: 100%;
padding: 10px 12px 12px;
display: flex;
flex-direction: column;
/* the theme's 64 pp slider capsule, at 40 in this compact column (knob and fill follow it) */
--lgs-slider: 40px;
}
.lgs-tune-title {
font: var(--lgs-type-headline);
color: var(--lgs-text-1);
padding: 0 12px 4px;
}
.lgs-tune-note {
font: var(--lgs-type-footnote);
color: var(--lgs-text-2);
padding: 0 12px 6px;
}
/* a row's name and value on one line */
.lgs-tune-label {
display: flex;
justify-content: space-between;
align-items: baseline;
gap: 12px;
font: var(--lgs-type-subhead);
color: var(--lgs-text-1);
white-space: nowrap;
padding: 2px 12px 0;
}
.lgs-tune-label > span {
font-variant-numeric: tabular-nums;
color: var(--lgs-text-2);
}
/* 2.1 Colour swatches: 8 x 26 pp discs, 7 pp apart (fits 276 pp) */
.lgs-tune-swatches {
display: flex;
justify-content: space-between;
padding: 6px 12px 8px;
}
.lgs-tune-swatch {
position: relative;
flex: none;
width: 26px;
height: 26px;
border-radius: 50%;
background: var(--lgs-sw);
/* a little glass of its own: lit from above, shaded below; no line */
box-shadow: inset 0 1.5px 1.5px -1px rgb(255 255 255 / .55), inset 0 -2px 3px rgb(0 0 0 / .22);
cursor: pointer;
transition: box-shadow var(--lgs-motion-hover-in, 294ms ease), scale var(--lgs-motion-hover-in, 294ms ease);
}
/* None: a clear disc with a diagonal */
.lgs-tune-swatch.is-none {
background: rgb(255 255 255 / .10);
}
.lgs-tune-swatch.is-none::before {
content: "";
position: absolute;
inset: 6px;
border-radius: 50%;
background: linear-gradient(135deg, transparent calc(50% - 1.25px), rgb(255 255 255 / .75) calc(50% - 1.25px),
rgb(255 255 255 / .75) calc(50% + 1.25px), transparent calc(50% + 1.25px));
}
/* the chosen colour: a white dot and the white glow */
.lgs-tune-swatch.is-on::after {
content: "";
position: absolute;
inset: 9px;
border-radius: 50%;
background: rgb(255 255 255 / .95);
box-shadow: 0 1px 2px rgb(0 0 0 / .30);
}
.lgs-tune-swatch.is-on {
box-shadow: inset 0 1.5px 1.5px -1px rgb(255 255 255 / .55), inset 0 -2px 3px rgb(0 0 0 / .22),
0 0 10px 2px rgb(255 255 255 / .35);
}
/* laser hover and gamepad focus: lift and light (no ring) */
&:not(.lgs-input-pad) .lgs-tune-swatch:hover,
&:not(.lgs-input-laser) .lgs-tune-swatch.gpfocus {
scale: 1.18;
box-shadow: inset 0 1.5px 1.5px -1px rgb(255 255 255 / .65), inset 0 -2px 3px rgb(0 0 0 / .22),
0 0 14px 3px rgb(255 255 255 / .45);
}
.lgs-tune-swatch.gpfocus {
outline: none;
}
/* 2.2 Sliders: Steam's own, bare (no label of theirs), fitted like the Control Center's (31-cc.css) */
.lgs-tune-row {
padding: 0 0 4px;
}
.lgs-tune-row %{*GamepadDialogContent>Field} {
padding: 0 4px !important;
margin: 0 !important;
min-height: 0 !important;
background: transparent !important;
box-shadow: none !important;
}
.lgs-tune-row %{*GamepadDialogContent>Field}::after {
display: none;
}
.lgs-tune-row %{*GamepadDialogContent>FieldLeftColumn},
.lgs-tune-row %{*GamepadDialogContent>FieldLeftColumn} > %{*GamepadDialogContent>FieldChildrenWithIcon} {
padding: 0 !important;
margin: 0 !important;
min-height: 0 !important;
}
.lgs-tune-row %{*SliderControlAndNotches>SliderControlPanelGroup} {
padding-block: 0;
}
.lgs-tune-row.is-disabled {
opacity: .45;
}
/* 2.3 Reset */
.lgs-tune-reset {
margin: 6px 8px 0;
min-height: 48px;
border-radius: var(--lgs-r-capsule);
}