fix some issues with rulesets being reapplied and nuking framerates due to shader reloads.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4919 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2015-06-26 13:21:04 +00:00
parent f7b61a1dd8
commit 24b8fff515
8 changed files with 89 additions and 47 deletions

View file

@ -5181,6 +5181,7 @@ char *CL_ParseChat(char *text, player_info_t **player, int *msgflags)
int check_flood;
flags = TP_CategorizeMessage (text, &offset, player);
*msgflags = flags;
s = text + offset;
@ -5256,8 +5257,6 @@ char *CL_ParseChat(char *text, player_info_t **player, int *msgflags)
}
}
*msgflags = flags;
return s;
}

View file

@ -15,6 +15,10 @@ static f_modified_t *f_modified_list;
qboolean care_f_modified;
qboolean f_modified_particles;
void QDECL rulesetcallback(cvar_t *var, char *oldval)
{
Validation_Apply_Ruleset();
}
cvar_t allow_f_version = SCVAR("allow_f_version", "1");
cvar_t allow_f_server = SCVAR("allow_f_server", "1");
@ -26,7 +30,7 @@ cvar_t allow_f_fakeshaft = SCVAR("allow_f_fakeshaft", "1");
cvar_t allow_f_system = SCVAR("allow_f_system", "0");
cvar_t allow_f_cmdline = SCVAR("allow_f_cmdline", "0");
cvar_t auth_validateclients = SCVAR("auth_validateclients", "1");
cvar_t ruleset = SCVAR("ruleset", "none");
cvar_t ruleset = CVARC("ruleset", "none", rulesetcallback);
#define SECURITY_INIT_BAD_CHECKSUM 1
@ -410,6 +414,7 @@ static ruleset_t rulesets[] =
{NULL}
};
static qboolean ruleset_locked;
void RulesetLatch(cvar_t *cvar)
{
cvar->flags |= CVAR_RULESETLATCH;
@ -417,6 +422,7 @@ void RulesetLatch(cvar_t *cvar)
void Validation_DelatchRulesets(void)
{ //game has come to an end, allow the ruleset to be changed
ruleset_locked = false;
if (Cvar_ApplyLatches(CVAR_RULESETLATCH))
Con_DPrintf("Ruleset deactivated\n");
}
@ -428,6 +434,9 @@ qboolean Validation_GetCurrentRulesetName(char *rsnames, int resultbuflen, qbool
ruleset_t *rs;
int i;
if (enforcechosenrulesets)
ruleset_locked = true;
rs = rulesets;
*rsnames = '\0';
@ -504,7 +513,8 @@ void Validation_AllChecks(void)
playername[0] = 0;
else
{
memset(playername, ' ', 15-localpnamelen-1);
//pad the left side to compensate for the player name prefix the server will add in the final svc_print
memset(playername, ' ', 15-localpnamelen);
playername[15-localpnamelen] = 0;
}
@ -528,16 +538,26 @@ void Validation_Apply_Ruleset(void)
int i;
char *rulesetname = ruleset.string;
if (ruleset_locked)
{
if (ruleset.modified)
{
Con_Printf("Cannot change rulesets after the current ruleset has been announced\n");
ruleset.modified = false;
}
return;
}
ruleset.modified = false;
if (!strcmp(rulesetname, "smackdown")) //officially, smackdown cannot authorise this, thus we do not use that name. however, imported configs tend to piss people off.
rulesetname = "strict";
#ifdef warningmsg
#pragma warningmsg("fixme: the following line should not be needed. ensure this is the case")
#endif
Validation_DelatchRulesets(); //make sure there's no old one
if (!*rulesetname || !strcmp(rulesetname, "none") || !strcmp(rulesetname, "default"))
{
if (Cvar_ApplyLatches(CVAR_RULESETLATCH))
Con_DPrintf("Ruleset deactivated\n");
return; //no ruleset is set
}
for (rs = rulesets; rs->rulesetname; rs++)
{
@ -547,6 +567,8 @@ void Validation_Apply_Ruleset(void)
if (!rs->rulesetname)
{
Con_Printf("Cannot apply ruleset %s - not recognised\n", rulesetname);
if (Cvar_ApplyLatches(CVAR_RULESETLATCH))
Con_DPrintf("Ruleset deactivated\n");
return;
}

View file

@ -881,8 +881,8 @@ qboolean Cvar_ApplyLatchFlag(cvar_t *var, char *value, int flag)
#ifdef warningmsg
#pragma warningmsg("this means the callback will never be called")
#endif
latch = var->string;
var->string = NULL;
latch = Z_StrDup(var->string);
// var->string = NULL;
}
#ifdef warningmsg
#pragma warningmsg("set or forceset?")
@ -924,16 +924,15 @@ void Cvar_ForceCheatVars(qboolean semicheats, qboolean absolutecheats)
if (!(var->flags & (CVAR_CHEAT|CVAR_SEMICHEAT)))
continue;
if (var->flags & CVAR_RULESETLATCH)
{
Con_Printf("Hello\n");
}
latch = var->latched_string;
var->latched_string = NULL;
if (!latch)
{
#ifdef warningmsg
#pragma warningmsg("this means the callback will never be called")
#endif
latch = var->string;
var->string = NULL;
}
latch = Z_StrDup(var->string);
if (var->flags & CVAR_CHEAT)
{
@ -944,7 +943,9 @@ void Cvar_ForceCheatVars(qboolean semicheats, qboolean absolutecheats)
}
if (var->flags & CVAR_SEMICHEAT)
{
if (!semicheats)
if (var->flags & CVAR_RULESETLATCH)
; //this is too problematic. the ruleset should cover it.
else if (!semicheats)
Cvar_ForceSet(var, "");
else
Cvar_ForceSet(var, latch);

View file

@ -283,6 +283,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define svcfte_setangledelta 85 // [angle3] add this to the current viewangles
#define svcfte_updateentities 86
#define svcfte_brushedit 87 // networked brush editing, paired with clcfte_brushedit.
#define svcfte_updateseats 88 // byte count, byte playernum[count]
//fitz svcs

View file

@ -656,12 +656,14 @@ static void BE_ApplyAttributes(unsigned int bitstochange, unsigned int bitstoend
}
break;
case VATTR_COLOUR:
if (shaderstate.sourcevbo->colours[0].gl.addr)
if (!shaderstate.sourcevbo->colours[0].gl.addr)
{
GL_SelectVBO(shaderstate.sourcevbo->colours[0].gl.vbo);
qglVertexAttribPointer(VATTR_COLOUR, 4, shaderstate.colourarraytype, ((shaderstate.colourarraytype==GL_FLOAT)?GL_FALSE:GL_TRUE), 0, shaderstate.sourcevbo->colours[0].gl.addr);
break;
shaderstate.sha_attr &= ~(1u<<i);
qglDisableVertexAttribArray(i);
continue;
}
GL_SelectVBO(shaderstate.sourcevbo->colours[0].gl.vbo);
qglVertexAttribPointer(VATTR_COLOUR, 4, shaderstate.colourarraytype, ((shaderstate.colourarraytype==GL_FLOAT)?GL_FALSE:GL_TRUE), 0, shaderstate.sourcevbo->colours[0].gl.addr);
break;
#if MAXRLIGHTMAPS > 1
case VATTR_COLOUR2:
@ -738,22 +740,22 @@ static void BE_ApplyAttributes(unsigned int bitstochange, unsigned int bitstoend
qglVertexAttribPointer(VATTR_TNORMALS, 3, GL_FLOAT, GL_FALSE, 0, shaderstate.sourcevbo->tvector.gl.addr);
break;
case VATTR_BONENUMS:
/*if (!shaderstate.sourcevbo->bonenums.gl.vbo && !shaderstate.sourcevbo->bonenums.gl.addr)
if (!shaderstate.sourcevbo->bonenums.gl.vbo && !shaderstate.sourcevbo->bonenums.gl.addr)
{
shaderstate.sha_attr &= ~(1u<<i);
qglDisableVertexAttribArray(i);
continue;
}*/
}
GL_SelectVBO(shaderstate.sourcevbo->bonenums.gl.vbo);
qglVertexAttribPointer(VATTR_BONENUMS, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0, shaderstate.sourcevbo->bonenums.gl.addr);
break;
case VATTR_BONEWEIGHTS:
/*if (!shaderstate.sourcevbo->boneweights.gl.vbo && !shaderstate.sourcevbo->boneweights.gl.addr)
if (!shaderstate.sourcevbo->boneweights.gl.vbo && !shaderstate.sourcevbo->boneweights.gl.addr)
{
shaderstate.sha_attr &= ~(1u<<i);
qglDisableVertexAttribArray(i);
continue;
}*/
}
GL_SelectVBO(shaderstate.sourcevbo->boneweights.gl.vbo);
qglVertexAttribPointer(VATTR_BONEWEIGHTS, 4, GL_FLOAT, GL_FALSE, 0, shaderstate.sourcevbo->boneweights.gl.addr);
break;

View file

@ -4693,6 +4693,9 @@ void Shader_DefaultBSPLM(const char *shortname, shader_t *s, const void *args)
);
Shader_DefaultScript(shortname, s, builtin);
if (r_lightprepass.ival)
s->flags |= SHADER_HASNORMALMAP;
}
void Shader_DefaultCinematic(const char *shortname, shader_t *s, const void *args)
@ -5656,21 +5659,29 @@ void Shader_DoReload(void)
int oldsort;
qboolean resort = false;
if (shader_rescan_needed && ruleset_allow_shaders.ival)
if (shader_rescan_needed)
{
Shader_FlushCache();
COM_EnumerateFiles("materials/*.mtr", Shader_InitCallback, NULL);
COM_EnumerateFiles("shaders/*.shader", Shader_InitCallback, NULL);
COM_EnumerateFiles("scripts/*.shader", Shader_InitCallback, NULL);
COM_EnumerateFiles("scripts/*.rscript", Shader_InitCallback, NULL);
if (ruleset_allow_shaders.ival)
{
COM_EnumerateFiles("materials/*.mtr", Shader_InitCallback, NULL);
COM_EnumerateFiles("shaders/*.shader", Shader_InitCallback, NULL);
COM_EnumerateFiles("scripts/*.shader", Shader_InitCallback, NULL);
COM_EnumerateFiles("scripts/*.rscript", Shader_InitCallback, NULL);
}
shader_reload_needed = true;
shader_rescan_needed = false;
}
if (!shader_reload_needed)
return;
Con_DPrintf("Rescanning shaders\n");
}
else
{
if (!shader_reload_needed)
return;
Con_DPrintf("Reloading shaders\n");
}
shader_reload_needed = false;
Font_InvalidateColour();
Shader_ReloadGenerics();

View file

@ -9258,7 +9258,7 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs
{"walkmove", PF_walkmove, 32, 32, 32, 0, D("float(float yaw, float dist, optional float settraceglobals)", "Attempt to walk the entity at a given angle for a given distance.\nif settraceglobals is set, the trace_* globals will be set, showing the results of the movement.\nThis function will trigger touch events.")},
// {"qtest_flymove", NULL, 33}, // float(vector dir) flymove = #33;
//qbism super8's 'private'sound #33
{"droptofloor", PF_droptofloor, 34, 34, 34, 0, D("float()", "Instantly moves the entity downwards until it hits the ground. If the entity would need to drop more than 'pr_droptofloorunits' quake units, its position will be considered invalid and the builtin will abort.")},
{"droptofloor", PF_droptofloor, 34, 34, 34, 0, D("float()", "Instantly moves the entity downwards until it hits the ground. If the entity is in solid or would need to drop more than 'pr_droptofloorunits' quake units, its position will be considered invalid and the builtin will abort, returning FALSE, otherwise TRUE.")},
{"lightstyle", PF_lightstyle, 35, 35, 35, 0, D("void(float lightstyle, string stylestring, optional vector rgb)", "Specifies an auto-animating string that specifies the light intensity for entities using that lightstyle.\na is off, z is fully lit. Should be lower case only.\nrgb will recolour all lights using that lightstyle.\n")},
{"rint", PF_rint, 36, 36, 36, 0, D("float(float)", "Rounds the given float up or down to the closest integeral value. X.5 rounds away from 0")},
{"floor", PF_floor, 37, 37, 37, 0, D("float(float)", "Rounds the given float downwards, even when negative.")},

View file

@ -5609,21 +5609,27 @@ void SV_ExecuteUserCommand (char *s, qboolean fromQC)
Cmd_ExecLevel=1;
if (!fromQC && host_client->controlled && atoi(Cmd_Argv(0))>0) //now see if it's meant to be from a slave client
{
int pnum = atoi(Cmd_Argv(0));
client_t *sp;
for (sp = host_client; sp; sp = sp->controlled)
if (!fromQC && host_client->controlled) //now see if it's meant to be from a slave client
{ //'cmd 2 say hi' should
char *a=Cmd_Argv(0), *e;
int pnum = strtoul(a, &e, 10);
if (e == a+1 && pnum >= 1 && pnum <= MAX_SPLITS)
{
if (!--pnum)
client_t *sp;
for (sp = host_client; sp; sp = sp->controlled)
{
host_client = sp;
break;
if (!--pnum)
{
host_client = sp;
break;
}
}
sv_player = host_client->edict;
s = Cmd_Args();
Cmd_ShiftArgs(1, false);
}
sv_player = host_client->edict;
s = Cmd_Args();
Cmd_ShiftArgs(1, false);
}
#ifdef Q2SERVER