acdream/tests/AcDream.UI.Abstractions.Tests/Panels/Settings
Erik d13d63d0a5 fix #389 review round: settings v3 FOV migration + live apply; AD-90
Dual-lens Opus review of 7e0c1303 (reports committed under
docs/research/). The law, gate, and vertical application are CONFIRMED
at instruction-byte level against the PDB-paired acclient.exe (the BN
text FPU-elides this whole area); the fix round addresses the findings:

- Blast MUST-FIX 1: real schema migration instead of a hand-edited dev
  file. SettingsStore v2->v3: a pre-v3 display.fieldOfView was the
  applied vertical FOV in degrees; v3 means retail's m_fGameFOV.
  LoadDisplay migrates on read - the untouched old default 60 maps to
  the retail default 90; a deliberate other value preserves its visible
  16:9 framing (x (16/9 - 0.1)), clamped to the registered [10,160];
  the next save stamps v3 and migration never reruns. The dev
  settings.json hand-edit was reverted so the migration owns it.
- Blast MUST-FIX 2 / mechanism M2: the Field of View now applies LIVE on
  Save (retail: Render::GRPCallback_OnRenderPreferenceChanged @0x0054d999
  -> SmartBox::SetDefaultFov). RuntimeSettingsTargets gains the camera
  graph and applies through ApplyDisplayWindowState - the update-phase
  seam, deliberately NOT the render-phase preview path (the review's
  WATCH-3 cull-vs-raster landmine).
- Mechanism M1 -> register row AD-90: retail's divisor aspect runs
  through the Render.AspectRatio preference (ComputeAspectForViewport
  @0x0054f150, (w/h) x pref x 0.75) - exactly raw w/h at the registered
  default, which is what acdream assumes; retail's NaN-through-the-gate
  quirk (M3) is folded into the same row as deliberately not reproduced.
- Docs: RetailFieldOfView now cites the decisive vertical proof
  (D3DXMatrixPerspectiveFovLH fovy slot @0x0059ab71), the unconditional
  SmartBox::RenderNormalMode site, and M4's exact horizontal numbers
  (89.0/83.9/80.6 deg); the Config FOV row comment updated to LIVE.
- Blast WATCH 4 disposition: the 15 replay-harness PI/3 constants stay -
  they are CAPTURE-TIME camera parameters for recorded fixtures, not
  production framing; changing them would invalidate the replays.

Tests: +6 SettingsStore migration facts, +1 live-apply fact.
App suite 4,962/3 skips; UI.Abstractions 922.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 17:27:15 +02:00
..
AudioSettingsTests.cs chore(audio): Campaign A slice A6 — delete what retail does not have 2026-08-08 22:58:50 +02:00
CharacterSettingsTests.cs feat(ui): Character tab — per-toon settings; Phase L.0 complete 2026-04-26 18:27:07 +02:00
ChatOpacityLinkTests.cs feat(chat): Campaign CH slice CH6c — window opacity + transparency setting 2026-08-10 14:00:55 +02:00
ChatSettingsTests.cs fix(chat): CH6c review fixes — opaque default, opacity-transition register clauses 2026-08-10 14:48:39 +02:00
DisplaySettingsTests.cs fix #389: port retail's SmartboxFOV law; retire AD-89 (display slice 1) 2026-08-13 17:08:41 +02:00
QualityPresetTests.cs feat(A.5 T22.5): QualityPreset schema + tests (commit 1/2) 2026-05-10 08:37:17 +02:00
SettingsStoreTests.cs fix #389 review round: settings v3 FOV migration + live apply; AD-90 2026-08-13 17:27:15 +02:00