Skip to content

v2.0.0-beta.4

Pre-release
Pre-release

Choose a tag to compare

@freddewitt freddewitt released this 17 Sep 12:30
· 61 commits to beta since this release

✨ Added

  • Training tab now has its own local Launch/Cancel button. Previously, starting Brush independently (outside the full pipeline chain) was only possible from the separate OUTILS → Brush module. EntrainementPanel builds btn_run/btn_cancel unconditionally now (was standalone-only); StudioWindow._launch_entrainement() wires it to the same _build_brush_worker() used by the pipeline chain (dataset resolved from the Source panel's output path + project name, checkpoints via resolve_checkpoints_dir()) — not the manual path fields used by the standalone Brush module, which would resolve to the wrong folder for this tab.

🐛 Fixes

  • Third-party dependency audit: stale checksums and drifted CLI flags. Reviewed every third-party binary/CLI CorbeauSplat integrates against its upstream repo (upscayl-ncnn, COLMAP/GLOMAP, Brush, ml-sharp, nianticlabs/spz, playcanvas/splat-transform, playcanvas/supersplat, vercel/serve, 360Extractor). Fixes applied:

    • checksums.json: the pinned darwin_upscayl SHA256 matched none of upscayl-ncnn's published release assets (stale from an older release), so verify_download_strict() would have refused every install — re-hashed from the current latest release (tag 20251207-174704) and added the previously-missing linux_upscayl hash. Also removed the orphaned darwin_glomap/linux_glomap keys: GLOMAP isn't a standalone binary in this codebase, it's invoked via colmap global_mapper (see build_global_mapper_command()), so those keys were dead and unreferenced.
    • SplatTransformEngine: upstream splat-transform renamed --summary to --stats/--info (the old flag no longer exists); ALLOWED_FLAGS_BOOLEAN updated accordingly, and the new --filter-floaters flag (removes splats not contributing to any solid voxel) was added alongside the existing --filter-nan.
    • _launch_splat_transform(): upstream's --decimate requires the output to be .ply. The panel lets users pick spz/splat output while decimation is enabled, which would fail at the CLI. Now blocked at launch time with a clear error instead of a silent CLI failure; the Decimate field also greys itself out in the panel the moment a non-.ply format is selected, so the conflict can't be composed in the first place.
    • SplatTransformPanel: the new --filter-floaters flag is now exposed as its own "Supprimer îlots isolés" checkbox next to "Supprimer splats dégénérés" — distinct filters (isolated floating points vs. NaN/degenerate splats), both now reachable from the UI.
  • Reconstruction: the panel's own local Lancer button ignored the "Run Brush" checkbox. The Reconstruction panel's standalone Lancer button (_launch_reconstruction()) ran COLMAP through the same generic _start_tool_worker()/_on_tool_finished() path as every other OUTILS module, which never chains into subsequent pipeline steps — unlike the global Source-tab Lancer, which walks the full plan via _run_pipeline_step(). This made the "Run Brush" checkbox visible in that same panel misleading: checking it had no effect when this button (rather than the global one) was used to launch a reconstruction. Now _launch_reconstruction() also wires _on_reconstruction_standalone_finished(), which chains into _launch_entrainement() (the same safe Brush launch used by the Training tab) when the reconstruction succeeds and run_state.entrainement_apres is checked.

  • Brush: starting a new training could move an entire unrelated folder tree instead of just archiving old checkpoints. BrushWorker.run()'s "new" mode used to shutil.move() the whole output_path directory to a checkpoints_backup_<timestamp> sibling whenever any .ply was found inside it — safe when output_path was genuinely the checkpoints folder, but a wrong path (e.g. the standalone OUTILS → Brush module pointed at a project root) relocated everything in that directory, not just checkpoints. Now only the matching .ply files are moved into the backup (relative subpath preserved); the output directory and everything else in it are left untouched. Added regression tests (tests/test_workers.py) covering unrelated content staying in place and the no-existing-checkpoints case.

  • 4DGS: COLMAP ran SfM on every extracted frame of every camera instead of one synchronized snapshot. FourDGSEngine.run_colmap() passed the whole images/ tree (all cam_XX subfolders, every timestep) to feature_extractor/mapper, violating COLMAP's static-scene assumption — matching frames from different instants of a moving scene produces invalid correspondences and corrupts the reconstruction. Confirmed against the reference hustvl/4DGaussians pipeline, which runs SfM on exactly one frame per camera and reuses those poses for every timestep. New _build_static_reference_set() stages one frame (first by name) per cam_XX folder into colmap_reference_frames/ before running COLMAP; cam_XX_src upscale leftovers are excluded. Falls back to the unmodified images/ folder for flat, single-camera datasets. The ns-process-data (nerfstudio) path was not audited for the same issue.

  • Launcher: fresh venvs could fail building packages without a precompiled wheel (e.g. pyobjc on a very recent Python release). Two compounding issues in CorbeauSplat.command:

    • Phase 3 only ran pip install --upgrade pip; a venv without setuptools/wheel has no pkg_resources, so any dependency falling back to a source build (no prebuilt wheel for the running Python version) failed with ModuleNotFoundError: No module named 'pkg_resources'. Now upgrades pip setuptools wheel together before dependency sync.
    • Phase 2's Python selection fell back to a bare python3 when no python3.10-python3.13 binary was found by name, which can silently resolve to an untested newer release (e.g. 3.14) with no wheel yet for some dependencies — reproducing the same pyobjc build failure regardless of the setuptools/wheel fix above, since it's pip's isolated build environment (not the app's venv) that lacks a working toolchain for that version. The generic python3 fallback is removed; if no supported version is found, the script now offers to install python@3.13 via Homebrew. An existing venv already built on an unsupported version is also detected and rebuilt automatically on next launch.

🔁 Changed

  • General Settings window slimmed down to app-wide preferences only. Theme, Language, and end-of-run notifications remain; the app identity footer (name + version, centered, small font) and a "View changelog" link (opens CHANGELOG.md in the OS default app) now sit at the bottom, with extra spacing below the notifications checkbox.
  • Config Load/Save/Delete and factory reset moved to the Project panel. These are project-workflow actions, not app-wide preferences — they now live in a "Current settings" block in the Project tab's right sidebar, below Automation, instead of the General Settings window.

🌍 i18n

  • New key settings_changelog_link (changelog link label). All 9 locales updated.
  • New key err_decimate_ply_only (SplatTransform decimate/format conflict error). All 9 locales updated.
  • New key st_filter_floaters (SplatTransform "Supprimer îlots isolés" checkbox). All 9 locales updated.