From d3e60c7d841a74e2b3a33db7accdf8407c84556d Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Fri, 9 Feb 2024 06:28:31 +0300 Subject: [PATCH 1/3] engine: gamma: higher brightness limit for compatibility --- engine/client/gamma.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engine/client/gamma.c b/engine/client/gamma.c index 0c39001e92..dd123cfec1 100644 --- a/engine/client/gamma.c +++ b/engine/client/gamma.c @@ -99,8 +99,8 @@ static void V_ValidateGammaCvars( void ) if( v_brightness.value < 0.0f ) Cvar_DirectSet( &v_brightness, "0" ); - else if( v_brightness.value > 2.0f ) - Cvar_DirectSet( &v_brightness, "2" ); + else if( v_brightness.value > 3.0f ) + Cvar_DirectSet( &v_brightness, "3" ); } void V_CheckGamma( void ) From 31fa990d44b086c36b83b1be66d4572bd434409c Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Fri, 9 Feb 2024 06:29:30 +0300 Subject: [PATCH 2/3] engine: gamma: fix gamma changes not caught if gamma cvar was set during frame --- engine/client/gamma.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/engine/client/gamma.c b/engine/client/gamma.c index dd123cfec1..0d69d0a5dd 100644 --- a/engine/client/gamma.c +++ b/engine/client/gamma.c @@ -21,6 +21,7 @@ GNU General Public License for more details. //----------------------------------------------------------------------------- // Gamma conversion support //----------------------------------------------------------------------------- +static qboolean gamma_rebuilt; static byte texgammatable[256]; static uint lightgammatable[1024]; static uint lineargammatable[1024]; @@ -131,6 +132,7 @@ void V_CheckGamma( void ) V_ValidateGammaCvars(); dirty = false; + gamma_rebuilt = true; BuildGammaTable( v_gamma.value, v_brightness.value, v_texgamma.value, v_lightgamma.value ); @@ -142,6 +144,13 @@ void V_CheckGamma( void ) void V_CheckGammaEnd( void ) { + // don't reset changed flag if it was set during frame + // keep it for next frame + if( !gamma_rebuilt ) + return; + + gamma_rebuilt = false; + // keep the flags until the end of frame so client.dll will catch these changes if( FBitSet( v_texgamma.flags|v_lightgamma.flags|v_brightness.flags|v_gamma.flags, FCVAR_CHANGED )) { From c2da12535814b0aced09a2283aa7baa9ba2bd74e Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Fri, 9 Feb 2024 07:25:47 +0300 Subject: [PATCH 3/3] engine: client: as an experiment, let users override default font rendermode through hud_fontrender and con_fontrender cvars --- engine/client/cl_font.c | 36 ++++++++++++++++++++++++++++++++---- engine/client/cl_game.c | 3 +-- engine/client/cl_main.c | 2 ++ engine/client/cl_netgraph.c | 2 +- engine/client/cl_scrn.c | 6 +++--- engine/client/client.h | 8 +++++--- engine/client/console.c | 10 ++++++---- 7 files changed, 50 insertions(+), 17 deletions(-) diff --git a/engine/client/cl_font.c b/engine/client/cl_font.c index 7d5a1c92be..354df2b6b3 100644 --- a/engine/client/cl_font.c +++ b/engine/client/cl_font.c @@ -46,10 +46,35 @@ static int CL_LoadFontTexture( const char *fontname, uint texFlags, int *width ) return tex; } -qboolean Con_LoadFixedWidthFont( const char *fontname, cl_font_t *font, float scale, int rendermode, uint texFlags ) +static int CL_FontRenderMode( convar_t *fontrender ) +{ + switch((int)fontrender->value ) + { + case 0: + return kRenderTransAdd; + case 1: + return kRenderTransAlpha; + case 2: + return kRenderTransTexture; + default: + Cvar_DirectSet( fontrender, fontrender->def_string ); + } + + return kRenderTransTexture; +} + +void CL_SetFontRendermode( cl_font_t *font ) +{ + ref.dllFuncs.GL_SetRenderMode( CL_FontRenderMode( font->rendermode )); +} + +qboolean Con_LoadFixedWidthFont( const char *fontname, cl_font_t *font, float scale, convar_t *rendermode, uint texFlags ) { int font_width, i; + if( !rendermode ) + return false; + if( font->valid ) return true; // already loaded @@ -76,13 +101,16 @@ qboolean Con_LoadFixedWidthFont( const char *fontname, cl_font_t *font, float sc return true; } -qboolean Con_LoadVariableWidthFont( const char *fontname, cl_font_t *font, float scale, int rendermode, uint texFlags ) +qboolean Con_LoadVariableWidthFont( const char *fontname, cl_font_t *font, float scale, convar_t *rendermode, uint texFlags ) { fs_offset_t length; qfont_t src; byte *pfile; int font_width, i; + if( !rendermode ) + return false; + if( font->valid ) return true; @@ -191,7 +219,7 @@ int CL_DrawCharacter( float x, float y, int number, rgba_t color, cl_font_t *fon SPR_AdjustSize( &x, &y, &w, &h ); if( !FBitSet( flags, FONT_DRAW_NORENDERMODE )) - ref.dllFuncs.GL_SetRenderMode( font->rendermode ); + CL_SetFontRendermode( font ); // don't apply color to fixed fonts it's already colored if( font->type != FONT_FIXED || REF_GET_PARM( PARM_TEX_GLFORMAT, font->hFontTexture ) == 0x8045 ) // GL_LUMINANCE8_ALPHA8 @@ -214,7 +242,7 @@ int CL_DrawString( float x, float y, const char *s, rgba_t color, cl_font_t *fon Con_UtfProcessChar( 0 ); // clear utf state if( !FBitSet( flags, FONT_DRAW_NORENDERMODE )) - ref.dllFuncs.GL_SetRenderMode( font->rendermode ); + CL_SetFontRendermode( font ); Vector4Copy( color, current_color ); diff --git a/engine/client/cl_game.c b/engine/client/cl_game.c index 8d37265ff5..a7016d6566 100644 --- a/engine/client/cl_game.c +++ b/engine/client/cl_game.c @@ -474,8 +474,7 @@ void CL_DrawCenterPrint( void ) pText = clgame.centerPrint.message; CL_DrawCharacterLen( font, 0, NULL, &charHeight ); - - ref.dllFuncs.GL_SetRenderMode( font->rendermode ); + CL_SetFontRendermode( font ); for( i = 0; i < clgame.centerPrint.lines; i++ ) { lineLength = 0; diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 8de09c7366..a1405b6c9c 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -61,6 +61,7 @@ CVAR_DEFINE_AUTO( cl_smoothtime, "0.1", FCVAR_ARCHIVE, "time to smooth up" ); CVAR_DEFINE_AUTO( cl_clockreset, "0.1", FCVAR_ARCHIVE, "frametime delta maximum value before reset" ); 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_fontrender, "0", FCVAR_ARCHIVE, "hud font render mode (0: additive, 1: holes, 2: trans)" ); 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)" ); @@ -2926,6 +2927,7 @@ static void CL_InitLocal( void ) Cvar_RegisterVariable( &cl_clockreset ); Cvar_RegisterVariable( &cl_fixtimerate ); Cvar_RegisterVariable( &hud_fontscale ); + Cvar_RegisterVariable( &hud_fontrender ); Cvar_RegisterVariable( &hud_scale ); Cvar_RegisterVariable( &hud_scale_minimal_width ); Cvar_Get( "cl_background", "0", FCVAR_READ_ONLY, "indicate what background map is running" ); diff --git a/engine/client/cl_netgraph.c b/engine/client/cl_netgraph.c index f2c1943d73..ee1e36bd1f 100644 --- a/engine/client/cl_netgraph.c +++ b/engine/client/cl_netgraph.c @@ -387,7 +387,7 @@ static void NetGraph_DrawTextFields( int x, int y, int w, wrect_t rect, int coun // move rolling average framerate = FRAMERATE_AVG_FRAC * host.frametime + ( 1.0f - FRAMERATE_AVG_FRAC ) * framerate; - ref.dllFuncs.GL_SetRenderMode( font->rendermode ); + CL_SetFontRendermode( font ); if( framerate > 0.0f ) { diff --git a/engine/client/cl_scrn.c b/engine/client/cl_scrn.c index 0132e6b5aa..8d639b8af0 100644 --- a/engine/client/cl_scrn.c +++ b/engine/client/cl_scrn.c @@ -573,15 +573,15 @@ void SCR_LoadCreditsFont( void ) "creditsfont_%s.fnt", Cvar_VariableString( "con_charset" )) > 0 ) { if( FS_FileExists( charsetFnt, false )) - success = Con_LoadVariableWidthFont( charsetFnt, font, scale, kRenderTransAdd, TF_FONT ); + success = Con_LoadVariableWidthFont( charsetFnt, font, scale, &hud_fontrender, TF_FONT ); } } if( !success ) - success = Con_LoadVariableWidthFont( "gfx/creditsfont.fnt", font, scale, kRenderTransAdd, TF_FONT ); + success = Con_LoadVariableWidthFont( "gfx/creditsfont.fnt", font, scale, &hud_fontrender, TF_FONT ); if( !success ) - success = Con_LoadFixedWidthFont( "gfx/conchars", font, scale, kRenderTransAdd, TF_FONT ); + success = Con_LoadFixedWidthFont( "gfx/conchars", font, scale, &hud_fontrender, TF_FONT ); // copy font size for client.dll if( success ) diff --git a/engine/client/client.h b/engine/client/client.h index 72700e31b5..36b1b9c932 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -342,7 +342,7 @@ typedef struct byte charWidths[256]; // scaled widths int charHeight; // scaled height int type; // fixed width font or variable - int rendermode; // default rendermode + convar_t *rendermode; // user-defined default rendermode qboolean valid; // all rectangles are valid } cl_font_t; @@ -681,6 +681,7 @@ extern convar_t cl_draw_beams; extern convar_t cl_clockreset; extern convar_t cl_fixtimerate; extern convar_t hud_fontscale; +extern convar_t hud_fontrender; extern convar_t hud_scale; extern convar_t hud_scale_minimal_width; extern convar_t r_showtextures; @@ -798,9 +799,10 @@ void CL_FireEvents( void ); // cl_font.c // qboolean CL_FixedFont( cl_font_t *font ); -qboolean Con_LoadFixedWidthFont( const char *fontname, cl_font_t *font, float scale, int rendermode, uint texFlags ); -qboolean Con_LoadVariableWidthFont( const char *fontname, cl_font_t *font, float scale, int rendermode, uint texFlags ); +qboolean Con_LoadFixedWidthFont( const char *fontname, cl_font_t *font, float scale, convar_t *rendermode, uint texFlags ); +qboolean Con_LoadVariableWidthFont( const char *fontname, cl_font_t *font, float scale, convar_t *rendermode, uint texFlags ); void CL_FreeFont( cl_font_t *font ); +void CL_SetFontRendermode( cl_font_t *font ); int CL_DrawCharacter( float x, float y, int number, rgba_t color, cl_font_t *font, int flags ); int CL_DrawString( float x, float y, const char *s, rgba_t color, cl_font_t *font, int flags ); void CL_DrawCharacterLen( cl_font_t *font, int number, int *width, int *height ); diff --git a/engine/client/console.c b/engine/client/console.c index 41cbe06e8a..506ad848bc 100644 --- a/engine/client/console.c +++ b/engine/client/console.c @@ -25,6 +25,7 @@ GNU General Public License for more details. static CVAR_DEFINE_AUTO( scr_conspeed, "600", FCVAR_ARCHIVE, "console moving speed" ); static CVAR_DEFINE_AUTO( con_notifytime, "3", FCVAR_ARCHIVE, "notify time to live" ); CVAR_DEFINE_AUTO( con_fontsize, "1", FCVAR_ARCHIVE, "console font number (0, 1 or 2)" ); +static CVAR_DEFINE_AUTO( con_fontrender, "2", FCVAR_ARCHIVE, "console font render mode (0: additive, 1: holes, 2: trans)" ); static CVAR_DEFINE_AUTO( con_charset, "cp1251", FCVAR_ARCHIVE, "console font charset (only cp1251 supported now)" ); static CVAR_DEFINE_AUTO( con_fontscale, "1.0", FCVAR_ARCHIVE, "scale font texture" ); static CVAR_DEFINE_AUTO( con_fontnum, "-1", FCVAR_ARCHIVE, "console font number (0, 1 or 2), -1 for autoselect" ); @@ -547,7 +548,7 @@ static void Con_LoadConsoleFont( int fontNumber, cl_font_t *font ) if( con_oldfont.value ) { - success = Con_LoadVariableWidthFont( "gfx/conchars.fnt", font, scale, kRenderTransTexture, TF_FONT|TF_NEAREST ); + success = Con_LoadVariableWidthFont( "gfx/conchars.fnt", font, scale, &con_fontrender, TF_FONT|TF_NEAREST ); } else { @@ -560,14 +561,14 @@ static void Con_LoadConsoleFont( int fontNumber, cl_font_t *font ) if( Q_snprintf( path, sizeof( path ), "font%i_%s.fnt", fontNumber, Cvar_VariableString( "con_charset" )) > 0 ) { - success = Con_LoadVariableWidthFont( path, font, scale, kRenderTransTexture, TF_FONT|TF_NEAREST ); + success = Con_LoadVariableWidthFont( path, font, scale, &con_fontrender, TF_FONT|TF_NEAREST ); } } if( !success ) { Q_snprintf( path, sizeof( path ), "fonts/font%i", fontNumber ); - success = Con_LoadVariableWidthFont( path, font, scale, kRenderTransTexture, TF_FONT|TF_NEAREST ); + success = Con_LoadVariableWidthFont( path, font, scale, &con_fontrender, TF_FONT|TF_NEAREST ); } } @@ -575,7 +576,7 @@ static void Con_LoadConsoleFont( int fontNumber, cl_font_t *font ) { // quake fixed font as fallback // keep source to print directly into conback image - if( !Con_LoadFixedWidthFont( "gfx/conchars", font, scale, kRenderTransTexture, TF_FONT|TF_NEAREST|TF_KEEP_SOURCE )) + if( !Con_LoadFixedWidthFont( "gfx/conchars", font, scale, &con_fontrender, TF_FONT|TF_NEAREST|TF_KEEP_SOURCE )) Con_DPrintf( S_ERROR "failed to load console font\n" ); } } @@ -840,6 +841,7 @@ void Con_Init( void ) Cvar_RegisterVariable( &con_fontsize ); Cvar_RegisterVariable( &con_charset ); Cvar_RegisterVariable( &con_fontscale ); + Cvar_RegisterVariable( &con_fontrender ); Cvar_RegisterVariable( &con_fontnum ); Cvar_RegisterVariable( &con_color ); Cvar_RegisterVariable( &scr_drawversion );