The shared engine of the additive-ladder progressive loaders.
Points, Lines and GSplats each wrap N spatial-index loaders — one per
additive_<i> subgroup, the rungs of one additive ladder — and stream them
per view under the same lifecycle. That lifecycle used to be copy-maintained
three times, and the richer behaviour the performance work added landed
mostly in GSplats. It lives here once; a geometry supplies only what differs
(LadderGeometry: how payloads concatenate, how elements are counted,
the log vocabulary) and, for GSplats, a deeper lookahead planner.
One updateView pass:
Directives. Record the pass's playback budget and pinned ladder depth
first — a pause re-trigger arrives with the SAME view and must still clear
them.
View change. Abort the old view's speculative reads (keeping a
read-ahead of exactly the slice being entered, which the new pass joins),
store the OUTGOING view's partial ladder under the outgoing key (departure
store, so scrub-back stays warm), adopt an in-flight shadow (SlicePrefetcher)
store of the incoming view, then restore a cached ladder or reset. A
restored FULL ladder short-circuits the pass.
Stream. Load rungs under the shared streaming policy
(streaming-policy.ts): playback within its budget, prefetch toward
the full ladder, refine until the first cold/slow rung, pinned exactly
the pinned depth — whose rungs are all started up front under per-rung
child signals so a brake cancels the remainder and releases what it
decoded. While a rung loads, the next rung's spatial index is warmed at
refinement priority (B6). A rung coming back empty never stops the loop
(#1456): additive rungs are disjoint subsets, not coarse resamplings.
Close. Log the summary at verbose, schedule the signal-linked
speculative lookahead of the next rung and the B5 ±1-slice read-ahead of
rung 0, then store the ladder (full ladders always; prefixes while a
playback budget or pinned depth is active) unless the pass was torn down.
The concatenated result is memoized on (reset generation, logical rung
count): an unchanged view with no new rung returns the SAME reference, which
the commit pipeline uses to skip no-op re-commits, and each fresh result is
stamped with its prefix-lineage parent for the append fast path.
The shared engine of the additive-ladder progressive loaders.
Points, Lines and GSplats each wrap N spatial-index loaders — one per
additive_<i>subgroup, the rungs of one additive ladder — and stream them per view under the same lifecycle. That lifecycle used to be copy-maintained three times, and the richer behaviour the performance work added landed mostly in GSplats. It lives here once; a geometry supplies only what differs (LadderGeometry: how payloads concatenate, how elements are counted, the log vocabulary) and, for GSplats, a deeper lookahead planner.One
updateViewpass:streaming-policy.ts):playbackwithin its budget,prefetchtoward the full ladder,refineuntil the first cold/slow rung,pinnedexactly the pinned depth — whose rungs are all started up front under per-rung child signals so a brake cancels the remainder and releases what it decoded. While a rung loads, the next rung's spatial index is warmed at refinement priority (B6). A rung coming back empty never stops the loop (#1456): additive rungs are disjoint subsets, not coarse resamplings.The concatenated result is memoized on (reset generation, logical rung count): an unchanged view with no new rung returns the SAME reference, which the commit pipeline uses to skip no-op re-commits, and each fresh result is stamped with its prefix-lineage parent for the append fast path.