]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - view.c
fix 256 frame limit (stupid legacy bug in entity_state_t building code)
[xonotic/darkplaces.git] / view.c
diff --git a/view.c b/view.c
index 49879479d0ba4693b0cf765320014cd5e10ed0f2..36176d6d34ca29587b76b3e4cafe465b98f5f84a 100644 (file)
--- a/view.c
+++ b/view.c
@@ -204,7 +204,7 @@ V_ParseDamage
 */
 void V_ParseDamage (void)
 {
-       int i, armor, blood;
+       int armor, blood;
        vec3_t from;
        //vec3_t forward, right;
        vec3_t localfrom;
@@ -214,8 +214,7 @@ void V_ParseDamage (void)
 
        armor = MSG_ReadByte ();
        blood = MSG_ReadByte ();
-       for (i=0 ; i<3 ; i++)
-               from[i] = MSG_ReadCoord ();
+       MSG_ReadVector(from, cl.protocol);
 
        count = blood*0.5 + armor*0.5;
        if (count < 10)
@@ -249,7 +248,7 @@ void V_ParseDamage (void)
        }
 
        // calculate view angle kicks
-       if (cl.viewentity >= 0 && cl.viewentity < MAX_EDICTS && cl_entities[cl.viewentity].state_current.active)
+       if (cl_entities[cl.viewentity].state_current.active)
        {
                ent = &cl_entities[cl.viewentity];
                Matrix4x4_Transform(&ent->render.inversematrix, from, localfrom);
@@ -309,12 +308,11 @@ V_CalcRefdef
 
 ==================
 */
-extern float timerefreshangle;
 void V_CalcRefdef (void)
 {
        static float oldz;
        entity_t *ent;
-       float vieworg[3], viewangles[3], newz;
+       float vieworg[3], viewangles[3];
        Matrix4x4_CreateIdentity(&viewmodelmatrix);
        Matrix4x4_CreateIdentity(&r_refdef.viewentitymatrix);
        if (cls.state == ca_connected && cls.signon == SIGNONS)
@@ -326,6 +324,8 @@ void V_CalcRefdef (void)
                        // entity is a fixed camera, just copy the matrix
                        Matrix4x4_Copy(&r_refdef.viewentitymatrix, &ent->render.matrix);
                        Matrix4x4_Copy(&viewmodelmatrix, &ent->render.matrix);
+                       r_refdef.viewentitymatrix.m[2][3] += cl.stats[STAT_VIEWHEIGHT];
+                       viewmodelmatrix.m[2][3] += cl.stats[STAT_VIEWHEIGHT];
                }
                else
                {
@@ -335,12 +335,19 @@ void V_CalcRefdef (void)
                        VectorCopy(cl.viewangles, viewangles);
 
                        // stair smoothing
-                       newz = vieworg[2];
-                       oldz -= newz;
-                       oldz += (cl.time - cl.oldtime) * cl_stairsmoothspeed.value;
-                       oldz = bound(-16, oldz, 0);
-                       vieworg[2] += oldz;
-                       oldz += newz;
+                       //Con_Printf("cl.onground %i oldz %f newz %f\n", cl.onground, oldz, vieworg[2]);
+                       if (cl.onground && oldz < vieworg[2])
+                       {
+                               oldz += (cl.time - cl.oldtime) * cl_stairsmoothspeed.value;
+                               oldz = vieworg[2] = bound(vieworg[2] - 16, oldz, vieworg[2]);
+                       }
+                       else if (cl.onground && oldz > vieworg[2])
+                       {
+                               oldz -= (cl.time - cl.oldtime) * cl_stairsmoothspeed.value;
+                               oldz = vieworg[2] = bound(vieworg[2], oldz, vieworg[2] + 16);
+                       }
+                       else
+                               oldz = vieworg[2];
 
                        if (chase_active.value)
                        {
@@ -379,7 +386,7 @@ void V_CalcRefdef (void)
                        {
                                // first person view from entity
                                // angles
-                               if (cl.stats[STAT_HEALTH] <= 0)
+                               if (cl.stats[STAT_HEALTH] <= 0 && gamemode != GAME_FNIGGIUM)
                                        viewangles[ROLL] = 80;  // dead view angle
                                VectorAdd(viewangles, cl.punchangle, viewangles);
                                viewangles[ROLL] += V_CalcRoll(cl.viewangles, cl.velocity);
@@ -391,7 +398,7 @@ void V_CalcRefdef (void)
                                }
                                // origin
                                VectorAdd(vieworg, cl.punchvector, vieworg);
-                               vieworg[2] += cl.viewheight;
+                               vieworg[2] += cl.stats[STAT_VIEWHEIGHT];
                                if (cl.stats[STAT_HEALTH] > 0 && cl_bob.value && cl_bobcycle.value)
                                {
                                        double bob, cycle;
@@ -443,61 +450,71 @@ void V_CalcViewBlend(void)
        r_refdef.viewblend[1] = 0;
        r_refdef.viewblend[2] = 0;
        r_refdef.viewblend[3] = 0;
-       if (cls.state == ca_connected && cls.signon == SIGNONS)
+       r_refdef.fovscale_x = cl.viewzoom;
+       r_refdef.fovscale_y = cl.viewzoom;
+       if (cls.state == ca_connected && cls.signon == SIGNONS && gl_polyblend.value > 0)
        {
                // set contents color
-               switch (CL_PointQ1Contents(r_vieworigin))
+               int supercontents;
+               vec3_t vieworigin;
+               Matrix4x4_OriginFromMatrix(&r_refdef.viewentitymatrix, vieworigin);
+               supercontents = CL_PointSuperContents(vieworigin);
+               if (supercontents & SUPERCONTENTS_LIQUIDSMASK)
+               {
+                       r_refdef.fovscale_x *= 1 - (((sin(cl.time * 4.7) + 1) * 0.015) * r_waterwarp.value);
+                       r_refdef.fovscale_y *= 1 - (((sin(cl.time * 3.0) + 1) * 0.015) * r_waterwarp.value);
+                       if (supercontents & SUPERCONTENTS_LAVA)
+                       {
+                               cl.cshifts[CSHIFT_CONTENTS].destcolor[0] = 255;
+                               cl.cshifts[CSHIFT_CONTENTS].destcolor[1] = 80;
+                               cl.cshifts[CSHIFT_CONTENTS].destcolor[2] = 0;
+                       }
+                       else if (supercontents & SUPERCONTENTS_SLIME)
+                       {
+                               cl.cshifts[CSHIFT_CONTENTS].destcolor[0] = 0;
+                               cl.cshifts[CSHIFT_CONTENTS].destcolor[1] = 25;
+                               cl.cshifts[CSHIFT_CONTENTS].destcolor[2] = 5;
+                       }
+                       else
+                       {
+                               cl.cshifts[CSHIFT_CONTENTS].destcolor[0] = 130;
+                               cl.cshifts[CSHIFT_CONTENTS].destcolor[1] = 80;
+                               cl.cshifts[CSHIFT_CONTENTS].destcolor[2] = 50;
+                       }
+                       cl.cshifts[CSHIFT_CONTENTS].percent = 150 >> 1;
+               }
+               else
                {
-               case CONTENTS_EMPTY:
-               case CONTENTS_SOLID:
                        cl.cshifts[CSHIFT_CONTENTS].destcolor[0] = 0;
                        cl.cshifts[CSHIFT_CONTENTS].destcolor[1] = 0;
                        cl.cshifts[CSHIFT_CONTENTS].destcolor[2] = 0;
                        cl.cshifts[CSHIFT_CONTENTS].percent = 0;
-                       break;
-               case CONTENTS_LAVA:
-                       cl.cshifts[CSHIFT_CONTENTS].destcolor[0] = 255;
-                       cl.cshifts[CSHIFT_CONTENTS].destcolor[1] = 80;
-                       cl.cshifts[CSHIFT_CONTENTS].destcolor[2] = 0;
-                       cl.cshifts[CSHIFT_CONTENTS].percent = 150 >> 1;
-                       break;
-               case CONTENTS_SLIME:
-                       cl.cshifts[CSHIFT_CONTENTS].destcolor[0] = 0;
-                       cl.cshifts[CSHIFT_CONTENTS].destcolor[1] = 25;
-                       cl.cshifts[CSHIFT_CONTENTS].destcolor[2] = 5;
-                       cl.cshifts[CSHIFT_CONTENTS].percent = 150 >> 1;
-                       break;
-               default:
-                       cl.cshifts[CSHIFT_CONTENTS].destcolor[0] = 130;
-                       cl.cshifts[CSHIFT_CONTENTS].destcolor[1] = 80;
-                       cl.cshifts[CSHIFT_CONTENTS].destcolor[2] = 50;
-                       cl.cshifts[CSHIFT_CONTENTS].percent = 128 >> 1;
                }
 
                if (gamemode != GAME_TRANSFUSION)
                {
-                       if (cl.items & IT_QUAD)
+                       if (cl.stats[STAT_ITEMS] & IT_QUAD)
                        {
                                cl.cshifts[CSHIFT_POWERUP].destcolor[0] = 0;
                                cl.cshifts[CSHIFT_POWERUP].destcolor[1] = 0;
                                cl.cshifts[CSHIFT_POWERUP].destcolor[2] = 255;
                                cl.cshifts[CSHIFT_POWERUP].percent = 30;
                        }
-                       else if (cl.items & IT_SUIT)
+                       else if (cl.stats[STAT_ITEMS] & IT_SUIT)
                        {
                                cl.cshifts[CSHIFT_POWERUP].destcolor[0] = 0;
                                cl.cshifts[CSHIFT_POWERUP].destcolor[1] = 255;
                                cl.cshifts[CSHIFT_POWERUP].destcolor[2] = 0;
                                cl.cshifts[CSHIFT_POWERUP].percent = 20;
                        }
-                       else if (cl.items & IT_INVISIBILITY)
+                       else if (cl.stats[STAT_ITEMS] & IT_INVISIBILITY)
                        {
                                cl.cshifts[CSHIFT_POWERUP].destcolor[0] = 100;
                                cl.cshifts[CSHIFT_POWERUP].destcolor[1] = 100;
                                cl.cshifts[CSHIFT_POWERUP].destcolor[2] = 100;
                                cl.cshifts[CSHIFT_POWERUP].percent = 100;
                        }
-                       else if (cl.items & IT_INVULNERABILITY)
+                       else if (cl.stats[STAT_ITEMS] & IT_INVULNERABILITY)
                        {
                                cl.cshifts[CSHIFT_POWERUP].destcolor[0] = 255;
                                cl.cshifts[CSHIFT_POWERUP].destcolor[1] = 255;
@@ -520,7 +537,7 @@ void V_CalcViewBlend(void)
                        if (a2 > 0)
                        {
                                VectorLerp(r_refdef.viewblend, a2, cl.cshifts[j].destcolor, r_refdef.viewblend);
-                               r_refdef.viewblend[3] = 1 - (1 - r_refdef.viewblend[3]) * (1 - a2); // correct alpha multiply...  took a while to find it on the web
+                               r_refdef.viewblend[3] = (1 - (1 - r_refdef.viewblend[3]) * (1 - a2)); // correct alpha multiply...  took a while to find it on the web
                        }
                }
                // saturate color (to avoid blending in black)
@@ -533,7 +550,7 @@ void V_CalcViewBlend(void)
                r_refdef.viewblend[0] = bound(0.0f, r_refdef.viewblend[0] * (1.0f/255.0f), 1.0f);
                r_refdef.viewblend[1] = bound(0.0f, r_refdef.viewblend[1] * (1.0f/255.0f), 1.0f);
                r_refdef.viewblend[2] = bound(0.0f, r_refdef.viewblend[2] * (1.0f/255.0f), 1.0f);
-               r_refdef.viewblend[3] = bound(0.0f, r_refdef.viewblend[3]                , 1.0f);
+               r_refdef.viewblend[3] = bound(0.0f, r_refdef.viewblend[3] * gl_polyblend.value, 1.0f);
        }
 }