Luxar Viewer API Documentation - v2026.9.22
    Preparing search index...

    Module data/scene-loader/nodes/load-mesh-node

    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 / 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.

    MeshCheapLoad
    loadMeshNodeCheap
    loadMeshNodeExpensive
    loadMeshNode