Currently-loaded progressive loaders, keyed by scene path.
Queue checked for user-initiated cancellation each rAF.
Per-iteration processor. Handles ONE loader: derive query state,
fetch the next LOD via the loader's updateView, process, commit.
If the loader has no more LODs (or query state says skip), this
returns false without work. A successful attempt returns true;
failures and cancellations return false so their existing retry
policies take precedence over the no-progress guard.
Snapshot a loader that is still eligible for refinement. Return null
for completed, non-progressive, or failure-exhausted loaders.
After each pass, the loop asks whether ANY loader still has more LODs to refine. Once all return false, the loop exits.
OptionalonReport loaders that remained pending without advancing during a pass.
Aggregate visible counts into the monitor after each pass.
Release the SceneLoader's _updateInProgress lock when the loop
completes normally. On cancellation the loop hands the lock to
retriggerUpdate instead.
Re-enter SceneLoader.updateView() with the pending state.
Owns the lock from this point. Typically schedules the new
update at the next rAF boundary.
OptionalisOptional liveness check. Returns false once the owning SceneLoader has been disposed (e.g. a dataset switch tore it down while this loop was mid-flight). When provided and false, the loop aborts immediately instead of continuing to fetch/decode/prefetch against a dead dataset. Omitted by callers that have no separate disposal signal.
OptionalonOptional handler for an error thrown inside the per-pass loop body (outside the per-loader processing, which the caller's closure already guards). Called just before the loop breaks; typically logs.
Context object the generic loop needs from the per-type caller.
TLoaderis intentionally loose — the loop only reads loaders out ofloadersand passes them throughprocessLoader/ checksanyHasMoreLODs. All type-specific work happens inside the closures.