diff --git a/engine/client/cl_font.c b/engine/client/cl_font.c index 7d5a1c92..354df2b6 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 8d37265f..a7016d65 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 8de09c73..a1405b6c 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 f2c1943d..ee1e36bd 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 0132e6b5..8d639b8a 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 72700e31..36b1b9c9 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 41cbe06e..506ad848 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 );