v0.2.0: splats, copy/paste, faster homes, seat facing, and a full bug sweep

Frame Studio
- Gaussian splats (PLY, SPZ v2-v4), PLY vertex colours, panorama skies
- Copy, cut, paste and duplicate for objects, splats and world items
- Walkable-area rebake moved off the UI thread; viewport one frame sooner;
  refresh-locked pacing (FS_PACE=timer for the old one)
- Fixed: bundle thumbnail use-after-free crash, auto-save deleting
  environments, saves into scratch copies, edits lost on non-ASCII paths,
  unopenable manifests with inf/nan, bundle save data loss, opening a home
  marking it changed, gizmo NaN, long paths, many malformed-file crashes
- Updater verifies sha256, journals the swap and never leaves the exe missing

Frame Home
- Seats turn you to face their way
- Draw batching (Hand Tutorials up to ~20% less GPU time), cut-out EQUAL pass,
  late head-pose read before submit
- Proper queue-family hand-over to the compositor layer; layer descriptor
  generations and seqlocked slots; structural SPIR-V check
- Fixed: hangs/crashes on damaged .fenv files and shaders, render-pass
  validation error, sync hazard in the foveation smoothing pass, unverified
  update downloads, half-done installs

Tests: tests_loco/env_share/spv_check wired into CMake (FRAME_TESTS) and CI.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VsaXGU27gsrXjDoFtyFJP9
This commit is contained in:
ToastconcernandClaude Opus 5.5 committed 2026-10-25 13:15:07 -05:00
1 parent d8e5d9e71e
commit 6d0b4fcd2f
544 files changed
+210660 -796

No files matched your search

+19 -16
View File
@@ -152,26 +152,29 @@ int run(const std::string& commandLine, const fs::path& workingDir, std::string&
// Both ends close on exec: a command started meanwhile by another thread (Send to Frame and Install run at once)
// must not inherit this pipe, or its reader never sees the end. The child's own copies (dup2) stay open.
int pipeFds[2];
{
static std::mutex creating; // (no pipe2 on macOS: made and marked as one step)
std::lock_guard<std::mutex> lock(creating);
if (::pipe(pipeFds) != 0) return -1;
::fcntl(pipeFds[0], F_SETFD, FD_CLOEXEC);
::fcntl(pipeFds[1], F_SETFD, FD_CLOEXEC);
}
posix_spawn_file_actions_t actions;
posix_spawn_file_actions_init(&actions);
posix_spawn_file_actions_addopen(&actions, 0, "/dev/null", O_RDONLY, 0);
posix_spawn_file_actions_adddup2(&actions, pipeFds[1], 1);
posix_spawn_file_actions_adddup2(&actions, pipeFds[1], 2);
posix_spawn_file_actions_addclose(&actions, pipeFds[0]);
posix_spawn_file_actions_addclose(&actions, pipeFds[1]);
// (the working directory through the shell: posix_spawn_file_actions_addchdir isn't everywhere yet)
const std::string line = workingDir.empty() ? commandLine : "cd " + shellQuote(workingDir.string()) + " && " + commandLine;
const char* argv[] = {"/bin/sh", "-c", line.c_str(), nullptr};
pid_t pid = -1;
const int spawned = posix_spawn(&pid, "/bin/sh", &actions, nullptr, const_cast<char* const*>(argv), environ);
posix_spawn_file_actions_destroy(&actions);
int spawned;
{
// (no pipe2 on macOS: made, marked and handed to the child as one step, so another thread's spawn can't
// catch the pipe in between, still inheritable, and keep it open)
static std::mutex creating;
std::lock_guard<std::mutex> lock(creating);
if (::pipe(pipeFds) != 0) return -1;
::fcntl(pipeFds[0], F_SETFD, FD_CLOEXEC);
::fcntl(pipeFds[1], F_SETFD, FD_CLOEXEC);
posix_spawn_file_actions_t actions;
posix_spawn_file_actions_init(&actions);
posix_spawn_file_actions_addopen(&actions, 0, "/dev/null", O_RDONLY, 0);
posix_spawn_file_actions_adddup2(&actions, pipeFds[1], 1);
posix_spawn_file_actions_adddup2(&actions, pipeFds[1], 2);
posix_spawn_file_actions_addclose(&actions, pipeFds[0]);
posix_spawn_file_actions_addclose(&actions, pipeFds[1]);
spawned = posix_spawn(&pid, "/bin/sh", &actions, nullptr, const_cast<char* const*>(argv), environ);
posix_spawn_file_actions_destroy(&actions);
}
::close(pipeFds[1]);
if (spawned != 0) { ::close(pipeFds[0]); out = "could not start: " + commandLine; return -1; }
char buf[4096];