fix #389: port retail's SmartboxFOV law; retire AD-89 (display slice 1)
Retail's world-camera FOV is not a constant: the applied vertical FOV is m_fGameFOV / (viewportAspect - 0.1), recomputed on every aspect or game-FOV change (CreatureMode smartbox sites 0x00452b2f/0x00453b14), gated by Render::SetFOVRad's open (0, pi) acceptance (0x0054b2d0 - rejected results keep the previous FOV). m_fGameFOV defaults to pi/2 = 90 degrees (0x00454649) and is what the Field of View option sets in degrees (0x00451e6a; registered range [10,160] default 90 - gmClient::InitUIPreferences @0x004035b0). Net effect: the horizontal view stays ~85-90 degrees across aspect ratios; wide screens trim the vertical slice instead of ballooning the sides. acdream hardcoded FovY = pi/3 = 60 degrees on all four world cameras, aspect-independent, and the Config slider wrote raw vertical-FOV degrees. New: RetailFieldOfView (the law + gate, decomp-cited), CameraController.GameFovRadians + SetGameFov + one ApplyProjection chokepoint recomputing every camera on SetAspect/SetGameFov/ EnterChaseMode/RestoreState; ApplyFieldOfView now feeds the law; DisplaySettings.Default.FieldOfView 60 -> 90 (the retail registered default; the stored number changed MEANING with this commit). The same seam closes a second latent bug the 2026-08-13 "squished" gate report exposed: SetAspect only ever updated Orbit/Fly - the CHASE cameras (the ones the player looks through) kept their creation-time aspect across every mid-session resize, drawing the world at the old shape stretched onto the new viewport. The paperdoll camera stays outside the law by design (retail portrait mode is UseSharpMode, not smartbox - DollCamera's own doc). Tests: RetailFieldOfViewTests (golden law values at 4:3/16:9/21:9, the constant-horizontal property, the rejection gate, controller propagation incl. chase attach/restore + rejected-law aspect-still-propagates); DisplaySettingsTests + RuntimeSettingsControllerTests updated to the new semantics. App suite 4,953/3 skips; UI.Abstractions 916/0. AD-89 retired in this commit; user settings.json migrated 60->90 by hand (stale pre-port default). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
a1efc8bcb3
commit
7e0c130344
13 changed files with 334 additions and 22 deletions
|
|
@ -56,7 +56,22 @@ invent a clamp rule. Part of the display work block with #376/#377/#388/
|
|||
|
||||
## #389 — World-camera FOV is an invented aspect-independent constant; retail is SmartboxFOV (vFOV = gameFOV / (aspect − 0.1))
|
||||
|
||||
**Status:** OPEN — filed 2026-08-13 (user gate report: "meant to run on an
|
||||
**Status:** DONE 2026-08-13 (this commit) — display block slice 1, pending
|
||||
the user's feel gate. `RetailFieldOfView` ports the law + the
|
||||
`Render::SetFOVRad` (0, π) acceptance gate verbatim;
|
||||
`CameraController` owns `GameFovRadians` (default 90°) and recomputes
|
||||
every camera's aspect + applied FOV on `SetAspect`/`SetGameFov`/
|
||||
`EnterChaseMode`/`RestoreState`; `ApplyFieldOfView` converts the stored
|
||||
degrees exactly as retail's option setter does; the four π/3 camera
|
||||
constants are deleted; `DisplaySettings.Default.FieldOfView` is retail's
|
||||
registered 90. **The same seam fixed a second latent squish bug: SetAspect
|
||||
never propagated to the CHASE cameras at all — a mid-session resize left
|
||||
the play camera on its creation-time aspect, drawing the world stretched
|
||||
onto the new viewport.** The user's stored settings.json was migrated
|
||||
60→90 by hand (the stale pre-port default). Register AD-89 retired in
|
||||
this commit. Original filing below.
|
||||
|
||||
**Original filing:** OPEN — filed 2026-08-13 (user gate report: "meant to run on an
|
||||
old aspect ratio... modern screens feels weird... some resolutions feels
|
||||
like it is just squished"). Decomp-verified retail law:
|
||||
`Render::SetFOVRad(SmartBox::m_fGameFOV / (RenderDevice::m_ViewportAspectRatio − 0.1))`
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue