Tiny bugfixesish.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3810 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2011-06-04 16:11:35 +00:00
parent 71b8797d9e
commit 0d17471975
3 changed files with 154 additions and 93 deletions

View file

@ -115,15 +115,54 @@ char *svc_strings[] =
"FTE svc_spawnbaseline2", "FTE svc_spawnbaseline2",
"FTE svc_customtempent", "FTE svc_customtempent",
"FTE svc_choosesplitclient", "FTE svc_choosesplitclient",
"FTE svc_showpic",
"FTE svc_hidepic", "svcfte_showpic",
"FTE svc_movepic", "svcfte_hidepic",
"FTE svc_updatepic", "svcfte_movepic",
"FTE svcqw_effect", "svcfte_updatepic",
"FTE svcqw_effect2",
"FTE svc_csqcentities", "???",
"FTE svc_precache",
"FTE svc_choosesplitclient", "svcfte_effect",
"svcfte_effect2",
"svcfte_csqcentities",
"svcfte_precache",
"svcfte_updatestatstring",
"svcfte_updatestatfloat",
"svcfte_trailparticles",
"svcfte_pointparticles",
"svcfte_pointparticles1",
"svcfte_cgamepacket",
"svcfte_voicechat",
"svcfte_setangledelta",
"???",
"???",
"???",
"???",
"???",
"???",
"???",
"???",
"???",
"???",
"???",
"???",
"???",
"???",
"???",
"???",
"???",
"???",
"???",
"???",
"???",
"???",
"???",
}; };
char *svc_nqstrings[] = char *svc_nqstrings[] =

View file

@ -1343,7 +1343,11 @@ static void Shader_FlushGenerics(void)
{ {
g = sgenerics; g = sgenerics;
sgenerics = g->next; sgenerics = g->next;
free(g);
if (g->prog.refs == 1)
free(g);
else
Con_Printf("generic shader still used\n");
} }
} }
static program_t *Shader_LoadGeneric(char *name, int qrtype) static program_t *Shader_LoadGeneric(char *name, int qrtype)
@ -2500,6 +2504,61 @@ static shaderkey_t shaderpasskeys[] =
// =============================================================== // ===============================================================
void Shader_FreePass (shaderpass_t *pass)
{
#ifndef NOMEDIA
if ( pass->flags & SHADER_PASS_VIDEOMAP )
{
Media_ShutdownCin(pass->cin);
pass->cin = NULL;
}
#endif
}
void Shader_Free (shader_t *shader)
{
int i;
shaderpass_t *pass;
if (shader->bucket.data == shader)
Hash_RemoveData(&shader_active_hash, shader->name, shader);
shader->bucket.data = NULL;
#ifdef GLQUAKE
if (qrenderer == QR_OPENGL && shader->prog)
{
program_t *prog = shader->prog;
int p;
if (--prog->refs == 0)
{
for (p = 0; p < PERMUTATIONS; p++)
{
if (prog->handle[p].glsl)
qglDeleteProgramObject_(prog->handle[p].glsl);
}
free(prog);
}
shader->prog = NULL;
}
#endif
if (shader->skydome)
{
Z_Free (shader->skydome);
}
pass = shader->passes;
for (i = 0; i < shader->numpasses; i++, pass++)
{
Shader_FreePass (pass);
}
shader->numpasses = 0;
}
int Shader_InitCallback (const char *name, int size, void *param) int Shader_InitCallback (const char *name, int size, void *param)
{ {
strcpy(shaderbuf+shaderbuflen, name); strcpy(shaderbuf+shaderbuflen, name);
@ -2511,6 +2570,7 @@ int Shader_InitCallback (const char *name, int size, void *param)
qboolean Shader_Init (void) qboolean Shader_Init (void)
{ {
int i;
shaderbuflen = 0; shaderbuflen = 0;
r_shaders = calloc(MAX_SHADERS, sizeof(shader_t)); r_shaders = calloc(MAX_SHADERS, sizeof(shader_t));
@ -2521,6 +2581,11 @@ qboolean Shader_Init (void)
memset(shader_active_hash_mem, 0, Hash_BytesForBuckets(1024)); memset(shader_active_hash_mem, 0, Hash_BytesForBuckets(1024));
Hash_InitTable(&shader_active_hash, 1024, shader_active_hash_mem); Hash_InitTable(&shader_active_hash, 1024, shader_active_hash_mem);
for (i = 0; i < MAX_SHADERS; i++)
{
if (r_shaders[i].uses)
Shader_Free(&r_shaders[i]);
}
Shader_FlushGenerics(); Shader_FlushGenerics();
shader_rescan_needed = true; shader_rescan_needed = true;
Shader_NeedReload(); Shader_NeedReload();
@ -2636,56 +2701,6 @@ static void Shader_GetPathAndOffset ( char *name, char **path, unsigned int *off
path = NULL; path = NULL;
} }
void Shader_FreePass (shaderpass_t *pass)
{
#ifndef NOMEDIA
if ( pass->flags & SHADER_PASS_VIDEOMAP )
{
Media_ShutdownCin(pass->cin);
pass->cin = NULL;
}
#endif
}
void Shader_Free (shader_t *shader)
{
int i;
shaderpass_t *pass;
if (shader->bucket.data == shader)
Hash_RemoveData(&shader_active_hash, shader->name, shader);
shader->bucket.data = NULL;
#ifdef GLQUAKE
if (qrenderer == QR_OPENGL && shader->prog)
{
program_t *prog = shader->prog;
int p;
if (--prog->refs == 0)
{
for (p = 0; p < PERMUTATIONS; p++)
{
if (prog->handle[p].glsl)
qglDeleteProgramObject_(prog->handle[p].glsl);
}
free(prog);
}
shader->prog = NULL;
}
#endif
if (shader->skydome)
{
Z_Free (shader->skydome);
}
pass = shader->passes;
for (i = 0; i < shader->numpasses; i++, pass++)
{
Shader_FreePass (pass);
}
shader->numpasses = 0;
}
void Shader_Reset(shader_t *s) void Shader_Reset(shader_t *s)
{ {
char name[MAX_QPATH]; char name[MAX_QPATH];

View file

@ -1611,7 +1611,7 @@ void SV_UpdateClientStats (client_t *client, int pnum)
else else
{ {
#ifdef PEXT_CSQC #ifdef PEXT_CSQC
if ((client->fteprotocolextensions & PEXT_CSQC) && (sv.csqcchecksum || progstype == PROG_H2)) if (client->fteprotocolextensions & PEXT_CSQC)
{ {
if (statss[i] || client->statss[i]) if (statss[i] || client->statss[i])
if (strcmp(statss[i]?statss[i]:"", client->statss[i]?client->statss[i]:"")) if (strcmp(statss[i]?statss[i]:"", client->statss[i]?client->statss[i]:""))
@ -1645,48 +1645,55 @@ void SV_UpdateClientStats (client_t *client, int pnum)
if (statsf[i]) if (statsf[i])
{ {
if (statsf[i] != client->statsf[i]) if (client->fteprotocolextensions & PEXT_CSQC)
{ {
if (statsf[i] - (float)(int)statsf[i] == 0 && statsf[i] >= 0 && statsf[i] <= 255) if (statsf[i] != client->statsf[i])
{ {
if (pnum) if (statsf[i] - (float)(int)statsf[i] == 0 && statsf[i] >= 0 && statsf[i] <= 255)
{ {
ClientReliableWrite_Begin(client->controller, svcfte_choosesplitclient, 5); if (pnum)
ClientReliableWrite_Byte(client->controller, pnum); {
ClientReliableWrite_Byte(client->controller, svc_updatestat); ClientReliableWrite_Begin(client->controller, svcfte_choosesplitclient, 5);
ClientReliableWrite_Byte(client->controller, i); ClientReliableWrite_Byte(client->controller, pnum);
ClientReliableWrite_Byte(client->controller, statsf[i]); ClientReliableWrite_Byte(client->controller, svc_updatestat);
ClientReliableWrite_Byte(client->controller, i);
ClientReliableWrite_Byte(client->controller, statsf[i]);
}
else
{
ClientReliableWrite_Begin(client, svc_updatestat, 3);
ClientReliableWrite_Byte(client, i);
ClientReliableWrite_Byte(client, statsf[i]);
}
} }
else else
{ {
ClientReliableWrite_Begin(client, svc_updatestat, 3); if (pnum)
ClientReliableWrite_Byte(client, i); {
ClientReliableWrite_Byte(client, statsf[i]); ClientReliableWrite_Begin(client->controller, svcfte_choosesplitclient, 8);
ClientReliableWrite_Byte(client->controller, pnum);
ClientReliableWrite_Byte(client->controller, svcfte_updatestatfloat);
ClientReliableWrite_Byte(client->controller, i);
ClientReliableWrite_Float(client->controller, statsf[i]);
}
else
{
ClientReliableWrite_Begin(client, svcfte_updatestatfloat, 6);
ClientReliableWrite_Byte(client, i);
ClientReliableWrite_Float(client, statsf[i]);
}
} }
client->statsf[i] = statsf[i];
/*make sure statsf is correct*/
client->statsi[i] = statsf[i];
} }
else }
{ else
if (pnum) {
{ statsi[i] = statsf[i];
ClientReliableWrite_Begin(client->controller, svcfte_choosesplitclient, 8);
ClientReliableWrite_Byte(client->controller, pnum);
ClientReliableWrite_Byte(client->controller, svcfte_updatestatfloat);
ClientReliableWrite_Byte(client->controller, i);
ClientReliableWrite_Float(client->controller, statsf[i]);
}
else
{
ClientReliableWrite_Begin(client, svcfte_updatestatfloat, 6);
ClientReliableWrite_Byte(client, i);
ClientReliableWrite_Float(client, statsf[i]);
}
}
client->statsf[i] = statsf[i];
/*make sure statsf is correct*/
client->statsi[i] = statsf[i];
} }
} }
else if (statsi[i] != client->statsi[i]) if (statsi[i] != client->statsi[i])
{ {
client->statsi[i] = statsi[i]; client->statsi[i] = statsi[i];
client->statsf[i] = statsi[i]; client->statsf[i] = statsi[i];