Builds the loader, attaches an empty placeholder so commit / retry / update always
have a target, then routes the fetch through the same deriveNodeViewState +
processMeshData / commitMeshGeometry path the update sweep and the retry path
use. Structurally the same as load-points-node.ts, progressive branch included:
a node declaring n_additive_sublods > 1 gets a MeshProgressiveLoader over its
additive_<i>/ subgroups, and everything downstream is unchanged.
Note what that ladder is and is not. Mesh still has no additive
LEVEL-OF-DETAIL ladder — a prefix of an arbitrary index buffer is a holed
surface, not a coarser one — and the writer enforces it by admitting only
orderings whose every prefix is one connected patch, so what streams in is a
REVEAL: a growing surface (MESH_NODE_SPEC.md §9). SUBSTITUTIVE levels remain a
different shape entirely — sibling children of a kind=lod group, written by
add_mesh(substitutive_lod=…) — and never route through the progressive path.
It DOES have the cheap/expensive split, and gained it late. The sibling loaders
split so a lazily-activated kind=lod level can attach its placeholder up front
and defer the costly geometry load; a mesh could not be a LOD-group child until
luxar.mesh.decimate gave it a producer, so the split had no second caller and
would have been machinery for one. Now the finest level of a mesh ladder is the
full-resolution surface, and without deferral every level — including that one —
would be fetched eagerly at scene load, which defeats the entire point of the
ladder.
Initial-load path for a single Mesh leaf node.
Builds the loader, attaches an empty placeholder so commit / retry / update always have a target, then routes the fetch through the same
deriveNodeViewState+processMeshData/commitMeshGeometrypath the update sweep and the retry path use. Structurally the same asload-points-node.ts, progressive branch included: a node declaringn_additive_sublods > 1gets aMeshProgressiveLoaderover itsadditive_<i>/subgroups, and everything downstream is unchanged.Note what that ladder is and is not. Mesh still has no additive LEVEL-OF-DETAIL ladder — a prefix of an arbitrary index buffer is a holed surface, not a coarser one — and the writer enforces it by admitting only orderings whose every prefix is one connected patch, so what streams in is a REVEAL: a growing surface (
MESH_NODE_SPEC.md§9). SUBSTITUTIVE levels remain a different shape entirely — sibling children of akind=lodgroup, written byadd_mesh(substitutive_lod=…)— and never route through the progressive path.It DOES have the cheap/expensive split, and gained it late. The sibling loaders split so a lazily-activated
kind=lodlevel can attach its placeholder up front and defer the costly geometry load; a mesh could not be a LOD-group child untilluxar.mesh.decimategave it a producer, so the split had no second caller and would have been machinery for one. Now the finest level of a mesh ladder is the full-resolution surface, and without deferral every level — including that one — would be fetched eagerly at scene load, which defeats the entire point of the ladder.