Cheap half of GSplats node loading: construct the loader and attach
an empty placeholder mesh — no array fetch, no GPU commit, and
crucially no registry registration. Splitting this from the
expensive half lets the lod_group loader attach every level's
placeholder up front while deferring the costly geometry load to
loadGSplatsNodeExpensive (per-level lazy loading). Branches on
n_additive_sublods for progressive vs single-LOD loaders, exactly
as the combined path did.
Registration is the caller's responsibility. Registering an unloaded
lazy level would pull it into the scene-wide updateView sweep
(runLoaderUpdates over every registered gsplat loader), which would
load+commit every level and defeat the lazy deferral. The combined
loadGSplatsNode (eager path) registers immediately; the lod_group's
lazy levels are NEVER registered — they stay out of the sweep for their
whole lifetime and the LODGroupRegistry drives their (re)loads
(settle-gated ensureLoaded; see load-lod-group-node.ts).
Cheap half of GSplats node loading: construct the loader and attach an empty placeholder mesh — no array fetch, no GPU commit, and crucially no registry registration. Splitting this from the expensive half lets the lod_group loader attach every level's placeholder up front while deferring the costly geometry load to
loadGSplatsNodeExpensive(per-level lazy loading). Branches onn_additive_sublodsfor progressive vs single-LOD loaders, exactly as the combined path did.Registration is the caller's responsibility. Registering an unloaded lazy level would pull it into the scene-wide
updateViewsweep (runLoaderUpdatesover every registered gsplat loader), which would load+commit every level and defeat the lazy deferral. The combinedloadGSplatsNode(eager path) registers immediately; the lod_group's lazy levels are NEVER registered — they stay out of the sweep for their whole lifetime and theLODGroupRegistrydrives their (re)loads (settle-gatedensureLoaded; seeload-lod-group-node.ts).