From fea6833ea00efefec5dccd2ee85656e759726168 Mon Sep 17 00:00:00 2001 From: Roman Fomin Date: Wed, 20 Dec 2023 14:09:01 +0700 Subject: [PATCH] update DRS parameters --- src/d_main.c | 16 ++++++---------- src/doomstat.h | 2 -- src/i_video.c | 40 ++++++++++++++++++++++------------------ src/i_video.h | 10 ++++++---- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index ad289eeb..0d5fdf59 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -210,7 +210,6 @@ void D_ProcessEvents (void) gamestate_t wipegamestate = GS_DEMOSCREEN; boolean screen_melt = true; extern int showMessages; -boolean enable_drs; void D_Display (void) { @@ -246,10 +245,14 @@ void D_Display (void) } } - enable_drs = true; - redrawsbar = false; + // save the current screen if about to wipe + if ((wipe = gamestate != wipegamestate) && NOTSTRICTMODE(screen_melt)) + wipe_StartScreen(0, 0, video.unscaledw, SCREENHEIGHT); + else + I_DynamicResolution(); + if (setsizeneeded) // change the view size if needed { R_ExecuteSetViewSize(); @@ -257,13 +260,6 @@ void D_Display (void) borderdrawcount = 3; } - // save the current screen if about to wipe - if ((wipe = gamestate != wipegamestate) && NOTSTRICTMODE(screen_melt)) - { - enable_drs = false; - wipe_StartScreen(0, 0, video.unscaledw, SCREENHEIGHT); - } - if (gamestate == GS_LEVEL && gametic) HU_Erase(); diff --git a/src/doomstat.h b/src/doomstat.h index 6f30d5f7..8bccef38 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -368,8 +368,6 @@ extern boolean precache; // to force a wipe on the next draw extern gamestate_t wipegamestate; -extern boolean enable_drs; - extern int mouseSensitivity_horiz; // killough extern int mouseSensitivity_vert; extern int mouseSensitivity_horiz_strafe; // [FG] strafe diff --git a/src/i_video.c b/src/i_video.c index 3f3c903d..9377ccea 100644 --- a/src/i_video.c +++ b/src/i_video.c @@ -479,7 +479,7 @@ static int targetrefresh; static void ResetResolution(int height); static void ResetLogicalSize(void); -static void DynamicResolution(void) +void I_DynamicResolution(void) { if (resolution_mode != RES_DRS || frametime_withoutpresent == 0 || frametime_withoutpresent > 1000000 / 15) @@ -494,9 +494,10 @@ static void DynamicResolution(void) double actualpercent = actual / target; #define DRS_MIN_HEIGHT 400 - #define DRS_DELTA 0.5 + #define DRS_DELTA 0.01 #define DRS_GREATER (1 + DRS_DELTA) #define DRS_LESS (1 - DRS_DELTA) + #define DRS_STEP (SCREENHEIGHT / 2) int newheight = 0; int oldheight = video.height; @@ -516,6 +517,15 @@ static void DynamicResolution(void) return; } + int mul = (newheight + (DRS_STEP - 1)) / DRS_STEP; // integer round + + newheight = mul * DRS_STEP; + + if (newheight > native_height_adjusted) + { + newheight -= DRS_STEP; + } + if (newheight == oldheight) { return; @@ -563,8 +573,8 @@ void I_FinishUpdate(void) time = frametime_start - last_time; - // Update FPS counter every second - if (time >= 1000000) + // Update FPS counter every 10th of second + if (time >= 100000) { fps = (frame_counter * 1000000) / time; frame_counter = 0; @@ -590,11 +600,6 @@ void I_FinishUpdate(void) I_ResetScreen(); need_reset = false; } - else if (enable_drs) - { - DynamicResolution(); - enable_drs = false; - } if (need_resize) { @@ -966,14 +971,16 @@ static void ResetResolution(int height) { int w, h; + int unscaled_ah = use_aspect ? ACTUALHEIGHT : SCREENHEIGHT; + actualheight = use_aspect ? (int)(height * 1.2) : height; video.height = height; switch (widescreen) { case RATIO_ORIG: - w = 4; - h = 3; + w = SCREENWIDTH; + h = unscaled_ah; break; case RATIO_MATCH_SCREEN: w = native_width; @@ -1004,14 +1011,11 @@ static void ResetResolution(int height) aspect_ratio = 2.4; } - video.unscaledw = (int)(ACTUALHEIGHT * aspect_ratio); - video.width = (int)(actualheight * aspect_ratio); + video.unscaledw = (int)(unscaled_ah * aspect_ratio); - // width and height shoud be even - video.unscaledw = (video.unscaledw + 1) & ~1; - video.width = (video.width + 1) & ~1; - video.height = (video.height + 1) & ~1; - actualheight = (actualheight + 1) & ~1; + double vertscale = (double)actualheight / (double)unscaled_ah; + video.width = (int)(video.unscaledw * vertscale); + video.width = (video.width + 1) & ~1; video.deltaw = (video.unscaledw - NONWIDEWIDTH) / 2; diff --git a/src/i_video.h b/src/i_video.h index 2b6b01d4..8a564916 100644 --- a/src/i_video.h +++ b/src/i_video.h @@ -51,20 +51,22 @@ typedef enum // determines the hardware configuration // and sets up the video mode -void I_InitGraphics (void); +void I_InitGraphics(void); void I_ShutdownGraphics(void); // Takes full 8 bit values. -void I_SetPalette (byte* palette); +void I_SetPalette(byte* palette); -void I_FinishUpdate (void); +void I_FinishUpdate(void); -void I_ReadScreen (byte* scr); +void I_ReadScreen(byte* dst); void I_ResetScreen(void); // killough 10/98 void I_ResetTargetRefresh(void); void I_ToggleVsync(void); // [JN] Calls native SDL vsync toggle +void I_DynamicResolution(void); + extern boolean use_vsync; // killough 2/8/98: controls whether vsync is called extern boolean disk_icon; // killough 10/98 extern resolution_mode_t resolution_mode, default_resolution_mode;