]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - view.c
rewrote memory system entirely (hunk, cache, and zone are gone, memory pools replaced...
[xonotic/darkplaces.git] / view.c
diff --git a/view.c b/view.c
index 5b0da1ee968a8c9bf5c854f63598e274e388558e..5a8e7af55913760ca2c637bc2d48c3b9a6e11027 100644 (file)
--- a/view.c
+++ b/view.c
@@ -8,7 +8,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -30,34 +30,35 @@ when crossing a water boudnary.
 
 */
 
-cvar_t cl_rollspeed = {"cl_rollspeed", "200"};
-cvar_t cl_rollangle = {"cl_rollangle", "2.0"};
+cvar_t cl_rollspeed = {0, "cl_rollspeed", "200"};
+cvar_t cl_rollangle = {0, "cl_rollangle", "2.0"};
 
-cvar_t cl_bob = {"cl_bob","0.02", false};
-cvar_t cl_bobcycle = {"cl_bobcycle","0.6", false};
-cvar_t cl_bobup = {"cl_bobup","0.5", false};
+cvar_t cl_bob = {0, "cl_bob","0.02"};
+cvar_t cl_bobcycle = {0, "cl_bobcycle","0.6"};
+cvar_t cl_bobup = {0, "cl_bobup","0.5"};
 
-cvar_t v_kicktime = {"v_kicktime", "0.5", false};
-cvar_t v_kickroll = {"v_kickroll", "0.6", false};
-cvar_t v_kickpitch = {"v_kickpitch", "0.6", false};
+cvar_t v_kicktime = {0, "v_kicktime", "0.5"};
+cvar_t v_kickroll = {0, "v_kickroll", "0.6"};
+cvar_t v_kickpitch = {0, "v_kickpitch", "0.6"};
 
-cvar_t v_punch = {"v_punch", "1", false};
+cvar_t v_punch = {0, "v_punch", "1"};
 
-cvar_t v_iyaw_cycle = {"v_iyaw_cycle", "2", false};
-cvar_t v_iroll_cycle = {"v_iroll_cycle", "0.5", false};
-cvar_t v_ipitch_cycle = {"v_ipitch_cycle", "1", false};
-cvar_t v_iyaw_level = {"v_iyaw_level", "0.3", false};
-cvar_t v_iroll_level = {"v_iroll_level", "0.1", false};
-cvar_t v_ipitch_level = {"v_ipitch_level", "0.3", false};
+cvar_t v_iyaw_cycle = {0, "v_iyaw_cycle", "2"};
+cvar_t v_iroll_cycle = {0, "v_iroll_cycle", "0.5"};
+cvar_t v_ipitch_cycle = {0, "v_ipitch_cycle", "1"};
+cvar_t v_iyaw_level = {0, "v_iyaw_level", "0.3"};
+cvar_t v_iroll_level = {0, "v_iroll_level", "0.1"};
+cvar_t v_ipitch_level = {0, "v_ipitch_level", "0.3"};
 
-cvar_t v_idlescale = {"v_idlescale", "0", false};
+cvar_t v_idlescale = {0, "v_idlescale", "0"};
 
-cvar_t crosshair = {"crosshair", "0", true};
-cvar_t cl_crossx = {"cl_crossx", "0", false};
-cvar_t cl_crossy = {"cl_crossy", "0", false};
+cvar_t crosshair = {CVAR_SAVE, "crosshair", "0"};
 
-//cvar_t       gl_cshiftpercent = {"gl_cshiftpercent", "100", false};
-cvar_t gl_polyblend = {"gl_polyblend", "1", true};
+//cvar_t       gl_cshiftpercent = {0, "gl_cshiftpercent", "100"};
+cvar_t gl_polyblend = {CVAR_SAVE, "gl_polyblend", "1"};
+
+cvar_t v_centermove = {0, "v_centermove", "0.15"};
+cvar_t v_centerspeed = {0, "v_centerspeed","500"};
 
 float  v_dmg_time, v_dmg_roll, v_dmg_pitch;
 
@@ -89,9 +90,9 @@ float V_CalcRoll (vec3_t angles, vec3_t velocity)
                side = side * value / cl_rollspeed.value;
        else
                side = value;
-       
+
        return side*sign;
-       
+
 }
 
 
@@ -131,10 +132,6 @@ float V_CalcBob (void)
 //=============================================================================
 
 
-cvar_t v_centermove = {"v_centermove", "0.15", false};
-cvar_t v_centerspeed = {"v_centerspeed","500"};
-
-
 void V_StartPitchDrift (void)
 {
 #if 1
@@ -168,7 +165,7 @@ If the user is adjusting pitch manually, either with lookup/lookdown,
 mlook and mouse, or klook and keyboard, pitch drifting is constantly stopped.
 
 Drifting is enabled when the center view key is hit, mlook is released and
-lookspring is non 0, or when 
+lookspring is non 0, or when
 ===============
 */
 void V_DriftPitch (void)
@@ -511,7 +508,7 @@ void V_UpdateBlends (void)
        V_CalcPowerupCshift ();
        
        new = false;
-       
+
        for (i=0 ; i<NUM_CSHIFTS ; i++)
        {
                if (cl.cshifts[i].percent != cl.prev_cshifts[i].percent)
@@ -565,54 +562,7 @@ CalcGunAngle
 ==================
 */
 void CalcGunAngle (void)
-{      
-       /*
-       float   yaw, pitch, move;
-       static float oldyaw = 0;
-       static float oldpitch = 0;
-       
-       yaw = r_refdef.viewangles[YAW];
-       pitch = -r_refdef.viewangles[PITCH];
-
-       yaw = angledelta(yaw - r_refdef.viewangles[YAW]) * 0.4;
-       if (yaw > 10)
-               yaw = 10;
-       if (yaw < -10)
-               yaw = -10;
-       pitch = angledelta(-pitch - r_refdef.viewangles[PITCH]) * 0.4;
-       if (pitch > 10)
-               pitch = 10;
-       if (pitch < -10)
-               pitch = -10;
-       move = cl.frametime*20;
-       if (yaw > oldyaw)
-       {
-               if (oldyaw + move < yaw)
-                       yaw = oldyaw + move;
-       }
-       else
-       {
-               if (oldyaw - move > yaw)
-                       yaw = oldyaw - move;
-       }
-       
-       if (pitch > oldpitch)
-       {
-               if (oldpitch + move < pitch)
-                       pitch = oldpitch + move;
-       }
-       else
-       {
-               if (oldpitch - move > pitch)
-                       pitch = oldpitch - move;
-       }
-       
-       oldyaw = yaw;
-       oldpitch = pitch;
-
-       cl.viewent.angles[YAW] = r_refdef.viewangles[YAW] + yaw;
-       cl.viewent.angles[PITCH] = - (r_refdef.viewangles[PITCH] + pitch);
-       */
+{
        cl.viewent.render.angles[YAW] = r_refdef.viewangles[YAW];
        cl.viewent.render.angles[PITCH] = -r_refdef.viewangles[PITCH];
 
@@ -742,99 +692,110 @@ void V_CalcRefdef (void)
        ent = &cl_entities[cl.viewentity];
 // view is the weapon model (only visible from inside body)
        view = &cl.viewent;
-       
 
-// transform the view offset by the model's matrix to get the offset from model origin for the view
-       if (!chase_active.value) // LordHavoc: get rid of angle problems in chase_active mode
+
+       if (chase_active.value)
        {
-               ent->render.angles[YAW] = cl.viewangles[YAW];   // the model should face the view dir
-               ent->render.angles[PITCH] = -cl.viewangles[PITCH];      // the model should face the view dir
+               VectorCopy (ent->render.origin, r_refdef.vieworg);
+               VectorCopy (cl.viewangles, r_refdef.viewangles);
+               Chase_Update ();
+               V_AddIdle ();
        }
-                                                                               
-       
-       bob = V_CalcBob ();
-       
-// refresh position
-       VectorCopy (ent->render.origin, r_refdef.vieworg);
-       r_refdef.vieworg[2] += cl.viewheight + bob;
+       else
+       {
+       // transform the view offset by the model's matrix to get the offset from model origin for the view
+       //      if (!chase_active.value) // LordHavoc: get rid of angle problems in chase_active mode
+       //      {
+       //              ent->render.angles[YAW] = cl.viewangles[YAW];   // the model should face the view dir
+       //              ent->render.angles[PITCH] = -cl.viewangles[PITCH];      // the model should face the view dir
+       //      }
 
-       // LordHavoc: the protocol has changed...  so this is an obsolete approach
-// never let it sit exactly on a node line, because a water plane can
-// dissapear when viewed with the eye exactly on it.
-// the server protocol only specifies to 1/16 pixel, so add 1/32 in each axis
-//     r_refdef.vieworg[0] += 1.0/32;
-//     r_refdef.vieworg[1] += 1.0/32;
-//     r_refdef.vieworg[2] += 1.0/32;
+               bob = V_CalcBob ();
 
-       if (!intimerefresh)
-               VectorCopy (cl.viewangles, r_refdef.viewangles);
-       V_CalcViewRoll ();
-       V_AddIdle ();
+       // refresh position
+               VectorCopy (ent->render.origin, r_refdef.vieworg);
+               r_refdef.vieworg[2] += cl.viewheight + bob;
 
-// offsets
-       angles[PITCH] = -ent->render.angles[PITCH];     // because entity pitches are actually backward
-       angles[YAW] = ent->render.angles[YAW];
-       angles[ROLL] = ent->render.angles[ROLL];
+               // LordHavoc: the protocol has changed...  so this is an obsolete approach
+       // never let it sit exactly on a node line, because a water plane can
+       // dissapear when viewed with the eye exactly on it.
+       // the server protocol only specifies to 1/16 pixel, so add 1/32 in each axis
+       //      r_refdef.vieworg[0] += 1.0/32;
+       //      r_refdef.vieworg[1] += 1.0/32;
+       //      r_refdef.vieworg[2] += 1.0/32;
 
-       AngleVectors (angles, forward, NULL, NULL);
+               if (!intimerefresh)
+                       VectorCopy (cl.viewangles, r_refdef.viewangles);
+               V_CalcViewRoll ();
+               V_AddIdle ();
 
-       V_BoundOffsets ();
-               
-// set up gun position
-       VectorCopy (cl.viewangles, view->render.angles);
-       
-       CalcGunAngle ();
+       // offsets
+               angles[PITCH] = -ent->render.angles[PITCH];     // because entity pitches are actually backward
+               angles[YAW] = ent->render.angles[YAW];
+               angles[ROLL] = ent->render.angles[ROLL];
 
-       VectorCopy (ent->render.origin, view->render.origin);
-       view->render.origin[2] += cl.viewheight;
+               AngleVectors (angles, forward, NULL, NULL);
 
-       for (i=0 ; i<3 ; i++)
-       {
-               view->render.origin[i] += forward[i]*bob*0.4;
-//             view->render.origin[i] += right[i]*bob*0.4;
-//             view->render.origin[i] += up[i]*bob*0.8;
-       }
-       view->render.origin[2] += bob;
+               V_BoundOffsets ();
 
-       view->render.model = cl.model_precache[cl.stats[STAT_WEAPON]];
-       view->render.frame = cl.stats[STAT_WEAPONFRAME];
-       view->render.colormap = -1; // no special coloring
+       // set up gun position
+               VectorCopy (ent->render.origin, view->render.origin);
+               view->render.origin[2] += cl.viewheight;
+               VectorCopy (cl.viewangles, view->render.angles);
 
-// set up the refresh position
+               CalcGunAngle ();
 
-       // LordHavoc: this never looked all that good to begin with...
-       /*
-// smooth out stair step ups
-if (cl.onground && ent->render.origin[2] - oldz > 0)
-{
-       float steptime;
-       
-       steptime = cl.time - cl.oldtime;
-       if (steptime < 0)
-//FIXME                I_Error ("steptime < 0");
-               steptime = 0;
+               for (i=0 ; i<3 ; i++)
+               {
+                       view->render.origin[i] += forward[i]*bob*0.4;
+       //              view->render.origin[i] += right[i]*bob*0.4;
+       //              view->render.origin[i] += up[i]*bob*0.8;
+               }
+               view->render.origin[2] += bob;
 
-       oldz += steptime * 80;
-       if (oldz > ent->render.origin[2])
-               oldz = ent->render.origin[2];
-       if (ent->render.origin[2] - oldz > 12)
-               oldz = ent->render.origin[2] - 12;
-       r_refdef.vieworg[2] += oldz - ent->render.origin[2];
-       view->render.origin[2] += oldz - ent->render.origin[2];
-}
-else
-       oldz = ent->render.origin[2];
-       */
+               // FIXME: this setup code is somewhat evil (CL_LerpUpdate should be private)
+               CL_LerpUpdate(view, cl.stats[STAT_WEAPONFRAME], cl.stats[STAT_WEAPON]);
+
+               view->render.model = cl.model_precache[cl.stats[STAT_WEAPON]];
+               view->render.frame = cl.stats[STAT_WEAPONFRAME];
+               view->render.colormap = -1; // no special coloring
+               view->render.alpha = ent->render.alpha; // LordHavoc: if the player is transparent, so is the gun
+               view->render.effects = ent->render.effects;
+               view->render.scale = 1;
+
+       // set up the refresh position
 
-// LordHavoc: origin view kick added
-       if (!intimerefresh && v_punch.value)
+               // LordHavoc: this never looked all that good to begin with...
+               /*
+       // smooth out stair step ups
+       if (cl.onground && ent->render.origin[2] - oldz > 0)
        {
-               VectorAdd(r_refdef.viewangles, cl.punchangle, r_refdef.viewangles);
-               VectorAdd(r_refdef.vieworg, cl.punchvector, r_refdef.vieworg);
+               float steptime;
+
+               steptime = cl.time - cl.oldtime;
+               if (steptime < 0)
+       //FIXME         I_Error ("steptime < 0");
+                       steptime = 0;
+
+               oldz += steptime * 80;
+               if (oldz > ent->render.origin[2])
+                       oldz = ent->render.origin[2];
+               if (ent->render.origin[2] - oldz > 12)
+                       oldz = ent->render.origin[2] - 12;
+               r_refdef.vieworg[2] += oldz - ent->render.origin[2];
+               view->render.origin[2] += oldz - ent->render.origin[2];
        }
+       else
+               oldz = ent->render.origin[2];
+               */
 
-       if (chase_active.value)
-               Chase_Update ();
+       // LordHavoc: origin view kick added
+               if (!intimerefresh && v_punch.value)
+               {
+                       VectorAdd(r_refdef.viewangles, cl.punchangle, r_refdef.viewangles);
+                       VectorAdd(r_refdef.vieworg, cl.punchvector, r_refdef.vieworg);
+               }
+       }
 }
 
 /*
@@ -847,7 +808,7 @@ the entity origin, so any view position inside that will be valid
 */
 void V_RenderView (void)
 {
-       if (con_forcedup)
+       if (scr_con_current >= vid.conheight)
                return;
 
        if (cl.intermission)
@@ -883,8 +844,6 @@ void V_Init (void)
 
        Cvar_RegisterVariable (&v_idlescale);
        Cvar_RegisterVariable (&crosshair);
-       Cvar_RegisterVariable (&cl_crossx);
-       Cvar_RegisterVariable (&cl_crossy);
 //     Cvar_RegisterVariable (&gl_cshiftpercent);
        Cvar_RegisterVariable (&gl_polyblend);