Stamp per-point-data presence flags on the geometry's userData — the
points twin of line-geometry.ts::stampLinePresenceFlags, extracted
so the two texel-write paths (node factory + pool adapter) share ONE
implementation instead of a drift-prone five-flag inline block. The
fixed 3-texel layout always carries every slot (identity fills when
absent), so presence is not readable off a geometry attribute:
supportsScalarColormap('points', …) reads hasScalars; the
commit's material sync pushes hasElementAlpha into the material's
uHasElementAlpha gate (volumetric w(a) map); the sibling flags
serve debug/E2E introspection (node zarr attrs lack
has_colors/has_radii/has_sharpness on datasets written before the
Python writer stamped them).
Semantics preserved exactly from the historical inline blocks:
hasScalars counts a ZERO-LENGTH declared scalars array as present
(!== undefined) — the placeholder's declared field must pass the
fail-closed colormap guard, matching the interleaved era's empty
aScalar pre-bind.
hasElementAlpha derives from the SOURCE color layout
(colorK === 4), not from buffer contents.
Refreshed on EVERY write (pool geometries are reused across tenants;
a presence flip must not leak the previous tenant's stamp) and called
AFTER the texel write: writePointTexels throws only at its pre-loop
length guard, so a throwing write leaves the texture's PREVIOUS
content fully intact — and the un-reached stamps stay consistent with
it (old texels + old stamps).
Stamp per-point-data presence flags on the geometry's userData — the points twin of
line-geometry.ts::stampLinePresenceFlags, extracted so the two texel-write paths (node factory + pool adapter) share ONE implementation instead of a drift-prone five-flag inline block. The fixed 3-texel layout always carries every slot (identity fills when absent), so presence is not readable off a geometry attribute:supportsScalarColormap('points', …)readshasScalars; the commit's material sync pusheshasElementAlphainto the material'suHasElementAlphagate (volumetric w(a) map); the sibling flags serve debug/E2E introspection (node zarr attrs lack has_colors/has_radii/has_sharpness on datasets written before the Python writer stamped them).Semantics preserved exactly from the historical inline blocks:
hasScalarscounts a ZERO-LENGTH declared scalars array as present (!== undefined) — the placeholder's declared field must pass the fail-closed colormap guard, matching the interleaved era's emptyaScalarpre-bind.hasElementAlphaderives from the SOURCE color layout (colorK === 4), not from buffer contents.Refreshed on EVERY write (pool geometries are reused across tenants; a presence flip must not leak the previous tenant's stamp) and called AFTER the texel write:
writePointTexelsthrows only at its pre-loop length guard, so a throwing write leaves the texture's PREVIOUS content fully intact — and the un-reached stamps stay consistent with it (old texels + old stamps).