]> git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
Cvars for part 2. Added safety checks and fixed gunmodel bobbing.
authordivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Sun, 2 May 2010 14:05:33 +0000 (14:05 +0000)
committerdivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Sun, 2 May 2010 14:05:33 +0000 (14:05 +0000)
From: MirceaKitsune <sonichedgehog_hyperblast00@yahoo.com>

git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@10133 d7cf8633-e32d-0410-b094-e92efae38249

darkplaces.txt
view.c

index 726c1db987aa4586fda37a81f7a72c666b805c4d..a037edbbeb7b226c04c74c1e5a06e3b8de835de7 100644 (file)
@@ -406,6 +406,12 @@ cl_leanmodel_side_limit                           7.5                 gun leanin
 cl_leanmodel_up                                   1                   enables gun leaning upward\r
 cl_leanmodel_up_speed                             2                   gun leaning upward speed\r
 cl_leanmodel_up_limit                             5                   gun leaning upward limit\r
+cl_followmodel_side                               1                   enables gun following sideways\r
+cl_followmodel_side_speed                         4                   gun following sideways speed\r
+cl_followmodel_side_limit                         2                   gun following sideways limit\r
+cl_followmodel_up                                 1                   enables gun following upward\r
+cl_followmodel_up_speed                           3                   gun following upward speed\r
+cl_followmodel_up_limit                           1                   gun following upward limit\r
 cl_bobup                                          0.5                 view bobbing adjustment that makes the up or down swing of the bob last longer\r
 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)\r
 cl_capturevideo_fps                               30                  how many frames per second to save (29.97 for NTSC, 30 for typical PC video, 15 can be useful)\r
diff --git a/view.c b/view.c
index 39c4be9c29009accc70ecbf5946081858ac9158b..f542c7a5b4f70a77a7bcfc659fb903c38e35e318 100644 (file)
--- 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);