Ancestor-aware ("effective") visibility for scene-graph nodes.
object.visible is a LOCAL flag: THREE hides a subtree by clearing the flag
on one ancestor and leaves every descendant's own flag untouched. Anything
that asks "does this node actually render / is it worth spending work on?"
must therefore walk the parent chain. Two independent places got this wrong
in different ways, so the walk lives here once:
a layer authored visible=false (or toggled off in the layers panel)
hides the LAYER object, while an LOD level underneath keeps
visible === true;
the LOD registry hides a LEVEL, which can itself be a GROUP (partition
tiles), while the member meshes underneath keep visible === true.
Consumers: the LOD-group registry's load gate (never fetch a hidden layer's
lazy levels), the LOD eviction policy (a hidden level is evictable), the
pick pass, and the depth-sort scheduler.
Ancestor-aware ("effective") visibility for scene-graph nodes.
object.visibleis a LOCAL flag: THREE hides a subtree by clearing the flag on one ancestor and leaves every descendant's own flag untouched. Anything that asks "does this node actually render / is it worth spending work on?" must therefore walk the parent chain. Two independent places got this wrong in different ways, so the walk lives here once:visible=false(or toggled off in the layers panel) hides the LAYER object, while an LOD level underneath keepsvisible === true;visible === true.Consumers: the LOD-group registry's load gate (never fetch a hidden layer's lazy levels), the LOD eviction policy (a hidden level is evictable), the pick pass, and the depth-sort scheduler.