Skip to content

Project Manager, Online Gallery, Faster Training and Lower VRAM

Latest

Choose a tag to compare

@MrNeRF MrNeRF released this 09 Oct 13:02
· 76 commits to master since this release

Release overview video: https://www.youtube.com/watch?v=DIcGFMeBSXU

What's Changed

  • CUDA Streams by @MrNeRF in #1302
  • Feature: Camera Frustum Visibility Shortcut by @kmeirlaen in #1323
  • Keep Set Pivot Available Across Editing Tools by @kmeirlaen in #1324
  • Window Resize Behavior by @kmeirlaen in #1326
  • Window Resize Plugin Panel Bugfix by @kmeirlaen in #1329
  • #1327 fix(sequencer): disable toolbar button while training is active by @tritolol in #1332
  • Resize Training Pause Bugfix by @kmeirlaen in #1330
  • fix(sequencer): gate on isTraining instead of isToolsDisabled by @tritolol in #1333
  • Ability to use CTRL-X to cut splats by @kmeirlaen in #1334
  • Harden startup plugin loading and add progress feedback by @francescofugazzi in #1297
  • Fix logging panel action layout by @kmeirlaen in #1343
  • Fix duplicate frames in full GPU video frame extraction by @kmeirlaen in #1342
  • Fix 10-bit hardware-decoded video frame colors by @kmeirlaen in #1341
  • Fix Plugin Marketplace Confirm Overlay Hover Glitch by @kmeirlaen in #1347
  • Fix Issue 1301: Tooltip Cache Invalidation Fix by @kmeirlaen in #1348
  • COLMAP Text Import Performance by @kmeirlaen in #1344
  • Issue 1208: Viewport Shortcut Focus Fix by @kmeirlaen in #1352
  • COLMAP Minimum Track Length Filter by @kmeirlaen in #1349
  • l10n(zh): reorder to en.json order and fill missing keys by @LeoYiMon in #1357
  • fix(l10n): sync missing keys, reorder, add --lang filter to validate_localization by @LeoYiMon in #1356
  • Fix - PPISP Correction Has No Effect In VkSplat Viewport by @kmeirlaen in #1355
  • Various fixes: frustum picking, point cloud selection, file menu, toolbar, and crop tools (box + ellipsoid) by @francescofugazzi in #1351
  • Brush Selection Commit Uses Preview Mask by @kmeirlaen in #1358
  • VkSplat Training Viewport Stability by @kmeirlaen in #1361
  • VkSplat Delete Flash Fix by @kmeirlaen in #1363
  • Fix Copy/Paste And Selection Of Soft-Deleted Splats by @kmeirlaen in #1364
  • Optimize COLMAP points3D.txt Loading by @kmeirlaen in #1366
  • fix duplicate of models with deleted splats by @kmeirlaen in #1371
  • add points3d tests (were missing from the PR) by @kmeirlaen in #1379
  • Prevent Camera Deletion During Active Training by @kmeirlaen in #1375
  • HDRI Background Fixes by @kmeirlaen in #1367
  • transform tools on multiple models by @kmeirlaen in #1374
  • GT 16 bits image support + lossless 16bits cache for HDR training [VOLINGA] by @AlbertoValenzuelaRedondo in #1335
  • onnx patches by @kmeirlaen in #1380
  • fix win onnx ci build by @MrNeRF in #1382
  • prebuild ort by @MrNeRF in #1385
  • fix hash calculation on windows by @kmeirlaen in #1386
  • Bundle cuDNN Runtime DLLs for Windows Builds by @kmeirlaen in #1387
  • add update submodule by @xiaobiaodu in #1389
  • Video Frame Extractor enhancements by @francescofugazzi in #1368
  • Add headless camera-path render mode (--render-camera-path) by @tritolol in #1390
  • Drag/drop video files for frame extraction by @kmeirlaen in #1388
  • Python API Doc Update by @shadygm in #1392
  • explain how to connect claude to LFS MCP Server by @kmeirlaen in #1401
  • Better depth by @MrNeRF in #1393
  • Vulkan hardening by @MrNeRF in #1411
  • Faster build by @MrNeRF in #1412
  • Test cleanup by @MrNeRF in #1413
  • Harden tensor library by @MrNeRF in #1415
  • Sccache cache hits by @MrNeRF in #1417
  • fix: correct sign inversion in video rotation detection by @francescofugazzi in #1416
  • Clamped color gradient [Volinga] by @Ediolot in #1394
  • remove const to match declaration in launch_delay_kernel by @miriameng in #1424
  • Better errors by @MrNeRF in #1423
  • exact mem usage in viewer by @MrNeRF in #1428
  • Fix inconsistent DLL linkage warnings in error.hpp by @francescofugazzi in #1433
  • Tensor fixes by @MrNeRF in #1432
  • MCP Tool Name Compatibility by @kmeirlaen in #1400
  • Fix CommandCenter singleton linkage by @MrNeRF in #1437
  • Delete Camera Fix by @kmeirlaen in #1398
  • Fix/cropbox by @kmeirlaen in #1404
  • Add correct HDR-to-SDR video preview and extraction by @francescofugazzi in #1421
  • Bye Bye ImGUI by @shadygm in #1395
  • Fix Training Crop Box Pruning by @kmeirlaen in #1365
  • Stabilize headless execution and plugin validation by @francescofugazzi in #1441
  • Stabilize right panel resizing and empty viewport overlay by @francescofugazzi in #1438
  • Fix RmlUI warning from uninitialized status message color by @francescofugazzi in #1442
  • Preserve training iterations when resetting the same dataset by @francescofugazzi in #1443
  • Preserve explicit training iterations; clean up auto-scale marker sync by @MrNeRF in #1444
  • Remove the unused standalone Vulkan path from the RmlUi backend by @MrNeRF in #1455
  • Start LichtFeld Studio on demand from the MCP bridge, and shut it down again by @MrNeRF in #1459
  • Reduce rebuilds caused by Git version metadata by @francescofugazzi in #1456
  • Remove dead no-op event handlers from VisualizerImpl by @MrNeRF in #1465
  • Complete locale coverage and add validation by @francescofugazzi in #1464
  • Fix NVCC dllimport/dllexport conflict in memory arena diagnostics check by @francescofugazzi in #1466
  • Move Vulkan/CUDA interop out of gui_manager.cpp into the rendering module by @MrNeRF in #1461
  • Fix Empty-Name Group Merge When Merging To Single PLY by @kmeirlaen in #1468
  • Use node ids for scene operations that delete or rename nodes by @MrNeRF in #1471
  • Remove stale duplicate SuperSplat viewer bundle by @MrNeRF in #1498
  • Remove unreferenced source files by @MrNeRF in #1500
  • Stop clang-format from exploding the generated SPIR-V header by @MrNeRF in #1499
  • Deduplicate helper_math.h between the fastgs and edge_compute backends by @MrNeRF in #1501
  • Video Frame Extractor Source Frame Numbering by @kmeirlaen in #1462
  • docs: centralize source build instructions by @ColumbusLabs in #1502
  • Scene Graph Camera Group Active Count by @kmeirlaen in #1504
  • ci: fix Ubuntu build (sdl3 getresuid/getresgid redeclaration) by @MrNeRF in #1526
  • ci: pin CMake to 4.4.0 (fixes the real cause of the Ubuntu break) by @MrNeRF in #1528
  • lichtfeld_tests Link Fix by @kmeirlaen in #1533
  • Fix PPISP Checkpoint Resume Color Regularizer State by @kmeirlaen in #1535
  • Remove misleading video frame orientation helper by @noor-ahmadi in #1550
  • #1475 Fix drifted parameter defaults in the property registry by @dusancubik in #1553
  • fix: pre-flight GPU check - refuse cards below SM 7.5 with clear message by @jacobvanbeets in #1542
  • Complete GUI localization coverage and add headless contracts by @francescofugazzi in #1527
  • fix: add libgtk-3-dev to Dockerfile (#1554) by @jacobvanbeets in #1555
  • #1494 A single home to all parameters by @MrNeRF in #1556
  • Report bugs to the portal from inside the app by @MrNeRF in #1558
  • Unblock Windows test build by @francescofugazzi in #1559
  • Compute Vulkan barriers instead of hand-writing them by @MrNeRF in #1561
  • Pool viewport render targets (#1497) by @MrNeRF in #1562
  • Splat simplify target incorrect by @kmeirlaen in #1560
  • Remove the remaining viewport host drains and resize churn (#1568) by @MrNeRF in #1573
  • End the remaining per-frame CPU waits on the GPU (#1577) by @MrNeRF in #1578
  • Fix newer GCC builds and remove inert Python UI APIs by @shadygm in #1585
  • Update nvImageCodec to 0.9.0 by @MrNeRF in #1591
  • Remove dead code by @MrNeRF in #1592
  • Fix GPU running at 100% when no scene is loaded by @MrNeRF in #1593
  • Speed and vram by @MrNeRF in #1588
  • Fix old library loading and panel register errors by @MrNeRF in #1598
  • refactor(ui): unify panel rendering API by @shadygm in #1587
  • Stability fixes: video decode fallback, CUDA error recovery, build cache hardening by @MrNeRF in #1599
  • Address #1598 review comments and surfaced test regressions by @MrNeRF in #1600
  • Eliminate all build warnings by @MrNeRF in #1603
  • Remove Edit mode from training-stopped dialog, suppress it on New Project/close by @MrNeRF in #1605
  • perf(viewer): decouple tool-overlay cost from the splat raster hot path by @MrNeRF in #1606
  • Stop hidden left dock from driving animation frame demand by @MrNeRF in #1607
  • Fix transforms.json loading: per-frame intrinsics and camera/point-cloud alignment by @MrNeRF in #1608
  • Export provenance stamps: every export records what produced it by @MrNeRF in #1611
  • Fix mask loading regression (#1612) and CUDA stream race on GT images/masks (#1427) by @MrNeRF in #1613
  • Fix export failure after switching from training to edit mode by @MrNeRF in #1614
  • Fix node delete failing for viewer-loaded PLYs (#1616) by @MrNeRF in #1618
  • PLY infinite opacity import repair by @kmeirlaen in #1615
  • One project file: the .licht format by @MrNeRF in #1525
  • Fix Windows test compilation and DLL linkage by @francescofugazzi in #1623
  • Fix Save Project failing during paused or running training by @MrNeRF in #1624
  • Fix remaining q16 SH bugs and Python bridge correctness by @MrNeRF in #1619
  • Fix multi-splat scenes not rendering after project reload by @MrNeRF in #1626
  • Fix transform bake on q16 compressed models by @MrNeRF in #1630
  • README: point Windows binary downloads at the LichtFeld Portal by @MrNeRF in #1631
  • Fix CUDA event-pool cleanup during runtime shutdown by @francescofugazzi in #1632
  • add fast compile to test build by @kmeirlaen in #1636
  • Add persistent user preferences, recovery controls, and resilient window state by @francescofugazzi in #1629
  • Add close buttons to Asset Manager and Python Console by @francescofugazzi in #1637
  • Restore training datasets when reopening projects by @francescofugazzi in #1635
  • Cancel in-flight dataset import when opening a project by @MrNeRF in #1649
  • Do not offer autosave recovery after an intentional discard by @MrNeRF in #1652
  • Fix/joint adam reset race by @MrNeRF in #1653
  • Offer autosave recovery at startup after an unintentional close by @MrNeRF in #1655
  • Accept .licht projects as convert input by @MrNeRF in #1659
  • Stream compressed project payloads instead of materializing them by @MrNeRF in #1660
  • Reset point cloud mode when loading standalone assets by @francescofugazzi in #1646
  • Exclude soft-deleted Gaussians from node-level clipboard copies by @MrNeRF in #1663
  • Offer to remove a missing project from the Open Recent menu by @MrNeRF in #1662
  • Silence MSVC fast compile override warnings by @francescofugazzi in #1664
  • Keep Save As from resurrecting a removed training checkpoint by @MrNeRF in #1665
  • Clear the viewport when every splat node is hidden by @MrNeRF in #1666
  • Ask to locate a missing dataset when opening a project by @MrNeRF in #1667
  • Keep the window inside the GNOME work area on Wayland by @MrNeRF in #1668
  • Add persistent MCP server management and privacy-safe diagnostics by @francescofugazzi in #1658
  • Polish MCP server management after #1658 by @MrNeRF in #1669
  • Fix Sequencer camera path JSON loading on Windows by @francescofugazzi in #1670
  • Save Sequencer camera path JSON in binary mode by @MrNeRF in #1671
  • Speed up the FastGS training rasterizer: dual-pixel blend, __expf, warp-aggregated edge atomics by @MrNeRF in #1673
  • Speed up training by 9% by fixing the edge-map bottleneck by @MrNeRF in #1675
  • Free the CPU from hidden GPU waits in the tensor library by @MrNeRF in #1676
  • Speed up high-count training by 6% by fixing a hidden memory spill by @MrNeRF in #1682
  • Make stopping and saving training instant on large datasets by @MrNeRF in #1689
  • Align Input Settings rebind rows by @francescofugazzi in #1680
  • Fix training failing to start with SH1 on some datasets by @MrNeRF in #1690
  • Add ALT-G Grid Visibility Shortcut by @kmeirlaen in #1687
  • Restore plugins and settings location on Windows builds by @MrNeRF in #1691
  • Add built-in phase timing to the performance bench by @MrNeRF in #1677
  • Accept COLMAP Points With Unknown Error by @kmeirlaen in #1674
  • Move Input Settings into Preferences by @MrNeRF in #1692
  • (#1693) Fix focused input fields not becoming unfocused when clicking outside… by @thomas-koch-core11 in #1694
  • Save projects only with the user's consent by @MrNeRF in #1696
  • Keep .licht project saves working past 2 GiB checkpoints on Windows by @MrNeRF in #1697
  • Suppress the stale Training Stopped popup when loading a new dataset by @MrNeRF in #1698
  • Add persistent spatial scene reconstruction for the viewport by @francescofugazzi in #1672
  • Fix Save As over an existing project failing on Windows by @MrNeRF in #1701
  • Disable Compact Project until a project file is bound by @MrNeRF in #1700
  • Scene reconstruction follow-ups: fix the Preferences key-binding poll, preset persistence, and split-view captures by @MrNeRF in #1699
  • Make checkpoint steps editable again (#1648) by @MrNeRF in #1702
  • Fix training autosave failing while the training model is selected by @MrNeRF in #1704
  • Revert invalid MSVC D9025 warning suppression by @francescofugazzi in #1705
  • Make resumed training runs save their results by @MrNeRF in #1707
  • Stop leaving lock files and stranded save temporaries behind by @MrNeRF in #1708
  • Let users pick a different save location when starting training by @MrNeRF in #1709
  • Fix Delete inside text fields deleting the selected model by @MrNeRF in #1710
  • Clean up save temporaries left by a crash toward a new file by @MrNeRF in #1711
  • Harden file I/O against the Windows 2GiB and text-mode bug classes by @MrNeRF in #1712
  • Fix Save As over an existing project failing during paused training by @MrNeRF in #1718
  • Ask to stop training when switching projects by @MrNeRF in #1719
  • Keep autosave working after the first checkpoint save by @MrNeRF in #1722
  • Keep loading and training when dataset images are missing by @MrNeRF in #1723
  • Fix the histogram icon disappearing after project flows by @MrNeRF in #1724
  • Ask to save before a new dataset replaces the open project by @MrNeRF in #1726
  • Crash recovery for unsaved sessions, with a clearer dialog that remembers Skip by @MrNeRF in #1729
  • Group File imports and surface rejected formats by @francescofugazzi in #1728
  • Preserve calibrated camera frustums during training by @francescofugazzi in #1731
  • Keep per-camera enabled and hidden state when reopening a project saved before training by @MrNeRF in #1732
  • Fix Python UI callback teardown ordering by @francescofugazzi in #1735
  • Stop the 'frame timeline waits must increase strictly' present storm by @MrNeRF in #1733
  • One source of truth for what goes into a saved project by @MrNeRF in #1734
  • Fix the error-debt CI gate by @MrNeRF in #1736
  • Attach q16 bounds before the SH degree on every model rebuild by @MrNeRF in #1737
  • Keep the viewport stable when toggling the UI by @francescofugazzi in #1727
  • Let an explicit save refresh the preview after a recovery by @MrNeRF in #1740
  • Make Recover consume the recovery offer by @MrNeRF in #1741
  • Defer autosave until the scene goes quiet by @MrNeRF in #1743
  • Recheck dataset images when reopening a project by @MrNeRF in #1744
  • Fail loud when the writer lock cannot prove its identity by @MrNeRF in #1745
  • Remove dead training-loop API and deduplicate save plumbing by @MrNeRF in #1746
  • Match project-switch refusals by tag instead of message text by @MrNeRF in #1747
  • Skip unchanged selection capture during automatic saves by @MrNeRF in #1748
  • Associate the .licht format and manage file associations from Preferences by @MrNeRF in #1749
  • Make the I/O discipline allowlist exact by @MrNeRF in #1751
  • Close the tile-culling boundary so edge-exact splats are never dropped by @MrNeRF in #1755
  • Tear down native panels and GUI globals when the GUI shuts down by @MrNeRF in #1754
  • Trim IEEE divides in the fastgs preprocess kernels and align forward/backward numerics by @MrNeRF in #1757
  • Trim the fastgs forward blend kernel by @MrNeRF in #1760
  • Keep the Python test suite isolated and the startup chooser dismissing after open by @MrNeRF in #1759
  • Marshal scene-mutating Python commands to the viewer thread by @MrNeRF in #1761
  • Trim the fastgs backward blend kernel by @MrNeRF in #1762
  • Refresh the error-debt baseline after the view-path refactor by @MrNeRF in #1764
  • Trim backward blend dispatch to the cull modes that are actually used by @MrNeRF in #1765
  • Use the same fast-math flags on every platform by @MrNeRF in #1766
  • Reorder gaussians by Morton code during training by @MrNeRF in #1753
  • Harden the Morton reorder tests by @MrNeRF in #1768
  • Share one tile-row bound between instance counting and emission by @MrNeRF in #1769
  • Configurable working folder, temp project instead of forced project creation, save prompts on every wipe by @MrNeRF in #1758
  • Log when adding a keyframe replaces an existing one by @OmarFaig in #1772
  • Keep Morton reorder in place for exportable splat storage by @MrNeRF in #1775
  • Add measurement tool with translate gizmo to HTML viewer export by @jacobvanbeets in #1773
  • Fix HTML viewer measurement tool input handling and resource lookup by @MrNeRF in #1778
  • GUT training: all SH degrees, 25% faster by @MrNeRF in #1780
  • Fix HTML export camera orbit for off-center models by @jacobvanbeets in #1782
  • Seed PPISP exposure from EXIF and apply PPISP in evaluation by @MrNeRF in #1783
  • Fix Python test collection on Windows: register the build root as a DLL directory by @alexmgee in #1787
  • Guard plugin API version and feature contract against cross-language drift by @OmarFaig in #1789
  • Polish Training panel and Scene Graph selection workflows by @francescofugazzi in #1730
  • Normal loss: schedule parameters and automatic normal maps by @MrNeRF in #1784
  • Native inference engine: drop ONNX Runtime, 34 ms normals in 1 GB VRAM by @MrNeRF in #1792
  • Fix selection depth filter collapsing to a 1 cm slab (#1785) by @MrNeRF in #1794
  • Make undo work for pasted splats (#1776) by @MrNeRF in #1795
  • Fix camera spawn when opening a CLI-trained project by @MrNeRF in #1796
  • Per-launch MCP port override (#1786) by @MrNeRF in #1797
  • Keep the depth filter range intact when reopening a project saved with it enabled by @MrNeRF in #1798
  • Explain and de-spam CODEC_UNSUPPORTED decode failures (#1791) by @MrNeRF in #1800
  • Fix --save-project-at-iter when the target is the last iteration by @MrNeRF in #1799
  • Big splat models no longer hit the 4 GB GPU memory wall by @MrNeRF in #1841
  • Opening big PLY files needs much less GPU memory by @MrNeRF in #1842
  • Add the far-field reconstruction option to mrnf by @MrNeRF in #1839
  • Encode shN of viewer-built models into exportable q16 storage by @MrNeRF in #1844
  • Normal loss defaults that improve the benchmark by @MrNeRF in #1793
  • Saving a project with several loaded PLYs works again by @MrNeRF in #1846
  • Make the Asset Manager native to .licht projects by @shadygm in #1770
  • Asset Manager follow-up: thumbnails for every project, safer catalog, found-location relink by @MrNeRF in #1848
  • Add Orthographic Mode toggle to the web viewer by @jacobvanbeets in #1856
  • Create a new project UUID when using Save As by @shadygm in #1853
  • Export of very large models no longer runs out of GPU memory by @MrNeRF in #1863
  • Training started over MCP now uses the real default settings by @MrNeRF in #1865
  • Opening .licht projects is 2-3x faster by @MrNeRF in #1866
  • Save modified point clouds into the project, not over the source dataset by @MrNeRF in #1867
  • Opening .licht projects is up to 5x faster by @MrNeRF in #1868
  • Add overview video to README by @MrNeRF in #1869
  • Faster tensor-core kernels and new NN ops by @MrNeRF in #1873
  • Fix lichtfeld_tests not compiling on Windows by @thomas-koch-core11 in #1872
  • Fix/python callback gil lifetime by @thomas-koch-core11 in #1871
  • Fix GIL-safe ownership of Python animation callbacks by @MrNeRF in #1877
  • Fix sequencer overlapping the asset manager and its own toolbar by @MrNeRF in #1878
  • Fix training-time autosave failing after a training restart by @MrNeRF in #1881
  • Make the sequencer timeline directly interactive across its full height by @MrNeRF in #1879
  • Fix ruler tick drift after zoom and add Set Time to the keyframe menu by @MrNeRF in #1886
  • Remaining sequencer fixes from #1133: preview updates, state reads, tooltips by @MrNeRF in #1891
  • Exposure correction, a working bilateral grid, and cleaner skies by @MrNeRF in #1892
  • Fix multi-model export and merge, and the Windows build by @MrNeRF in #1896
  • Keep the undocked sequencer inside the viewport by @MrNeRF in #1901
  • Optional Minecraft style for the training progress bar by @MrNeRF in #1902
  • Keep the focal length when leaving orthographic mode by @MrNeRF in #1903
  • Honor --mcp-port and --no-splash in view mode by @MrNeRF in #1904
  • Keep the error-debt gate clean after the view-mode flag fix by @MrNeRF in #1907
  • Let training start again after loading with an init PLY by @MrNeRF in #1905
  • Save the final project into -o and run --export in the GUI flow by @MrNeRF in #1906
  • A smoke break for the Minecraft progress bar by @MrNeRF in #1908
  • Fix .licht resume anomalies: q16 pre-allocation, explicit -o, quiet shutdown by @MrNeRF in #1911
  • Rename the Minecraft progress bar style to Miner by @MrNeRF in #1912
  • Fix decoded image corruption during training by @shadygm in #1920
  • Create training projects in the project location instead of hidden temp files by @MrNeRF in #1914
  • Feat/project location creation by @MrNeRF in #1922
  • Add an optional license to the .licht format by @MrNeRF in #1921
  • Fix 16-bit color runs never hitting the compressed image cache by @MrNeRF in #1919
  • Fix corrupted images on GPUs with hardware JPEG decoding by @MrNeRF in #1924
  • Never drop the final project save under memory pressure, and warn the user by @MrNeRF in #1925
  • Give the New Project name field a full-size input box by @MrNeRF in #1926
  • Let explicit depth edits through the selection panel echo holdoff by @MrNeRF in #1927
  • Repair stale test contracts and plugin test isolation by @MrNeRF in #1928
  • Re-land the opt-in dataset embedding that missed master by @MrNeRF in #1929
  • Commit the MoGe2 ONNX-reference fixture and its generator by @MrNeRF in #1931
  • Cut training VRAM by 30% and speed up training by @MrNeRF in #1917
  • Follow-ups: depth-edit mark expiry, typed autosave toast, honest restore-start message by @MrNeRF in #1933
  • Marshal GUI-affine Python bindings to the viewer thread by @MrNeRF in #1934
  • Remove the benchmark target pointing at a developer-local path by @MrNeRF in #1935
  • Autosave no longer rewrites unchanged projects in a loop by @MrNeRF in #1938
  • SPZ export is 2.6x faster by @MrNeRF in #1937
  • SOG export is 1.9x faster and no longer drops colors of transparent splats by @MrNeRF in #1941
  • Saving projects is 2.2x faster by @MrNeRF in #1940
  • Training survives OOM, GUT gets edge scores, .licht keeps checkpoint history by @MrNeRF in #1943
  • Remove the dead edge_compute backend by @MrNeRF in #1945
  • Launching after a crash no longer takes seconds by @MrNeRF in #1944
  • Fix normal/depth map generation aborting on mixed-orientation datasets by @MrNeRF in #1946
  • Add a seperate .licht inspect and restore CLI Tool by @dreamTent in #1947
  • Add an FOV slider with reset to the HTML viewer by @jacobvanbeets in #1951
  • Fix Windows link failures for lfs_mcp and lfs_visualizer by @jacobvanbeets in #1957
  • Replace OpenImageIO with direct image codecs by @MrNeRF in #1948
  • SOG export is 10% smaller and 6% faster by @MrNeRF in #1949
  • PLY export is 3.5x faster by @MrNeRF in #1952
  • COLMAP dataset import is almost 5x faster by @MrNeRF in #1950
  • SOG export is 2.9x faster: tiled k-means assignment by @MrNeRF in #1954
  • Replace OpenUSD with vendored flat USD I/O by @MrNeRF in #1953
  • fix: add missing include to tinyusdz integerCoding.h by @jacobvanbeets in #1958
  • Fix GUI evaluation split initialization by @shadygm in #1923
  • Fix stack overflow when embedding dataset into project (on Windows) by @thomas-koch-core11 in #1959
  • Wrap long status text in viewport status overlays by @MrNeRF in #1960
  • SPZ and SOG files open 2.5x faster, SPZ export 2.6x faster by @MrNeRF in #1961
  • Loading splat files no longer freezes the window by @MrNeRF in #1962
  • GT comparison: cheaper frames, cached depth/normal previews, no cross-thread syncs by @MrNeRF in #1963
  • UI: no more idle CPU spin, display-rate animations, exact click replay by @MrNeRF in #1966
  • Startup: window shown earlier, less work before the first frame by @MrNeRF in #1965
  • Asset Manager: instant open, incremental rescans, thumbnails off the UI thread by @MrNeRF in #1964
  • Histogram panel opens instantly: compute off the UI thread by @MrNeRF in #1969
  • Modal dialogs no longer keep the frame loop awake by @MrNeRF in #1971
  • PLY comparison renders each half at its own width by @MrNeRF in #1968
  • Build the multi-node combined model off the main thread by @MrNeRF in #1972
  • Compile the project lifecycle unit with /bigobj on MSVC by @MrNeRF in #1976
  • Camera thumbnails: cheap decode, prioritised requests, no full re-renders by @MrNeRF in #1973
  • Start training without blocking the window by @MrNeRF in #1974
  • Autosave captures geometry off the viewer thread by @MrNeRF in #1970
  • Cache the camera frustum overlay between frames by @MrNeRF in #1978
  • Getting Started opens with the overview video by @MrNeRF in #1980
  • Panels update on events, not on a timer by @MrNeRF in #1981
  • Preferences opens without a first-use stall by @MrNeRF in #1982
  • Camera thumbnails upload in batches by @MrNeRF in #1988
  • Scene tree: lock before eye so eye and bin stay together by @MrNeRF in #1984
  • Toolbar icons: one Tabler set, 40 px exports, clearer selection glyphs by @MrNeRF in #1985
  • Bottom dock: tabs for sequencer and histogram, synced with the toolbar by @MrNeRF in #1983
  • Selection: the cursor shows the armed set operation by @MrNeRF in #1987
  • Panel layout test advances the scene generation before a poll flip by @MrNeRF in #1989
  • Three main-thread waits removed by @MrNeRF in #1991
  • Selection commits without host synchronisation by @MrNeRF in #1992
  • Compile the gui manager unit with /bigobj on MSVC by @thomas-koch-core11 in #1990
  • Scene graph drag and drop: correct, complete, animated by @MrNeRF in #1994
  • Hidden panels no longer keep the frame loop awake by @MrNeRF in #1995
  • Preferences: zoom speed and navigation speed sliders by @MrNeRF in #1997
  • Windows: logger.cpp includes windows.h with NOMINMAX by @MrNeRF in #2000
  • Floating panels: real soft shadow, no stretched edge by @MrNeRF in #1998
  • Import dialogs open again after lazy panel registration by @MrNeRF in #1996
  • Drops from Wayland-native apps arrive as files again by @MrNeRF in #2002
  • Scene panel unregisters its tree element on destruction, keymap stubs refreshed by @MrNeRF in #2003
  • Frame pacing: wait for the frame slot before reading input by @MrNeRF in #1993
  • Selection: hardware brush ring, popup drags glued to the pointer by @MrNeRF in #2004
  • Fix recent Windows compile and test-link regressions by @francescofugazzi in #2007
  • Windows: selection pending-count struct destroys SceneSnapshot where it is complete by @MrNeRF in #2009
  • Viewport rail follows the bottom dock and re-flows instead of scrolling by @MrNeRF in #2012
  • Autosave no longer collides with its own geometry capture by @MrNeRF in #2013
  • Deferred splat loads no longer collide with the async import slot by @MrNeRF in #2015
  • New Project accepts a typed source path; stale tests repaired by @MrNeRF in #2016
  • Plugin manager and marketplace robustness by @MrNeRF in #2017
  • Fix USD splat CLI opening and preserve Windows Unicode paths by @francescofugazzi in #2020
  • Non-ASCII paths, arguments and environment survive on Windows by @MrNeRF in #2021
  • Vulkan: complete the 8-bit overlay flag transition on master (port of #2019) by @MrNeRF in #2023
  • Honor transforms.json mask paths and preserve nested mask lookup by @francescofugazzi in #2022
  • Fix MSVC preprocessing in Unicode path assertions by @francescofugazzi in #2027
  • Add opt-in Release-only vcpkg presets for Windows and Linux by @francescofugazzi in #2028
  • Avoid unnecessary CMake regeneration for core edits and runtime assets by @francescofugazzi in #2018
  • Add fast source and MSVC preflight gates for Windows builds by @francescofugazzi in #2008
  • Scene graph: fix undo for group/duplicate/paste, locked nodes, hidden-child merge by @MrNeRF in #2031
  • Tests: skip missing local PLY fixture, isolate VRAM profiler order test by @MrNeRF in #2033
  • Let headless training start from an untrained .licht with embedded dataset via --data-path by @thomas-koch-core11 in #2001
  • Avoid waiting for training initialization on the viewer thread by @francescofugazzi in #2040
  • Invalidate viewport state when training hands the same model to Edit Mode by @francescofugazzi in #2039
  • Preserve Unicode in Windows console logs by @francescofugazzi in #2042
  • Recover VkSplat shared scratch after training pause by @francescofugazzi in #2041
  • Stream bridge test: enter through the public wait, pin the retired-handle contract by @MrNeRF in #2044
  • Tensor: order synchronous host copies against the home stream by @MrNeRF in #2045
  • Windows: per-request events for overlapped project file I/O (#2038) by @MrNeRF in #2049
  • Add native LPIPS evaluation metric by @MrNeRF in #1977
  • Fix camera coordinates in headless video export by @MrNeRF in #2051
  • 3DGUT: honor prepared undistortion instead of applying distortion twice by @MrNeRF in #2054
  • Fix upside-down Sequencer video export for point clouds by @MrNeRF in #2055
  • Fix projects refusing to open when a camera or crop box was selected at save time by @MrNeRF in #2056
  • Fix normal loss degrading large scenes late in training (wrong gradient index) by @MrNeRF in #2057
  • Resuming a project with Undistort on no longer undistorts the cameras twice by @MrNeRF in #2059
  • Headless runs redirected with -o keep the source project's embedded dataset by @MrNeRF in #2060
  • Viewport never keeps showing a stale splat image while the camera moves during training by @MrNeRF in #2062
  • FastGS: order the visible-count readback after the visibility scan by @MrNeRF in #2061
  • Normal loss: apply user masks to the normal terms and gate the prior-depth term by @MrNeRF in #2064
  • Adam: decode zero-variance joint moments as exactly zero by @MrNeRF in #2066
  • MRNF: keep the far-field mask bound across reorders and carry it into FastGS by @MrNeRF in #2065
  • Tests: normal-loss regression suite by @MrNeRF in #2067
  • SSOG export and import by @MrNeRF in #2068
  • MRNF: rebuild the far-field mask after hard compaction and ignore stale bindings by @MrNeRF in #2070
  • Priors: accept depth and normal maps of any resolution, log the normal-estimation device by @MrNeRF in #2071
  • Startup overlay: ignore clicks while a modal or context menu is open by @MrNeRF in #2073
  • SSOG: export twice as fast by @MrNeRF in #2075
  • MRNF: hand the far-field mask to Adam as a tensor, rebuild it on Background Improvement toggles by @MrNeRF in #2074
  • SSOG: fix the error-debt gate and take export to 2.6x by @MrNeRF in #2076
  • Selection: never draw the software brush ring while the cursor ring is showing by @MrNeRF in #2077
  • Fix MRNF normal-loss pruning and checkpoint resume by @MrNeRF in #2078
  • Fix viewport export use-after-free and device-loss handling by @MrNeRF in #2083
  • Fix MRNF saturated opacity and PLY export by @MrNeRF in #2082
  • Masks: compare segment_and_ignore bands on the normalized mask scale by @rkskmt in #2085
  • Fix Windows test build errors in crash handler and Vulkan exports by @miriameng in #2088
  • Fix firewall warning when running the application [Volinga] by @Ediolot in #2092
  • fix: add Pascal viewer compatibility and avoid scratch cleanup deadlock by @parsamahdavi48 in #2090
  • Fix duplicate selection brush on Wayland by @constantin906 in #2086
  • Fix unclickable Training Complete dialog with File menu open by @MrNeRF in #2113
  • Fix bilateral grid with disabled cameras by @MrNeRF in #2111
  • Match SegmentAndIgnore evaluation to the training keep band by @MrNeRF in #2114
  • Center the orbit pivot in comparison views by @MrNeRF in #2115
  • Confirm overwrite when creating an existing project by @MrNeRF in #2116
  • Keep training initialization on the scene owner thread by @MrNeRF in #2118
  • Refresh cached panels after UI scale and visibility changes by @MrNeRF in #2119
  • Keep polygon selection out of dock controls by @MrNeRF in #2120
  • Avoid combined model copies in PLY comparison by @MrNeRF in #2121
  • Keep GT Compare aligned during training and mouse movement by @MrNeRF in #2122
  • Fix GPU video extraction frame synchronization by @MrNeRF in #2125
  • Prevent training viewport flashes during arena contention by @MrNeRF in #2126
  • Fix mask processing after image undistortion by @MrNeRF in #2129
  • Fix Stop after reopening a project and Save during dataset embedding by @MrNeRF in #2130
  • Keep the histogram visible above its controls by @MrNeRF in #2131
  • Fix deleted-splat rendering after undo and redo by @MrNeRF in #2132
  • Fix histogram loading without NumPy by @MrNeRF in #2133
  • Fix randomly black GT previews during training by @MrNeRF in #2134
  • Fix stale opacity frames after edits and undo by @MrNeRF in #2136
  • Connect LichtFeld Studio to the portal and sync gallery files by @MrNeRF in #2137
  • Fix Windows snapshot linkage and visualizer object size by @MrNeRF in #2139
  • Preserve CropBox settings when training starts by @MrNeRF in #2140
  • Match Rendering panel scrolling to Training by @MrNeRF in #2141
  • Add label tool to HTML viewer export by @jacobvanbeets in #2124
  • Fix black RAD viewports and holes during LOD navigation by @MrNeRF in #2142
  • Preview and refine three-point alignment by @MrNeRF in #2145
  • Export alignment snap resolver on Windows by @francescofugazzi in #2147
  • Fix PLY comparison alignment, black panels and crash by @francescofugazzi in #2144
  • Fix bright red/yellow pixels with GUT exposure correction by @MrNeRF in #2146
  • Projects panel, Inspector Contents and Gallery publishing by @MrNeRF in #2148
  • fix stack overflow in scene publication by @kmeirlaen in #2153
  • Fix spacing in wayland and xkbcommon module versions by @Alatar98 in #2152
  • Catch gallery export stack overflows in tests by @MrNeRF in #2154
  • Show project filenames instead of parent folder names by @MrNeRF in #2155
  • Include projects outside the library in Recent by @MrNeRF in #2156
  • Keep context menus inside the window by @MrNeRF in #2157
  • Show a project icon when a thumbnail is missing by @MrNeRF in #2158
  • Refresh gallery workflow regression fixtures by @MrNeRF in #2159
  • Publish saved projects from the File menu by @MrNeRF in #2160
  • Decode thumbnail images and preserve the dialog on cancel by @MrNeRF in #2161
  • Keep custom thumbnails when saving projects by @MrNeRF in #2163
  • Offer only usable project thumbnail sources by @MrNeRF in #2162
  • Fix Asset Manager theme coverage and stale status-bar tests by @MrNeRF in #2178
  • Fix Windows window bounds and Asset Manager resize cursors by @francescofugazzi in #2164
  • Improve Project Manager responsiveness, layout, and Gallery UX by @francescofugazzi in #2177
  • Fix Project Manager Inspector access, reset height, and Gallery refresh by @MrNeRF in #2184
  • Share published scenes by link instead of making them public by @MrNeRF in #2186
  • Report an unsupported gsplat intersection count instead of aborting by @MrNeRF in #2185
  • Render large frames by batching the tile grid by @MrNeRF in #2188
  • Fix project list actions and gallery conflict tooltips by @francescofugazzi in #2181
  • Show project details and actions for external recent files by @francescofugazzi in #2183
  • Make the screen-share limit work on GUT without costing quality by @MrNeRF in #2194
  • Fix restoring saves with retained project previews by @francescofugazzi in #2182
  • Restore input handling in dirty-driven Python panels by @francescofugazzi in #2192
  • Honor project locations in Windows save dialogs by @francescofugazzi in #2193
  • Show the active project in the application title bar by @francescofugazzi in #2195
  • Fix Unicode filenames across Windows UI boundaries by @francescofugazzi in #2198
  • Preserve Unicode filenames in serialized error details by @francescofugazzi in #2199
  • Return the default log file path as UTF-8 by @francescofugazzi in #2200
  • Preserve Unicode project names in recovery path handling by @francescofugazzi in #2201
  • Preserve Unicode filenames during drag and drop by @francescofugazzi in #2202
  • Preserve Unicode paths in environment map diagnostics by @francescofugazzi in #2204
  • Fix stale GUT state when switching to IGS+ by @francescofugazzi in #2197
  • Allow MCP sequencer scrubs to update the viewport camera by @francescofugazzi in #2196
  • Keep one dirty check for the title bar, and test the title properly by @MrNeRF in #2203
  • Preserve Unicode filenames in preprocessing progress by @francescofugazzi in #2205
  • Fix TinyUSDZ compilation with GCC 15 by @shadygm in #2221
  • Protect active project write temps from recovery cleanup by @francescofugazzi in #2232
  • Fix SOG publication after soft-deleting splats by @francescofugazzi in #2234
  • Refresh project thumbnails immediately after updates by @francescofugazzi in #2230
  • Fix Gallery state and publishing for external recent projects by @francescofugazzi in #2233
  • windows: fix test compilation by @miriameng in #2236
  • Preserve Unicode paths in weight file errors by @francescofugazzi in #2217
  • Preserve thumbnail proportions and refine responsive Project Manager interactions by @francescofugazzi in #2231
  • Preserve Unicode paths in crash diagnostics by @francescofugazzi in #2222
  • Export menu bar test dependencies on Windows by @francescofugazzi in #2213
  • Keep checkpoints in order after compacting a project by @MrNeRF in #2240
  • Restore save points that contain deleted checkpoints by @MrNeRF in #2241
  • Keep the New Project dialog closed when reopening projects by @MrNeRF in #2242
  • Clear the unsaved marker after saving paused training by @MrNeRF in #2243
  • Keep Gallery reviews visible and recover failed changes by @MrNeRF in #2244
  • Persist project folder rescans and discard canceled changes by @MrNeRF in #2245
  • Stop showing failed Gallery downloads as processing by @MrNeRF in #2246
  • Choose the folder when creating a project by @MrNeRF in #2247
  • Apply Gallery conflicts locally and keep unpublished changes by @MrNeRF in #2248
  • Preserve Unicode filenames in converter overwrite prompts by @francescofugazzi in #2219
  • more descriptive tooltips for training parameters by @kmeirlaen in #2149
  • Preserve Unicode filenames in converter outputs by @francescofugazzi in #2227
  • Build vulkan-loader with Wayland WSI support on Linux by @bmaltais in #2249
  • Preserve Unicode paths throughout project save and recovery by @francescofugazzi in #2224
  • Start new projects without creating a file by @MrNeRF in #2251
  • Start training without processing the whole dataset first by @MrNeRF in #2253
  • Fix thumbnail updates colliding with Save and Exit by @MrNeRF in #2254
  • Clean old project saves while keeping the current state by @MrNeRF in #2252
  • Allow republishing projects deleted from Gallery by @MrNeRF in #2256
  • Explain Gallery changes before opening a project by @MrNeRF in #2257
  • Keep project write polling on the viewer thread by @MrNeRF in #2258
  • Fix local copies of newly uploaded Gallery scenes by @MrNeRF in #2259
  • Persist Project Manager preferences and refine responsive startup UX by @francescofugazzi in #2255
  • Keep training initialization aligned when centering datasets by @MrNeRF in #2260
  • Fix project cleanup, histogram updates and ring dragging by @MrNeRF in #2270
  • Remove the old v0.3 video from Getting Started by @MrNeRF in #2271
  • Fix restoring older save points by @MrNeRF in #2272
  • Keep the Project Manager close button visible at every width by @francescofugazzi in #2269
  • Keep points outside the crop box when starting training by @MrNeRF in #2273
  • Fix persistence of Project Manager folder scan depth by @francescofugazzi in #2263
  • Fix build warnings across Debug and Release configurations by @MrNeRF in #2274
  • Add Windows binary metadata to mitigate Defender false positives by @MrNeRF in #2275
  • fix viewport export in high res by @MrNeRF in #2276
  • Fix gallery recovery after oversized viewport thumbnails by @MrNeRF in #2283
  • Fix high-resolution depth and orthographic viewport exports by @MrNeRF in #2278
  • Fix autosave provenance after edits and wrap long modal paths by @MrNeRF in #2284
  • Keep image-export overhead out of the interactive viewer by @MrNeRF in #2285
  • Keep undistorted images within max width by @MrNeRF in #2286
  • Fix crash when switching projects during training by @MrNeRF in #2287
  • Show the splash as one card centered on the window by @MrNeRF in #2288
  • Fix undefined banded export shader macro warning by @francescofugazzi in #2289
  • Prevent Selection Groups from appearing after a layout reset by @francescofugazzi in #2290
  • Fix Selection Groups registration after PR #2290 by @francescofugazzi in #2291
  • Fix import dialog Advanced arrow not rotating on toggle by @jacobvanbeets in #2305
  • Keep projects unlinked after Unlink by @MrNeRF in #2308
  • Show the Copy link label in the Inspector by @MrNeRF in #2309
  • Rename from the project card also updates the file title by @MrNeRF in #2310
  • Wrap tooltips between words by @MrNeRF in #2312
  • Keep the Transfers overlay visible with the Project Manager open by @MrNeRF in #2313
  • Update the project thumbnail from the File menu by @MrNeRF in #2314
  • Show Inspector only once in the project menu by @MrNeRF in #2315
  • Apply gallery text without opening the project by @MrNeRF in #2317
  • Keep the applied gallery view in sync by @MrNeRF in #2321
  • Do not save the project when publishing by @MrNeRF in #2316
  • Make the checkpoint and dataset filters work by @MrNeRF in #2318
  • Update the gallery cover from the project thumbnail on publish by @MrNeRF in #2320
  • Edit the gallery title and description before publishing by @MrNeRF in #2319
  • Do not upload the scene again when only metadata changed by @MrNeRF in #2322
  • Do not show a content conflict for a view-only save by @MrNeRF in #2323
  • Keep empty local camera tracks out of published views by @MrNeRF in #2324
  • Keep the viewport smooth while training runs by @MrNeRF in #2325
  • Redraw the UI only for what changes during training by @MrNeRF in #2326
  • Remove the gallery status label from the Projects panel by @MrNeRF in #2327
  • Keep SOG license files through gallery downloads and imports by @MrNeRF in #2328
  • Restore gallery upload retries by @MrNeRF in #2329
  • Fix Windows format-test build after SOG license parsing changes by @francescofugazzi in #2341
  • Run CPU Python tests in CI by @MrNeRF in #2331
  • Add a gallery publishing sample corpus by @MrNeRF in #2330
  • Fix Tools → Projects selecting the Projects view by @francescofugazzi in #2343
  • Make the Gallery only filter show only gallery-only projects by @MrNeRF in #2345
  • Call the filter reset option "No filter" by @MrNeRF in #2346
  • Name the active filter in the Projects header by @MrNeRF in #2347
  • Include gallery-only scenes in All projects, add Local projects by @MrNeRF in #2348
  • Fix LichtFeld Studio quitting when opening a downloaded project on Windows by @MrNeRF in #2349
  • Let Enter start a new line in the publish description by @MrNeRF in #2350
  • Show and save Inspector descriptions and license text as typed by @MrNeRF in #2351
  • Move gallery sync procedures out of the controller by @MrNeRF in #2332
  • Remove temporary files after applying gallery changes by @MrNeRF in #2353
  • Remove emptied groups when applying gallery content by @MrNeRF in #2354
  • Show a cover upload failure as a warning, not a failed publish by @MrNeRF in #2355
  • Ignore float noise when comparing gallery view settings by @MrNeRF in #2356
  • Pick up a project save made while the Projects panel was hidden by @MrNeRF in #2357
  • Validate MCP HTTP requests and require a token for network access by @MrNeRF in #2363
  • Ask before starting training again after a finished run by @MrNeRF in #2364
  • Open Selection Groups from the Select menu by @MrNeRF in #2365
  • Publish a scene with or without saving it as a project by @MrNeRF in #2368
  • Keep Python callbacks safe while I/O operations release the GIL by @MrNeRF in #2360
  • Add Tersus as hardware sponsor to the README by @MrNeRF in #2369
  • Projects panel without the left sidebar by @MrNeRF in #2362
  • Fix the Needs attention project filter by @MrNeRF in #2370
  • Add a single existing project without watching its folder by @MrNeRF in #2371
  • Keep the Projects panel responsive with many projects by @MrNeRF in #2374
  • Make dropdown lists as wide as their field and align form fields by @MrNeRF in #2375
  • Choose where a gallery download is saved by @MrNeRF in #2376
  • Let the Projects toolbar wrap instead of clipping or overlapping by @MrNeRF in #2377
  • Escape the placeholder in the Scripts panel hint by @MrNeRF in #2379
  • Show live keymap shortcuts in button tooltips by @MrNeRF in #2381
  • Make panel resizing work from both sides and follow the cursor by @MrNeRF in #2383
  • Make the account connection easier to find and act on by @MrNeRF in #2372
  • glTF/glb splat IO support by @dozeri83 in #2344
  • Expect the GLB format in the export panel test by @MrNeRF in #2384
  • Expect the glTF format in the export panel test by @MrNeRF in #2385
  • Hide tooltips when the pointer leaves their area by @MrNeRF in #2386
  • Keep exposure correction grids in host memory by @MrNeRF in #2387
  • Export the RmlUIManager methods used by the tooltip test by @MrNeRF in #2389
  • Refresh Python stubs for the GLB export bindings by @MrNeRF in #2390
  • Smooth viewport navigation while training by @MrNeRF in #2388
  • Queue clearing finished transfers behind a gallery refresh by @MrNeRF in #2392
  • Fix stale Projects workers and add missing input localization keys by @francescofugazzi in #2391
  • Reuse nvJPEG encoder params across cache encodes by @MrNeRF in #2394
  • Remove the viewport reprojection by @MrNeRF in #2397
  • Fix UI glitches at narrow widths and large UI scales by @MrNeRF in #2398
  • Fix empty-state hint overlapping import status by @francescofugazzi in #2405
  • Prune stale image preview metadata by @francescofugazzi in #2406
  • Stop tinyply at the end of a truncated PLY body by @MrNeRF in #2400
  • Check MCP tool arguments against their declared types by @MrNeRF in #2401
  • Keep setting fields readable and aligned on narrow panels by @MrNeRF in #2403
  • Group digits in displayed counts by @MrNeRF in #2407
  • Turn the viewport vignette off by default by @MrNeRF in #2411
  • Fix stale Getting Started thumbnail callbacks after remount by @francescofugazzi in #2410
  • Bring four stale tests back in line with the code by @MrNeRF in #2412
  • Keep the image preview status strip on one line by @MrNeRF in #2413
  • Restore Plugin Marketplace callbacks after remount by @francescofugazzi in #2409
  • Rediscover plugins when the Marketplace reopens by @MrNeRF in #2414
  • Give every copied project file its own Projects entry by @MrNeRF in #2415
  • Refuse File > Publish for a copy of another project by @MrNeRF in #2417
  • Render emoji in UI text with the system color emoji font by @MrNeRF in #2418
  • Load the emoji font for emoji in text fields by @MrNeRF in #2421
  • Fix NaN buffer rollback and Windows test linking by @francescofugazzi in #2426
  • Pass FastGS Adam batch metadata by value by @francescofugazzi in #2428
  • Keep FastGS Adam reset indices on GPU by @francescofugazzi in #2431
  • Test that GPU Adam state resets match the host index path by @MrNeRF in #2432
  • Avoid reserving unused PPISP controller CNN buffers by @francescofugazzi in #2433
  • Avoid a duplicate image-directory scan during COLMAP loading by @francescofugazzi in #2435
  • Write per-image evaluation results and add --eval-all by @MrNeRF in #2422
  • Fix master CI: error-debt gate and x264 download by @MrNeRF in #2437
  • Exercise the 16-bit JPEG 2000 cache path with a resized load by @MrNeRF in #2439
  • Fetch x264 from its GitHub mirror by @MrNeRF in #2440
  • Remove the disabled COLMAP scan benchmark by @francescofugazzi in #2451
  • Reduce training VRAM and bound refine and Morton peaks by @MrNeRF in #2460
  • Release cached images when host memory runs low by @MrNeRF in #2461
  • Reduce viewer VRAM by @MrNeRF in #2463
  • Show VRAM by owner over time and report GPU memory like the driver by @MrNeRF in #2466
  • Keep the viewport at full resolution when training allocations retry by @MrNeRF in #2502
  • Reject misshapen FastGS extra gradients in every build by @MrNeRF in #2486
  • Apply node-parented crop boxes in single-model scenes by @MrNeRF in #2516
  • Open the File > Export panel from the project manager by @MrNeRF in #2517
  • Ask to stop training before compacting the project by @MrNeRF in #2518
  • Open never-trained projects ready to train by @MrNeRF in #2521
  • Resolve an images folder next to the dataset from the working directory by @MrNeRF in #2519
  • Fix the stale binding count in the viewer overlay storage test by @MrNeRF in #2549
  • Use the official Tersus logo files by @MrNeRF in #2550
  • Adjust the sponsor wall by @MrNeRF in #2551
  • Group the project context menu actions by @MrNeRF in #2553
  • Keep the Performance window under the cursor next to the Project Manager by @MrNeRF in #2554
  • Add screenshot JPG export with resolution presets to the HTML viewer by @jacobvanbeets in #2571
  • Stop state replacement from writing through Tensor views by @MrNeRF in #2573
  • Fix gsplat SH addressing, depth modes and two SSIM gradient bugs by @MrNeRF in #2574
  • Make Tensor assignment always rebind by @MrNeRF in #2576
  • Move training charts and status above the parameter search by @francescofugazzi in #2581
  • Keep the screen-share hinge out of Adam's second moment by @MrNeRF in #2602
  • Fix tensor edge cases on the CPU and CUDA by @MrNeRF in #2605
  • Fix COLMAP export, undo history, project restore and SH model commands by @MrNeRF in #2606
  • Harden MCP tools against malformed input, native dialogs and stale scene state by @MrNeRF in #2607
  • Fix failed final exports, lazy shN gradient growth and NaN models in training by @MrNeRF in #2608
  • Synchronize block reductions before their shared buffer is reused by @MrNeRF in #2611
  • Load dropped models as queued batches by @MrNeRF in #2619
  • Encode combined models in bounded bands by @MrNeRF in #2620
  • Size banded q16 storage to the model capacity by @MrNeRF in #2621
  • Keep the load confirmation callback compatible by @MrNeRF in #2622
  • Fix Python editor editing and keyboard input routing by @MrNeRF in #2624
  • Fix the Windows build and error-debt gate on master by @MrNeRF in #2626
  • Measure compaction peak with process allocator accounting by @MrNeRF in #2629
  • Stabilize large-image bilateral gradient comparisons by @MrNeRF in #2630
  • Fix Windows build and test linker failures by @francescofugazzi in #2631
  • Keep comparison captures upright and step through scene cameras by @MrNeRF in #2634
  • HTML export: screenshot capture with overlay compositing and fullscreen-first framing by @jacobvanbeets in #2638
  • Report VRAM without double counting shared allocations by @MrNeRF in #2636
  • Catch missing Windows exports in the Linux build by @MrNeRF in #2643
  • Fix optimizer capacity after uncapped compaction by @MrNeRF in #2641
  • Gate colour gradients below the blend clamp toward the image by @MrNeRF in #2654
  • Normalize the quaternion before placing split children by @MrNeRF in #2655
  • Use exact neighbors for MRNF initialization by @MrNeRF in #2656
  • Show the exact iteration in the Training panel after Pause and Stop by @MrNeRF in #2659
  • Update the Volinga logo by @MrNeRF in #2660
  • Let training and the viewport take turns on the GPU by @MrNeRF in #2662
  • Keep typed step values exact and make the automatic stretch respect them by @MrNeRF in #2666
  • Fix Ground Truth comparison dropdown alignment by @francescofugazzi in #2667
  • Export and import all dataset and training settings in config files by @MrNeRF in #2669
  • Stop redrawing the viewport while a camera drag is held still by @MrNeRF in #2670
  • Return a typed error from config import by @MrNeRF in #2676
  • Redraw the viewport only when something changes by @MrNeRF in #2675
  • Show line breaks in runtime error dialogs by @MrNeRF in #2677
  • Remove unused frame-scheduling code by @MrNeRF in #2678
  • Allow resuming projects trained with added splats by @MrNeRF in #2680
  • Avoid reprocessing immediate image cache hits by @MrNeRF in #2681
  • Support six-term rational camera distortion by @MrNeRF in #2683
  • Fix Ubuntu workflow validation blocking Release and Debug builds by @francescofugazzi in #2685
  • Fix evaluation and training image quality with --undistort by @MrNeRF in #2686
  • Fix the error-debt gate for evaluation view preparation by @MrNeRF in #2687
  • Allow cleaning and compacting projects without opening them by @francescofugazzi in #2674
  • Average masked LPIPS over the masked area by @MrNeRF in #2688
  • Keep renders from changing training statistics and fix a hidden-model training stall by @MrNeRF in #2690
  • Add eval_space to the parameter JSON test references by @MrNeRF in #2691
  • Keep depth AbsRel available after resuming a project by @MrNeRF in #2684
  • Leave frozen added splats out of the final export with --exclude-export by @MrNeRF in #2692
  • Match thin-prism fisheye undistortion to the COLMAP camera model by @MrNeRF in #2693
  • Scan multinomial weights once on CUDA by @MrNeRF in #2696
  • Order legacy-stream work against non-blocking streams in the memory pool by @MrNeRF in #2699
  • Order evaluation reads after render and sidecar loading streams by @MrNeRF in #2700
  • Downscale CPU-decoded training images and evaluation references on the GPU by @MrNeRF in #2702
  • Select evaluated pixels with a mesh by @MrNeRF in #2689
  • Restrict optional GPU idle CI to the upstream repository by @francescofugazzi in #2704
  • Fix Windows portal storage permissions and stale viewport rendering by @francescofugazzi in #2703
  • Fix missing SfM chapter dependency in CPU format tests by @francescofugazzi in #2705
  • Unify editable dataset configuration after #2669 by @francescofugazzi in #2671
  • Request redraws where view inputs change by @MrNeRF in #2706
  • Add the evaluation mask parameters to the parameter JSON references by @MrNeRF in #2708
  • Measure this process's device memory in the FastGS VRAM release test by @MrNeRF in #2711
  • Show UI and viewport frame rates separately and fix resize and scale redraws by @MrNeRF in #2712
  • Composite RGBA targets over the training background by @MrNeRF in #2715
  • Fix redraw and layout issues after the frame-rate update by @MrNeRF in #2716
  • Decode and cache 16-bit RGBA images at full precision by @MrNeRF in #2717
  • Order the immediate CPU image decode on the caller's stream by @MrNeRF in #2719
  • Put the first alpha load on the 16-bit cache grid by @MrNeRF in #2721
  • Pin the mask cache sample-width contract in the IO hygiene test by @MrNeRF in #2725
  • Run deferred view materializers on their tensor's stream by @MrNeRF in #2728
  • Order eager tensor ops after inputs from other streams by @MrNeRF in #2729
  • Replace TinyEXR with OpenEXRCore for native DWA decoding by @francescofugazzi in #2710
  • Skip pool rehoming when an empty tensor changes stream by @MrNeRF in #2732
  • Keep nvImageCodec pinned buffers in the caching allocator by @MrNeRF in #2733
  • Find the gallery test fixtures from the project root by @MrNeRF in #2734
  • Annotate the EXR decoder's handled catches for the error-debt gate by @MrNeRF in #2731
  • Pace frames without input to the display interval by @MrNeRF in #2736
  • Offer Retry and Change Location when a project save runs out of disk space by @MrNeRF in #2737
  • Add tooltips for splat exposure and tone mapping by @MrNeRF in #2745
  • Recover the failed save destination and every full-volume write in the disk-space dialog by @MrNeRF in #2740
  • Pace from the last presented frame's start and never block on queued viewer work by @MrNeRF in #2741
  • Keep exposure correction's backward to one live image per stage by @MrNeRF in #2742
  • Keep CUDA narrow-row reductions and broadcasts at full occupancy by @MrNeRF in #2743
  • Keep panel tab labels in the current language by @MrNeRF in #2746
  • Ignore focus without a context while panel documents reload by @MrNeRF in #2747
  • Translate the UI strings that were still English in every locale by @MrNeRF in #2750
  • Keep the thin-image SSIM gradient test off the L1 kink by @MrNeRF in #2751
  • Keep CUDA where operands compact and skip per-element broadcast indexing by @MrNeRF in #2752
  • Multiply narrow CUDA matrices one row per thread by @MrNeRF in #2755
  • Start training without the setup stall by @MrNeRF in #2756
  • HTML viewer: multiple measurements alongside labels in save/load by @jacobvanbeets in #2744
  • Lower exposure correction VRAM with an in-place appearance backward by @MrNeRF in #2758
  • Accelerate CPU image encoding with libjpeg-turbo and zlib-ng by @francescofugazzi in #2757
  • Export the native scene panel from the visualizer library by @MrNeRF in #2760
  • Find trimmed scene bounds by selection instead of sorting by @MrNeRF in #2761
  • Follow up #2756: keep training project preparation responsive by @francescofugazzi in #2759
  • Keep Linux Release CPU instructions portable across CI runners by @francescofugazzi in #2767
  • Remove the training manager's event handlers when it is destroyed by @MrNeRF in #2769
  • Gate training preparation animation on active state by @francescofugazzi in #2770
  • Lower evaluation VRAM and remove hidden copies in lazy materialization by @MrNeRF in #2772
  • Initialize the logger in the scene panel log demand test by @MrNeRF in #2773
  • Remove the MRNF background improvements option by @MrNeRF in #2780
  • Give the scene panel log demand test an RmlUIManager by @MrNeRF in #2784
  • Order the copy in Tensor::reserve after writes on the tensor's stream by @MrNeRF in #2790
  • Connect sequencer redraw demand, the Python selection submode and the gallery undo/recovery buttons by @MrNeRF in #2803
  • Draw registered plugin gizmos and UIList rows by @MrNeRF in #2804
  • Keep projects readable when their evaluation mask file is missing by @MrNeRF in #2805
  • Fix --save-project-at-iter after an earlier project save by @MrNeRF in #2782
  • Refresh scene-dependent operator polls and record benchmark PSNR by @MrNeRF in #2807
  • Consistent training panel controls and one UI font by @MrNeRF in #2809
  • Open projects whose parameter presets hold values this version rejects by @MrNeRF in #2818
  • Publish projects with an HDR background, fix the publish dialog layout and keep entered details by @MrNeRF in #2817
  • Remove missing projects from the Missing files view in one step by @MrNeRF in #2819
  • Skip the preview warning for projects whose file is gone by @MrNeRF in #2825
  • Keep every save until the user removes it by @MrNeRF in #2827
  • Fix the localization contract for the sequencer frame demand by @MrNeRF in #2834
  • Fix camera frustum occlusion against point-cloud NDC depth by @francescofugazzi in #2837
  • HTML viewer: in-world VR annotations and locomotion for exported viewers by @jacobvanbeets in #2822
  • Fix MCMC sampling with small weights, Float16 clamp and one-sided clamp infinities by @MrNeRF in #2840
  • Keep added splats when training in the viewer by @MrNeRF in #2843
  • Keep --eval-steps when training in the viewer by @MrNeRF in #2844
  • Speed up saving and loading evaluation images by @MrNeRF in #2848
  • Export Float16 tensors to NumPy without aborting by @MrNeRF in #2851
  • Decode the next evaluation image while the current one is scored by @MrNeRF in #2856
  • Keep the crop box when training starts from an init splat by @MrNeRF in #2857
  • Validate frustum overlay push constants and clarify depth reconstruction by @francescofugazzi in #2841
  • Fix block-shaped camera frustum occlusion in HiGS previews by @francescofugazzi in #2858
  • Keep the mesh converter's Vulkan device until the process ends by @MrNeRF in #2861
  • Select evaluated pixels with boxes, the crop box, mask folders, depth and points by @MrNeRF in #2860
  • Compute exact HiGS depth only where viewport overlays read it; exact depth for meshes by @MrNeRF in #2863
  • Parallelize MRNF's bounded median selection by @MrNeRF in #2868
  • Release panel Python instances with the GIL and contain poll exceptions by @MrNeRF in #2873
  • Repeat tensors by the exact count instead of the next power of two by @MrNeRF in #2869
  • Fix locale markup and CPU Python test contracts by @francescofugazzi in #2870
  • Assign through a boolean row mask to whole rows by @MrNeRF in #2871
  • Keep dimensions in global tensor reductions when keepdim is set by @MrNeRF in #2872
  • Keep every configured project save step while a writer is active by @MrNeRF in #2874
  • Return NaN from tensor asin and acos outside their domain by @MrNeRF in #2875
  • Finish editor scripts that call sys.exit and keep the editor usable by @MrNeRF in #2876
  • Return NaN from tensor sign for NaN inputs by @MrNeRF in #2878
  • Reject CUDA arrays in Python APIs that read their input on the host by @MrNeRF in #2879
  • Mark the CUDA cases of the new tensor regression tests as GPU tests by @MrNeRF in #2880
  • Release the GIL while starting splat simplification from Python by @MrNeRF in #2882
  • Localize the editor SystemExit message by @MrNeRF in #2885
  • Clear Python undo callbacks before interpreter shutdown by @MrNeRF in #2886
  • Preserve the first NaN index in tensor argmin and argmax by @MrNeRF in #2887
  • Allow empty tensor slices with valid view offsets by @MrNeRF in #2888
  • Restore contiguous NumPy input validation by @MrNeRF in #2889
  • Validate mesh handles and face indices by @MrNeRF in #2890
  • Handle empty batched matmul outputs by @MrNeRF in #2891
  • Support Float16 Python extraction by @MrNeRF in #2892
  • Import NumPy Float16 arrays by @MrNeRF in #2893
  • Expand scoped selection masks to scene indices by @MrNeRF in #2895
  • Preserve project scenes during hydration imports by @MrNeRF in #2896
  • Guard Gaussian deletion in selection tools by @MrNeRF in #2897
  • Preserve RAD LOD data in identity exports by @MrNeRF in #2899
  • Keep sibling dataset references portable by @MrNeRF in #2900
  • Add eval_mask_opacity to the parameter JSON references by @MrNeRF in #2901
  • Reset stale import completion state by @MrNeRF in #2902
  • Reject unsafe export names and failed project saves by @MrNeRF in #2903
  • Report empty evaluations and missing image backgrounds by @MrNeRF in #2904
  • Validate numeric training options by @MrNeRF in #2905
  • Reject unknown log levels by @MrNeRF in #2906
  • Preserve scene bindings on headless resume by @MrNeRF in #2908
  • Refresh generated Python stubs by @MrNeRF in #2909
  • Reject stale SceneNode wrappers by @MrNeRF in #2910
  • Keep dataset drops replacing during project hydration by @MrNeRF in #2911
  • Preserve bool dtype in DLPack interchange by @MrNeRF in #2912
  • Reject copy=False export of non-contiguous tensors by @MrNeRF in #2913
  • Raise for non-finite and out-of-range integer conversions by @MrNeRF in #2914
  • Reject converter output suffixes that contradict the format by @MrNeRF in #2915
  • Validate MCP render scale values by @MrNeRF in #2916
  • Reject --init when resuming by @MrNeRF in #2917
  • Reject null optional MCP booleans by @MrNeRF in #2918
  • Reject --init together with --random by @MrNeRF in #2919
  • Validate optimization enums in user configuration by @MrNeRF in #2920
  • Allow zero perf benchmark warmup by @MrNeRF in #2922
  • Preserve fractional MCP request ids by @MrNeRF in #2923
  • Carry stop approval through the project switch by @MrNeRF in #2924
  • Support ellipsis and new-axis tensor indexing by @MrNeRF in #2925
  • Support standalone camera image loading by @MrNeRF in #2926
  • Reject wrong JSON types in user configuration by @MrNeRF in #2927
  • Restore the error-debt gate after the training update by @MrNeRF in #2929
  • Give OperatorFlags flag semantics in Python by @MrNeRF in #2930
  • Validate colormap input rank by @MrNeRF in #2931
  • Validate SplatData.set_colors_rgb input by @MrNeRF in #2932
  • Honor dataset options when resuming a project by @MrNeRF in #2933
  • Reject unknown MeshData.to devices by @MrNeRF in #2934
  • Validate project preview PNG bytes by @MrNeRF in #2941
  • Accept empty multidimensional NumPy arrays by @MrNeRF in #2935
  • Validate MeshData tensor setters by @MrNeRF in #2936
  • Reject negative tensor dimensions in factories by @MrNeRF in #2937
  • Broadcast values in tensor slice assignment by @MrNeRF in #2939
  • Cover invalid tuple index assignment by @MrNeRF in #2940
  • Enforce the dataset resize factor minimum in Python by @MrNeRF in #2942
  • Validate optimization parameters set from Python by @MrNeRF in #2943
  • Support positive stepped tensor slices by @MrNeRF in #2944
  • Reject nonpositive pipeline grow and shrink iterations by @MrNeRF in #2947
  • Return an empty tensor when arange steps away from its end by @MrNeRF in #2948
  • Reject non-finite splat simplification ratios by @MrNeRF in #2945
  • Report empty pipelines as not ready by @MrNeRF in #2949
  • Reject negative LOD hierarchy node ids by @MrNeRF in #2946
  • Reject --mcp-port in headless mode by @MrNeRF in #2953
  • Restore the outer context after nested lf.run by @MrNeRF in #2952
  • Return Camera.K without a batch dimension by @MrNeRF in #2954
  • Return an empty tensor for zero linspace samples by @MrNeRF in #2951
  • Make the animation timeline constructible from Python by @MrNeRF in #2955
  • Create arange tensors on the requested device by @MrNeRF in #2959
  • Update Python tests for automatic MRNF values and the shared edge loss by @MrNeRF in #2958
  • Evaluation: reference bit depth, FLIP and one image per view with masks by @MrNeRF in #2961
  • Count the new evaluation property in the property inventory test by @MrNeRF in #2962
  • Scope exposure correction defaults to MRNF by @MrNeRF in #2963
  • Concatenate CUDA tensors of any element size along inner dimensions by @MrNeRF in #2964
  • Fix compact performance HUD input and dragging by @MrNeRF in #2966
  • Create a fresh project on training-start Save As by @MrNeRF in #2967
  • Fix MSVC C2398 narrowing conversion in metrics eval expand() calls by @jacobvanbeets in #2965
  • Define output_format_extension inline for the standalone unicode path test by @MrNeRF in #2969
  • Skip disabled backward features in the fused rasterizer by @MrNeRF in #2970
  • Add licht --embed to embed a dataset into a project by @MrNeRF in #2968
  • fix compile error on windows by @kmeirlaen in #2972
  • Compose multi-node numeric rotations as matrices by @MrNeRF in #2971
  • Keep node origins in Individual mode numeric rotation and scale by @MrNeRF in #2974
  • Apply transforms once when a node and its descendant are both selected by @MrNeRF in #2975
  • Keep typed transform values while a field is being edited by @MrNeRF in #2976
  • Cancel transform gizmo drags with Escape or right-click by @MrNeRF in #2978
  • Refine COLMAP sparse point import by @MrNeRF in #2977
  • Preserve sheared transforms when editing nodes under scaled parents by @MrNeRF in #2979
  • Undo deleting all gaussians of a node in a multi-node scene by @MrNeRF in #2980
  • Route the G key by scene content and keep GT comparison to datasets by @MrNeRF in #2981
  • Reject parent transforms that cannot preserve a node's world transform by @MrNeRF in #2982
  • Grow and shrink selections in world space across transformed nodes by @MrNeRF in #2983
  • Prioritize gizmo axis hits over collapsed plane handles by @MrNeRF in #2984
  • Keep the requested selection submode when activating Select through MCP by @MrNeRF in #2985
  • Allow Save As after an autosave without touching the source project by @MrNeRF in #2987
  • Refresh the Asset Manager entry after renaming an open project by @MrNeRF in #2989
  • Search Asset Manager entries by their displayed title by @MrNeRF in #2990
  • Keep the cached selection count in sync with the selection masks by @MrNeRF in #2986
  • Warn about the removed oversize split setting only when it was changed by @MrNeRF in #2994
  • Use an unconditional viewport shortcut in input dispatch tests by @MrNeRF in #2999
  • Lay out streamed RAD exports the way Spark pages them by @MrNeRF in #3001
  • Keep every selection tool within visible, unlocked nodes by @MrNeRF in #3006
  • Keep the minimized performance HUD closed after a drag by @MrNeRF in #3009
  • Show the selection only in select mode and switch out of crop mode with one click by @MrNeRF in #3008
  • Add an eval command that scores a finished model by @MrNeRF in #3007
  • Write final exports next to the resumed project when no output folder is given by @MrNeRF in #3011
  • Restore native Wayland window handling and scaling by @shadygm in #2988
  • Apply the final pointer position when a gizmo drag is released by @MrNeRF in #3012
  • Fix top menu hover on scaled displays by @shadygm in #2991
  • Make Getting Started videos easier to browse by @shadygm in #2993
  • Resize tutorial thumbnails with the Getting Started popup by @shadygm in #2995
  • Restore 3-point alignment for untrained point clouds by @shadygm in #2998
  • Update and consolidate Python API documentation by @shadygm in #3000
  • Improve Projects panel spacing and transfer progress layout by @shadygm in #3002
  • Fix orbit after cropping, redraw after deleting, crop tool after undo, and the error-debt gate by @MrNeRF in #3014
  • Move WASD at the same speed in every scene by @MrNeRF in #2996
  • Make UI visibility toggles respond without the fullscreen cooldown by @shadygm in #3004
  • Select every model with Ctrl+A outside the Select tool by @MrNeRF in #3015
  • Keep orthographic zoom synchronized with scene overlays by @shadygm in #3005
  • Use the panel's orthographic zoom for align markers and run UI visibility tests on Linux by @MrNeRF in #3016
  • Show the portal's reason when a gallery request is rejected or the session is revoked by @MrNeRF in #3019
  • Keep Gaussian render inputs resident during node transforms by @MrNeRF in #3020
  • Keep published split-view output images alive until they are replaced by @MrNeRF in #3021
  • Refresh the Scene panel immediately after Duplicate and other context-menu changes by @MrNeRF in #3023
  • Check the consolidated plugin reference in the docs tests by @MrNeRF in #3024
  • Keep project opening responsive while the project catalog is scanned by @MrNeRF in #3025
  • Show selection volume guides when the selected model has a hidden crop helper by @MrNeRF in #3027
  • Keep the active transform tool and its toolbar when a model is deleted by @MrNeRF in #3026
  • Suggest SSOG as the default gallery upload format by @MrNeRF in #3028
  • Start camera navigation on the first press after a gizmo drag by @MrNeRF in #3029
  • Stop the brush hover cursor from leaving a selection tint on splats by @MrNeRF in #3030
  • Remove the node selection flash by @MrNeRF in #3031
  • Fix the Windows link of the CPU-only visualizer tests by @MrNeRF in #3033
  • Keep the selection depth box in the split panel the user selects in by @MrNeRF in #3034
  • Keep other models in place while a hidden model's scene rebuild runs by @MrNeRF in #3035
  • Keep unselected models dimmed while another model is hidden by @MrNeRF in #3036
  • Make mirror edits undoable by @MrNeRF in #3039
  • Select the same Gaussians for a shape through the UI and through commands by @MrNeRF in #3041
  • Keep repeated mirrors from drifting by computing the pivot in double precision by @MrNeRF in #3042
  • Block transforms of every node inside a locked group by @MrNeRF in #3040
  • Make depth and normal loss unavailable with GUT by @MrNeRF in #3043
  • Record a numeric transform edit as one undo step by @MrNeRF in #3044
  • Restore the exact sibling order when redoing a Scene panel reorder by @MrNeRF in #3045
  • Duplicate point-cloud nodes by @MrNeRF in #3046
  • Skip the frustum zoom test on machines without a GPU by @MrNeRF in #3048
  • Fixes Windows portable-build compilation failure by @kmeirlaen in #3047
  • Duplicate every render-content child of a group and skip training data with a notice by @MrNeRF in #3051
  • Fix video extractor panel layout and state display by @MrNeRF in #3050
  • Keep the merged output visible after Merge to Single PLY, undo and reopen by @MrNeRF in #3052
  • Give API-created cameras a valid distortion schema and validate camera inputs by @MrNeRF in #3054
  • Keep the camera constructor accepting every loader input and validate only add_camera by @MrNeRF in #3056
  • Do not append a second extension in save dialogs by @MrNeRF in #3057
  • Write the canonical suffix when a save dialog path differs only in case by @MrNeRF in #3058
  • Report live Gaussian counts in scene node summaries by @MrNeRF in #3060
  • Offer Merge to Single PLY only for groups that contain splats by @MrNeRF in #3061
  • Publish large scenes to the gallery as streamable SSOG by @MrNeRF in #3049
  • Remove the unused committed selection color setting by @MrNeRF in #3055
  • Show selection groups in the Selection & Overlays section by @MrNeRF in #3059
  • Keep locked selection groups on Deselect All by @MrNeRF in #3062
  • Finish collapse animations in the collapsed section state by @MrNeRF in #3063
  • Apply RmlUi scissor regions in window coordinates by @MrNeRF in #3064
  • Size the color picker popup to the picker by @MrNeRF in #3065
  • Find the Python module from test binaries and drop pytest from the embedded test by @MrNeRF in #3066
  • Keep valid leading statements when formatting Python by @MrNeRF in #3069
  • Use the panel scrollbar size for every scroll area by @MrNeRF in #3071
  • Respect node locks when applying crops and deleting selected Gaussians by @MrNeRF in #3070
  • Keep reopened untrained projects clean until edited by @MrNeRF in #3074
  • Keep non-splat nodes when merging a group to a single PLY by @MrNeRF in #3075
  • Reject point cloud colors the project format cannot store by @MrNeRF in #3076
  • Reject mesh colors that are not one RGBA value per vertex by @MrNeRF in #3080
  • Keep projects created now readable by earlier builds by @MrNeRF in #3081
  • Wrap the HUD tabs and console toolbar when space is short by @MrNeRF in #3079
  • Fix inconsistencies and a stuck rebind in Preferences by @MrNeRF in #3083
  • Keep the command-line MCP port when MCP preferences change by @MrNeRF in #3084
  • Center message and confirmation dialogs on the window by @MrNeRF in #3085
  • Offer camera menu actions only when they have a target by @MrNeRF in #3086
  • Keep the copied selection aligned when duplicating a splat with deleted rows by @MrNeRF in #3087
  • Keep interactive ellipsoid radii positive for flat or single-point splats by @MrNeRF in #3088
  • Fix the camera schema tests to pass loader-shaped translations by @MrNeRF in #3090
  • Recognize SOG and SSOG files regardless of suffix case by @MrNeRF in #3091
  • Export the real splats of a loaded RAD file by @MrNeRF in #3092
  • Keep every splat when merging a group with an unapplied crop by @MrNeRF in #3093
  • Fix a crash when opening videos that need stream probing by @MrNeRF in #3094
  • Clamp crop box scale drags to the minimum extent under scaled parents by @MrNeRF in #3097
  • Extract the auto-detected trim range to the end of the video by @MrNeRF in #3095
  • Keep the input-dispatch test overlay alive through GUI teardown by @MrNeRF in #3096
  • Keep pixels outside the training mask out of MRNF edge guidance by @MrNeRF in #3098
  • Stop the font warnings when a panel section collapses by @MrNeRF in #3099
  • Show the crop tool gizmo in both split panels and clip gizmos to their panel by @MrNeRF in #3100
  • Cut routine INFO lines that flood the log by @MrNeRF in #3101
  • Show the number of splats the export writes in the Export dialog by @MrNeRF in #3102
  • End long model names in the Export dialog with an ellipsis by @MrNeRF in #3103
  • Keep timed and explicit video extraction bounds after the trim range fix by @MrNeRF in #3104
  • Keep locked selection groups when using the selection toolbar by @MrNeRF in #3105
  • Let the Python console terminals follow the theme by @MrNeRF in #3106
  • Render RAD files without a glow next to other models and in exports by @MrNeRF in #3107
  • Keep viewport image export VRAM flat at large sizes by @MrNeRF in #3108
  • Write large PNG images on all cores by @MrNeRF in #3109
  • Export the current scene right after showing or hiding a model by @MrNeRF in #3110
  • Include visible meshes in viewport image exports by @MrNeRF in #3111
  • Test that the Python console terminals follow the theme by @MrNeRF in #3112
  • Make the Adam precision control numerically stable by @MrNeRF in #3113
  • Select nodes before numeric history runtime checks by @MrNeRF in #3114
  • Generate the RAD leaf regression fixture by @MrNeRF in #3115
  • Retire test CUDA streams before destroying them by @MrNeRF in #3116
  • Generate the SH workspace test model by @MrNeRF in #3117
  • Synchronize Python panel replacement and removal on the viewer thread by @MrNeRF in #3118
  • Count every finite effective rank in automatic histogram ranges by @MrNeRF in #3119
  • Keep the Histogram range fields in sync with the displayed metric by @MrNeRF in #3120
  • Count every finite sample in the automatic Opacity and Anisotropy histogram ranges by @MrNeRF in #3121
  • Keep clicks on floating panels from reaching docked panels beneath them by @MrNeRF in #3122
  • Apply active crop volumes to Histogram samples by @MrNeRF in #3123
  • Turn off the MRNF opacity regularizer by @MrNeRF in #3124
  • Keep Histogram range controls legible in narrow panels by @MrNeRF in #3125
  • Synchronize Vulkan device idle with queue access by @MrNeRF in #3126
  • Reset Histogram zoom on double-click by @MrNeRF in #3127
  • Extend the clip when a keyframe is added just past its end by @MrNeRF in #3129
  • Grow the Vulkan UI geometry pool instead of drawing past it by @MrNeRF in #3130
  • Record sequencer keyframe additions in the shared undo history by @MrNeRF in #3128
  • Give every exported video frame a duration by @MrNeRF in #3131
  • Report PLY sequence load failures from the MCP sequencer tool by @MrNeRF in #3132
  • Reject non-MP4 filenames for video export by @MrNeRF in #3133
  • Trim info logs to what users act on by @MrNeRF in #3134
  • Keep the running time when training is stopped by @MrNeRF in #3135
  • Check snapshot gate flags against their inputs in tests by @MrNeRF in #3136
  • Reject out-of-range PLY sequence frame rates in the MCP sequencer tool by @MrNeRF in #3137
  • Reject out-of-range easing values in the MCP sequencer tool by @MrNeRF in #3138
  • Regenerate the error-debt baseline after the log trim by @MrNeRF in #3139
  • Make sequencer keyframe deletion undoable by @MrNeRF in #3140
  • Make sequencer keyframe time edits undoable by @MrNeRF in #3141
  • Keep the PLY sequence when clearing sequencer keyframes by @MrNeRF in #3145
  • Hide single-model datasets in Vulkan renders and exports when hidden in the scene by @MrNeRF in #3155
  • Reject degenerate camera up vectors in the MCP sequencer tools by @MrNeRF in #3156
  • Allow Save As to long project filenames by @MrNeRF in #3159
  • Keep sequencer helper nodes out of scoped scene undo by @MrNeRF in #3160
  • Do not resurrect removed camera-path keys when saving projects by @MrNeRF in #3161
  • Sequencer fixes: clear, PLY scrub/export, timeline layout, MCP validation, idle, Ping-Pong by @MrNeRF in #3162
  • Export the full sequencer clip in Once mode by @MrNeRF in #3164
  • Keep the order of camera keys that share a time by @MrNeRF in #3165
  • Fix short igs+ and sparsity runs and dataset-camera captures over MCP by @MrNeRF in #3167
  • Support camera-aware depth and normal supervision in GUT by @MrNeRF in #2138
  • fix(io): support long Windows project paths and bound replacement filenames by @francescofugazzi in #3169
  • Fix the long-name Save As overwrite test build by @MrNeRF in #3170
  • Name the project file after --output-name and keep its extension single by @MrNeRF in #3171
  • Keep the dataset image thumbnail of a project after a library refresh by @MrNeRF in #3172
  • Speed up Histogram drag, zoom and bin changes; select bins like the selection tools by @MrNeRF in #3173
  • Add the 0.5.4 release video to Getting Started and open it from the startup overlay by @MrNeRF in #3174
  • Refresh the project library without reopening unchanged projects by @MrNeRF in #3175
  • fix: preserve edited PLY sequence frames during cache eviction by @francescofugazzi in #3179
  • Fit depth anchors on the SfM points each camera observed by @MrNeRF in #3180
  • Publish gallery SSOG in 64k units by @MrNeRF in #3182
  • fix: preserve active PLY sequence when import discovery fails by @francescofugazzi in #3181
  • Keep the histogram highlight in sync with every selection change by @MrNeRF in #3184
  • fix: retain combined splat aggregates for render snapshots by @francescofugazzi in #3183
  • Show the version on the startup screen by @MrNeRF in #3185

New Contributors

Full Changelog: v0.5.3...v0.5.4