# Sequencer Viewport Preview

Task: `TODOS.phase-72.72.15.2.5`

The sequencer viewport preview is represented by a V2Editor TimelineVisualizer
panel spec, frame request, and deterministic preview model. It lets editor UI
show real-time preview in the 3D viewport while the timeline is playing or
scrubbing.

## Runtime API

- Panel spec: `FV2SequencerViewportPreviewPanelSpec`
- Request: `FV2SequencerViewportPreviewRequest`
- Camera state: `FV2SequencerViewportPreviewCameraState`
- Track state: `FV2SequencerViewportPreviewTrackState`
- Audio cue state: `FV2SequencerViewportPreviewAudioCueState`
- Event state: `FV2SequencerViewportPreviewEventState`
- Model: `FV2SequencerViewportPreviewModel`
- Issue enum: `EV2SequencerViewportPreviewIssueType`

`BuildSequencerViewportPreviewModel` evaluates the current frame against
`FV2SequencerSequenceSpec` and `FV2SequencerInterpolationSpec` data. It exposes
the active camera binding and FOV, evaluated keyframed track states, active
audio cues, crossed event markers, timeline frame/time, and validation issues
for the 3D viewport overlay.

## Behavior

- Real-time preview marks `bRealtimePreviewActive` from the request's playing
  state while preserving scrubbed preview through the same model.
- Timeline sync records current and previous frames, normalized position, time,
  playback rate, and looping state.
- Camera preview resolves full camera tracks through
  `EvaluateSequencerCameraTrack` and falls back to camera keyframe/property
  tracks such as `Track.HeroCamera.FOV`.
- Track states use `EvaluateSequencerKeyframeInterpolation` for transform,
  camera, property, and keyframed event tracks.
- Audio overlays use `EvaluateSequencerAudioTrack` to expose active cues, bus,
  local frame, volume, pitch, and trigger state.
- Event overlays use `EvaluateSequencerEventTrack` when event trigger tracks are
  present and also surface crossed keyframed event markers from the default data
  model.
- Validation reports invalid sequences, invalid requests, out-of-range frames,
  missing camera preview state, and failed track evaluations.

The default QA fixture uses `Seq.DataModel.CouncilIntro`, frame `60`, previous
frame `20`, active camera binding `Binding.Camera.Hero`, audio cue
`Cue.CouncilTrial.OminousMusicSwell`, and event keyframe
`Key.Global.Event.CameraCut`.

## QA Inventory

- Timeline sync: verify frame `60`, previous frame `20`, time `1.0`, realtime
  active state, and looping state.
- Camera: verify active camera binding and evaluated FOV from the hero camera
  FOV track.
- Track states: verify Cassia transform interpolation at frame `60`.
- Audio overlays: verify the active music cue and cinematic audio bus.
- Event overlays: verify the crossed camera cut event keyframe.
- Off-path: reject invalid frames, invalid playback rates, and missing camera
  tracks.

`js_repl` Playwright interaction was unavailable in this session and the
affected surface is Unreal editor data rather than browser-rendered UI, so
verification is through UE editor automation and contract gates.

## Verification

- `python3 V2/ue/Tools/check-v2-sequencer-viewport-preview.py`
- `V2.Editor.Sequencer.ViewportPreview`
- `python3 V2/ue/Tools/check-v2-editor-module.py`
- `python3 V2/ue/Tools/check-v2-ci-workflow.py`
