Add a Steam Frame bootstrap that downloads and validates the selected release installer,
then runs the existing payload installer. Document latest and versioned install commands.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Remove generated payload files and the source stamp from the repository while
keeping the installer source.
Update the updater and documentation for the shared Studio and Frame Home releases.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Build Frame Home payload in CI
Build the ARM64 headset payload against the glibc 2.39 baseline, validate its ABI,
and pass the generated artifact to Studio packaging.
Add provenance attestations and document CI and local build modes.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The committed frame/payload still had Frame Home from Oct 21, which opens baked
scenes up to v13, while Studio has saved v14 since wall spots were removed: every
environment saved and sent from a release failed on the headset with "baked scene
from a different Frame Studio version".
- frame/payload: frame-home and fenv-tool rebuilt on the Frame from this source
(byte-identical to what is installed there now).
- frame/payload/SOURCE + scripts/frame-payload.sh: records the source the headset
programs were built from; CI checks it in the installer job and in the release
job, so nothing is published beside an outdated headset build.
- fenv-tool version prints the newest baked scene it opens; Studio asks before
Send to Frame and Calculate Best Settings and says to update Frame Home instead
of sending a file the headset can't open.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CI stamps every Studio build with its commit (FRAME_BUILD) and the
release gets latest.json: the commit, Frame Home's identity (a hash of
the headset programs in frame/payload) and the files in the release.
Frame Studio (studio/updater.h): checks a few seconds after start and
every 6 hours (Help > Check for Updates any time). A newer build shows
"Update Available" in the top bar; Download and Install fetches this
computer's build with the system's curl, unpacks it with tar, and swaps
each item in (the old one renamed aside first, so the running copy
keeps working and a failure rolls everything back). Restart Now closes
through the normal unsaved-changes prompt, then starts the new copy;
the next start deletes what was set aside. Local builds never update.
New platform calls: systemTool (System32's curl/tar on Windows) and
launch.
Frame Home (src/switcher.cpp): on the Steam Frame the Environments
panel checks a minute after it starts and every 6 hours. When the
installed programs' hash isn't the release's, "Update Frame Home"
shows beside Restart Frame Home; it downloads FrameHome-installer.zip
and runs its install.sh in its own session (which restarts Frame Home
and the panel), and the new panel says "Frame Home is updated". Also
frame-switcher --check-update / --update from a terminal.
frame/payload: frame-switcher rebuilt on the Steam Frame with this.
Tested: Studio's full cycle (check, download, unpack, swap, relaunch,
cleanup) and its rollback against a local fake release on Windows; the
headset's check and update against a fake release on the Frame (old
panel and Frame Home replaced, then up to date); Linux compile of
Studio; Studio --selftest unchanged (98 passed, same 6 known fails).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The macOS x64 job used the macos-13 runner, which GitHub retired in
December 2025, so it sat in the queue until a newer run cancelled it and
no Intel Mac build was ever made. macos-15-intel is GitHub's remaining
Intel Mac runner (supported until August 2027). It stays a native Intel
build, since the MoltenVK bundled from Homebrew is the runner's own arch.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GitHub's Windows runners are x64, so arm64 is a cross build. vcvarsall
sets up the ARM64 compiler, but CMake still reported the build machine's
own CPU (AMD64) as the target. astcenc then built its SSE4.1 version and
opus turned on its x86 SIMD files, neither of which compiles for ARM.
build_windows.bat now passes CMAKE_SYSTEM_NAME/CMAKE_SYSTEM_PROCESSOR
whenever the target differs from the build machine (arm64 from x64,
x86 from x64, x64 from an ARM PC).
Checked with MSVC 14.51: arm64 failed before this and builds after it
(the exe is ARM64); x86 and x64 still build.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every Windows job and Linux x86 were failing; reproduced each locally (MSVC 18
x64/x86, gcc -m32) and fixed:
- studio.cpp: thumbnail buffers were named `small`, which Windows' rpcndr.h
#defines to `char`, so MSVC saw `std::vector<u8> char(...)`. Renamed to
`scaled`. (All three Windows builds.)
- 32-bit x86: astcenc's SSE4.1 code calls __builtin_popcountll on 32-bit
MSVC, which doesn't exist; 32-bit builds now use astcenc's plain backend.
- opus defaulted to the DLL C runtime while the app links the static one;
x86 MSVC can't link that mix (__except_handler4_common). OPUS_STATIC_RUNTIME.
- 32-bit gcc/clang: turn on SSE2 (-msse2 -mfpmath=sse) as MSVC does; rtm
(under ACL) uses SSE intrinsics on any x86.
- CI Linux x86: install the i386 X11 dev packages; GLFW couldn't find a
32-bit libX11 to link.
The x86 and x64 Windows builds pass the same --selftest checks (97/104; the
7 failures are pre-existing and identical on both).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The release job depended on every build job, including the macOS Intel
runner, which can sit in GitHub's hosted queue for hours. Because a new
push cancels the in-progress run (concurrency: cancel-in-progress) and a
cancelled run skips Publish (if: !cancelled()), no run ever lived long
enough to create the "latest" release. Drop macOS from the release job's
needs so it publishes once Linux, Windows and the installer are done;
both Mac builds still run and are attached whenever they finish in time.
Also add timeout-minutes to every job so nothing can hang on GitHub's
6-hour default again.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The welcome screen (title, Open button, My Environments and Recent lists)
hardcoded dark greys for its backdrop, cards and muted text, so it ignored
the theme system and looked wrong on light themes especially. Now it draws
from the theme tokens: the backdrop is the theme's base background and the
cards sit a step lighter on it (kPanel, hovering to kWidgetHover with a blue
edge), the empty-state text is kDim, and the "file missing" rows read as a
subdued grey chip on any theme.
The kind chip (E / H / M) is now a solid saturated tile with a white initial
instead of a faint tint, so it stays legible and distinct in light and dark.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Deletes pc-streaming/ (the experimental Windows D3D11 compositor proxy that
tried to make a home SteamVR's environment on a tethered PC, with its .def,
installer .ps1/.bat and notes) and everything that pointed at its files:
- CMakeLists: the frame-home-d3d11 proxy target.
- build-studio.sh: the Windows pc/ staging and the d3d11.dll build step.
- CI: the pc-home-windows job and the Windows Studio job's download/staging
of FrameHome-PC-windows-x64.
- Studio: the Windows branch of the "This PC" installer (it ran the deleted
.ps1); the feature is now Linux-only, where it installs the Vulkan layer.
- README and docs: the Windows PC download row, the PC-streaming highlight,
and the dead Frame-Home-on-a-PC / pc-steamvr.md links.
FRAME_HOME_PC and the runtime OpenVR/Vulkan loader stay, so Frame Home still
builds for a PC; only the pc-streaming folder and its wiring are gone. The
Linux PC layer (layer/) and its install path are untouched.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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>
Viewport shading toolbar: a thin divider now separates the world-layer
overlay toggle from the Wireframe/Solid/Material shading buttons, so the
two groups read as distinct sets of controls rather than a run of icons.
Properties tab column: the open tab gets a blue accent bar on its left
edge, and the tab icons are theme-aware (the active and hovered icons use
the theme's text colour, the rest its muted colour) instead of hardcoded
greys that washed out on light themes.
README and the Studio guide now cover the navigation gizmo (drag to orbit,
click an axis to snap to that view) and the Window > Theme palette.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The X/Y/Z axes at the top-right were a static readout; now they work like Blender's navigation gizmo. Drag the ball
to orbit the view; click an axis to snap to that orthographic view (X right/left, Y top/bottom, Z front/back, reusing
viewFrom). Negative axes show as hollow rings, the ball under the pointer is highlighted, and while the gizmo has the
mouse the viewport doesn't also orbit or select.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The editor's palette is now a theme's, not a fixed set of constants, chosen under Window > Theme and kept in
studio-settings.txt. Ten themes come straight from MetaDB's own CSS tokens (Dark, Midnight, Forest, Forest Deep,
Ember, Terminal, Contrast, Paper, Light) — a handful of tokens per theme, from which the editor's many greys are
derived (mix()), so light and dark both read right. The theme is applied after ImGui is initialised (its init resets
the style), so a saved theme takes on startup.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The PC compositor-layer work (the Direct3D 11 proxy, its installer, its notes) now lives in pc-streaming/, clearly
separate and marked experimental, so the main project is the Steam Frame build and the fixes that help it. The PC
layer can't change the Steam Frame's home (the Steam Frame renders it on the headset), and this keeps it from
crowding the Steam Frame release while preserving it for a tethered PC headset.
The shared Windows renderer support (src/, behind #ifdef _WIN32 / FRAME_HOME_PC) stays put: it only compiles into a
PC build and never touches the Steam Frame build. Build and README references updated to the new paths.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A probe in vrserver and the device/draw diagnostics established that the Steam Frame renders its home on the headset,
not on the PC (the compositor draws nothing, the vrlink streaming driver makes no environment shaders), so a PC-side
layer can't change its home. Kept as the record of that investigation.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The compositor records its environment on a deferred D3D11 context, a different object with its own vtable than the
immediate context we hooked — so our draw hooks never saw it and the home never replaced Aurora (connected, but 0
draws). Hook every context's vtable: the immediate one, and each deferred one as CreateDeferredContext /
CreateDeferredContext1 makes it, keeping each vtable's own original draw/PSSetShader so calls dispatch correctly.
classify and the constant-buffer upload now work on whichever context records the draw.
Also fix the crash guard false-tripping: it armed when Frame Home connected and disarmed only after 30 drawn frames,
so when the home never drew (this very bug) every compositor restart counted as a crash and it wrote . Arm only
once we actually swap a draw, so never-drawing can't be mistaken for crashing.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
On a real headset the layer connected but replaced nothing, so the compositor draws its environment through a path
the layer wasn't catching. Track the bound pixel shader per device context (not only the immediate one we hooked, in
case the environment is recorded on a deferred context), name every pixel shader from its .fxo, and the first time
each is drawn log its name and whether it was on our context or another. The 5-second heartbeat now always prints
(home draws, distinct shaders seen here/other, connected). This makes one short headset session show exactly which
shaders and context the environment uses, to aim the fix. The diagnostic stops itself after a few seconds of draws.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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>
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>
frame-home.exe and frame-switcher.exe were console-subsystem binaries, so a console window popped whenever SteamVR
or the panel launched them. Build them as Windows GUI apps (-mwindows; they already log to a file, never a terminal,
since stderrIsTerminal() is false on Windows), so nothing shows a console.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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>
- 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>
- 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>
- 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>
- 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>
- ImGui's docking branch (1.91.5): the 3D Viewport, Outliner, Properties and Timeline are areas on a gutter, each
with a header. Drag an area by its header's editor button to dock it elsewhere (as a tab, or splitting an area);
click it to show another editor there. Layouts are kept between runs; Window > Reset Layout restores them.
- Workspaces in the top bar: Layout, Walking, Headset. Ctrl+Space maximizes the 3D Viewport.
- 3D Viewport header: Arrange / Draw Floor, View, Select, Add, Object menus, Global / Local, the world layer and
shading (Material, Solid, Wireframe; GPU Cost, Overdraw, Leave Out in its menu). In the view: the toolbar (T), a
chip naming the home and selection, navigation buttons under the axes, a sidebar (N: Item, Tool, View).
- Properties: tabs as icons down its left edge (Object, World, Environment, Bundle, Headset); sections are panels on
lighter boxes; labels right-aligned in a column. Sound is part of the Environment tab.
- Timeline: transport in its header, a ruler in seconds with the playhead. Status bar: what the mouse does.
- Keys: Shift+A add menu, X asks before deleting, F3 menu search, Alt+A, Space, Numpad 1/3/7 views, T, N.
- Inter (SIL OFL) built in as the interface font; a palette of cool greys, one blue, Frame Studio's orange.
- ImGui patches (marked Frame Studio): the submenu triangle, and dropdown arrows drawn small on the field.
- Self-test: an area dragged to dock elsewhere, Reset Layout, workspaces, F3 (104/104).
- Guides follow the new menus.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 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>
- 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>
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>
- LICENSE: GNU Affero General Public License v3 (as the author's MetaDB),
shipped in every package; third_party/qhe/LICENSE.md keeps Quest Home
Editor's MIT terms for the code that started there
- Install on Steam Frame lives in the Inspector's Headset tab (no floating
window); FS_INSPECTOR_TAB=<tab> starts Studio on a tab
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Getting started, headset setup, installing and using Frame Home, the .fenv
format and fenv-tool, performance, building, troubleshooting, and an index.
Stubs for the Studio guide and bundles.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 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>
- a newer push to the same branch cancels the run it replaces
- the Latest build pre-release gets every build that worked; a v* tag needs all
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ImGuizmo is compiled with -fno-strict-aliasing on GCC/Clang: its type
punning let Clang for x64 turn gizmo drags into NaN transforms
- 32-bit: the .fenv packer keeps LZMA within a 32-bit address space (saves
failed with out-of-memory); failed saves are logged
- std::to_string of file times and the 32-bit descriptor handle cast compile
on every standard library
- Linux fonts: Noto Sans, then Liberation Sans, then DejaVu; the Play/Pause
button sizes to its label; macOS fonts are rasterized at Retina density
- self-test stages allow at least 3000 frames (software GPUs draw ~30 a second)
- headset payload rebuilt from this source
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>