undefined when no level of the chain set a mode (each consumer applies
its own per-type default); otherwise canonical — a set value (even a
malformed one) is run through normalizeBlendingMode.
Nearest ancestor (root-to-leaf) that sets join, undefined when no
level of the chain does — which is what lets createLinesNode apply
DEFAULT_LINE_JOIN. Left raw on purpose: the consumer validates.
Nearest ancestor (root-to-leaf) that sets colormap, undefined when no
level of the chain does (the leaf renders its direct colours). Left raw:
getColormapTexture owns the unknown-name fallback.
Whether an inherited palette actually applies is the consumer's call and
differs by geometry: points / lines / mesh gate on has_scalars (no
scalar channel, no colormap), while a gsplats leaf is always
colormap-capable — its amplitude IS the scalar — so an ancestor-authored
palette overrides even per-splat colours there. That matches the Layers
panel's imperative fan-out (layer-apply.ts::applyColormap), so the
authored and interactive routes agree.
The custom LUT bytes belonging to whichever node supplied colormap;
undefined when that node declared no 'custom' palette.
Nearest ancestor (root-to-leaf) that sets layer_order; undefined when
no level of the chain does. The undefined is load-bearing — see the
ComposableAttrs field.
Composed absorption coefficient κ (≥ 0; only read in volumetric mode).