cvar_t csqc_progname = {0, "csqc_progname","csprogs.dat","name of csprogs.dat file to load"};
cvar_t csqc_progcrc = {CVAR_READONLY, "csqc_progcrc","-1","CRC of csprogs.dat file to load (-1 is none), only used during level changes and then reset to -1"};
cvar_t csqc_progsize = {CVAR_READONLY, "csqc_progsize","-1","file size of csprogs.dat file to load (-1 is none), only used during level changes and then reset to -1"};
+cvar_t csqc_usedemoprogs = {0, "csqc_usedemoprogs","1","use csprogs stored in demos"};
cvar_t cl_shownet = {0, "cl_shownet","0","1 = print packet size, 2 = print packet message list"};
cvar_t cl_nolerp = {0, "cl_nolerp", "0","network update smoothing"};
+cvar_t cl_lerpexcess = {0, "cl_lerpexcess", "0","maximum allowed lerp excess (hides, not fixes, some packet loss)"};
cvar_t cl_lerpanim_maxdelta_server = {0, "cl_lerpanim_maxdelta_server", "0.1","maximum frame delta for smoothing between server-controlled animation frames (when 0, one network frame)"};
cvar_t cl_lerpanim_maxdelta_framegroups = {0, "cl_lerpanim_maxdelta_framegroups", "0.1","maximum frame delta for smoothing between framegroups (when 0, one network frame)"};
if (cls.state == ca_dedicated)
return;
+ // don't connect to a server if we're benchmarking a demo
+ if (COM_CheckParm("-benchmark"))
+ return;
+
// clear menu's connect error message
M_Update_Return_Reason("");
cls.demonum = -1;
}
f = (cl.time - cl.mtime[1]) / (cl.mtime[0] - cl.mtime[1]);
- return bound(0, f, 1);
+ return bound(0, f, 1 + cl_lerpexcess.value);
}
void CL_ClearTempEntities (void)
{
r_refdef.scene.numtempentities = 0;
+ // grow tempentities buffer on request
+ if (r_refdef.scene.expandtempentities)
+ {
+ Con_Printf("CL_NewTempEntity: grow maxtempentities from %i to %i\n", r_refdef.scene.maxtempentities, r_refdef.scene.maxtempentities * 2);
+ r_refdef.scene.maxtempentities *= 2;
+ r_refdef.scene.tempentities = (entity_render_t *)Mem_Realloc(cls.permanentmempool, r_refdef.scene.tempentities, sizeof(entity_render_t) * r_refdef.scene.maxtempentities);
+ r_refdef.scene.expandtempentities = false;
+ }
}
entity_render_t *CL_NewTempEntity(double shadertime)
if (r_refdef.scene.numentities >= r_refdef.scene.maxentities)
return NULL;
if (r_refdef.scene.numtempentities >= r_refdef.scene.maxtempentities)
+ {
+ r_refdef.scene.expandtempentities = true; // will be reallocated next frame since current frame may have pointers set already
return NULL;
+ }
render = &r_refdef.scene.tempentities[r_refdef.scene.numtempentities++];
memset (render, 0, sizeof(*render));
r_refdef.scene.entities[r_refdef.scene.numentities++] = render;
CL_UpdateRenderEntity(flagrender);
}
-matrix4x4_t viewmodelmatrix;
+matrix4x4_t viewmodelmatrix_withbob;
+matrix4x4_t viewmodelmatrix_nobob;
static const vec3_t muzzleflashorigin = {18, 0, 0};
{
// view-relative entity (guns and such)
if (e->render.effects & EF_NOGUNBOB)
- matrix = &r_refdef.view.matrix; // really attached to view
+ matrix = &viewmodelmatrix_nobob; // really attached to view
else
- matrix = &viewmodelmatrix; // attached to gun bob matrix
+ matrix = &viewmodelmatrix_withbob; // attached to gun bob matrix
}
else
{
VectorCopy(cl.movement_origin, origin);
VectorSet(angles, 0, cl.viewangles[1], 0);
}
- else if (interpolate && e->persistent.lerpdeltatime > 0 && (lerp = (cl.time - e->persistent.lerpstarttime) / e->persistent.lerpdeltatime) < 1)
+ else if (interpolate && e->persistent.lerpdeltatime > 0 && (lerp = (cl.time - e->persistent.lerpstarttime) / e->persistent.lerpdeltatime) < 1 + cl_lerpexcess.value)
{
// interpolate the origin and angles
lerp = max(0, lerp);
}
// animation lerp
- if (e->render.framegroupblend[0].frame == frame)
+ e->render.skeleton = NULL;
+ if (e->render.flags & RENDER_COMPLEXANIMATION)
+ {
+ e->render.framegroupblend[0] = e->state_current.framegroupblend[0];
+ e->render.framegroupblend[1] = e->state_current.framegroupblend[1];
+ e->render.framegroupblend[2] = e->state_current.framegroupblend[2];
+ e->render.framegroupblend[3] = e->state_current.framegroupblend[3];
+ if (e->state_current.skeletonobject.model && e->state_current.skeletonobject.relativetransforms)
+ e->render.skeleton = &e->state_current.skeletonobject;
+ }
+ else if (e->render.framegroupblend[0].frame == frame)
{
// update frame lerp fraction
e->render.framegroupblend[0].lerp = 1;
// do trails
if (e->render.flags & RENDER_GLOWTRAIL)
trailtype = EFFECT_TR_GLOWTRAIL;
+ if (e->state_current.traileffectnum)
+ trailtype = (effectnameindex_t)e->state_current.traileffectnum;
// check if a trail is allowed (it is not after a teleport for example)
if (trailtype && e->persistent.trail_allowed)
{
trace_t trace;
matrix4x4_t tempmatrix;
Matrix4x4_Transform(&e->render.matrix, muzzleflashorigin, v2);
- trace = CL_TraceLine(origin, v2, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, true, false, NULL, false);
+ trace = CL_TraceLine(origin, v2, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, true, false, NULL, false, false);
Matrix4x4_Normalize(&tempmatrix, &e->render.matrix);
Matrix4x4_SetOrigin(&tempmatrix, trace.endpos[0], trace.endpos[1], trace.endpos[2]);
Matrix4x4_Scale(&tempmatrix, 150, 1);
// do trail light
if (e->render.flags & RENDER_GLOWTRAIL)
trailtype = EFFECT_TR_GLOWTRAIL;
+ if (e->state_current.traileffectnum)
+ trailtype = (effectnameindex_t)e->state_current.traileffectnum;
if (trailtype)
CL_ParticleTrail(trailtype, 1, origin, origin, vec3_origin, vec3_origin, NULL, e->state_current.glowcolor, true, false, NULL, NULL);
r_refdef.scene.numlights = 0;
r_refdef.view.matrix = identitymatrix;
r_refdef.view.quality = 1;
-
+
cl.num_brushmodel_entities = 0;
if (cls.state == ca_connected && cls.signon == SIGNONS)
*/
void CL_Init (void)
{
+
cls.levelmempool = Mem_AllocPool("client (per-level memory)", 0, NULL);
cls.permanentmempool = Mem_AllocPool("client (long term memory)", 0, NULL);
r_refdef.scene.maxentities = MAX_EDICTS + 256 + 512;
r_refdef.scene.entities = (entity_render_t **)Mem_Alloc(cls.permanentmempool, sizeof(entity_render_t *) * r_refdef.scene.maxentities);
- r_refdef.scene.maxtempentities = MAX_TEMPENTITIES; // FIXME: make this grow
+ // max temp entities
+ r_refdef.scene.maxtempentities = MAX_TEMPENTITIES;
r_refdef.scene.tempentities = (entity_render_t *)Mem_Alloc(cls.permanentmempool, sizeof(entity_render_t) * r_refdef.scene.maxtempentities);
CL_InitInput ();
Cvar_RegisterVariable (&cl_anglespeedkey);
Cvar_RegisterVariable (&cl_shownet);
Cvar_RegisterVariable (&cl_nolerp);
+ Cvar_RegisterVariable (&cl_lerpexcess);
Cvar_RegisterVariable (&cl_lerpanim_maxdelta_server);
Cvar_RegisterVariable (&cl_lerpanim_maxdelta_framegroups);
Cvar_RegisterVariable (&cl_deathfade);