v2.0.0-beta.4
Pre-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.
EntrainementPanelbuildsbtn_run/btn_cancelunconditionally now (wasstandalone-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 viaresolve_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 pinneddarwin_upscaylSHA256 matched none of upscayl-ncnn's published release assets (stale from an older release), soverify_download_strict()would have refused every install — re-hashed from the current latest release (tag20251207-174704) and added the previously-missinglinux_upscaylhash. Also removed the orphaneddarwin_glomap/linux_glomapkeys: GLOMAP isn't a standalone binary in this codebase, it's invoked viacolmap global_mapper(seebuild_global_mapper_command()), so those keys were dead and unreferenced.SplatTransformEngine: upstream splat-transform renamed--summaryto--stats/--info(the old flag no longer exists);ALLOWED_FLAGS_BOOLEANupdated accordingly, and the new--filter-floatersflag (removes splats not contributing to any solid voxel) was added alongside the existing--filter-nan._launch_splat_transform(): upstream's--decimaterequires the output to be.ply. The panel lets users pickspz/splatoutput 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-.plyformat is selected, so the conflict can't be composed in the first place.SplatTransformPanel: the new--filter-floatersflag 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 andrun_state.entrainement_apresis 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 toshutil.move()the wholeoutput_pathdirectory to acheckpoints_backup_<timestamp>sibling whenever any.plywas found inside it — safe whenoutput_pathwas 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.plyfiles 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 wholeimages/tree (allcam_XXsubfolders, every timestep) tofeature_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 referencehustvl/4DGaussianspipeline, 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) percam_XXfolder intocolmap_reference_frames/before running COLMAP;cam_XX_srcupscale leftovers are excluded. Falls back to the unmodifiedimages/folder for flat, single-camera datasets. Thens-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 withoutsetuptools/wheelhas nopkg_resources, so any dependency falling back to a source build (no prebuilt wheel for the running Python version) failed withModuleNotFoundError: No module named 'pkg_resources'. Now upgradespip setuptools wheeltogether before dependency sync. - Phase 2's Python selection fell back to a bare
python3when nopython3.10-python3.13binary 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 thesetuptools/wheelfix above, since it's pip's isolated build environment (not the app's venv) that lacks a working toolchain for that version. The genericpython3fallback is removed; if no supported version is found, the script now offers to installpython@3.13via Homebrew. An existing venv already built on an unsupported version is also detected and rebuilt automatically on next launch.
- Phase 3 only ran
🔁 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.mdin 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.