Blacksite/docs/adr/0015-viewport-camera-stack-ownership.md
Rbanh f29712d158
Some checks are pending
CI / Format, lint, test, build (push) Waiting to run
Initial project import
2026-06-05 21:44:45 -04:00

41 lines
2.2 KiB
Markdown

# ADR 0015: Viewport camera stack ownership
## Status
Accepted
## Context
ADR 0014 unified the editor viewport render target and camera binding, but post-processing and GI
components were still stripped in multiple places (`scene_view`, play session, and full strip/reapply
in `render_view`). That caused WYSIWYG gaps between edit and play, lost FX after resize, and
interacted badly with `setup_project_camera_effects` filtering on `Without<Atmosphere>`.
Separately, `GiMode::Auto` could select Solari while shadow-casting point/spot lights were present.
Solari deferred skips the forward PBR light pass (ADR 0013), so local light shadows disappeared.
Scene directionals hydrated with hardcoded cascade bounds that did not match project shadow settings
used by `ProjectSun`.
## Decision
1. **`game_hot::rendering::viewport_camera`** is the only module that adds/removes the viewport
render stack (`ProjectRenderCamera`, exposure, GI, atmosphere, bloom, fog, etc.).
2. **Editor** `scene_view` and `play/session` set `RenderTarget`, `Camera::is_active`, and
`viewport = None` only. **`render_view::sync_project_render_view`** calls
`clear_viewport_camera_stack` on owner handoff and `sync_viewport_camera_stack` on the active
camera (full apply on owner change; incremental when the stack already exists).
3. **`effective_viewport_gi_path`** forces `GiPath::Forward` when any `PointLight` or `SpotLight`
with `shadows_enabled` exists in the world (auto-forward for local shadows).
4. **Scene directionals** use `cascade_config_from_rendering` from project settings at hydration;
`sync_scene_directional_shadow_cascades` updates cascades when settings change.
5. **Hydrated lights** always insert `Visibility::Visible` with runtime light components.
## Consequences
- Edit/play possession (F5/F8) and settings Apply no longer flash unlit frames from scattered FX strips.
- Rendering diagnostics can report “Solari requested, Forward (local shadow lights)”.
- Thumbnail studio and multi-viewport remain out of scope; they do not use the viewport camera sync path.
- `setup_project_camera_effects` no longer skips cameras that already have atmosphere; editor defers
player FX via `GameRenderBootstrap` and relies on `sync_project_render_view` once HDR RTT exists.