diff --git a/engine/client/cl_game.c b/engine/client/cl_game.c index 7daff3e1..8d37265f 100644 --- a/engine/client/cl_game.c +++ b/engine/client/cl_game.c @@ -1641,6 +1641,7 @@ get actual screen info */ int GAME_EXPORT CL_GetScreenInfo( SCREENINFO *pscrinfo ) { + qboolean apply_scale_factor = false; float scale_factor = hud_scale.value; if( FBitSet( hud_fontscale.flags, FCVAR_CHANGED )) @@ -1655,17 +1656,24 @@ int GAME_EXPORT CL_GetScreenInfo( SCREENINFO *pscrinfo ) clgame.scrInfo.iSize = sizeof( clgame.scrInfo ); clgame.scrInfo.iFlags = SCRINFO_SCREENFLASH; - if( scale_factor && scale_factor != 1.0f) + if( scale_factor && scale_factor != 1.0f ) + { + float scaled_width = (float)refState.width / scale_factor; + if( scaled_width >= hud_scale_minimal_width.value ) + apply_scale_factor = true; + } + + if( apply_scale_factor ) { clgame.scrInfo.iWidth = (float)refState.width / scale_factor; clgame.scrInfo.iHeight = (float)refState.height / scale_factor; - clgame.scrInfo.iFlags |= SCRINFO_STRETCHED; + SetBits( clgame.scrInfo.iFlags, SCRINFO_STRETCHED ); } else { clgame.scrInfo.iWidth = refState.width; clgame.scrInfo.iHeight = refState.height; - clgame.scrInfo.iFlags &= ~SCRINFO_STRETCHED; + ClearBits( clgame.scrInfo.iFlags, SCRINFO_STRETCHED ); } if( !pscrinfo ) return 0; diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 3ffad555..8de09c73 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -62,6 +62,7 @@ CVAR_DEFINE_AUTO( cl_clockreset, "0.1", FCVAR_ARCHIVE, "frametime delta maximum CVAR_DEFINE_AUTO( cl_fixtimerate, "7.5", FCVAR_ARCHIVE, "time in msec to client clock adjusting" ); CVAR_DEFINE_AUTO( hud_fontscale, "1.0", FCVAR_ARCHIVE|FCVAR_LATCH, "scale hud font texture" ); CVAR_DEFINE_AUTO( hud_scale, "0", FCVAR_ARCHIVE|FCVAR_LATCH, "scale hud at current resolution" ); +CVAR_DEFINE_AUTO( hud_scale_minimal_width, "640", FCVAR_ARCHIVE|FCVAR_LATCH, "if hud_scale results in a HUD virtual screen smaller than this value, it won't be applied" ); CVAR_DEFINE_AUTO( cl_solid_players, "1", 0, "Make all players not solid (can't traceline them)" ); CVAR_DEFINE_AUTO( cl_updaterate, "20", FCVAR_USERINFO|FCVAR_ARCHIVE, "refresh rate of server messages" ); CVAR_DEFINE_AUTO( cl_showevents, "0", FCVAR_ARCHIVE, "show events playback" ); @@ -2926,6 +2927,7 @@ static void CL_InitLocal( void ) Cvar_RegisterVariable( &cl_fixtimerate ); Cvar_RegisterVariable( &hud_fontscale ); Cvar_RegisterVariable( &hud_scale ); + Cvar_RegisterVariable( &hud_scale_minimal_width ); Cvar_Get( "cl_background", "0", FCVAR_READ_ONLY, "indicate what background map is running" ); Cvar_RegisterVariable( &cl_showevents ); Cvar_Get( "lastdemo", "", FCVAR_ARCHIVE, "last played demo" ); diff --git a/engine/client/client.h b/engine/client/client.h index d9ad920a..c01e18a5 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -683,6 +683,7 @@ extern convar_t cl_clockreset; extern convar_t cl_fixtimerate; extern convar_t hud_fontscale; extern convar_t hud_scale; +extern convar_t hud_scale_minimal_width; extern convar_t r_showtextures; extern convar_t cl_bmodelinterp; extern convar_t cl_lw; // local weapons