Accepts a PARTIAL snapshot — symmetric with deserializeSettings,
which returns one. Callers legitimately omit keys they do not own:
saveSettingsToStorage drops near / far while dynamic clipping owns
them, so a transient camera readout is never persisted as user intent.
Serializes settings for storage.
Accepts a PARTIAL snapshot — symmetric with deserializeSettings, which returns one. Callers legitimately omit keys they do not own:
saveSettingsToStoragedropsnear/farwhile dynamic clipping owns them, so a transient camera readout is never persisted as user intent.