From f5477f0c4e076264185261bb0a6c92c0a44666a8 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 1 Apr 2024 19:07:24 -0700 Subject: [PATCH] Confirm FOV override when level is loaded --- src/f_finale.c | 2 -- src/p_setup.cpp | 3 +++ src/r_main.cpp | 18 ++++++++++++++++-- src/r_main.h | 2 ++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index 8f56503d1..0b169c9b8 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -1646,8 +1646,6 @@ void F_StartTitleScreen(void) camera[0].height = 0; wipegamestate = prevwipegamestate; - - R_ExecuteSetViewSize(); // update FOV } else { diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 78927211b..1ff4310de 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -8825,6 +8825,9 @@ boolean P_LoadLevel(boolean fromnetsave, boolean reloadinggamestate) { G_PreLevelTitleCard(); } + + // Apply FOV override. + R_CheckFOV(); } TracyCZoneEnd(__zone); diff --git a/src/r_main.cpp b/src/r_main.cpp index f43370552..925786c5e 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -69,6 +69,7 @@ fixed_t centerxfrac, centeryfrac; fixed_t projection[MAXSPLITSCREENPLAYERS]; fixed_t projectiony[MAXSPLITSCREENPLAYERS]; // aspect ratio fixed_t fovtan[MAXSPLITSCREENPLAYERS]; // field of view +fixed_t g_fovcache[MAXSPLITSCREENPLAYERS]; // just for profiling purposes size_t framecount; @@ -188,7 +189,7 @@ void SplitScreen_OnChange(void) extern "C" void Fov_OnChange(void); void Fov_OnChange(void) { - R_SetViewSize(); + R_CheckFOV(); } extern "C" void ChaseCam_OnChange(void); @@ -955,6 +956,18 @@ void R_SetViewSize(void) setsizeneeded = true; } +void R_CheckFOV(void) +{ + for (UINT8 s = 0; s <= r_splitscreen; ++s) + { + if (g_fovcache[s] != R_FOV(s)) + { + R_SetViewSize(); + break; + } + } +} + // // R_ExecuteSetViewSize // @@ -997,7 +1010,8 @@ void R_ExecuteSetViewSize(void) for (s = 0; s <= r_splitscreen; ++s) { - fov = FixedAngle(R_FOV(s)/2) + ANGLE_90; + g_fovcache[s] = R_FOV(s); + fov = FixedAngle(g_fovcache[s]/2) + ANGLE_90; fovtan[s] = FixedMul(FINETANGENT(fov >> ANGLETOFINESHIFT), viewmorph[s].zoomneeded); if (r_splitscreen == 1) // Splitscreen FOV should be adjusted to maintain expected vertical view fovtan[s] = 17*fovtan[s]/10; diff --git a/src/r_main.h b/src/r_main.h index 405cb663c..3be1a1581 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -34,6 +34,7 @@ extern fixed_t centeryfrac; extern fixed_t projection[MAXSPLITSCREENPLAYERS]; extern fixed_t projectiony[MAXSPLITSCREENPLAYERS]; extern fixed_t fovtan[MAXSPLITSCREENPLAYERS]; +extern fixed_t g_fovcache[MAXSPLITSCREENPLAYERS]; extern size_t validcount, linecount, loopcount, framecount; @@ -179,6 +180,7 @@ void R_SetViewSize(void); void R_ExecuteSetViewSize(void); fixed_t R_FOV(int split); +void R_CheckFOV(void); void R_SetupFrame(int split); void R_SkyboxFrame(int split);