X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=cl_main.c;h=420203b4f4e0c641d2fe54887432550e4c1a46d1;hb=c6b063db8b4b2175f81ec0146f4e23a0ec1abcd9;hp=26bac7799dc0fdeae9b421ccc8b1bf0e4ae0cc36;hpb=a201aa8ae4beab46d0d56f3b21afc9ca92c9dbf4;p=xonotic%2Fdarkplaces.git diff --git a/cl_main.c b/cl_main.c index 26bac779..420203b4 100644 --- a/cl_main.c +++ b/cl_main.c @@ -38,6 +38,7 @@ cvar_t csqc_progsize = {CVAR_READONLY, "csqc_progsize","-1","file size of csprog 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)"}; @@ -297,6 +298,7 @@ void CL_ExpandEntities(int num) void CL_ExpandCSQCRenderEntities(int num) { + int i; int oldmaxcsqcrenderentities; entity_render_t *oldcsqcrenderentities; if (num >= cl.max_csqcrenderentities) @@ -310,6 +312,9 @@ void CL_ExpandCSQCRenderEntities(int num) if (oldcsqcrenderentities) { memcpy(cl.csqcrenderentities, oldcsqcrenderentities, oldmaxcsqcrenderentities * sizeof(entity_render_t)); + for (i = 0;i < r_refdef.scene.numentities;i++) + if(r_refdef.scene.entities[i] >= oldcsqcrenderentities && r_refdef.scene.entities[i] < (oldcsqcrenderentities + oldmaxcsqcrenderentities)) + r_refdef.scene.entities[i] = cl.csqcrenderentities + (r_refdef.scene.entities[i] - oldcsqcrenderentities); Mem_Free(oldcsqcrenderentities); } } @@ -412,6 +417,10 @@ void CL_EstablishConnection(const char *host, int firstarg) 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; @@ -620,12 +629,20 @@ static float CL_LerpPoint(void) } 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) @@ -635,7 +652,10 @@ 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; @@ -888,7 +908,8 @@ void CL_AddQWCTFFlagModel(entity_t *player, int skin) CL_UpdateRenderEntity(flagrender); } -matrix4x4_t viewmodelmatrix; +matrix4x4_t viewmodelmatrix_withbob; +matrix4x4_t viewmodelmatrix_nobob; static const vec3_t muzzleflashorigin = {18, 0, 0}; @@ -991,9 +1012,9 @@ void CL_UpdateNetworkEntity(entity_t *e, int recursionlimit, qboolean interpolat { // 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 { @@ -1014,7 +1035,7 @@ void CL_UpdateNetworkEntity(entity_t *e, int recursionlimit, qboolean interpolat 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); @@ -1079,7 +1100,17 @@ void CL_UpdateNetworkEntity(entity_t *e, int recursionlimit, qboolean interpolat } // 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; @@ -1230,6 +1261,8 @@ void CL_UpdateNetworkEntityTrail(entity_t *e) // 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) { @@ -1458,7 +1491,7 @@ void CL_LinkNetworkEntity(entity_t *e) 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); @@ -1527,6 +1560,8 @@ void CL_LinkNetworkEntity(entity_t *e) // 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); @@ -1877,7 +1912,7 @@ void CL_UpdateWorld(void) 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) @@ -2357,6 +2392,7 @@ CL_Init */ void CL_Init (void) { + cls.levelmempool = Mem_AllocPool("client (per-level memory)", 0, NULL); cls.permanentmempool = Mem_AllocPool("client (long term memory)", 0, NULL); @@ -2365,7 +2401,8 @@ void CL_Init (void) 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 (); @@ -2383,6 +2420,7 @@ void CL_Init (void) 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);