fix frame lerp again, dynamically allocate client baselines (should save about 2MB of memory on typical servers), bounds check baselines (stops invalid svc_spawnbaseline from crashing), small DP extension fix, fix demo baselines

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@2365 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
TimeServ 2006-07-24 04:24:41 +00:00
parent 0089cf5a3f
commit 084c095dc7
7 changed files with 56 additions and 23 deletions

View file

@ -765,7 +765,7 @@ void CL_Record_f (void)
int n, i, j; int n, i, j;
char *s, *p, *fname; char *s, *p, *fname;
entity_t *ent; entity_t *ent;
entity_state_t *es, blankes; entity_state_t *es;
player_info_t *player; player_info_t *player;
extern char gamedirfile[]; extern char gamedirfile[];
int seq = 1; int seq = 1;
@ -1051,12 +1051,11 @@ void CL_Record_f (void)
// baselines // baselines
memset(&blankes, 0, sizeof(blankes)); for (i = 0; i < cl_baselines_count; i++)
for (i = 0; i < MAX_EDICTS; i++)
{ {
es = cl_baselines + i; es = cl_baselines + i;
if (memcmp(es, &blankes, sizeof(blankes))) if (memcmp(es, &nullentitystate, sizeof(nullentitystate)))
{ {
MSG_WriteByte (&buf,svc_spawnbaseline); MSG_WriteByte (&buf,svc_spawnbaseline);
MSG_WriteShort (&buf, i); MSG_WriteShort (&buf, i);

View file

@ -604,7 +604,9 @@ void CL_ParsePacketEntities (qboolean delta)
newp->entities = BZ_Realloc(newp->entities, sizeof(entity_state_t)*newp->max_entities); newp->entities = BZ_Realloc(newp->entities, sizeof(entity_state_t)*newp->max_entities);
} }
CL_ParseDelta (&cl_baselines[newnum], &newp->entities[newindex], word, true); if (!CL_CheckBaselines(newnum))
Host_EndGame("CL_ParsePacketEntities: check baselines failed with size %i", newnum);
CL_ParseDelta (cl_baselines + newnum, &newp->entities[newindex], word, true);
newindex++; newindex++;
continue; continue;
} }
@ -1064,7 +1066,9 @@ void CLNQ_ParseEntity(unsigned int bits)
from = CL_FindOldPacketEntity(num); //this could be optimised. from = CL_FindOldPacketEntity(num); //this could be optimised.
base = &cl_baselines[num]; if (!CL_CheckBaselines(num))
Host_EndGame("CLNQ_ParseEntity: check baselines failed with size %i", num);
base = cl_baselines + num;
state->number = num; state->number = num;
@ -2661,7 +2665,7 @@ guess_pm_type:
if (cl.lerpplayers[num].frame != state->frame) if (cl.lerpplayers[num].frame != state->frame)
{ {
cl.lerpplayers[num].oldframechange = cl.lerpplayers[num].framechange; cl.lerpplayers[num].oldframechange = cl.lerpplayers[num].framechange;
cl.lerpplayers[num].framechange = cl.servertime; cl.lerpplayers[num].framechange = cl.time;
cl.lerpplayers[num].frame = state->frame; cl.lerpplayers[num].frame = state->frame;
//don't care about position interpolation. //don't care about position interpolation.
@ -3058,8 +3062,8 @@ void CL_LinkViewModel(void)
lerptime[r_refdef.currentplayernum] = realtime; lerptime[r_refdef.currentplayernum] = realtime;
} }
ent.lerpfrac = 1-(realtime-lerptime[r_refdef.currentplayernum])*10; ent.lerpfrac = 1-(realtime-lerptime[r_refdef.currentplayernum])*10;
if (ent.lerpfrac<0)ent.lerpfrac=0; ent.lerpfrac = bound(0, ent.lerpfrac, 1);
if (ent.lerpfrac>1)ent.lerpfrac=1;
#define Q2RF_VIEWERMODEL 2 // don't draw through eyes, only mirrors #define Q2RF_VIEWERMODEL 2 // don't draw through eyes, only mirrors
#define Q2RF_WEAPONMODEL 4 // only draw through eyes #define Q2RF_WEAPONMODEL 4 // only draw through eyes
#define Q2RF_DEPTHHACK 16 // for view weapon Z crunching #define Q2RF_DEPTHHACK 16 // for view weapon Z crunching

View file

@ -155,7 +155,7 @@ client_static_t cls;
client_state_t cl; client_state_t cl;
// alot of this should probably be dynamically allocated // alot of this should probably be dynamically allocated
entity_state_t cl_baselines[MAX_EDICTS]; entity_state_t *cl_baselines;
efrag_t cl_efrags[MAX_EFRAGS]; efrag_t cl_efrags[MAX_EFRAGS];
entity_t cl_static_entities[MAX_STATIC_ENTITIES]; entity_t cl_static_entities[MAX_STATIC_ENTITIES];
trailstate_t *cl_static_emit[MAX_STATIC_ENTITIES]; trailstate_t *cl_static_emit[MAX_STATIC_ENTITIES];
@ -163,6 +163,7 @@ lightstyle_t cl_lightstyle[MAX_LIGHTSTYLES];
//lightstyle_t cl_lightstyle[MAX_LIGHTSTYLES]; //lightstyle_t cl_lightstyle[MAX_LIGHTSTYLES];
dlight_t cl_dlights[MAX_DLIGHTS]; dlight_t cl_dlights[MAX_DLIGHTS];
int cl_baselines_count;
int dlights_running, dlights_software; int dlights_running, dlights_software;
// refresh list // refresh list
@ -987,12 +988,12 @@ void CL_ClearState (void)
dlights_running = 0; dlights_running = 0;
for (i = 0; i < MAX_EDICTS; i++) if (cl_baselines)
{ {
memcpy(&cl_baselines[i], &nullentitystate, sizeof(cl_baselines[i])); BZ_Free(cl_baselines);
cl_baselines = NULL;
} }
cl_baselines_count = 0;
// //
// allocate the efrags and chain together into a free list // allocate the efrags and chain together into a free list

View file

@ -2320,6 +2320,30 @@ void CLQ2_ParseConfigString (void)
#endif #endif
qboolean CL_CheckBaselines (int size)
{
int i;
if (size < 0)
return false;
if (size > MAX_EDICTS)
return false;
size = (size + 64) & ~63; // round up to next 64
if (size < cl_baselines_count)
return true;
cl_baselines = BZ_Realloc(cl_baselines, sizeof(*cl_baselines)*size);
for (i = cl_baselines_count; i < size; i++)
{
memcpy(cl_baselines + i, &nullentitystate, sizeof(*cl_baselines));
}
cl_baselines_count = size;
return true;
}
/* /*
================== ==================
CL_ParseBaseline CL_ParseBaseline
@ -2347,7 +2371,9 @@ void CL_ParseBaseline2 (void)
entity_state_t es; entity_state_t es;
CL_ParseDelta(&nullentitystate, &es, MSG_ReadShort(), true); CL_ParseDelta(&nullentitystate, &es, MSG_ReadShort(), true);
memcpy(&cl_baselines[es.number], &es, sizeof(es)); if (!CL_CheckBaselines(es.number))
Host_EndGame("CL_ParseBaseline2: check baselines failed with size %i", es.number);
memcpy(cl_baselines + es.number, &es, sizeof(es));
} }
void CLQ2_Precache_f (void) void CLQ2_Precache_f (void)
@ -4007,7 +4033,9 @@ void CL_ParseServerMessage (void)
case svc_spawnbaseline: case svc_spawnbaseline:
i = MSG_ReadShort (); i = MSG_ReadShort ();
CL_ParseBaseline (&cl_baselines[i]); if (!CL_CheckBaselines(i))
Host_EndGame("CL_ParseServerMessage: svc_spawnbaseline failed with size %i", i);
CL_ParseBaseline (cl_baselines + i);
break; break;
case svc_spawnbaseline2: case svc_spawnbaseline2:
CL_ParseBaseline2 (); CL_ParseBaseline2 ();
@ -4678,7 +4706,9 @@ void CLNQ_ParseServerMessage (void)
case svc_spawnbaseline: case svc_spawnbaseline:
i = MSG_ReadShort (); i = MSG_ReadShort ();
CL_ParseBaseline (&cl_baselines[i]); if (!CL_CheckBaselines(i))
Host_EndGame("CLNQ_ParseServerMessage: svc_spawnbaseline failed with size %i", i);
CL_ParseBaseline (cl_baselines + i);
break; break;
case svc_time: case svc_time:

View file

@ -638,7 +638,7 @@ extern cvar_t name;
extern client_state_t cl; extern client_state_t cl;
// FIXME, allocate dynamically // FIXME, allocate dynamically
extern entity_state_t cl_baselines[MAX_EDICTS]; extern entity_state_t *cl_baselines;
extern efrag_t cl_efrags[MAX_EFRAGS]; extern efrag_t cl_efrags[MAX_EFRAGS];
extern entity_t cl_static_entities[MAX_STATIC_ENTITIES]; extern entity_t cl_static_entities[MAX_STATIC_ENTITIES];
extern trailstate_t *cl_static_emit[MAX_STATIC_ENTITIES]; extern trailstate_t *cl_static_emit[MAX_STATIC_ENTITIES];
@ -646,6 +646,7 @@ extern lightstyle_t cl_lightstyle[MAX_LIGHTSTYLES];
extern dlight_t cl_dlights[MAX_DLIGHTS]; extern dlight_t cl_dlights[MAX_DLIGHTS];
extern int dlights_running, dlights_software; extern int dlights_running, dlights_software;
extern int cl_baselines_count;
extern qboolean nomaster; extern qboolean nomaster;
extern float server_version; // version of server we connected to extern float server_version; // version of server we connected to

View file

@ -458,6 +458,8 @@ enum clcq2_ops_e
#define U_COLOURMOD (1<<10) //rgb #define U_COLOURMOD (1<<10) //rgb
#define U_DPFLAGS (1<<11) #define U_DPFLAGS (1<<11)
#define U_TAGINFO (1<<12) #define U_TAGINFO (1<<12)
#define U_LIGHT (1<<13) #define U_LIGHT (1<<13)
#define U_EFFECTS16 (1<<14) #define U_EFFECTS16 (1<<14)

View file

@ -543,12 +543,8 @@ void SV_WriteDelta (entity_state_t *from, entity_state_t *to, sizebuf_t *msg, qb
if ((to->colormod[0]!=from->colormod[0]||to->colormod[1]!=from->colormod[1]||to->colormod[2]!=from->colormod[2]) && protext & PEXT_COLOURMOD) if ((to->colormod[0]!=from->colormod[0]||to->colormod[1]!=from->colormod[1]||to->colormod[2]!=from->colormod[2]) && protext & PEXT_COLOURMOD)
evenmorebits |= U_COLOURMOD; evenmorebits |= U_COLOURMOD;
if (to->dpflags != from->dpflags && protext & PEXT_DPFLAGS)
evenmorebits |= U_DPFLAGS;
if (to->glowsize != from->glowsize) if (to->glowsize != from->glowsize)
to->dpflags |= 4; to->dpflags |= 2; // RENDER_GLOWTRAIL
if (to->dpflags != from->dpflags && protext & PEXT_DPFLAGS) if (to->dpflags != from->dpflags && protext & PEXT_DPFLAGS)
evenmorebits |= U_DPFLAGS; evenmorebits |= U_DPFLAGS;