View: the INI viewangle is the HORIZONTAL field -- authentic 60x47 frustum (task #55)

Community reports said the camera looked too far back and the cockpit frames
were never this revealed; the user's hypothesis (our projection widens the
view) was exactly right.  The original Tesla projection call, preserved in a
comment at DPLRenderer::SetView, is

  dpl_SetViewProjection(view, -1, -aspect, +1, +aspect, 1/tan(viewangle/2))

i.e. BTDPL.INI's viewangle=60.0 is the HORIZONTAL field of view with the
vertical derived by aspect: the pod's frustum was 60 x 46.8 deg at 4:3.  The
port fed the 60 to D3DXMatrixPerspectiveFovRH as the VERTICAL fov -> 75 x 60
at 4:3 (worse on widescreen): the world rendered ~25% farther away and far
more canopy was visible than the pod ever showed.

Fix: BTFovYFromHorizontal(viewangle, aspect) at all five projection sites
(main, per-frame resize, sky pass, WM_SIZE rebuild, fallback) -- the
horizontal field stays the authentic 60 deg at any window shape.  The aim
boresight reads the live projection (gBTAimP22) and adapts; combat
re-verified (kill chain, no NaN).  Cockpits now show the frames at the
pod's framing: viewports dominant, frames at the periphery.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
arcattack
2026-07-11 09:17:07 -05:00
co-authored by Claude Fable 5
parent 96b8892e7c
commit 27959990ea
2 changed files with 48 additions and 11 deletions
+13
View File
@@ -147,6 +147,19 @@ Raptor / Firestarter / Blackjack have `_COP` meshes, SKLs and gauge configs but
names: `avatar bhk1 loki madcat owens sunder thor vulture` (+ variants ava1/lok1/lok2/mad1/mad2/
own1/snd1/thr1/vul1/blkhawk).
## The authentic view field (FOV) — viewangle is HORIZONTAL [T1]
`BTDPL.INI [dpl_defaults] viewangle=60.0` is the **horizontal** field of view: the original Tesla
call (preserved in the DPLRenderer::SetView comment, L4VIDEO.cpp) is
`dpl_SetViewProjection(view, -1, -aspect, +1, +aspect, 1/tan(viewangle/2))` — horizontal
half-extent 1.0, vertical scaled by aspect. Authentic frustum at 4:3 = **60° × 46.8°**. The
port had fed the 60 to D3DX as the VERTICAL fov (75° × 60° at 4:3, worse on widescreen) — the
world read ~25% farther away ("camera too far back" reports) and the canopy frames were
massively over-revealed. Fixed (`BTFovYFromHorizontal`, all 5 projection sites incl. sky +
resize): the horizontal field stays 60° at any window shape. The aim/pick feed reads the live
projection (`gBTAimP22`) so targeting adapts automatically (combat re-verified). Credit: a
user-community report ("frames were never this revealed") + the resolution/FOV hypothesis.
## Diagnostics / env gates
`BT_FORCE_MODEL=<name>` (force the player mech: madcat/owens/sunder/…; btl4mssn.cpp),