From 625c75ef5d167e769b8b65c8d47238c4b0710872 Mon Sep 17 00:00:00 2001 From: divverent Date: Sun, 2 May 2010 14:05:33 +0000 Subject: [PATCH] Cvars for part 2. Added safety checks and fixed gunmodel bobbing. From: MirceaKitsune git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@10133 d7cf8633-e32d-0410-b094-e92efae38249 --- darkplaces.txt | 6 ++ view.c | 241 +++++++++++++++++++++++++++---------------------- 2 files changed, 141 insertions(+), 106 deletions(-) diff --git a/darkplaces.txt b/darkplaces.txt index 726c1db9..a037edbb 100644 --- a/darkplaces.txt +++ b/darkplaces.txt @@ -406,6 +406,12 @@ cl_leanmodel_side_limit 7.5 gun leanin cl_leanmodel_up 1 enables gun leaning upward cl_leanmodel_up_speed 2 gun leaning upward speed cl_leanmodel_up_limit 5 gun leaning upward limit +cl_followmodel_side 1 enables gun following sideways +cl_followmodel_side_speed 4 gun following sideways speed +cl_followmodel_side_limit 2 gun following sideways limit +cl_followmodel_up 1 enables gun following upward +cl_followmodel_up_speed 3 gun following upward speed +cl_followmodel_up_limit 1 gun following upward limit cl_bobup 0.5 view bobbing adjustment that makes the up or down swing of the bob last longer cl_capturevideo 0 enables saving of video to a .avi file using uncompressed I420 colorspace and PCM audio, note that scr_screenshot_gammaboost affects the brightness of the output) cl_capturevideo_fps 30 how many frames per second to save (29.97 for NTSC, 30 for typical PC video, 15 can be useful) diff --git a/view.c b/view.c index 39c4be9c..f542c7a5 100644 --- a/view.c +++ b/view.c @@ -52,6 +52,13 @@ cvar_t cl_leanmodel_up = {CVAR_SAVE, "cl_leanmodel_up", "1", "enables gun leanin cvar_t cl_leanmodel_up_speed = {CVAR_SAVE, "cl_leanmodel_up_speed", "2", "gun leaning upward speed"}; cvar_t cl_leanmodel_up_limit = {CVAR_SAVE, "cl_leanmodel_up_limit", "5", "gun leaning upward limit"}; +cvar_t cl_followmodel_side = {CVAR_SAVE, "cl_followmodel_side", "1", "enables gun following sideways"}; +cvar_t cl_followmodel_side_speed = {CVAR_SAVE, "cl_followmodel_side_speed", "4", "gun following sideways speed"}; +cvar_t cl_followmodel_side_limit = {CVAR_SAVE, "cl_followmodel_side_limit", "2", "gun following sideways limit"}; +cvar_t cl_followmodel_up = {CVAR_SAVE, "cl_followmodel_up", "1", "enables gun following upward"}; +cvar_t cl_followmodel_up_speed = {CVAR_SAVE, "cl_followmodel_up_speed", "3", "gun following upward speed"}; +cvar_t cl_followmodel_up_limit = {CVAR_SAVE, "cl_followmodel_up_limit", "1", "gun following upward limit"}; + 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"}; @@ -526,70 +533,6 @@ void V_CalcRefdef (void) VectorAdd(vieworg, cl.punchvector, vieworg); if (cl.stats[STAT_HEALTH] > 0) { - double xyspeed, bob; - - xyspeed = sqrt(cl.movement_velocity[0]*cl.movement_velocity[0] + cl.movement_velocity[1]*cl.movement_velocity[1]); - if (cl_bob.value && cl_bobcycle.value) - { - float cycle; - // LordHavoc: this code is *weird*, but not replacable (I think it - // should be done in QC on the server, but oh well, quake is quake) - // LordHavoc: figured out bobup: the time at which the sin is at 180 - // degrees (which allows lengthening or squishing the peak or valley) - cycle = cl.time / cl_bobcycle.value; - cycle -= (int) cycle; - if (cycle < cl_bobup.value) - cycle = sin(M_PI * cycle / cl_bobup.value); - else - cycle = sin(M_PI + M_PI * (cycle-cl_bobup.value)/(1.0 - cl_bobup.value)); - // bob is proportional to velocity in the xy plane - // (don't count Z, or jumping messes it up) - bob = xyspeed * cl_bob.value; - bob = bob*0.3 + bob*0.7*cycle; - vieworg[2] += bound(-7, bob, 4); - } - - 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. - // Sajt: I tried to smooth out the transitions between bob and no bob, which works - // for the most part, but for some reason when you go through a message trigger or - // pick up an item or anything like that it will momentarily jolt the gun. - vec3_t forward, right, up; - float bspeed; - float s; - float t; - - s = cl.time * cl_bobmodel_speed.value; - if (cl.onground) - { - if (cl.time - cl.hitgroundtime < 0.2) - { - // just hit the ground, speed the bob back up over the next 0.2 seconds - t = cl.time - cl.hitgroundtime; - t = bound(0, t, 0.2); - t *= 5; - } - else - t = 1; - } - else - { - // recently left the ground, slow the bob down over the next 0.2 seconds - t = cl.time - cl.lastongroundtime; - t = 0.2 - bound(0, t, 0.2); - t *= 5; - } - - bspeed = bound (0, xyspeed, 400) * 0.01f; - AngleVectors (gunangles, forward, right, up); - bob = bspeed * cl_bobmodel_side.value * cl_viewmodel_scale.value * sin (s) * t; - VectorMA (gunorg, bob, right, gunorg); - bob = bspeed * cl_bobmodel_up.value * cl_viewmodel_scale.value * cos (s * 2) * t; - VectorMA (gunorg, bob, up, gunorg); - } - float ef_speed = cl.realframetime * cl_leanmodel_up_speed.value; // gun model leaning code @@ -652,54 +595,133 @@ void V_CalcRefdef (void) VectorSet(gunangles, viewmodel_push_x, viewmodel_push_y, viewangles[2]); - // gun model following code + // gun model following code - if(gunorg_follow[0] < vieworg[0]) - { - if(vieworg[0] - gunorg_follow[0] > 5) - gunorg_follow[0] = vieworg[0] - 5; - else - gunorg_follow[0] += (vieworg[0] - gunorg_follow[0]) * 5 * ef_speed; - } - if(gunorg_follow[0] > vieworg[0]) - { - if(gunorg_follow[0] - vieworg[0] > 5) - gunorg_follow[0] = vieworg[0] + 5; - else - gunorg_follow[0] -= (gunorg_follow[0] - vieworg[0]) * 5 * ef_speed; - } + if(cl_followmodel_side.value && cl_followmodel_side_speed.value * ef_speed < 1) // bad things happen if this goes over 1, so prevent the effect + { + if(gunorg_follow[0] < vieworg[0]) + { + if(vieworg[0] - gunorg_follow[0] > cl_followmodel_side_limit.value) + gunorg_follow[0] = vieworg[0] - cl_followmodel_side_limit.value; + else + gunorg_follow[0] += (vieworg[0] - gunorg_follow[0]) * cl_followmodel_side_speed.value * ef_speed; + } + if(gunorg_follow[0] > vieworg[0]) + { + if(gunorg_follow[0] - vieworg[0] > cl_followmodel_side_limit.value) + gunorg_follow[0] = vieworg[0] + cl_followmodel_side_limit.value; + else + gunorg_follow[0] -= (gunorg_follow[0] - vieworg[0]) * cl_followmodel_side_speed.value * ef_speed; + } - if(gunorg_follow[1] < vieworg[1]) - { - if(vieworg[1] - gunorg_follow[1] > 5) - gunorg_follow[1] = vieworg[1] - 5; - else - gunorg_follow[1] += (vieworg[1] - gunorg_follow[1]) * 5 * ef_speed; - } - if(gunorg_follow[1] > vieworg[1]) - { - if(gunorg_follow[1] - vieworg[1] > 5) - gunorg_follow[1] = vieworg[1] + 5; + if(gunorg_follow[1] < vieworg[1]) + { + if(vieworg[1] - gunorg_follow[1] > cl_followmodel_side_limit.value) + gunorg_follow[1] = vieworg[1] - cl_followmodel_side_limit.value; + else + gunorg_follow[1] += (vieworg[1] - gunorg_follow[1]) * cl_followmodel_side_speed.value * ef_speed; + } + if(gunorg_follow[1] > vieworg[1]) + { + if(gunorg_follow[1] - vieworg[1] > cl_followmodel_side_limit.value) + gunorg_follow[1] = vieworg[1] + cl_followmodel_side_limit.value; + else + gunorg_follow[1] -= (gunorg_follow[1] - vieworg[1]) * cl_followmodel_side_speed.value * ef_speed; + } + } else - gunorg_follow[1] -= (gunorg_follow[1] - vieworg[1]) * 5 * ef_speed; - } + { + gunorg_follow[0] = vieworg[0]; + gunorg_follow[1] = vieworg[1]; + } - if(gunorg_follow[2] < vieworg[2]) - { - if(vieworg[2] - gunorg_follow[2] > 5) - gunorg_follow[2] = vieworg[2] - 5; - else - gunorg_follow[2] += (vieworg[2] - gunorg_follow[2]) * 5 * ef_speed; - } - if(gunorg_follow[2] > vieworg[2]) - { - if(gunorg_follow[2] - vieworg[2] > 5) - gunorg_follow[2] = vieworg[2] + 5; + if(cl_followmodel_up.value && cl_followmodel_up_speed.value * ef_speed < 1) // bad things happen if this goes over 1, so prevent the effect + { + if(gunorg_follow[2] < vieworg[2]) + { + if(vieworg[2] - gunorg_follow[2] > cl_followmodel_up_limit.value) + gunorg_follow[2] = vieworg[2] - cl_followmodel_up_limit.value; + else + gunorg_follow[2] += (vieworg[2] - gunorg_follow[2]) * cl_followmodel_up_speed.value * ef_speed; + } + if(gunorg_follow[2] > vieworg[2]) + { + if(gunorg_follow[2] - vieworg[2] > cl_followmodel_up_limit.value) + gunorg_follow[2] = vieworg[2] + cl_followmodel_up_limit.value; + else + gunorg_follow[2] -= (gunorg_follow[2] - vieworg[2]) * cl_followmodel_up_speed.value * ef_speed; + } + } else - gunorg_follow[2] -= (gunorg_follow[2] - vieworg[2]) * 5 * ef_speed; - } + gunorg_follow[2] = vieworg[2]; + + VectorCopy(gunorg_follow, gunorg); - VectorCopy(gunorg_follow, gunorg); + // gun model bobbing code + + double xyspeed, bob; + + xyspeed = sqrt(cl.movement_velocity[0]*cl.movement_velocity[0] + cl.movement_velocity[1]*cl.movement_velocity[1]); + if (cl_bob.value && cl_bobcycle.value) + { + float cycle; + // LordHavoc: this code is *weird*, but not replacable (I think it + // should be done in QC on the server, but oh well, quake is quake) + // LordHavoc: figured out bobup: the time at which the sin is at 180 + // degrees (which allows lengthening or squishing the peak or valley) + cycle = cl.time / cl_bobcycle.value; + cycle -= (int) cycle; + if (cycle < cl_bobup.value) + cycle = sin(M_PI * cycle / cl_bobup.value); + else + cycle = sin(M_PI + M_PI * (cycle-cl_bobup.value)/(1.0 - cl_bobup.value)); + // bob is proportional to velocity in the xy plane + // (don't count Z, or jumping messes it up) + bob = xyspeed * cl_bob.value; + bob = bob*0.3 + bob*0.7*cycle; + vieworg[2] += bound(-7, bob, 4); + } + + 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. + // Sajt: I tried to smooth out the transitions between bob and no bob, which works + // for the most part, but for some reason when you go through a message trigger or + // pick up an item or anything like that it will momentarily jolt the gun. + vec3_t forward, right, up; + float bspeed; + float s; + float t; + + s = cl.time * cl_bobmodel_speed.value; + if (cl.onground) + { + if (cl.time - cl.hitgroundtime < 0.2) + { + // just hit the ground, speed the bob back up over the next 0.2 seconds + t = cl.time - cl.hitgroundtime; + t = bound(0, t, 0.2); + t *= 5; + } + else + t = 1; + } + else + { + // recently left the ground, slow the bob down over the next 0.2 seconds + t = cl.time - cl.lastongroundtime; + t = 0.2 - bound(0, t, 0.2); + t *= 5; + } + + bspeed = bound (0, xyspeed, 400) * 0.01f; + AngleVectors (gunangles, forward, right, up); + bob = bspeed * cl_bobmodel_side.value * cl_viewmodel_scale.value * sin (s) * t; + VectorMA (gunorg, bob, right, gunorg); + 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 @@ -905,6 +927,13 @@ void V_Init (void) Cvar_RegisterVariable (&cl_leanmodel_up_speed); Cvar_RegisterVariable (&cl_leanmodel_up_limit); + Cvar_RegisterVariable (&cl_followmodel_side); + Cvar_RegisterVariable (&cl_followmodel_side_speed); + Cvar_RegisterVariable (&cl_followmodel_side_limit); + Cvar_RegisterVariable (&cl_followmodel_up); + Cvar_RegisterVariable (&cl_followmodel_up_speed); + Cvar_RegisterVariable (&cl_followmodel_up_limit); + Cvar_RegisterVariable (&cl_viewmodel_scale); Cvar_RegisterVariable (&v_kicktime); -- 2.39.2