OptionalhasWhether the owning loader has latched an archive fault.
OptionalhasWhether a loader under this LOD group has a recorded network failure.
OptionalgetResident-byte budget (the ceiling). The single, adaptive VRAM budget shared with the GPU buffer pool — one authority, not a competing one. Omitted ⇒ no eviction (pure retention), the default for unit tests that construct the registry directly.
OptionalgetMeasured total resident VRAM bytes (active + pooled) from the GPU buffer pool — the single accounting truth. The registry compares this to the budget to decide when to demote cold levels; it no longer keeps its own per-level byte estimate. Omitted ⇒ no eviction (pure retention), the default for unit tests.
OptionalgetCurrent view-update version (SceneLoader.currentViewVersion). Used for
the slice-aware fallback: a gsplats level whose committed geometry was
stamped with an older version still shows a previous slice/displayDims, so
the registry treats it as stale and displays the coarsest level that IS
fresh until the re-slice commits. Omitted ⇒ no freshness tracking (every
ready level is treated as fresh — identical to the pre-feature behaviour;
the default for unit tests that don't exercise scrubbing).
OptionalnowMonotonic wall clock in milliseconds, for the stale-hold budget (see
config.lod.staleHoldMs). Injectable so tests can advance it deterministically;
omitted ⇒ performance.now().
OptionalrequestKeep the render loop alive (the viewer is on-demand and idles after ~2s).
Called each frame while a lazy level is loading so a deferred fine reload
— which commits OUTSIDE the per-slice sweep and can take longer than the
idle timeout — still triggers the per-frame swap-up to the fresh level when
it lands, instead of waiting for the next user interaction. Wired to
AnimationController.startAnimation (resets the idle timeout). Omitted ⇒
no-op (unit tests don't run a loop).
OptionalrequestKeep the loop TICKING without asking for a redraw — the render-on-change
counterpart of requestRender for the two keep-alive calls above
(a lazy level loading, a pending partition resync): nothing drawn has
changed yet, the loop just has to keep running the per-frame selector so
the swap fires when the load lands (a swap marks the frame dirty through
LODGroupRegistry.takeDrawnStateChanged). Wired to
AnimationController.requestTick. Omitted ⇒ those calls fall back to
requestRender (an embedder whose host renders on every wake).
OptionalrequestRe-run the current view update for the partition parts that just
re-entered the frustum. Culled children skip event-driven slice updates, so
the rising edge must resync any geometry that missed the latest view state.
paths are the re-entering PART node paths (child.path), or
the partition wrapper path when a part has none (= resync the whole
partition); the loader prefix-matches its sweep loaders under them, so a
nested kind=lod part's eager level is covered. The view state is
unchanged, so the loader MUST NOT bump the view version for this pass —
otherwise every lazy fine level scene-wide reads stale and drops to coarse.
OptionalgetThe view the drawn geometry was last COMMITTED for (the owning loader's
last committed pass). Partition parts whose bounds miss its hidden-dim
slice draw nothing, so they are hidden and kept out of refinement (B4) —
against the COMMITTED view, not the requested one, so a part leaving the
slice disappears in the same frame its successors are committed rather
than when the pass that replaces it starts. Omitted / undefined ⇒ no
slice gating (every part is in slice — the pre-B4 behaviour).
OptionalisWhether the owning loader has a view PASS in flight or queued. Rising edges are held (and coalesced) while this is true so a resync never lands on top of a pass. A refinement hold deliberately does NOT count: the loader parks a resync that arrives during one and cancels into its own pass, so re-entering parts do not sit on a stale slice until the ladders finish.
OptionalgetWhether the LOD level dissolve is enabled (ON by default; ?noLodFade
disables; the name predates the time-driven dissolve). When true and a blendable (additive/luminous/volumetric — see
BLENDABLE_MODES in scene/lod-fade.ts) group changes its displayed
level, the registry dissolves from the outgoing level to the incoming one
over config.lod.fadeMs — the incoming at smoothstep(elapsed / fadeMs),
the outgoing at the complement — instead of a hard visibility swap.
Time-driven, so a parked camera always settles on ONE level, and
independent of additive streaming. Omitted / false ⇒ the hard swap,
byte-identical.
Read live so the flag applies without a reload. The default for unit tests
(off).
OptionalgetThe period (ms) of the fastest dimension currently PLAYING, or null
when nothing plays (DimensionAnimationManager.getPlaybackPeriodMs).
While non-null, lazy levels reload on every timepoint without the settle
debounce and the aspiration is capped at the finest level whose measured
load time fits (see config.lod.playbackLoadBudgetFraction). Omitted ⇒ never
playing — identical to the pre-feature behaviour.
OptionalgetWhether streaming brightness compensation is enabled: as a blendable
(additive/luminous/volumetric)
leaf's ladder streams in, scale its opacity by 1/e(k) so the partial prefix
renders at the full-level energy (no brightening pop). Distinct from the
level dissolve (within one level's stream, not between levels) and
independently gated; either flag on
enables the registry's per-frame opacity management. Omitted / false ⇒
byte-identical (no material writes). Read live so the flag applies without a
reload. The default for unit tests (off).
OptionalgetForce the finest LOD level regardless of projected screen coverage (and
never coarsen off-screen) — for high-quality still/video capture (the
gallery harness), where a coarse level looks blurry even when the
subject is small in frame. Wired from LuxarAppOptions.lodFinest
(the ?lodFinest URL flag, threaded through the standalone
bootstrap); omitted / false ⇒ normal coverage-driven selection. Read
live, like the sibling flags above.
OptionalgetReplacement-LOD bias in screen-area units. 2 advances one level on an
occupancy-halved ladder. Legacy diagonal coverage receives sqrt(bias)
so both selectors shift by the same area factor. Since finite screen-area
coverage is at most 1, bias below 1 makes a partition-anchored finest
level unreachable and bias below 0.5 does the same for a whole-object
finest level. Invalid values are neutral.
OptionalregisterRegister a clone-on-first-fade material with the material manager so it keeps
receiving per-frame camera-uniform updates (the fade clones the shared cached
material to fade one level independently; an unregistered gsplat clone would
project with stale camera params). Wired to materialManager.register;
omitted in unit tests (no camera loop).
Viewport size in CSS pixels (matches the renderer canvas).
OptionalgetThe frame's shared camera snapshot. When omitted the registry builds its
own from getCamera / getViewportSize, refreshed every evaluation.
Which dimensions of the data are being projected to screen.
Injected view-state accessors. Lets the registry stay test-friendly (mock the camera, the viewport, the slice) without coupling to the SceneManager singleton.