# V2 Camera Zoom

The camera zoom layer resolves aim-down-sights, scope, and binocular zoom from a
base `FV2CameraModeSpec`. It blends FOV toward the requested zoom target while
preserving the base camera pose and mode metadata.

## Runtime Surface

- `FV2CameraZoomConfig` configures FOV bounds, ADS, scope, and binocular target
  FOVs, zoom-in and zoom-out speeds, per-mode enable flags, and blend duration.
- `FV2CameraZoomState` carries the base camera mode, current FOV, and current
  zoom alpha.
- `FV2CameraZoomInput` carries requested zoom mode, held state, and delta
  seconds.
- `FV2CameraZoomEvaluation` returns requested and resolved modes, base, target,
  and final FOV, zoom alpha, active and completion flags, base and resolved mode
  specs, and validation issues.

## Zoom Rules

1. Invalid config, state, or input timing is blocking.
2. Disabled zoom modes report `ZoomModeDisabled` and fall back to no zoom.
3. ADS, scope, and binocular modes each resolve to their configured target FOV.
4. Holding zoom increases alpha by `ZoomInSpeed * DeltaSeconds`.
5. Releasing zoom decreases alpha by `ZoomOutSpeed * DeltaSeconds`.
6. FOV values are clamped to configured bounds and reported as `ZoomFovClamped`.
7. `ZoomBlendComplete` is reported when alpha reaches the requested end state.

## Camera Manager Export

`EvaluateCameraZoom` fills `ModeSpec` from the base camera mode with the
resolved FOV and configured blend duration. `BuildCameraZoomMode` can export a
custom id, priority, and active flag while preserving base camera pose, blend
function, input, and cinematic metadata.

## Validation Commands

Run these targeted checks when touching camera zoom:

```bash
python3 V2/ue/Tools/check-v2-camera-zoom.py
python3 V2/ue/Tools/check-v2-camera-manager.py
python3 V2/ue/Tools/check-v2-ci-workflow.py
python3 -m json.tool V2/ue/Content/V2/Gameplay/Camera/CameraZoom_V2_Contract.json
python3 -m py_compile V2/ue/Tools/check-v2-camera-zoom.py
```
