diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 469d1953d..122e2beb1 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -3063,7 +3063,6 @@ void Host_Frame (double time) } } - TP_CheckVars(); RSpeedEnd(RSPEED_PROTOCOL); // update video diff --git a/engine/client/cl_screen.c b/engine/client/cl_screen.c index a315a0412..3214c0d1f 100644 --- a/engine/client/cl_screen.c +++ b/engine/client/cl_screen.c @@ -292,7 +292,9 @@ void SCR_StringToRGB (char *rgbstring, float *rgb, float rgbinputscale) int i = atoi(rgbstring); i = bound(0, i, 255); - pal = host_basepal + (i * 3); + pal = host_basepal; + + pal += (i * 3); // convert r8g8b8 to rgb floats rgb[0] = (float)(pal[0]); rgb[1] = (float)(pal[1]); diff --git a/engine/client/client.h b/engine/client/client.h index fa110223e..a15e4db61 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -922,7 +922,6 @@ void TP_ExecTrigger (char *s); qboolean TP_SuppressMessage(char *buf); void TP_Init(void); -void TP_CheckVars(void); void TP_CheckPickupSound(char *s, vec3_t org); void TP_ParsePlayerInfo(player_state_t *oldstate, player_state_t *state, player_info_t *info); void CL_Say (qboolean team, char *extra); diff --git a/engine/client/keys.c b/engine/client/keys.c index 7ad96379a..8a2f4c906 100644 --- a/engine/client/keys.c +++ b/engine/client/keys.c @@ -54,8 +54,10 @@ qboolean keydown[K_MAX]; qboolean deltaused[K_MAX][KEY_MODIFIERSTATES]; +void Con_Selectioncolour_Callback(struct cvar_s *var, char *oldvalue); + extern cvar_t con_displaypossabilities; -cvar_t con_selectioncolour = SCVAR("con_selectioncolour", "0"); +cvar_t con_selectioncolour = SCVARFC("con_selectioncolour", "0", CVAR_RENDERERCALLBACK, Con_Selectioncolour_Callback); extern cvar_t cl_chatmode; static int KeyModifier (qboolean shift, qboolean alt, qboolean ctrl) @@ -385,9 +387,14 @@ void Con_ExecuteLine(console_t *con, char *line) // may take some time } -int scmodified; vec3_t sccolor; +void Con_Selectioncolour_Callback(struct cvar_s *var, char *oldvalue) +{ + if (qrenderer != QR_NONE && qrenderer != -1) + SCR_StringToRGB(var->string, sccolor, 1); +} + void Key_ConsoleDrawSelectionBox(void) { extern cvar_t vid_conwidth, vid_conheight; @@ -427,9 +434,6 @@ void Key_ConsoleDrawSelectionBox(void) } ypos++; - if (scmodified != con_selectioncolour.modified) - SCR_StringToRGB(con_selectioncolour.string, sccolor, 1); - Draw_FillRGB(xpos2*8, ypos2*8, (xpos - xpos2)*8, (ypos - ypos2)*8, sccolor[0], sccolor[1], sccolor[2]); } diff --git a/engine/client/renderer.c b/engine/client/renderer.c index d3fae6896..75c9be0ea 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -1953,6 +1953,8 @@ TRACE(("dbg: R_RestartRenderer_f\n")); } } } + + Cvar_ApplyCallbacks(CVAR_RENDERERCALLBACK); SCR_EndLoadingPlaque(); TRACE(("dbg: R_RestartRenderer_f success\n")); diff --git a/engine/client/zqtp.c b/engine/client/zqtp.c index 34a96b595..f184d9260 100644 --- a/engine/client/zqtp.c +++ b/engine/client/zqtp.c @@ -92,6 +92,9 @@ static size_t strlcat (char *dst, const char *src, size_t size) } #endif +// callbacks used for TP cvars +void TP_SkinCvar_Callback(struct cvar_s *var, char *oldvalue); + //a list of all the cvars //this is down to the fact that I keep defining them but forgetting to register. :/ #define TP_CVARS \ @@ -101,8 +104,8 @@ static size_t strlcat (char *dst, const char *src, size_t size) TP_CVAR(cl_triggers, "1"); \ TP_CVAR(tp_forceTriggers, "0"); \ TP_CVAR(tp_loadlocs, "1"); \ - TP_CVAR(cl_teamskin, ""); \ - TP_CVAR(cl_enemyskin, ""); \ + TP_CVARC(cl_teamskin, "", TP_SkinCvar_Callback); \ + TP_CVARC(cl_enemyskin, "", TP_SkinCvar_Callback); \ TP_CVAR(tp_soundtrigger, "~"); \ \ TP_CVAR(tp_name_none, ""); \ @@ -186,9 +189,10 @@ static size_t strlcat (char *dst, const char *src, size_t size) //create the globals for all the TP cvars. #define TP_CVAR(name,def) cvar_t name = SCVAR(#name, def) +#define TP_CVARC(name,def,call) cvar_t name = SCVARC(#name, def, call) TP_CVARS; #undef TP_CVAR - +#undef TP_CVARC extern cvar_t host_mapname; @@ -3114,14 +3118,9 @@ static void TP_MsgFilter_f (void) } } -void TP_CheckVars(void) +void TP_SkinCvar_Callback(struct cvar_s *var, char *oldvalue) { - if (cl_enemyskin.modified || cl_teamskin.modified) - { - Skin_FlushPlayers(); - cl_enemyskin.modified = false; - cl_teamskin.modified = false; - } + Skin_FlushPlayers(); } void TP_Init (void) @@ -3130,8 +3129,10 @@ void TP_Init (void) //register all the TeamPlay cvars. #define TP_CVAR(name,def) Cvar_Register (&name, TEAMPLAYVARS); +#define TP_CVARC(name,def,callback) Cvar_Register (&name, TEAMPLAYVARS); TP_CVARS; #undef TP_CVAR +#undef TP_CVARC Cmd_AddCommand ("loadloc", TP_LoadLocFile_f); Cmd_AddCommand ("filter", TP_MsgFilter_f); diff --git a/engine/common/cvar.c b/engine/common/cvar.c index e5744c9e5..60086e861 100644 --- a/engine/common/cvar.c +++ b/engine/common/cvar.c @@ -157,6 +157,8 @@ char *Cvar_FlagToName(int flag) return "renderlatch"; case CVAR_SERVEROVERRIDE: return "serverlatch"; + case CVAR_RENDERERCALLBACK: + return "rendercallback"; } return NULL; @@ -761,6 +763,22 @@ void Cvar_ForceCheatVars(qboolean semicheats, qboolean absolutecheats) } } +void Cvar_ApplyCallbacks(int callbackflag) +{ + cvar_group_t *grp; + cvar_t *var; + + for (grp=cvar_groups ; grp ; grp=grp->next) + for (var=grp->cvars ; var ; var=var->next) + { + if (var->flags & callbackflag) + { + if (var->callback) + var->callback(var, var->string); + } + } +} + void Cvar_ApplyLatches(int latchflag) { cvar_group_t *grp; diff --git a/engine/common/cvar.h b/engine/common/cvar.h index b5524a6e6..fc307381b 100644 --- a/engine/common/cvar.h +++ b/engine/common/cvar.h @@ -75,6 +75,7 @@ typedef struct cvar_s #define FCVARC(ConsoleName,ConsoleName2,Value,Flags,Callback) {ConsoleName, Value, NULL, Flags, 0, 0, 0, ConsoleName2, Callback} #define FCVAR(ConsoleName,ConsoleName2,Value,Flags) FCVARC(ConsoleName, ConsoleName2, Value, Flags, NULL) +#define SCVARFC(ConsoleName, Value, Flags, Callback) FCVARC(ConsoleName, NULL, Value, Flags, Callback) #define SCVARF(ConsoleName,Value, Flags) FCVAR(ConsoleName, NULL, Value, Flags) #define SCVARC(ConsoleName,Value,Callback) FCVARC(ConsoleName, NULL, Value, 0, Callback) #define SCVAR(ConsoleName,Value) FCVAR(ConsoleName, NULL, Value, 0) @@ -96,15 +97,16 @@ typedef struct cvar_group_s #define CVAR_LATCH 16 // save changes until server restart //freestyle -#define CVAR_POINTER 32 // q2 style. May be converted to q1 if needed. These are often specified on the command line and then converted into q1 when registered properly. -#define CVAR_NOTFROMSERVER 64 // the console will ignore changes to cvars if set at from the server or any gamecode. This is to protect against security flaws - like qterm -#define CVAR_USERCREATED 128 //write a 'set' or 'seta' in front of the var name. -#define CVAR_CHEAT 256 //latch to the default, unless cheats are enabled. -#define CVAR_SEMICHEAT 512 //if strict ruleset, force to 0/blank. -#define CVAR_RENDERERLATCH 1024 //requires a vid_restart to reapply. -#define CVAR_SERVEROVERRIDE 2048 //the server has overridden out local value - should probably be called SERVERLATCH +#define CVAR_POINTER 32 // q2 style. May be converted to q1 if needed. These are often specified on the command line and then converted into q1 when registered properly. +#define CVAR_NOTFROMSERVER 64 // the console will ignore changes to cvars if set at from the server or any gamecode. This is to protect against security flaws - like qterm +#define CVAR_USERCREATED 128 //write a 'set' or 'seta' in front of the var name. +#define CVAR_CHEAT 256 //latch to the default, unless cheats are enabled. +#define CVAR_SEMICHEAT 512 //if strict ruleset, force to 0/blank. +#define CVAR_RENDERERLATCH 1024 //requires a vid_restart to reapply. +#define CVAR_SERVEROVERRIDE 2048 //the server has overridden out local value - should probably be called SERVERLATCH +#define CVAR_RENDERERCALLBACK 4096 //force callback for cvars on renderer change -#define CVAR_LASTFLAG CVAR_SERVEROVERRIDE +#define CVAR_LASTFLAG CVAR_RENDERERCALLBACK #define CVAR_LATCHMASK (CVAR_LATCH|CVAR_RENDERERLATCH|CVAR_SERVEROVERRIDE|CVAR_CHEAT|CVAR_SEMICHEAT) //you're only allowed one of these. #define CVAR_NEEDDEFAULT CVAR_CHEAT @@ -129,6 +131,9 @@ void Cvar_SetValue (cvar_t *var, float value); void Cvar_ApplyLatches(int latchflag); //sets vars to thier latched values +void Cvar_ApplyCallbacks(int callbackflag); +//forces callbacks to be ran for given flags + float Cvar_VariableValue (const char *var_name); // returns 0 if not defined or non numeric diff --git a/engine/common/log.c b/engine/common/log.c index d060c4f32..8f154b96c 100644 --- a/engine/common/log.c +++ b/engine/common/log.c @@ -2,10 +2,14 @@ #include "quakedef.h" +// cvar callbacks +void Log_Dir_Callback (struct cvar_s *var, char *oldvalue); +void Log_Name_Callback (struct cvar_s *var, char *oldvalue); + // cvars #define CONLOGGROUP "Console logging" -cvar_t log_name = SCVARF("log_name", "", CVAR_NOTFROMSERVER); -cvar_t log_dir = SCVARF("log_dir", "", CVAR_NOTFROMSERVER); +cvar_t log_name = SCVARFC("log_name", "", CVAR_NOTFROMSERVER, Log_Name_Callback); +cvar_t log_dir = SCVARFC("log_dir", "", CVAR_NOTFROMSERVER, Log_Dir_Callback); cvar_t log_readable = SCVARF("log_readable", "0", CVAR_NOTFROMSERVER); cvar_t log_enable = SCVARF("log_enable", "0", CVAR_NOTFROMSERVER); cvar_t log_developer = SCVARF("log_developer", "0", CVAR_NOTFROMSERVER); @@ -54,6 +58,34 @@ char readable[256] = 'x', 'y', 'z', '{', '|', '}', '~', '_' }; +// Log_Dir_Callback: called when a log_dir is changed +void Log_Dir_Callback (struct cvar_s *var, char *oldvalue) +{ + char *t = var->string; + + // sanity check for directory + if (strstr(t, "..") || strstr(t, ":") || *t == '/' || *t == '\\') + { + Con_Printf(S_NOTICE "%s forced to default due to invalid characters.\n", var->name); + // recursion is avoided by assuming the default value is sane + Cvar_ForceSet(var, var->defaultstr); + } +} + +// Log_Name_Callback: called when a log_dir is changed +void Log_Name_Callback (struct cvar_s *var, char *oldvalue) +{ + char *t = var->string; + + // sanity check for directory + if (strstr(t, "..") || strstr(t, ":") || strstr(t, "/") || strstr(t, "\\")) + { + Con_Printf(S_NOTICE "%s forced to default due to invalid characters.\n", var->name); + // recursion is avoided by assuming the default value is sane + Cvar_ForceSet(var, var->defaultstr); + } +} + // Con_Log: log string to console log void Con_Log (char *s) { @@ -66,31 +98,6 @@ void Con_Log (char *s) if (!log_enable.value) return; - // cvar sanity checks - if (log_dir.modified) - { - t = log_dir.string; - if (strstr(t, "..") || strstr(t, ":") || *t == '/' || *t == '\\') - { - Con_Printf("log_dir forced to default due to invalid characters.\n"); - Cvar_ForceSet(&log_dir, log_dir.defaultstr); - } - - log_dir.modified = false; - } - - if (log_name.modified) - { - t = log_name.string; - if (strstr(t, "..") || strstr(t, ":") || strstr(t, "/") || strstr(t, "\\")) - { - Con_Printf("log_name forced to default due to invalid characters.\n"); - Cvar_ForceSet(&log_name, log_name.defaultstr); - } - - log_name.modified = false; - } - // get directory/filename d = gamedirfile; if (log_dir.string[0]) diff --git a/engine/gl/gl_bloom.c b/engine/gl/gl_bloom.c index dba9ec643..b028773da 100644 --- a/engine/gl/gl_bloom.c +++ b/engine/gl/gl_bloom.c @@ -136,7 +136,7 @@ void R_Bloom_InitBackUpTexture( int width, int height ) r_screenbackuptexture_size = width; - r_bloombackuptexture = GL_LoadTexture32("***r_bloombackuptexture***", width, height, data, false, false ); + r_bloombackuptexture = GL_LoadTexture32("***r_bloombackuptexture***", width, height, (unsigned int*)data, false, false ); Z_Free ( data ); } @@ -175,7 +175,7 @@ void R_Bloom_InitEffectTexture( void ) data = Z_Malloc( BLOOM_SIZE * BLOOM_SIZE * 4 ); - r_bloomeffecttexture = GL_LoadTexture32("***r_bloomeffecttexture***", BLOOM_SIZE, BLOOM_SIZE, data, false, false ); + r_bloomeffecttexture = GL_LoadTexture32("***r_bloomeffecttexture***", BLOOM_SIZE, BLOOM_SIZE, (unsigned int*)data, false, false ); Z_Free ( data ); } @@ -229,7 +229,7 @@ void R_Bloom_InitTextures( void ) { r_screendownsamplingtexture_size = (int)(BLOOM_SIZE * 2); data = Z_Malloc( r_screendownsamplingtexture_size * r_screendownsamplingtexture_size * 4 ); - r_bloomdownsamplingtexture = GL_LoadTexture32("***r_bloomdownsamplingtexture***", r_screendownsamplingtexture_size, r_screendownsamplingtexture_size, data, false, false ); + r_bloomdownsamplingtexture = GL_LoadTexture32("***r_bloomdownsamplingtexture***", r_screendownsamplingtexture_size, r_screendownsamplingtexture_size, (unsigned int*)data, false, false ); Z_Free ( data ); }