From e4af24f74c017f75dccc8bc675a4184d801e5d8a Mon Sep 17 00:00:00 2001 From: havoc Date: Mon, 19 Feb 2007 09:08:16 +0000 Subject: [PATCH] fixed stair smoothing code so it no longer jitters when riding lifts added support for cl_stairsmoothspeed 0 as a means of disabling stair smoothing git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@6869 d7cf8633-e32d-0410-b094-e92efae38249 --- cl_main.c | 6 +----- client.h | 3 ++- view.c | 60 ++++++++++++++++++------------------------------------- 3 files changed, 22 insertions(+), 47 deletions(-) diff --git a/cl_main.c b/cl_main.c index 927f7eff..693caeb7 100644 --- a/cl_main.c +++ b/cl_main.c @@ -866,7 +866,7 @@ void CL_UpdateNetworkEntity(entity_t *e, int recursionlimit) } // movement lerp - // if it's the player entity, update according to client movement + // if it's the predicted player entity, update according to client movement if (e == cl.entities + cl.playerentity && cl.movement_predicted) { lerp = (cl.time - cl.movement_time[2]) / (cl.movement_time[0] - cl.movement_time[1]); @@ -1625,8 +1625,6 @@ CL_ReadFromServer Read all incoming data from the server =============== */ -extern void CL_StairSmoothing(void);//view.c - int CL_ReadFromServer(void) { CL_ReadDemoMessage(); @@ -1655,8 +1653,6 @@ int CL_ReadFromServer(void) CL_RelinkLightFlashes(); CSQC_RelinkAllEntities(ENTMASK_ENGINE | ENTMASK_ENGINEVIEWMODELS); - CL_StairSmoothing(); - // move particles CL_MoveParticles(); R_MoveExplosions(); diff --git a/client.h b/client.h index 297b5d6b..f53943dc 100644 --- a/client.h +++ b/client.h @@ -662,7 +662,8 @@ typedef struct client_state_s // use pain anim frame if cl.time < this float faceanimtime; // for stair smoothing - float stairoffset; + float stairsmoothz; + double stairsmoothtime; // color shifts for damage, powerups cshift_t cshifts[NUM_CSHIFTS]; diff --git a/view.c b/view.c index 91e0dc0d..97ba0154 100644 --- a/view.c +++ b/view.c @@ -313,32 +313,6 @@ extern matrix4x4_t viewmodelmatrix; #include "cl_collision.h" #include "csprogs.h" -/* -================== -CL_StairSmoothing - -================== -*/ -void CL_StairSmoothing (void) -{ - if (v_dmg_time > 0) - v_dmg_time -= bound(0, cl.time - cl.oldtime, 0.1); - - // stair smoothing - if (cl.onground && cl.stairoffset < 0) - { - cl.stairoffset += bound(0, cl.time - cl.oldtime, 0.1) * cl_stairsmoothspeed.value; - cl.stairoffset = bound(-16, cl.stairoffset, 0); - } - else if (cl.onground && cl.stairoffset > 0) - { - cl.stairoffset -= bound(0, cl.time - cl.oldtime, 0.1) * cl_stairsmoothspeed.value; - cl.stairoffset = bound(0, cl.stairoffset, 16); - } - else - cl.stairoffset = 0; -} - /* ================== V_CalcRefdef @@ -347,9 +321,8 @@ V_CalcRefdef */ void V_CalcRefdef (void) { - static float oldz; entity_t *ent; - float vieworg[3], gunorg[3], viewangles[3]; + float vieworg[3], gunorg[3], viewangles[3], smoothtime; trace_t trace; VectorClear(gunorg); viewmodelmatrix = identitymatrix; @@ -363,16 +336,13 @@ void V_CalcRefdef (void) Matrix4x4_OriginFromMatrix(&ent->render.matrix, vieworg); VectorCopy(cl.viewangles, viewangles); - // update the stairoffset if the player entity has gone up or down without leaving the ground - //Con_Printf("cl.onground %i oldz %f newz %f vel %f %f %f\n", cl.onground, oldz, vieworg[2], cl.movement_velocity[0], cl.movement_velocity[1], cl.movement_velocity[2]); - if (cl.onground) - { - cl.stairoffset -= vieworg[2] - oldz; - cl.stairoffset = bound(-16, cl.stairoffset, 16); - } - else - cl.stairoffset = 0; - oldz = vieworg[2]; + // calculate how much time has passed since the last V_CalcRefdef + smoothtime = bound(0, cl.time - cl.stairsmoothtime, 0.1); + cl.stairsmoothtime = cl.time; + + // fade damage flash + if (v_dmg_time > 0) + v_dmg_time -= bound(0, smoothtime, 0.1); if (cl.intermission) { @@ -388,13 +358,21 @@ void V_CalcRefdef (void) } else { + // smooth stair stepping, but only if onground and enabled + if (!cl.onground || cl_stairsmoothspeed.value <= 0) + cl.stairsmoothz = vieworg[2]; + else + { + if (cl.stairsmoothz < vieworg[2]) + vieworg[2] = cl.stairsmoothz = bound(vieworg[2] - 16, cl.stairsmoothz + smoothtime * cl_stairsmoothspeed.value, vieworg[2]); + else if (cl.stairsmoothz > vieworg[2]) + vieworg[2] = cl.stairsmoothz = bound(vieworg[2], cl.stairsmoothz - smoothtime * cl_stairsmoothspeed.value, vieworg[2] + 16); + } + // apply qw weapon recoil effect (this did not work in QW) // TODO: add a cvar to disable this viewangles[PITCH] += cl.qw_weaponkick; - // bias by stair smoothing offset - vieworg[2] += cl.stairoffset; - if (chase_active.value) { // observing entity from third person -- 2.39.2