]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - view.c
don't crash in dedicated server when parsing shaders with dpreflectcube
[xonotic/darkplaces.git] / view.c
diff --git a/view.c b/view.c
index da240e586b9f7fd57ff9e5758bb981e37b8e5ccd..56b8ce058d77ad6d27f20a4f007736586abd156c 100644 (file)
--- a/view.c
+++ b/view.c
@@ -96,12 +96,14 @@ cvar_t v_centerspeed = {0, "v_centerspeed","500", "how fast the view centers its
 
 cvar_t cl_stairsmoothspeed = {CVAR_SAVE, "cl_stairsmoothspeed", "160", "how fast your view moves upward/downward when running up/down stairs"};
 
+cvar_t cl_smoothviewheight = {CVAR_SAVE, "cl_smoothviewheight", "0", "time of the averaging to the viewheight value so that it creates a smooth transition. higher values = longer transition, 0 for instant transition."};
+
 cvar_t chase_back = {CVAR_SAVE, "chase_back", "48", "chase cam distance from the player"};
 cvar_t chase_up = {CVAR_SAVE, "chase_up", "24", "chase cam distance from the player"};
 cvar_t chase_active = {CVAR_SAVE, "chase_active", "0", "enables chase cam"};
 cvar_t chase_overhead = {CVAR_SAVE, "chase_overhead", "0", "chase cam looks straight down if this is not zero"};
 // GAME_GOODVSBAD2
-cvar_t chase_stevie = {0, "chase_stevie", "0", "chase cam view from above (used only by GoodVsBad2)"};
+cvar_t chase_stevie = {0, "chase_stevie", "0", "(GOODVSBAD2 only) chase cam view from above"};
 
 cvar_t v_deathtilt = {0, "v_deathtilt", "1", "whether to use sideways view when dead"};
 cvar_t v_deathtiltangle = {0, "v_deathtiltangle", "80", "what roll angle to use when tilting the view while dead"};
@@ -431,6 +433,9 @@ void V_CalcRefdef (void)
        entity_t *ent;
        float vieworg[3], viewangles[3], smoothtime;
        float gunorg[3], gunangles[3];
+       
+       static float viewheightavg;
+       float viewheight;       
 #if 0
 // begin of chase camera bounding box size for proper collisions by Alexander Zubov
        vec3_t camboxmins = {-3, -3, -3};
@@ -488,7 +493,10 @@ void V_CalcRefdef (void)
                        viewangles[PITCH] += cl.qw_weaponkick;
 
                        // apply the viewofs (even if chasecam is used)
-                       vieworg[2] += cl.stats[STAT_VIEWHEIGHT];
+                       // Samual: Lets add smoothing for this too so that things like crouching are done with a transition.
+                       viewheight = bound(0, (cl.time - cl.oldtime) / max(0.0001, cl_smoothviewheight.value), 1);
+                       viewheightavg = viewheightavg * (1 - viewheight) + cl.stats[STAT_VIEWHEIGHT] * viewheight;
+                       vieworg[2] += viewheightavg;
 
                        if (chase_active.value)
                        {
@@ -527,7 +535,7 @@ void V_CalcRefdef (void)
 #else
                                        // trace from first person view location to our chosen third person view location
 #if 1
-                                       trace = CL_TraceLine(vieworg, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, true, false, NULL, false);
+                                       trace = CL_TraceLine(vieworg, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, true, false, NULL, false, true);
 #else
                                        trace = CL_TraceBox(vieworg, camboxmins, camboxmaxs, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, true, false, NULL, false);
 #endif
@@ -542,7 +550,7 @@ void V_CalcRefdef (void)
                                                        chase_dest[1] = vieworg[1] - forward[1] * camback + up[1] * camup + offset[1];
                                                        chase_dest[2] = vieworg[2] - forward[2] * camback + up[2] * camup + offset[2];
 #if 1
-                                                       trace = CL_TraceLine(vieworg, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, true, false, NULL, false);
+                                                       trace = CL_TraceLine(vieworg, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, true, false, NULL, false, true);
 #else
                                                        trace = CL_TraceBox(vieworg, camboxmins, camboxmaxs, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, true, false, NULL, false);
 #endif
@@ -570,7 +578,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_TraceLine(vieworg, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, true, false, NULL, false);
+                                       trace = CL_TraceLine(vieworg, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, true, false, NULL, false, true);
                                        VectorMAMAM(1, trace.endpos, 8, forward, 4, trace.plane.normal, vieworg);
                                }
                        }
@@ -595,8 +603,9 @@ void V_CalcRefdef (void)
                                        float cycle;
                                        vec_t frametime;
 
-                                       frametime = cl.realframetime * cl.movevars_timescale;
-
+                                       //frametime = cl.realframetime * cl.movevars_timescale;
+                                       frametime = (cl.time - cl.oldtime) * cl.movevars_timescale;
+                                       
                                        // 1. if we teleported, clear the frametime... the lowpass will recover the previous value then
                                        if(!ent->persistent.trail_allowed) // FIXME improve this check
                                        {
@@ -727,14 +736,11 @@ void V_CalcRefdef (void)
                                                        if (cl.velocity[2] < -cl_bobfallminspeed.value)
                                                                cl.bobfall_swing = 1;
                                                        else
-                                                               cl.bobfall_swing = 0;
+                                                               cl.bobfall_swing = 0; // TODO really?
                                                }
                                                else
                                                {
-                                                       if(cl.bobfall_swing > 0)
-                                                               cl.bobfall_swing -= bound(0, cl_bobfallcycle.value * frametime, 1);
-                                                       else
-                                                               cl.bobfall_swing = 0;
+                                                       cl.bobfall_swing = max(0, cl.bobfall_swing - cl_bobfallcycle.value * frametime);
 
                                                        bobfall = sin(M_PI * cl.bobfall_swing) * cl.bobfall_speed;
                                                        vieworg[2] += bobfall;
@@ -792,8 +798,8 @@ void V_CalcRefdef (void)
                                Matrix4x4_CreateFromQuakeEntity(&r_refdef.view.matrix, vieworg[0], vieworg[1], vieworg[2], viewangles[0], viewangles[1], viewangles[2], 1);
                        // calculate a viewmodel matrix for use in view-attached entities
                        Matrix4x4_CreateFromQuakeEntity(&viewmodelmatrix, gunorg[0], gunorg[1], gunorg[2], gunangles[0], gunangles[1], gunangles[2], cl_viewmodel_scale.value);
-                       VectorCopy(vieworg, cl.csqc_origin);
-                       VectorCopy(viewangles, cl.csqc_angles);
+                       VectorCopy(vieworg, cl.csqc_vieworiginfromengine);
+                       VectorCopy(viewangles, cl.csqc_viewanglesfromengine);
                }
        }
 }
@@ -1018,14 +1024,15 @@ void V_Init (void)
        Cvar_RegisterVariable (&v_kickpitch);
 
        Cvar_RegisterVariable (&cl_stairsmoothspeed);
+       
+       Cvar_RegisterVariable (&cl_smoothviewheight);
 
        Cvar_RegisterVariable (&chase_back);
        Cvar_RegisterVariable (&chase_up);
        Cvar_RegisterVariable (&chase_active);
        Cvar_RegisterVariable (&chase_overhead);
        Cvar_RegisterVariable (&chase_pitchangle);
-       if (gamemode == GAME_GOODVSBAD2)
-               Cvar_RegisterVariable (&chase_stevie);
+       Cvar_RegisterVariable (&chase_stevie);
 
        Cvar_RegisterVariable (&v_deathtilt);
        Cvar_RegisterVariable (&v_deathtiltangle);