cvar_t freelook = {CVAR_SAVE, "freelook", "1","mouse controls pitch instead of forward/back"};
+cvar_t cl_autodemo = {0, "cl_autodemo", "0", "records every game played, using the date/time and map name to name the demo file" };
+cvar_t cl_autodemo_nameformat = {0, "cl_autodemo_nameformat", "%Y-%m-%d_%H-%M", "The format of the cl_autodemo filename, followed by the map name" };
+
cvar_t r_draweffects = {0, "r_draweffects", "1","renders temporary sprite effects"};
cvar_t cl_explosions_alpha_start = {CVAR_SAVE, "cl_explosions_alpha_start", "1.5","starting alpha of an explosion shell"};
int i;
entity_t *ent;
- if (cl.entities) Mem_Free(cl.entities);cl.entities = NULL;
- if (cl.csqcentities) Mem_Free(cl.csqcentities);cl.csqcentities = NULL; //[515]: csqc
- if (cl.entities_active) Mem_Free(cl.entities_active);cl.entities_active = NULL;
- if (cl.csqcentities_active) Mem_Free(cl.csqcentities_active);cl.csqcentities_active = NULL; //[515]: csqc
- if (cl.static_entities) Mem_Free(cl.static_entities);cl.static_entities = NULL;
- if (cl.temp_entities) Mem_Free(cl.temp_entities);cl.temp_entities = NULL;
- if (cl.effects) Mem_Free(cl.effects);cl.effects = NULL;
- if (cl.beams) Mem_Free(cl.beams);cl.beams = NULL;
- if (cl.dlights) Mem_Free(cl.dlights);cl.dlights = NULL;
- if (cl.lightstyle) Mem_Free(cl.lightstyle);cl.lightstyle = NULL;
- if (cl.brushmodel_entities) Mem_Free(cl.brushmodel_entities);cl.brushmodel_entities = NULL;
- if (cl.entitydatabase) EntityFrame_FreeDatabase(cl.entitydatabase);cl.entitydatabase = NULL;
- if (cl.entitydatabase4) EntityFrame4_FreeDatabase(cl.entitydatabase4);cl.entitydatabase4 = NULL;
- if (cl.entitydatabaseqw) EntityFrameQW_FreeDatabase(cl.entitydatabaseqw);cl.entitydatabaseqw = NULL;
- if (cl.scores) Mem_Free(cl.scores);cl.scores = NULL;
- if (cl.particles) Mem_Free(cl.particles);cl.particles = NULL;
-
- if (!sv.active)
- Host_ClearMemory ();
-
// wipe the entire cl structure
+ Mem_EmptyPool(cls.levelmempool);
memset (&cl, 0, sizeof(cl));
S_StopAllSounds();
cl.num_effects = 0;
cl.num_beams = 0;
- cl.entities = (entity_t *)Mem_Alloc(cls.mempool, cl.max_entities * sizeof(entity_t));
- cl.csqcentities = (entity_t *)Mem_Alloc(cls.mempool, cl.max_csqcentities * sizeof(entity_t)); //[515]: csqc
- cl.entities_active = (unsigned char *)Mem_Alloc(cls.mempool, cl.max_brushmodel_entities * sizeof(unsigned char));
- cl.csqcentities_active = (unsigned char *)Mem_Alloc(cls.mempool, cl.max_brushmodel_entities * sizeof(unsigned char)); //[515]: csqc
- cl.static_entities = (entity_t *)Mem_Alloc(cls.mempool, cl.max_static_entities * sizeof(entity_t));
- cl.temp_entities = (entity_t *)Mem_Alloc(cls.mempool, cl.max_temp_entities * sizeof(entity_t));
- cl.effects = (cl_effect_t *)Mem_Alloc(cls.mempool, cl.max_effects * sizeof(cl_effect_t));
- cl.beams = (beam_t *)Mem_Alloc(cls.mempool, cl.max_beams * sizeof(beam_t));
- cl.dlights = (dlight_t *)Mem_Alloc(cls.mempool, cl.max_dlights * sizeof(dlight_t));
- cl.lightstyle = (lightstyle_t *)Mem_Alloc(cls.mempool, cl.max_lightstyle * sizeof(lightstyle_t));
- cl.brushmodel_entities = (int *)Mem_Alloc(cls.mempool, cl.max_brushmodel_entities * sizeof(int));
- cl.particles = (particle_t *) Mem_Alloc(cls.mempool, cl.max_particles * sizeof(particle_t));
+ cl.entities = (entity_t *)Mem_Alloc(cls.levelmempool, cl.max_entities * sizeof(entity_t));
+ cl.csqcentities = (entity_t *)Mem_Alloc(cls.levelmempool, cl.max_csqcentities * sizeof(entity_t)); //[515]: csqc
+ cl.entities_active = (unsigned char *)Mem_Alloc(cls.levelmempool, cl.max_brushmodel_entities * sizeof(unsigned char));
+ cl.csqcentities_active = (unsigned char *)Mem_Alloc(cls.levelmempool, cl.max_brushmodel_entities * sizeof(unsigned char)); //[515]: csqc
+ cl.static_entities = (entity_t *)Mem_Alloc(cls.levelmempool, cl.max_static_entities * sizeof(entity_t));
+ cl.temp_entities = (entity_t *)Mem_Alloc(cls.levelmempool, cl.max_temp_entities * sizeof(entity_t));
+ cl.effects = (cl_effect_t *)Mem_Alloc(cls.levelmempool, cl.max_effects * sizeof(cl_effect_t));
+ cl.beams = (beam_t *)Mem_Alloc(cls.levelmempool, cl.max_beams * sizeof(beam_t));
+ cl.dlights = (dlight_t *)Mem_Alloc(cls.levelmempool, cl.max_dlights * sizeof(dlight_t));
+ cl.lightstyle = (lightstyle_t *)Mem_Alloc(cls.levelmempool, cl.max_lightstyle * sizeof(lightstyle_t));
+ cl.brushmodel_entities = (int *)Mem_Alloc(cls.levelmempool, cl.max_brushmodel_entities * sizeof(int));
+ cl.particles = (particle_t *) Mem_Alloc(cls.levelmempool, cl.max_particles * sizeof(particle_t));
// LordHavoc: have to set up the baseline info for alpha and other stuff
for (i = 0;i < cl.max_entities;i++)
CL_Screen_NewMap();
}
+void CL_SetInfo(const char *key, const char *value, qboolean send, qboolean allowstarkey, qboolean allowmodel, qboolean quiet)
+{
+ if (strchr(key, '\"') || strchr(value, '\"') || (!allowstarkey && key[0] == '*') || (!allowmodel && (!strcasecmp(Cmd_Argv(1), "pmodel") || !strcasecmp(Cmd_Argv(1), "emodel"))))
+ {
+ if (!quiet)
+ Con_Printf("Can't setinfo \"%s\" \"%s\"\n");
+ return;
+ }
+ InfoString_SetValue(cls.userinfo, sizeof(cls.userinfo), key, value);
+ if (cls.state == ca_connected)
+ {
+ if (cls.protocol == PROTOCOL_QUAKEWORLD)
+ {
+ MSG_WriteByte(&cls.netcon->message, qw_clc_stringcmd);
+ MSG_WriteString(&cls.netcon->message, va("setinfo \"%s\" \"%s\"", key, value));
+ }
+ else if (!strcasecmp(key, "name"))
+ {
+ MSG_WriteByte(&cls.netcon->message, clc_stringcmd);
+ MSG_WriteString(&cls.netcon->message, va("name \"%s\"", value));
+ }
+ else if (!strcasecmp(key, "playermodel"))
+ {
+ MSG_WriteByte(&cls.netcon->message, clc_stringcmd);
+ MSG_WriteString(&cls.netcon->message, va("playermodel \"%s\"", value));
+ }
+ else if (!strcasecmp(key, "playerskin"))
+ {
+ MSG_WriteByte(&cls.netcon->message, clc_stringcmd);
+ MSG_WriteString(&cls.netcon->message, va("playerskin \"%s\"", value));
+ }
+ else if (!strcasecmp(key, "topcolor"))
+ {
+ // don't send anything, the combined color code will be updated manually
+ }
+ else if (!strcasecmp(key, "bottomcolor"))
+ {
+ // don't send anything, the combined color code will be updated manually
+ }
+ else if (!strcasecmp(key, "rate"))
+ {
+ MSG_WriteByte(&cls.netcon->message, clc_stringcmd);
+ MSG_WriteString(&cls.netcon->message, va("rate \"%s\"", value));
+ }
+ }
+}
+
void CL_ExpandEntities(int num)
{
int i, oldmaxentities;
oldmaxentities = cl.max_entities;
oldentities = cl.entities;
cl.max_entities = (num & ~255) + 256;
- cl.entities = (entity_t *)Mem_Alloc(cls.mempool, cl.max_entities * sizeof(entity_t));
+ cl.entities = (entity_t *)Mem_Alloc(cls.levelmempool, cl.max_entities * sizeof(entity_t));
memcpy(cl.entities, oldentities, oldmaxentities * sizeof(entity_t));
Mem_Free(oldentities);
for (i = oldmaxentities;i < cl.max_entities;i++)
oldmaxentities = cl.max_csqcentities;
oldentities = cl.csqcentities;
cl.max_csqcentities = (num & ~255) + 256;
- cl.csqcentities = Mem_Alloc(cls.mempool, cl.max_csqcentities * sizeof(entity_t));
+ cl.csqcentities = (entity_t *)Mem_Alloc(cls.levelmempool, cl.max_csqcentities * sizeof(entity_t));
memcpy(cl.csqcentities, oldentities, oldmaxentities * sizeof(entity_t));
Mem_Free(oldentities);
for (i = oldmaxentities;i < cl.max_csqcentities;i++)
//static const vec3_t nomodelmaxs = {16, 16, 16};
void CL_BoundingBoxForEntity(entity_render_t *ent)
{
- if (ent->model)
+ model_t *model = ent->model;
+ if (model)
{
//if (ent->angles[0] || ent->angles[2])
if (ent->matrix.m[2][0] != 0 || ent->matrix.m[2][1] != 0)
{
// pitch or roll
- ent->mins[0] = ent->matrix.m[0][3] + ent->model->rotatedmins[0];
- ent->mins[1] = ent->matrix.m[1][3] + ent->model->rotatedmins[1];
- ent->mins[2] = ent->matrix.m[2][3] + ent->model->rotatedmins[2];
- ent->maxs[0] = ent->matrix.m[0][3] + ent->model->rotatedmaxs[0];
- ent->maxs[1] = ent->matrix.m[1][3] + ent->model->rotatedmaxs[1];
- ent->maxs[2] = ent->matrix.m[2][3] + ent->model->rotatedmaxs[2];
- //VectorAdd(ent->origin, ent->model->rotatedmins, ent->mins);
- //VectorAdd(ent->origin, ent->model->rotatedmaxs, ent->maxs);
+ ent->mins[0] = ent->matrix.m[0][3] + model->rotatedmins[0];
+ ent->mins[1] = ent->matrix.m[1][3] + model->rotatedmins[1];
+ ent->mins[2] = ent->matrix.m[2][3] + model->rotatedmins[2];
+ ent->maxs[0] = ent->matrix.m[0][3] + model->rotatedmaxs[0];
+ ent->maxs[1] = ent->matrix.m[1][3] + model->rotatedmaxs[1];
+ ent->maxs[2] = ent->matrix.m[2][3] + model->rotatedmaxs[2];
+ //VectorAdd(ent->origin, model->rotatedmins, ent->mins);
+ //VectorAdd(ent->origin, model->rotatedmaxs, ent->maxs);
}
//else if (ent->angles[1])
else if (ent->matrix.m[0][1] != 0 || ent->matrix.m[1][0] != 0)
{
// yaw
- ent->mins[0] = ent->matrix.m[0][3] + ent->model->yawmins[0];
- ent->mins[1] = ent->matrix.m[1][3] + ent->model->yawmins[1];
- ent->mins[2] = ent->matrix.m[2][3] + ent->model->yawmins[2];
- ent->maxs[0] = ent->matrix.m[0][3] + ent->model->yawmaxs[0];
- ent->maxs[1] = ent->matrix.m[1][3] + ent->model->yawmaxs[1];
- ent->maxs[2] = ent->matrix.m[2][3] + ent->model->yawmaxs[2];
- //VectorAdd(ent->origin, ent->model->yawmins, ent->mins);
- //VectorAdd(ent->origin, ent->model->yawmaxs, ent->maxs);
+ ent->mins[0] = ent->matrix.m[0][3] + model->yawmins[0];
+ ent->mins[1] = ent->matrix.m[1][3] + model->yawmins[1];
+ ent->mins[2] = ent->matrix.m[2][3] + model->yawmins[2];
+ ent->maxs[0] = ent->matrix.m[0][3] + model->yawmaxs[0];
+ ent->maxs[1] = ent->matrix.m[1][3] + model->yawmaxs[1];
+ ent->maxs[2] = ent->matrix.m[2][3] + model->yawmaxs[2];
+ //VectorAdd(ent->origin, model->yawmins, ent->mins);
+ //VectorAdd(ent->origin, model->yawmaxs, ent->maxs);
}
else
{
- ent->mins[0] = ent->matrix.m[0][3] + ent->model->normalmins[0];
- ent->mins[1] = ent->matrix.m[1][3] + ent->model->normalmins[1];
- ent->mins[2] = ent->matrix.m[2][3] + ent->model->normalmins[2];
- ent->maxs[0] = ent->matrix.m[0][3] + ent->model->normalmaxs[0];
- ent->maxs[1] = ent->matrix.m[1][3] + ent->model->normalmaxs[1];
- ent->maxs[2] = ent->matrix.m[2][3] + ent->model->normalmaxs[2];
- //VectorAdd(ent->origin, ent->model->normalmins, ent->mins);
- //VectorAdd(ent->origin, ent->model->normalmaxs, ent->maxs);
+ ent->mins[0] = ent->matrix.m[0][3] + model->normalmins[0];
+ ent->mins[1] = ent->matrix.m[1][3] + model->normalmins[1];
+ ent->mins[2] = ent->matrix.m[2][3] + model->normalmins[2];
+ ent->maxs[0] = ent->matrix.m[0][3] + model->normalmaxs[0];
+ ent->maxs[1] = ent->matrix.m[1][3] + model->normalmaxs[1];
+ ent->maxs[2] = ent->matrix.m[2][3] + model->normalmaxs[2];
+ //VectorAdd(ent->origin, model->normalmins, ent->mins);
+ //VectorAdd(ent->origin, model->normalmaxs, ent->maxs);
}
}
else
l = (i-1) % cl.lightstyle[j].length;
k = cl.lightstyle[j].map[k] - 'a';
l = cl.lightstyle[j].map[l] - 'a';
- r_refdef.lightstylevalue[j] = ((k*frac)+(l*(1-frac)))*22;
+ r_refdef.lightstylevalue[j] = (unsigned short)(((k*frac)+(l*(1-frac)))*22);
}
}
{
matrix4x4_t *matrix, blendmatrix, tempmatrix, matrix2;
//matrix4x4_t dlightmatrix;
- int j, k, l, trailtype, temp;
- float origin[3], angles[3], delta[3], lerp, dlightcolor[3], dlightradius, mins[3], maxs[3], v2[3], d;
+ int j, k, l;
+ effectnameindex_t trailtype;
+ float origin[3], angles[3], delta[3], lerp, dlightcolor[3], dlightradius, v2[3], d;
entity_t *t;
model_t *model;
trace_t trace;
// if it's the player entity, update according to client movement
if (e == cl.entities + cl.playerentity && cl.movement)// && !e->csqc)
{
- lerp = (cl.time - cl.mtime[1]) / (cl.mtime[0] - cl.mtime[1]);
+ lerp = (cl.time - cl.movement_time[1]) / (cl.movement_time[0] - cl.movement_time[1]);
lerp = bound(0, lerp, 1);
VectorLerp(cl.movement_oldorigin, lerp, cl.movement_origin, origin);
VectorSet(angles, 0, cl.viewangles[1], 0);
if (e->render.model)
{
// if model is alias or this is a tenebrae-like dlight, reverse pitch direction
- if (e->render.model->type == mod_alias || (e->state_current.lightpflags & PFLAGS_FULLDYNAMIC))
+ if (e->render.model->type == mod_alias)
angles[0] = -angles[0];
if ((e->render.model->flags & EF_ROTATE) && (!e->state_current.tagentity && !(e->render.flags & RENDER_VIEWMODEL)))
{
}
// transfer certain model flags to effects
e->render.effects |= e->render.model->flags2 & (EF_FULLBRIGHT | EF_ADDITIVE);
- if (cl_prydoncursor.integer && (e->render.effects & EF_SELECTABLE) && cl.cmd.cursor_entitynumber == e->state_current.number)
+ if ((e->render.effects & EF_SELECTABLE) && cl.cmd.cursor_entitynumber == e->state_current.number)
VectorScale(e->render.colormod, 2, e->render.colormod);
}
+ // if model is alias or this is a tenebrae-like dlight, reverse pitch direction
+ else if (e->state_current.lightpflags & PFLAGS_FULLDYNAMIC)
+ angles[0] = -angles[0];
// animation lerp
if (e->render.frame2 == e->state_current.frame)
origin[1] = e->render.matrix.m[1][3];
origin[2] = e->render.matrix.m[2][3];
}
- trailtype = -1;
+ trailtype = EFFECT_NONE;
dlightradius = 0;
dlightcolor[0] = 0;
dlightcolor[1] = 0;
if (e->render.effects & EF_BRIGHTFIELD)
{
if (gamemode == GAME_NEXUIZ)
- {
- dlightradius = max(dlightradius, 200);
- dlightcolor[0] += 0.75f;
- dlightcolor[1] += 1.50f;
- dlightcolor[2] += 3.00f;
- trailtype = 8;
- }
+ trailtype = EFFECT_TR_NEXUIZPLASMA;
else
CL_EntityParticles(e);
}
dlightcolor[2] += 1.50f;
}
if (e->render.effects & EF_FLAME)
- {
- mins[0] = origin[0] - 16.0f;
- mins[1] = origin[1] - 16.0f;
- mins[2] = origin[2] - 16.0f;
- maxs[0] = origin[0] + 16.0f;
- maxs[1] = origin[1] + 16.0f;
- maxs[2] = origin[2] + 16.0f;
- // how many flames to make
- temp = (int) (cl.time * 300) - (int) (cl.oldtime * 300);
- CL_FlameCube(mins, maxs, temp);
- d = lhrandom(0.75f, 1);
- dlightradius = max(dlightradius, 200);
- dlightcolor[0] += d * 2.0f;
- dlightcolor[1] += d * 1.5f;
- dlightcolor[2] += d * 0.5f;
- }
+ CL_ParticleEffect(EFFECT_EF_FLAME, cl.time - cl.oldtime, origin, origin, vec3_origin, vec3_origin, NULL, 0);
if (e->render.effects & EF_STARDUST)
- {
- mins[0] = origin[0] - 16.0f;
- mins[1] = origin[1] - 16.0f;
- mins[2] = origin[2] - 16.0f;
- maxs[0] = origin[0] + 16.0f;
- maxs[1] = origin[1] + 16.0f;
- maxs[2] = origin[2] + 16.0f;
- // how many particles to make
- temp = (int) (cl.time * 200) - (int) (cl.oldtime * 200);
- CL_Stardust(mins, maxs, temp);
- dlightradius = max(dlightradius, 200);
- dlightcolor[0] += 1.0f;
- dlightcolor[1] += 0.7f;
- dlightcolor[2] += 0.3f;
- }
+ CL_ParticleEffect(EFFECT_EF_STARDUST, cl.time - cl.oldtime, origin, origin, vec3_origin, vec3_origin, NULL, 0);
if (e->render.effects & (EF_FLAG1QW | EF_FLAG2QW))
{
// these are only set on player entities
tempmatrix.m[1][3] = trace.endpos[1];
tempmatrix.m[2][3] = trace.endpos[2];
CL_AllocDlight(NULL, &tempmatrix, 100, e->persistent.muzzleflash, e->persistent.muzzleflash, e->persistent.muzzleflash, 0, 0, 0, -1, true, 0, 0.25, 0.25, 1, 1, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE);
- e->persistent.muzzleflash -= cl.frametime * 10;
+ e->persistent.muzzleflash -= (cl.time - cl.oldtime) * 10;
}
// LordHavoc: if the model has no flags, don't check each
if (e->render.model && e->render.model->flags && (!e->state_current.tagentity && !(e->render.flags & RENDER_VIEWMODEL)))
{
if (e->render.model->flags & EF_GIB)
- trailtype = 2;
+ trailtype = EFFECT_TR_BLOOD;
else if (e->render.model->flags & EF_ZOMGIB)
- trailtype = 4;
+ trailtype = EFFECT_TR_SLIGHTBLOOD;
else if (e->render.model->flags & EF_TRACER)
- {
- trailtype = 3;
- //dlightradius = max(dlightradius, 100);
- //dlightcolor[0] += 0.25f;
- //dlightcolor[1] += 1.00f;
- //dlightcolor[2] += 0.25f;
- }
+ trailtype = EFFECT_TR_WIZSPIKE;
else if (e->render.model->flags & EF_TRACER2)
- {
- trailtype = 5;
- //dlightradius = max(dlightradius, 100);
- //dlightcolor[0] += 1.00f;
- //dlightcolor[1] += 0.60f;
- //dlightcolor[2] += 0.20f;
- }
+ trailtype = EFFECT_TR_KNIGHTSPIKE;
else if (e->render.model->flags & EF_ROCKET)
- {
- trailtype = 0;
- dlightradius = max(dlightradius, 200);
- dlightcolor[0] += 3.00f;
- dlightcolor[1] += 1.50f;
- dlightcolor[2] += 0.50f;
- }
+ trailtype = EFFECT_TR_ROCKET;
else if (e->render.model->flags & EF_GRENADE)
{
// LordHavoc: e->render.alpha == -1 is for Nehahra dem compatibility (cigar smoke)
- trailtype = e->render.alpha == -1 ? 7 : 1;
+ trailtype = e->render.alpha == -1 ? EFFECT_TR_NEHAHRASMOKE : EFFECT_TR_GRENADE;
}
else if (e->render.model->flags & EF_TRACER3)
- {
- trailtype = 6;
- if (gamemode == GAME_PRYDON)
- {
- dlightradius = max(dlightradius, 100);
- dlightcolor[0] += 0.30f;
- dlightcolor[1] += 0.60f;
- dlightcolor[2] += 1.20f;
- }
- else
- {
- dlightradius = max(dlightradius, 200);
- dlightcolor[0] += 1.20f;
- dlightcolor[1] += 0.50f;
- dlightcolor[2] += 1.00f;
- }
- }
+ trailtype = EFFECT_TR_VORESPIKE;
}
// LordHavoc: customizable glow
if (e->state_current.glowsize)
}
// do trails
if (e->render.flags & RENDER_GLOWTRAIL)
- trailtype = 9;
- if (trailtype >= 0)
- CL_RocketTrail(e->persistent.trail_origin, origin, trailtype, e->state_current.glowcolor, e);
+ trailtype = EFFECT_TR_GLOWTRAIL;
+ if (trailtype)
+ {
+ float len;
+ vec3_t vel;
+ VectorSubtract(e->state_current.origin, e->state_previous.origin, vel);
+ len = e->state_current.time - e->state_previous.time;
+ if (len > 0)
+ len = 1.0f / len;
+ VectorScale(vel, len, vel);
+ CL_ParticleEffect(trailtype, 1, e->persistent.trail_origin, origin, vel, vel, e, e->state_current.glowcolor);
+ }
VectorCopy(origin, e->persistent.trail_origin);
// tenebrae's sprites are all additive mode (weird)
if (gamemode == GAME_TENEBRAE && e->render.model && e->render.model->type == mod_sprite)
if (e->active)
{
frame = (cl.time - e->starttime) * e->framerate + e->startframe;
- intframe = frame;
+ intframe = (int)frame;
if (intframe < 0 || intframe >= e->endframe)
{
memset(e, 0, sizeof(*e));
// if coming from the player, update the start position
//if (b->entity == cl.viewentity)
// Matrix4x4_OriginFromMatrix(&cl.entities[cl.viewentity].render.matrix, b->start);
- if (cl_beams_relative.integer && b->entity && cl.entities[b->entity].state_current.active && b->relativestartvalid)
+ if (cl_beams_relative.integer >= 1 && b->entity && (b->entity == cl.viewentity || cl_beams_relative.integer >= 2) && cl.entities[b->entity].state_current.active && b->relativestartvalid)
{
entity_render_t *r = &cl.entities[b->entity].render;
//Matrix4x4_OriginFromMatrix(&r->matrix, origin);
void CL_LerpPlayer(float frac)
{
int i;
- float d;
cl.viewzoom = cl.mviewzoom[1] + frac * (cl.mviewzoom[0] - cl.mviewzoom[1]);
for (i = 0;i < 3;i++)
cl.punchvector[i] = cl.mpunchvector[1][i] + frac * (cl.mpunchvector[0][i] - cl.mpunchvector[1][i]);
cl.velocity[i] = cl.mvelocity[1][i] + frac * (cl.mvelocity[0][i] - cl.mvelocity[1][i]);
}
-
- if (cls.demoplayback)
- {
- // interpolate the angles
- for (i = 0;i < 3;i++)
- {
- d = cl.mviewangles[0][i] - cl.mviewangles[1][i];
- if (d > 180)
- d -= 360;
- else if (d < -180)
- d += 360;
- cl.viewangles[i] = cl.mviewangles[1][i] + frac * d;
- }
- }
}
void CSQC_RelinkAllEntities (int drawmask)
{
+ cl.num_brushmodel_entities = 0;
CL_RelinkNetworkEntities(drawmask);
if(drawmask & ENTMASK_ENGINE)
{
r_refdef.extraupdate = !r_speeds.integer;
r_refdef.numentities = 0;
r_refdef.viewentitymatrix = identitymatrix;
- cl.num_brushmodel_entities = 0;
if (cls.state == ca_connected && cls.signon == SIGNONS)
{
CL_ClientMovement_Replay();
if(!csqc_loaded) //[515]: csqc
{
+ cl.num_brushmodel_entities = 0;
CL_RelinkNetworkEntities(65535);
// move particles
// update view blend
V_CalcViewBlend();
+
+ // update the r_refdef time again because cl.time may have changed
+ r_refdef.time = cl.time;
}
return 0;
CL_Particles_Shutdown();
CL_Parse_Shutdown();
- Mem_FreePool (&cls.mempool);
+ Mem_FreePool (&cls.permanentmempool);
+ Mem_FreePool (&cls.levelmempool);
}
/*
*/
void CL_Init (void)
{
- cls.mempool = Mem_AllocPool("client", 0, NULL);
+ cls.levelmempool = Mem_AllocPool("client (per-level memory)", 0, NULL);
+ cls.permanentmempool = Mem_AllocPool("client (long term memory)", 0, NULL);
memset(&r_refdef, 0, sizeof(r_refdef));
// max entities sent to renderer per frame
r_refdef.maxentities = MAX_EDICTS + 256 + 512;
- r_refdef.entities = (entity_render_t **)Mem_Alloc(cls.mempool, sizeof(entity_render_t *) * r_refdef.maxentities);
+ r_refdef.entities = (entity_render_t **)Mem_Alloc(cls.permanentmempool, sizeof(entity_render_t *) * r_refdef.maxentities);
CL_InitInput ();
Cmd_AddCommand ("playdemo", CL_PlayDemo_f, "watch a demo file");
Cmd_AddCommand ("timedemo", CL_TimeDemo_f, "play back a demo as fast as possible and save statistics to benchmark.log");
+ Cvar_RegisterVariable (&cl_autodemo);
+ Cvar_RegisterVariable (&cl_autodemo_nameformat);
+
Cmd_AddCommand ("fog", CL_Fog_f, "set global fog parameters (density red green blue)");
// LordHavoc: added pausedemo