The GLSL #defines carrying each layout's element-texture width.
Pre-stamped at material construction (visual + picking, all three
geometry types) with String(getElementTextureWidth(layout)) via
the layout's own widthDefine name, then re-stamped from the bound
texture on every texture update (applyElementTextureWidthDefine) — pool textures allocate at the
session width, so the re-stamp is a no-op in the common path. The
TSL twins bake the same value as a literal int node at graph build
instead of a define (resolveElementTextureWidth). The names are PER GEOMETRY
(widths differ: texels-per-element 6/3/4 → 4092/4095/4096) so a
harness compiling raw shader sources can inject all of them
unconditionally via elementTextureWidthDefines — an unused
define is inert.
The GLSL
#defines carrying each layout's element-texture width. Pre-stamped at material construction (visual + picking, all three geometry types) withString(getElementTextureWidth(layout))via the layout's ownwidthDefinename, then re-stamped from the bound texture on every texture update (applyElementTextureWidthDefine) — pool textures allocate at the session width, so the re-stamp is a no-op in the common path. The TSL twins bake the same value as a literal int node at graph build instead of a define (resolveElementTextureWidth). The names are PER GEOMETRY (widths differ: texels-per-element 6/3/4 → 4092/4095/4096) so a harness compiling raw shader sources can inject all of them unconditionally via elementTextureWidthDefines — an unused define is inert.