]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - view.c
oops, forgot to fix the Qread and Qwrite calls
[xonotic/darkplaces.git] / view.c
diff --git a/view.c b/view.c
index 7d907cd20c732d66d059634c5d13e7a3a46d7c8e..5b0da1ee968a8c9bf5c854f63598e274e388558e 100644 (file)
--- a/view.c
+++ b/view.c
@@ -41,6 +41,8 @@ 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_punch = {"v_punch", "1", false};
+
 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};
@@ -54,12 +56,11 @@ cvar_t      crosshair = {"crosshair", "0", true};
 cvar_t cl_crossx = {"cl_crossx", "0", false};
 cvar_t cl_crossy = {"cl_crossy", "0", false};
 
-cvar_t gl_cshiftpercent = {"gl_cshiftpercent", "100", false};
+//cvar_t       gl_cshiftpercent = {"gl_cshiftpercent", "100", false};
+cvar_t gl_polyblend = {"gl_polyblend", "1", true};
 
 float  v_dmg_time, v_dmg_roll, v_dmg_pitch;
 
-extern int                     in_forward, in_forward2, in_back;
-
 
 /*
 ===============
@@ -68,15 +69,14 @@ V_CalcRoll
 Used by view and sv_user
 ===============
 */
-vec3_t forward, right, up;
-
 float V_CalcRoll (vec3_t angles, vec3_t velocity)
 {
+       vec3_t  right;
        float   sign;
        float   side;
        float   value;
        
-       AngleVectors (angles, forward, right, up);
+       AngleVectors (angles, NULL, right, NULL);
        side = DotProduct (velocity, right);
        sign = side < 0 ? -1 : 1;
        side = fabs(side);
@@ -188,7 +188,7 @@ void V_DriftPitch (void)
                if ( fabs(cl.cmd.forwardmove) < cl_forwardspeed.value)
                        cl.driftmove = 0;
                else
-                       cl.driftmove += host_frametime;
+                       cl.driftmove += cl.frametime;
        
                if ( cl.driftmove > v_centermove.value)
                {
@@ -205,10 +205,10 @@ void V_DriftPitch (void)
                return;
        }
 
-       move = host_frametime * cl.pitchvel;
-       cl.pitchvel += host_frametime * v_centerspeed.value;
+       move = cl.frametime * cl.pitchvel;
+       cl.pitchvel += cl.frametime * v_centerspeed.value;
        
-//Con_Printf ("move: %f (%f)\n", move, host_frametime);
+//Con_Printf ("move: %f (%f)\n", move, cl.frametime);
 
        if (delta > 0)
        {
@@ -237,7 +237,7 @@ void V_DriftPitch (void)
 /*
 ============================================================================== 
  
-                                               PALETTE FLASHES 
+                                               SCREEN FLASHES 
  
 ============================================================================== 
 */ 
@@ -261,7 +261,7 @@ void V_ParseDamage (void)
        int             armor, blood;
        vec3_t  from;
        int             i;
-       vec3_t  forward, right, up;
+       vec3_t  forward, right;
        entity_t        *ent;
        float   side;
        float   count;
@@ -275,31 +275,34 @@ void V_ParseDamage (void)
        if (count < 10)
                count = 10;
 
-       cl.faceanimtime = cl.time + 0.2;                // but sbar face into pain frame
+       cl.faceanimtime = cl.time + 0.2;                // put sbar face into pain frame
 
-       cl.cshifts[CSHIFT_DAMAGE].percent += 3*count;
-       if (cl.cshifts[CSHIFT_DAMAGE].percent < 0)
-               cl.cshifts[CSHIFT_DAMAGE].percent = 0;
-       if (cl.cshifts[CSHIFT_DAMAGE].percent > 150)
-               cl.cshifts[CSHIFT_DAMAGE].percent = 150;
-
-       if (armor > blood)              
+       if (gl_polyblend.value)
        {
-               cl.cshifts[CSHIFT_DAMAGE].destcolor[0] = 200;
-               cl.cshifts[CSHIFT_DAMAGE].destcolor[1] = 100;
-               cl.cshifts[CSHIFT_DAMAGE].destcolor[2] = 100;
-       }
-       else if (armor)
-       {
-               cl.cshifts[CSHIFT_DAMAGE].destcolor[0] = 220;
-               cl.cshifts[CSHIFT_DAMAGE].destcolor[1] = 50;
-               cl.cshifts[CSHIFT_DAMAGE].destcolor[2] = 50;
-       }
-       else
-       {
-               cl.cshifts[CSHIFT_DAMAGE].destcolor[0] = 255;
-               cl.cshifts[CSHIFT_DAMAGE].destcolor[1] = 0;
-               cl.cshifts[CSHIFT_DAMAGE].destcolor[2] = 0;
+               cl.cshifts[CSHIFT_DAMAGE].percent += 3*count;
+               if (cl.cshifts[CSHIFT_DAMAGE].percent < 0)
+                       cl.cshifts[CSHIFT_DAMAGE].percent = 0;
+               if (cl.cshifts[CSHIFT_DAMAGE].percent > 150)
+                       cl.cshifts[CSHIFT_DAMAGE].percent = 150;
+
+               if (armor > blood)              
+               {
+                       cl.cshifts[CSHIFT_DAMAGE].destcolor[0] = 200;
+                       cl.cshifts[CSHIFT_DAMAGE].destcolor[1] = 100;
+                       cl.cshifts[CSHIFT_DAMAGE].destcolor[2] = 100;
+               }
+               else if (armor)
+               {
+                       cl.cshifts[CSHIFT_DAMAGE].destcolor[0] = 220;
+                       cl.cshifts[CSHIFT_DAMAGE].destcolor[1] = 50;
+                       cl.cshifts[CSHIFT_DAMAGE].destcolor[2] = 50;
+               }
+               else
+               {
+                       cl.cshifts[CSHIFT_DAMAGE].destcolor[0] = 255;
+                       cl.cshifts[CSHIFT_DAMAGE].destcolor[1] = 0;
+                       cl.cshifts[CSHIFT_DAMAGE].destcolor[2] = 0;
+               }
        }
 
 //
@@ -307,10 +310,10 @@ void V_ParseDamage (void)
 //
        ent = &cl_entities[cl.viewentity];
        
-       VectorSubtract (from, ent->origin, from);
+       VectorSubtract (from, ent->render.origin, from);
        VectorNormalize (from);
        
-       AngleVectors (ent->angles, forward, right, up);
+       AngleVectors (ent->render.angles, forward, right, NULL);
 
        side = DotProduct (from, right);
        v_dmg_roll = count*side*v_kickroll.value;
@@ -345,10 +348,13 @@ When you run over an item, the server sends this command
 */
 void V_BonusFlash_f (void)
 {
-       cl.cshifts[CSHIFT_BONUS].destcolor[0] = 215;
-       cl.cshifts[CSHIFT_BONUS].destcolor[1] = 186;
-       cl.cshifts[CSHIFT_BONUS].destcolor[2] = 69;
-       cl.cshifts[CSHIFT_BONUS].percent = 50;
+       if (gl_polyblend.value)
+       {
+               cl.cshifts[CSHIFT_BONUS].destcolor[0] = 215;
+               cl.cshifts[CSHIFT_BONUS].destcolor[1] = 186;
+               cl.cshifts[CSHIFT_BONUS].destcolor[2] = 69;
+               cl.cshifts[CSHIFT_BONUS].percent = 50;
+       }
 }
 
 /*
@@ -362,6 +368,11 @@ void V_SetContentsColor (int contents)
 {
        cshift_t* c;
        c = &cl.cshifts[CSHIFT_CONTENTS]; // just to shorten the code below
+       if (!gl_polyblend.value)
+       {
+               c->percent = 0;
+               return;
+       }
        switch (contents)
        {
        case CONTENTS_EMPTY:
@@ -402,6 +413,11 @@ V_CalcPowerupCshift
 */
 void V_CalcPowerupCshift (void)
 {
+       if (!gl_polyblend.value)
+       {
+               cl.cshifts[CSHIFT_POWERUP].percent = 0;
+               return;
+       }
        if (cl.items & IT_QUAD)
        {
                cl.cshifts[CSHIFT_POWERUP].destcolor[0] = 0;
@@ -450,11 +466,12 @@ void V_CalcBlend (void)
        b = 0;
        a = 0;
 
-       if (gl_cshiftpercent.value)
-       {
+//     if (gl_cshiftpercent.value)
+//     {
                for (j=0 ; j<NUM_CSHIFTS ; j++) 
                {
-                       a2 = ((cl.cshifts[j].percent * gl_cshiftpercent.value) / 100.0) / 255.0;
+//                     a2 = ((cl.cshifts[j].percent * gl_cshiftpercent.value) / 100.0) / 255.0;
+                       a2 = cl.cshifts[j].percent * (1.0f / 255.0f);
 
                        if (!a2)
                                continue;
@@ -473,7 +490,7 @@ void V_CalcBlend (void)
                        g *= a2;
                        b *= a2;
                }
-       }
+//     }
 
        v_blend[0] = bound(0, r * (1.0/255.0), 1);
        v_blend[1] = bound(0, g * (1.0/255.0), 1);
@@ -483,10 +500,10 @@ void V_CalcBlend (void)
 
 /*
 =============
-V_UpdatePalette
+V_UpdateBlends
 =============
 */
-void V_UpdatePalette (void)
+void V_UpdateBlends (void)
 {
        int             i, j;
        qboolean        new;
@@ -511,12 +528,12 @@ void V_UpdatePalette (void)
        }
        
 // drop the damage value
-       cl.cshifts[CSHIFT_DAMAGE].percent -= host_frametime*150;
+       cl.cshifts[CSHIFT_DAMAGE].percent -= (cl.time - cl.oldtime)*150;
        if (cl.cshifts[CSHIFT_DAMAGE].percent <= 0)
                cl.cshifts[CSHIFT_DAMAGE].percent = 0;
 
 // drop the bonus value
-       cl.cshifts[CSHIFT_BONUS].percent -= host_frametime*100;
+       cl.cshifts[CSHIFT_BONUS].percent -= (cl.time - cl.oldtime)*100;
        if (cl.cshifts[CSHIFT_BONUS].percent <= 0)
                cl.cshifts[CSHIFT_BONUS].percent = 0;
 
@@ -536,7 +553,7 @@ void V_UpdatePalette (void)
 
 float angledelta (float a)
 {
-       a = anglemod(a);
+       a = ANGLEMOD(a);
        if (a > 180)
                a -= 360;
        return a;
@@ -549,6 +566,7 @@ CalcGunAngle
 */
 void CalcGunAngle (void)
 {      
+       /*
        float   yaw, pitch, move;
        static float oldyaw = 0;
        static float oldpitch = 0;
@@ -566,7 +584,7 @@ void CalcGunAngle (void)
                pitch = 10;
        if (pitch < -10)
                pitch = -10;
-       move = host_frametime*20;
+       move = cl.frametime*20;
        if (yaw > oldyaw)
        {
                if (oldyaw + move < yaw)
@@ -594,10 +612,13 @@ void CalcGunAngle (void)
 
        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];
 
-       cl.viewent.angles[ROLL] -= v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value;
-       cl.viewent.angles[PITCH] -= v_idlescale.value * sin(cl.time*v_ipitch_cycle.value) * v_ipitch_level.value;
-       cl.viewent.angles[YAW] -= v_idlescale.value * sin(cl.time*v_iyaw_cycle.value) * v_iyaw_level.value;
+       cl.viewent.render.angles[ROLL] -= v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value;
+       cl.viewent.render.angles[PITCH] -= v_idlescale.value * sin(cl.time*v_ipitch_cycle.value) * v_ipitch_level.value;
+       cl.viewent.render.angles[YAW] -= v_idlescale.value * sin(cl.time*v_iyaw_cycle.value) * v_iyaw_level.value;
 }
 
 /*
@@ -611,21 +632,21 @@ void V_BoundOffsets (void)
        
        ent = &cl_entities[cl.viewentity];
 
-// absolutely bound refresh reletive to entity clipping hull
+// absolutely bound refresh relative to entity clipping hull
 // so the view can never be inside a solid wall
 
-       if (r_refdef.vieworg[0] < ent->origin[0] - 14)
-               r_refdef.vieworg[0] = ent->origin[0] - 14;
-       else if (r_refdef.vieworg[0] > ent->origin[0] + 14)
-               r_refdef.vieworg[0] = ent->origin[0] + 14;
-       if (r_refdef.vieworg[1] < ent->origin[1] - 14)
-               r_refdef.vieworg[1] = ent->origin[1] - 14;
-       else if (r_refdef.vieworg[1] > ent->origin[1] + 14)
-               r_refdef.vieworg[1] = ent->origin[1] + 14;
-       if (r_refdef.vieworg[2] < ent->origin[2] - 22)
-               r_refdef.vieworg[2] = ent->origin[2] - 22;
-       else if (r_refdef.vieworg[2] > ent->origin[2] + 30)
-               r_refdef.vieworg[2] = ent->origin[2] + 30;
+       if (r_refdef.vieworg[0] < ent->render.origin[0] - 14)
+               r_refdef.vieworg[0] = ent->render.origin[0] - 14;
+       else if (r_refdef.vieworg[0] > ent->render.origin[0] + 14)
+               r_refdef.vieworg[0] = ent->render.origin[0] + 14;
+       if (r_refdef.vieworg[1] < ent->render.origin[1] - 14)
+               r_refdef.vieworg[1] = ent->render.origin[1] - 14;
+       else if (r_refdef.vieworg[1] > ent->render.origin[1] + 14)
+               r_refdef.vieworg[1] = ent->render.origin[1] + 14;
+       if (r_refdef.vieworg[2] < ent->render.origin[2] - 22)
+               r_refdef.vieworg[2] = ent->render.origin[2] - 22;
+       else if (r_refdef.vieworg[2] > ent->render.origin[2] + 30)
+               r_refdef.vieworg[2] = ent->render.origin[2] + 30;
 }
 
 /*
@@ -654,14 +675,14 @@ void V_CalcViewRoll (void)
 {
        float           side;
                
-       side = V_CalcRoll (cl_entities[cl.viewentity].angles, cl.velocity);
+       side = V_CalcRoll (cl_entities[cl.viewentity].render.angles, cl.velocity);
        r_refdef.viewangles[ROLL] += side;
 
        if (v_dmg_time > 0)
        {
                r_refdef.viewangles[ROLL] += v_dmg_time/v_kicktime.value*v_dmg_roll;
                r_refdef.viewangles[PITCH] += v_dmg_time/v_kicktime.value*v_dmg_pitch;
-               v_dmg_time -= host_frametime;
+               v_dmg_time -= cl.frametime;
        }
 
        if (cl.stats[STAT_HEALTH] <= 0)
@@ -689,11 +710,11 @@ void V_CalcIntermissionRefdef (void)
 // view is the weapon model (only visible from inside body)
        view = &cl.viewent;
 
-       VectorCopy (ent->origin, r_refdef.vieworg);
-       VectorCopy (ent->angles, r_refdef.viewangles);
-       view->model = NULL;
+       VectorCopy (ent->render.origin, r_refdef.vieworg);
+       VectorCopy (ent->render.angles, r_refdef.viewangles);
+       view->render.model = NULL;
 
-// allways idle in intermission
+// always idle in intermission
        old = v_idlescale.value;
        v_idlescale.value = 1;
        V_AddIdle ();
@@ -710,10 +731,10 @@ void V_CalcRefdef (void)
 {
        entity_t        *ent, *view;
        int                     i;
-       vec3_t          forward, right, up;
+       vec3_t          forward;
        vec3_t          angles;
        float           bob;
-       static float oldz = 0;
+//     static float oldz = 0;
 
        V_DriftPitch ();
 
@@ -723,82 +744,68 @@ void V_CalcRefdef (void)
        view = &cl.viewent;
        
 
-// transform the view offset by the model's matrix to get the offset from
-// model origin for the view
-       ent->angles[YAW] = cl.viewangles[YAW];  // the model should face the view dir
-       ent->angles[PITCH] = -cl.viewangles[PITCH];     // the model should face the view dir
+// 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
+       }
                                                                                
        
        bob = V_CalcBob ();
        
 // refresh position
-       VectorCopy (ent->origin, r_refdef.vieworg);
+       VectorCopy (ent->render.origin, r_refdef.vieworg);
        r_refdef.vieworg[2] += cl.viewheight + bob;
 
+       // 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;
+//     r_refdef.vieworg[0] += 1.0/32;
+//     r_refdef.vieworg[1] += 1.0/32;
+//     r_refdef.vieworg[2] += 1.0/32;
 
-       VectorCopy (cl.viewangles, r_refdef.viewangles);
+       if (!intimerefresh)
+               VectorCopy (cl.viewangles, r_refdef.viewangles);
        V_CalcViewRoll ();
        V_AddIdle ();
 
 // offsets
-       angles[PITCH] = -ent->angles[PITCH];    // because entity pitches are
-                                                                                       //  actually backward
-       angles[YAW] = ent->angles[YAW];
-       angles[ROLL] = ent->angles[ROLL];
+       angles[PITCH] = -ent->render.angles[PITCH];     // because entity pitches are actually backward
+       angles[YAW] = ent->render.angles[YAW];
+       angles[ROLL] = ent->render.angles[ROLL];
 
-       AngleVectors (angles, forward, right, up);
+       AngleVectors (angles, forward, NULL, NULL);
 
        V_BoundOffsets ();
                
 // set up gun position
-       VectorCopy (cl.viewangles, view->angles);
+       VectorCopy (cl.viewangles, view->render.angles);
        
        CalcGunAngle ();
 
-       VectorCopy (ent->origin, view->origin);
-       view->origin[2] += cl.viewheight;
+       VectorCopy (ent->render.origin, view->render.origin);
+       view->render.origin[2] += cl.viewheight;
 
        for (i=0 ; i<3 ; i++)
        {
-               view->origin[i] += forward[i]*bob*0.4;
-//             view->origin[i] += right[i]*bob*0.4;
-//             view->origin[i] += up[i]*bob*0.8;
+               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->origin[2] += bob;
-
-// fudge position around to keep amount of weapon visible
-// roughly equal with different FOV
-
-#if 0
-       if (cl.model_precache[cl.stats[STAT_WEAPON]] && strcmp (cl.model_precache[cl.stats[STAT_WEAPON]]->name,  "progs/v_shot2.mdl"))
-#endif
-// LordHavoc: everyone hates the gun moving around
-/*
-       if (scr_viewsize.value == 110)
-               view->origin[2] += 1;
-       else if (scr_viewsize.value == 100)
-               view->origin[2] += 2;
-       else if (scr_viewsize.value == 90)
-               view->origin[2] += 1;
-       else if (scr_viewsize.value == 80)
-               view->origin[2] += 0.5;
-*/
+       view->render.origin[2] += bob;
 
-       view->model = cl.model_precache[cl.stats[STAT_WEAPON]];
-       view->frame = cl.stats[STAT_WEAPONFRAME];
-       view->colormap = 0; //vid.colormap;
+       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 the refresh position
-       VectorAdd (r_refdef.viewangles, cl.punchangle, r_refdef.viewangles);
 
+       // LordHavoc: this never looked all that good to begin with...
+       /*
 // smooth out stair step ups
-if (cl.onground && ent->origin[2] - oldz > 0)
+if (cl.onground && ent->render.origin[2] - oldz > 0)
 {
        float steptime;
        
@@ -808,15 +815,23 @@ if (cl.onground && ent->origin[2] - oldz > 0)
                steptime = 0;
 
        oldz += steptime * 80;
-       if (oldz > ent->origin[2])
-               oldz = ent->origin[2];
-       if (ent->origin[2] - oldz > 12)
-               oldz = ent->origin[2] - 12;
-       r_refdef.vieworg[2] += oldz - ent->origin[2];
-       view->origin[2] += oldz - ent->origin[2];
+       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->origin[2];
+       oldz = ent->render.origin[2];
+       */
+
+// 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);
+       }
 
        if (chase_active.value)
                Chase_Update ();
@@ -836,16 +851,9 @@ void V_RenderView (void)
                return;
 
        if (cl.intermission)
-       {       // intermission / finale rendering
                V_CalcIntermissionRefdef ();    
-       }
        else
-       {
-               if (!cl.paused /* && (sv.maxclients > 1 || key_dest == key_game) */ )
-                       V_CalcRefdef ();
-       }
-
-       R_PushDlights ();
+               V_CalcRefdef ();
 
        R_RenderView ();
 }
@@ -877,7 +885,8 @@ void V_Init (void)
        Cvar_RegisterVariable (&crosshair);
        Cvar_RegisterVariable (&cl_crossx);
        Cvar_RegisterVariable (&cl_crossy);
-       Cvar_RegisterVariable (&gl_cshiftpercent);
+//     Cvar_RegisterVariable (&gl_cshiftpercent);
+       Cvar_RegisterVariable (&gl_polyblend);
 
        Cvar_RegisterVariable (&cl_rollspeed);
        Cvar_RegisterVariable (&cl_rollangle);
@@ -888,6 +897,8 @@ void V_Init (void)
        Cvar_RegisterVariable (&v_kicktime);
        Cvar_RegisterVariable (&v_kickroll);
        Cvar_RegisterVariable (&v_kickpitch);   
+
+       Cvar_RegisterVariable (&v_punch);
 }