Adds VisibilityState, a CPU-only sibling to SelectionState. It owns
the canonical hidden-id set plus a flat per-object_id byte vector that
the cull's hot path queries inline (bounds check + byte load + compare
per surviving instance). Hidden elements never reach the visible[]
SSBO so they don't draw or pick — matching Blender/CAD convention.
ViewportWindow registers every streamed and sidecar-cached object_id
with the new state, resets it on clearScene, and connects the changed
signal to invalidate cached cull state. Three convenience verbs:
hideSelectedElements (union into hidden), isolateSelectedElements
(replace hidden with live-object_ids minus selection, skipping
model-hidden models so element-hide doesn't pile on top of model-hide),
and showAllElements (clears the override; model-hidden models stay
hidden, per the user's spec).
Bound in the View menu: H hide, Shift+H isolate, Alt+H show all.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>