X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=view.c;h=8cbdc5f7289b81385f5f91e212333fa00b0e85de;hb=dd907a12c173b52bdc7a81baec63d112f91203a6;hp=b00c3443f8602d841fcc8ca0e7d830d2e7403037;hpb=da1866f3c048815988f5986896f72d3c29d749f4;p=xonotic%2Fdarkplaces.git diff --git a/view.c b/view.c index b00c3443..8cbdc5f7 100644 --- a/view.c +++ b/view.c @@ -34,14 +34,16 @@ when crossing a water boudnary. cvar_t cl_rollspeed = {0, "cl_rollspeed", "200", "how much strafing is necessary to tilt the view"}; cvar_t cl_rollangle = {0, "cl_rollangle", "2.0", "how much to tilt the view when strafing"}; -cvar_t cl_bob = {0, "cl_bob","0.02", "view bobbing amount"}; -cvar_t cl_bobcycle = {0, "cl_bobcycle","0.6", "view bobbing speed"}; -cvar_t cl_bobup = {0, "cl_bobup","0.5", "view bobbing adjustment that makes the up or down swing of the bob last longer"}; +cvar_t cl_bob = {CVAR_SAVE, "cl_bob","0.02", "view bobbing amount"}; +cvar_t cl_bobcycle = {CVAR_SAVE, "cl_bobcycle","0.6", "view bobbing speed"}; +cvar_t cl_bobup = {CVAR_SAVE, "cl_bobup","0.5", "view bobbing adjustment that makes the up or down swing of the bob last longer"}; -cvar_t cl_bobmodel = {0, "cl_bobmodel", "1", "enables gun bobbing"}; -cvar_t cl_bobmodel_side = {0, "cl_bobmodel_side", "0.05", "gun bobbing sideways sway amount"}; -cvar_t cl_bobmodel_up = {0, "cl_bobmodel_up", "0.02", "gun bobbing upward movement amount"}; -cvar_t cl_bobmodel_speed = {0, "cl_bobmodel_speed", "7", "gun bobbing speed"}; +cvar_t cl_bobmodel = {CVAR_SAVE, "cl_bobmodel", "1", "enables gun bobbing"}; +cvar_t cl_bobmodel_side = {CVAR_SAVE, "cl_bobmodel_side", "0.15", "gun bobbing sideways sway amount"}; +cvar_t cl_bobmodel_up = {CVAR_SAVE, "cl_bobmodel_up", "0.06", "gun bobbing upward movement amount"}; +cvar_t cl_bobmodel_speed = {CVAR_SAVE, "cl_bobmodel_speed", "7", "gun bobbing speed"}; + +cvar_t cl_viewmodel_scale = {0, "cl_viewmodel_scale", "1", "changes size of gun model, lower values prevent poking into walls but cause strange artifacts on lighting and especially r_stereo/vid_stereobuffer options where the size of the gun becomes visible"}; cvar_t v_kicktime = {0, "v_kicktime", "0.5", "how long a view kick from damage lasts"}; cvar_t v_kickroll = {0, "v_kickroll", "0.6", "how much a view kick from damage rolls your view"}; @@ -319,15 +321,12 @@ 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; - if(csqc_loaded) - return; VectorClear(gunorg); viewmodelmatrix = identitymatrix; - r_refdef.viewentitymatrix = identitymatrix; + r_view.matrix = identitymatrix; if (cls.state == ca_connected && cls.signon == SIGNONS) { // ent is the view entity (visible when out of body) @@ -336,61 +335,43 @@ void V_CalcRefdef (void) // and the angles from the input system Matrix4x4_OriginFromMatrix(&ent->render.matrix, vieworg); VectorCopy(cl.viewangles, viewangles); - // interpolate the angles if playing a demo or spectating someone - if (cls.demoplayback || cl.fixangle[0]) - { - int i; - float frac = bound(0, (cl.time - cl.mtime[1]) / (cl.mtime[0] - cl.mtime[1]), 1); - for (i = 0;i < 3;i++) - { - float d = cl.mviewangles[0][i] - cl.mviewangles[1][i]; - if (d > 180) - d -= 360; - else if (d < -180) - d += 360; - viewangles[i] = cl.mviewangles[1][i] + frac * d; - } - } + + // 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) { // entity is a fixed camera, just copy the matrix if (cls.protocol == PROTOCOL_QUAKEWORLD) - Matrix4x4_CreateFromQuakeEntity(&r_refdef.viewentitymatrix, cl.qw_intermission_origin[0], cl.qw_intermission_origin[1], cl.qw_intermission_origin[2], cl.qw_intermission_angles[0], cl.qw_intermission_angles[1], cl.qw_intermission_angles[2], 1); + Matrix4x4_CreateFromQuakeEntity(&r_view.matrix, cl.qw_intermission_origin[0], cl.qw_intermission_origin[1], cl.qw_intermission_origin[2], cl.qw_intermission_angles[0], cl.qw_intermission_angles[1], cl.qw_intermission_angles[2], 1); else { - r_refdef.viewentitymatrix = ent->render.matrix; - r_refdef.viewentitymatrix.m[2][3] += cl.stats[STAT_VIEWHEIGHT]; + r_view.matrix = ent->render.matrix; + Matrix4x4_AdjustOrigin(&r_view.matrix, 0, 0, cl.stats[STAT_VIEWHEIGHT]); } - viewmodelmatrix = r_refdef.viewentitymatrix; + viewmodelmatrix = r_view.matrix; } else { - // apply qw weapon recoil effect (this did not work in QW) - // TODO: add a cvar to disable this - viewangles[PITCH] += cl.qw_weaponkick; - - if (cl.onground) + // smooth stair stepping, but only if onground and enabled + if (!cl.onground || cl_stairsmoothspeed.value <= 0) + cl.stairsmoothz = vieworg[2]; + else { - if (!cl.oldonground) - cl.hitgroundtime = cl.time; - cl.lastongroundtime = cl.time; + 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); } - cl.oldonground = cl.onground; - // stair smoothing - //Con_Printf("cl.onground %i oldz %f newz %f\n", cl.onground, oldz, vieworg[2]); - if (cl.onground && oldz < vieworg[2]) - { - oldz += (cl.time - cl.oldtime) * cl_stairsmoothspeed.value; - oldz = vieworg[2] = bound(vieworg[2] - 16, oldz, vieworg[2]); - } - else if (cl.onground && oldz > vieworg[2]) - { - oldz -= (cl.time - cl.oldtime) * cl_stairsmoothspeed.value; - oldz = vieworg[2] = bound(vieworg[2], oldz, vieworg[2] + 16); - } - else - oldz = vieworg[2]; + // apply qw weapon recoil effect (this did not work in QW) + // TODO: add a cvar to disable this + viewangles[PITCH] += cl.qw_weaponkick; if (chase_active.value) { @@ -420,7 +401,7 @@ void V_CalcRefdef (void) chase_dest[0] = vieworg[0] + forward[0] * dist; chase_dest[1] = vieworg[1] + forward[1] * dist; chase_dest[2] = vieworg[2] + forward[2] * dist + camup; - trace = CL_TraceBox(vieworg, vec3_origin, vec3_origin, chase_dest, true, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, false); + trace = CL_Move(vieworg, vec3_origin, vec3_origin, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, true, false, NULL, false); VectorMAMAM(1, trace.endpos, 8, forward, 4, trace.plane.normal, vieworg); } else @@ -435,7 +416,6 @@ void V_CalcRefdef (void) { viewangles[ROLL] += v_dmg_time/v_kicktime.value*v_dmg_roll; viewangles[PITCH] += v_dmg_time/v_kicktime.value*v_dmg_pitch; - v_dmg_time -= cl.realframetime; } // origin VectorAdd(vieworg, cl.punchvector, vieworg); @@ -467,7 +447,7 @@ void V_CalcRefdef (void) VectorCopy(vieworg, gunorg); - if (cl_bobmodel.value) + if (cl_bob.value && cl_bobmodel.value) { // calculate for swinging gun model // the gun bobs when running on the ground, but doesn't bob when you're in the air. @@ -502,28 +482,31 @@ void V_CalcRefdef (void) bspeed = bound (0, xyspeed, 400) * 0.01f; AngleVectors (viewangles, forward, right, up); - bob = bspeed * cl_bobmodel_side.value * sin (s) * t; + bob = bspeed * cl_bobmodel_side.value * cl_viewmodel_scale.value * sin (s) * t; VectorMA (gunorg, bob, right, gunorg); - bob = bspeed * cl_bobmodel_up.value * cos (s * 2) * t; + bob = bspeed * cl_bobmodel_up.value * cl_viewmodel_scale.value * cos (s * 2) * t; VectorMA (gunorg, bob, up, gunorg); } } } // calculate a view matrix for rendering the scene if (v_idlescale.value) - Matrix4x4_CreateFromQuakeEntity(&r_refdef.viewentitymatrix, vieworg[0], vieworg[1], vieworg[2], viewangles[0] + v_idlescale.value * sin(cl.time*v_ipitch_cycle.value) * v_ipitch_level.value, viewangles[1] + v_idlescale.value * sin(cl.time*v_iyaw_cycle.value) * v_iyaw_level.value, viewangles[2] + v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value, 1); + Matrix4x4_CreateFromQuakeEntity(&r_view.matrix, vieworg[0], vieworg[1], vieworg[2], viewangles[0] + v_idlescale.value * sin(cl.time*v_ipitch_cycle.value) * v_ipitch_level.value, viewangles[1] + v_idlescale.value * sin(cl.time*v_iyaw_cycle.value) * v_iyaw_level.value, viewangles[2] + v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value, 1); else - Matrix4x4_CreateFromQuakeEntity(&r_refdef.viewentitymatrix, vieworg[0], vieworg[1], vieworg[2], viewangles[0], viewangles[1], viewangles[2] + v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value, 1); + Matrix4x4_CreateFromQuakeEntity(&r_view.matrix, vieworg[0], vieworg[1], vieworg[2], viewangles[0], viewangles[1], viewangles[2] + v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value, 1); // calculate a viewmodel matrix for use in view-attached entities - Matrix4x4_CreateFromQuakeEntity(&viewmodelmatrix, gunorg[0], gunorg[1], gunorg[2], viewangles[0], viewangles[1], viewangles[2], 0.3); - VectorCopy(vieworg, csqc_origin); - VectorCopy(viewangles, csqc_angles); + Matrix4x4_CreateFromQuakeEntity(&viewmodelmatrix, gunorg[0], gunorg[1], gunorg[2], viewangles[0], viewangles[1], viewangles[2], cl_viewmodel_scale.value); + VectorCopy(vieworg, cl.csqc_origin); + VectorCopy(viewangles, cl.csqc_angles); } } } void V_FadeViewFlashs(void) { + // don't flash if time steps backwards + if (cl.time <= cl.oldtime) + return; // drop the damage value cl.cshifts[CSHIFT_DAMAGE].percent -= (cl.time - cl.oldtime)*150; if (cl.cshifts[CSHIFT_DAMAGE].percent <= 0) @@ -549,7 +532,7 @@ void V_CalcViewBlend(void) // set contents color int supercontents; vec3_t vieworigin; - Matrix4x4_OriginFromMatrix(&r_refdef.viewentitymatrix, vieworigin); + Matrix4x4_OriginFromMatrix(&r_view.matrix, vieworigin); supercontents = CL_PointSuperContents(vieworigin); if (supercontents & SUPERCONTENTS_LIQUIDSMASK) { @@ -682,6 +665,8 @@ void V_Init (void) Cvar_RegisterVariable (&cl_bobmodel_up); Cvar_RegisterVariable (&cl_bobmodel_speed); + Cvar_RegisterVariable (&cl_viewmodel_scale); + Cvar_RegisterVariable (&v_kicktime); Cvar_RegisterVariable (&v_kickroll); Cvar_RegisterVariable (&v_kickpitch);