Commit Graph
15 Commits
Author SHA1 Message Date
ToastconcernandClaude Opus 4.8 64ad00fa1d Remove wall spots
Wall spots were markers for where SteamVR panels/windows could dock on a
home's walls (Meta's WallPlacementComponent). Removed the feature end to
end: the WorldWallSpot type and its JSON/binary serialization, the loader
that read WallPlacementComponent, auto-generation of spots and the hotspots
placed in front of them, the Studio editor's Wall Spot kind (Add menu,
properties, overlay draw, picking, selection, report), the debug overlay,
the home report counts, and the walktest viz. The PanelDock subsystem
(src/panel_dock.h) existed only to dock panels onto wall spots and is
deleted with its use in Frame Home's frame loop.

Baked scene format is bumped to v14: new bakes omit wall spots, and older
baked scenes still load (the wall-spot block is read past). Collision walls
(WorldCollider::Wall) are unaffected — only the panel-placement markers are
gone. Docs updated.

Note: the pre-existing FRAME_HOME_PC Windows build break in walkgrid.h
(the `near` macro) is unrelated and left as-is.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-21 23:22:34 -05:00
ToastconcernandClaude Opus 4.8 b95fd82647 Decode HDR-encoded colour ASTC textures, not just linear ones (fixes the Focused vista)
Some environments store colour (sRGB) textures as HDR-encoded ASTC — the Focused vista's sky, water and glow. The
LDR decoder fills those with magenta error texels (the vista showed a huge magenta plane). We already re-decode
linear UNORM textures through the HDR profile for the same reason; do it for colour textures too: when the LDR decode
comes back mostly magenta, re-decode through the HDR profile and sRGB-encode the clamped linear colour so the sRGB
view samples it right (alpha stays linear). Verified by rendering the vista before/after. (A few of the vista's
special detail textures are neither plain LDR nor plain HDR colour and still look speckled; left for a follow-up.)

Also: a GUI-subsystem Windows build now sends the tool modes' log (--snapshot, --panorama, --bench) to the file,
since there's no console for them.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-21 20:19:17 -05:00
ToastconcernandClaude Opus 4.8 996c447a55 Environments panel: load Windows fonts too, so its text shows on a PC
The panel's fonts were loaded only from the Frame's Linux paths (/usr/share/fonts), so on a Windows PC none loaded
and almost no text drew. Try Windows' own Segoe UI and Arial after the Frame's Noto/DejaVu, so each weight has a real
font on either platform. Verified by rendering the panel headless (--render): all text is back.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-21 20:03:05 -05:00
ToastconcernandClaude Opus 4.8 d22cc04cb3 Frame Home as the real SteamVR environment on a PC (Windows too), not a home app
On the Steam Frame a layer inside SteamVR's compositor draws the home where it would draw Aurora, so the home is the
environment itself: at boot, during game loads, behind the Steam menu, with the controllers and passthrough, and it
steps aside for a game the instant it opens. On a PC this was faked with SteamVR's home-app slot and a flat 360 photo
in the gaps, which launched and handed off like an app and showed a picture, not the live home. This does it properly
on any PC that runs SteamVR, the Frame's way:

- Windows: the compositor is Direct3D 11, so the layer is a proxy d3d11.dll beside the compositor (layer/
  frame_home_layer_d3d11.cpp, built from the .def that forwards every other export to the real d3d11.dll, kept as
  fh_d3d11real.dll). It wraps the compositor's device, finds Aurora's draws by their shader bytecode and draws the
  home over the sky, leaving the floor and stars off; everything else passes straight through. Pure pass-through in
  any process that isn't vrcompositor.
- The home's frames cross from Frame Home (Vulkan) to the compositor (D3D11): the layer owns kSlots shared textures
  and hands Frame Home their NT handles over a named pipe; Frame Home imports them (VK_KHR_external_memory_win32) and
  renders into them. No cross-API lock — a slot is published only once the GPU has finished it and the four rotate,
  as on Linux. The shared State stays Frame Home's.
- The Environments panel runs frame-home --system and keeps it alive (one at a time, a pid file across panel
  restarts), the same systemEnv path as the Frame. The installer places/removes the proxy and marks the layer with a
  root/layer folder, in place of the old home-app registration and background pictures.
- Safe like the Vulkan layer: no home, or one stale over half a second, and the compositor draws Aurora as usual;
  the layer turns itself off after two unhealthy compositor starts, and root/layer/off turns it off by hand.

Linux keeps its Vulkan layer (unchanged). Verified without a headset on the null driver: the proxy loads and wraps
the compositor without crashing, recognises Aurora's shaders, and the frame hand-over completes (Frame Home connects,
imports the textures, renders). The compositor only draws the environment while presenting to a headset, so the final
on-headset image is the one step the null driver can't exercise.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-21 19:39:36 -05:00
ToastconcernandClaude Opus 5.5 283e19f87c Frame Home on a PC: smooth switching, a paced benchmark, measured on all 48 homes
- Switching homes fades through black in a scene app too (SteamVR's compositor fade), and the home stays black
  until its textures are in and 45 frames in a row are on time: Windows makes new GPU memory resident on first use,
  so a just-loaded home stalled for a second or two (100 ms frames) after its textures were up.
- Auto resolution remembers where each home settled (autoscale.txt) and starts there; far over budget it steps
  down further at once: a heavy home after a light one no longer starts at the light one's 150%.
- stats.json: fade, and hitchesShown (late frames while fully shown).
- Windows: the benchmark's pacing sleeps on the clock it measures with (it ran unpaced at 700+ fps).
- Measured on this PC (RTX 3060): all 48 homes walked by the benchmark at 2000x2000 per eye with 4x MSAA, paced
  120 Hz with snap turns, teleports and head whips: 0.19% of 115k frames over budget, the hand tutorials worst.
  On SteamVR's virtual headset: every home switched to by the panel, loaded, pictured, SteamVR's background made for
  each; light/heavy switches with no late frames shown; a game taking the scene and handing it back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 17:18:01 -05:00
ToastconcernandClaude Opus 5.5 4d058a9e7a Frame Home runs on SteamVR on a Windows PC (tested on SteamVR's virtual headset)
- vr_compat.h: GetProjectionMatrix / GetEyeToHeadTransform called with Microsoft's member ABI on MinGW builds
  (SteamVR is built with MSVC; the hidden return pointer goes after this): the first frame crashed there.
- When SteamVR asks it to quit (a game, room setup), Frame Home leaves at once instead of waiting for a load (SteamVR
  killed it after 5 s).
- The panel keeps SteamVR's home app running on a PC: SteamVR doesn't start it again after it stopped on its own.
- Logs on Windows: the environment and the panel always write logs/frame-home.log and logs/frame-switcher.log (SteamVR
  gives them a hidden console); the panel logs to a file on the headset too now. A crash writes the exception and the
  stack's return addresses there.
- Tested on SteamVR's null driver: Frame Home started by SteamVR as its home app, the panel with it, SteamVR's
  background made from the home, a crash recovered in seconds, 0.79 ms GPU at 1976x1976 per eye with 4x MSAA.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 15:45:28 -05:00
ToastconcernandClaude Opus 5.5 1863e495d2 Installers never start SteamVR to register; headset payload rebuilt
- frame-home --install/--uninstall and frame-switcher --install/--uninstall check for SteamVR's server first: on
  Windows, connecting as a utility started SteamVR. Not running: exit 3 and the installer writes SteamVR's config
  files, as on the headset.
- frame/payload: Frame Home, the panel, fenv-tool and the compositor layer built on the Steam Frame from this
  source (installed there; locomotion tests 0 failed).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 15:03:09 -05:00
ToastconcernandClaude Opus 5.5 3469b77ca3 Frame Home on a PC with SteamVR (Windows, Linux); thumbnails from the spawn
- src/home_platform.h: what Frame Home and the panel need from the system (paths, finding and stopping each
  other, running a tool, restarting, priorities) for SteamOS, Windows and Linux PCs. On a PC the environments are
  Frame Studio's My Environments; Frame Home's own files in %LOCALAPPDATA%\Frame Home (Windows).
- src/openvr_loader.cpp: a PC build finds SteamVR's own OpenVR library at run time (openvrpaths.vrpath), so it runs
  on any PC with SteamVR; Vulkan through volk. CMake: FRAME_HOME_PC (default on Windows and x86-64 Linux); the Steam
  Frame build is unchanged.
- Windows: Frame Home is SteamVR's home app; SteamVR's classic environment shows a 360-degree picture of the current
  home from its spawn (frame-home --panorama --spawn, made by the panel when the home changes) instead of Aurora
  while Frame Home starts. Linux PCs: the Steam Frame's compositor layer, as on the headset.
- frame/pc: install-frame-home-pc.ps1 (+ .bat): online through SteamVR's API or offline in its config files; the
  SteamVR settings it changes are saved and restored exactly on -Uninstall (tested in a sandbox both ways).
  frame-switcher --uninstall. Studio: Properties > Headset > This PC installs it from pc/ beside Studio.
- Packaging and CI: pc/ in the Windows x64 and Linux x64 Studio downloads; FrameHome-PC-windows-x64.zip.
- Thumbnails come from where Frame Home starts you (the first spawn, eyes 1.6 m up): Studio's saves and the
  panel's (frame-home --snapshot --spawn).
- docs/pc-steamvr.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 14:37:49 -05:00
ToastconcernandClaude Opus 5.5 e9d670b755 Invisible walls: placed in Studio, and Meta's converted; Planet removed; submenu safe triangle
- World > Add > Invisible Wall: a 2 x 2.5 m box (Object role) standing on the floor across the view. Frame Home
  never draws it; it stops you and is never stood on.
- Meta's invisible walls (a solid collider with nothing drawn, 2 m or taller: Cascadia's, Space Station's, Desert
  Terrace's, Haven's) load as invisible walls instead of surfaces, so the play space they bound holds.
- Walk grid: a drawn floor's edge exemption no longer applies within a body's radius of a wall, so a wall through a
  drawn floor takes that floor away. tools/walktest/wallcheck: walls at every angle never have walkable area inside.
- New items land on the home's own surfaces when the spot is beyond the walkable area.
- The Planet (World > Add > Planet, Planet Pull) is gone; older files' planet zones still load.
- ImGui menus: a safe triangle from where the pointer was on the item to the whole submenu; crossing other items
  on the way neither opens them nor closes it (resting 0.3 s still does).
- Self-test: invisible wall placed, walked into (with and without the area), through a drawn floor, undone (98/98).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 13:44:56 -05:00
ToastconcernandClaude Opus 5.5 8b0c2aa5a3 Studio: bundles (Bundle menu and Inspector tab), Sound into the Environment tab, tab labels no longer clipped
- Bundle tab: name, environments with their pictures (read in place), add the open one / My Environments / any
  .fenv, reorder, remove, double-click to open (unpacked first), Save / Save As, Install on Steam Frame (onto the
  Headset tab's list), Unpack into My Environments. Saving and unpacking run in the background.
- .fbundle opens from File > Open, the Bundle menu or a drop; the installer takes bundles and shows the first .fenv.
- HslRenderer::createPicture / releasePicture for UI thumbnails.
- Inspector tabs: ImGui draws a tab's label with the padding at BeginTabBar, so the snug padding is pushed there too.
- Self-test: bundle make, save, validate, reopen and unpack (93/93).
- docs/bundles.md written; Studio guide and README follow.
- Linux: no GLFW_INCLUDE_NONE redefinition, freopen's result checked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 12:44:57 -05:00
ToastconcernandClaude Opus 5.5 95ccea95ca Merge environment bundles (.fbundle); track astcenc's CMakeLists.txt and LICENSE.txt
astcenc's own .gitignore excluded them, so a fresh clone could not configure.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 12:27:01 -05:00
ToastconcernandClaude Opus 5.5 d8abf2c438 Environment bundles (.fbundle): several .fenv files in one, each its own environment
src/fenv_bundle.h: a ZIP of bundle.json and the .fenv files stored as-is, copied
in pieces (zip64 from the start when 4 GB or more). Write, read the manifest,
read one environment's fenv.json + thumbnail in place, unpack all or one
(.part then rename, checksummed; never replaces a different file: "name 2"),
validate.

fenv-tool bundle / unbundle, and info lists a bundle's environments. The
switcher unpacks bundles dropped into envs/ into their environments and
deletes them (frame-switcher --unpack-bundles does it at once). The installers
copy .fbundle files alongside .fenv; only a .fenv sets the one shown.
tools/bundletest checks it against real environments (--big: past 4 GB).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 12:26:16 -05:00
ToastconcernandClaude Opus 5.5 5b449908e4 Docs follow the Headset menu and tab; tune's usage and settings comments corrected
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 12:22:22 -05:00
ToastconcernandClaude Opus 5.5 cdbd98f04b Studio: editor-dock layout
- the window is laid out as an editor dock: a tool strip (drawn icons) on the
  left edge, the Explorer, the 3D view, and a tabbed Inspector on the right
  (Selected, World, Environment, Sound, Headset); the timeline and the status
  bar run along the bottom
- the old one-piece properties panel is split into one function per tab;
  selecting something shows the Selected tab
- the Frame menu is now Headset (and opens the Headset panel); the tuning
  tooltip describes the paced walk

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 12:18:39 -05:00
ToastconcernandClaude Opus 5.5 f7345a5ac3 Frame Studio and Frame Home: cross-platform builds
Frame Studio now builds for Windows (x64, x86, ARM64), Linux (x64, x86, ARM64)
and macOS (Apple Silicon, Intel):
- studio/platform.h with Win32 and POSIX implementations (dialogs through
  tinyfiledialogs on Linux/macOS), a GLFW window beside the Win32 one, and a
  platform-neutral frame pacer
- MoltenVK support in the renderer (portability enumeration) and bundled in
  the macOS app
- 32-bit builds: large-address-aware, LZMA packing within a 32-bit address space
- unaligned file reads in the loaders go through loadUnaligned (no UB)
- scripts/build-studio.sh, studio/build_windows.bat [x64|x86|arm64],
  cmake/llvm-mingw.cmake, and a GitHub Actions workflow building every target

Frame Home installs without Studio: frame/install-frame-home.{sh,ps1} and
"Install Frame Home.bat" (packaged as FrameHome-installer.zip).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 12:03:25 -05:00