The node's own scalar/amplitude data range.
Raw leaf-authored gain/offset (uncomposed).
Effective gain/offset after ancestor composition.
Optionalowner: DisplayUniforms
Raw gain/offset of the nearest layer=true node on the
leaf's ancestry, the leaf included (windowOwnerGain);
omitted when no layer owns the leaf.
Resolve the scalar LUT window for a COLORMAPPED node at load time.
On a colormapped node an authored
intensity/offsetis the scalar WINDOW (value→LUT mapping), NOT a post-LUT color gain — applying it as both double-applies (#936). Callers therefore push identity to the color GOG and this window toupdateScalarRange.The identity-vs-window decision follows the RAW gain of the node whose window the Layers panel controls — the leaf, or the nearest
layer=trueancestor that owns it (owner) — mirroring the panel:layer-state.tsstarts a layer from its data range when THAT LAYER's gain is identity, and reads a non-identity gain on it as the absolute window. NOT the composed value, which would treat a non-layer ancestor's gain as an authored window and discard the node's own data range. When the leaf or its owning layer DID author a window, the COMPOSED gain IS the panel's effective gain (intensity multiplies, offset adds —attrs-composer.ts), so it is used directly. When both are identity, any ancestor gain is folded onto the data-range window exactly the way the panel composes it: data range → window uniforms × ancestor gain → back to a window.Deciding on the leaf alone disagreed with the panel whenever the gain sat on a layer GROUP above an identity leaf (
luxar gsplat convert --intensity, akind=partitionwrapper): the factory folded it onto the leaf's range while the panel pushed it as the window — ~14x narrower on the hosted h2afva timelapse. Invisible on leaves the panel re-pushes, visible on any leaf built after the panel's last push.Shared by the points, lines, and gsplats node factories so all three geometry types agree (the three-geometry symmetry rule).