]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - view.c
another stack overflow fixed, this one more on the order of 300k+?
[xonotic/darkplaces.git] / view.c
diff --git a/view.c b/view.c
index 6d969d0d772eea387ac29a72a8a90ff16b803321..4b46ffc44709a28701bda82d9b45979eb0dfacf5 100644 (file)
--- a/view.c
+++ b/view.c
@@ -76,10 +76,8 @@ float V_CalcRoll (vec3_t angles, vec3_t velocity)
        side = DotProduct (velocity, right);
        sign = side < 0 ? -1 : 1;
        side = fabs(side);
-       
+
        value = cl_rollangle.value;
-//     if (cl.inwater)
-//             value *= 6;
 
        if (side < cl_rollspeed.value)
                side = side * value / cl_rollspeed.value;
@@ -97,6 +95,8 @@ static float V_CalcBob (void)
        // LordHavoc: easy case
        if (cl_bob.value == 0)
                return 0;
+       if (cl_bobcycle.value == 0)
+               return 0;
 
        // LordHavoc: FIXME: this code is *weird*, redesign it sometime
        cycle = cl.time  / cl_bobcycle.value;
@@ -110,7 +110,6 @@ static float V_CalcBob (void)
        // (don't count Z, or jumping messes it up)
 
        bob = sqrt(cl.velocity[0]*cl.velocity[0] + cl.velocity[1]*cl.velocity[1]) * cl_bob.value;
-       //Con_Printf ("speed: %5.1f\n", Length(cl.velocity));
        bob = bob*0.3 + bob*0.7*sin(cycle);
        bob = bound(-7, bob, 4);
        return bob;
@@ -119,12 +118,9 @@ static float V_CalcBob (void)
 
 void V_StartPitchDrift (void)
 {
-#if 1
        if (cl.laststop == cl.time)
-       {
                return;         // something else is keeping it from drifting
-       }
-#endif
+
        if (cl.nodrift || !cl.pitchvel)
        {
                cl.pitchvel = v_centerspeed.value;
@@ -190,8 +186,6 @@ static void V_DriftPitch (void)
        move = cl.frametime * cl.pitchvel;
        cl.pitchvel += cl.frametime * v_centerspeed.value;
 
-//Con_Printf ("move: %f (%f)\n", move, cl.frametime);
-
        if (delta > 0)
        {
                if (move > delta)
@@ -213,9 +207,6 @@ static void V_DriftPitch (void)
 }
 
 
-
-
-
 /*
 ==============================================================================
 
@@ -333,7 +324,7 @@ void V_UpdateBlends (void)
        float   r, g, b, a, a2;
        int             j;
 
-       if (cl.worldmodel == NULL)
+       if (cls.signon != SIGNONS)
        {
                cl.cshifts[CSHIFT_DAMAGE].percent = 0;
                cl.cshifts[CSHIFT_BONUS].percent = 0;
@@ -357,7 +348,7 @@ void V_UpdateBlends (void)
                cl.cshifts[CSHIFT_BONUS].percent = 0;
 
        // set contents color
-       switch (Mod_PointInLeaf (r_refdef.vieworg, cl.worldmodel)->contents)
+       switch (Mod_PointContents (r_refdef.vieworg, cl.worldmodel))
        {
        case CONTENTS_EMPTY:
        case CONTENTS_SOLID:
@@ -370,19 +361,19 @@ void V_UpdateBlends (void)
                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;
+               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;
+               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;
+               cl.cshifts[CSHIFT_CONTENTS].percent = 128 >> 1;
        }
 
        if (cl.items & IT_QUAD)
@@ -487,6 +478,9 @@ void V_CalcRefdef (void)
        float           bob;
        float           side;
 
+       if (cls.state != ca_connected || cls.signon != SIGNONS)
+               return;
+
        // ent is the player model (visible when out of body)
        ent = &cl_entities[cl.viewentity];
        // view is the weapon model (only visible from inside body)
@@ -494,17 +488,19 @@ void V_CalcRefdef (void)
 
        V_DriftPitch ();
 
-       VectorCopy (ent->render.origin, r_refdef.vieworg);
+       VectorCopy (cl.viewentorigin, r_refdef.vieworg);
        if (!intimerefresh)
                VectorCopy (cl.viewangles, r_refdef.viewangles);
 
        if (cl.intermission)
        {
                view->render.model = NULL;
+               VectorCopy (ent->render.angles, r_refdef.viewangles);
                V_AddIdle (1);
        }
        else if (chase_active.value)
        {
+               r_refdef.vieworg[2] += cl.viewheight;
                Chase_Update ();
                V_AddIdle (v_idlescale.value);
        }
@@ -536,31 +532,35 @@ void V_CalcRefdef (void)
 
                r_refdef.vieworg[2] += cl.viewheight + bob;
 
+               // LordHavoc: origin view kick added
+               if (!intimerefresh)
+               {
+                       VectorAdd(r_refdef.viewangles, cl.punchangle, r_refdef.viewangles);
+                       VectorAdd(r_refdef.vieworg, cl.punchvector, r_refdef.vieworg);
+               }
+
                // set up gun
+               // (FIXME! this should be in cl_main.c with the other linking code, not view.c!)
                view->state_current.modelindex = cl.stats[STAT_WEAPON];
                view->state_current.frame = cl.stats[STAT_WEAPONFRAME];
-               view->render.origin[0] = ent->render.origin[0] + bob * 0.4 * forward[0];
-               view->render.origin[1] = ent->render.origin[1] + bob * 0.4 * forward[1];
-               view->render.origin[2] = ent->render.origin[2] + bob * 0.4 * forward[2] + cl.viewheight + bob;
+               VectorCopy(r_refdef.vieworg, view->render.origin);
+               //view->render.origin[0] = ent->render.origin[0] + bob * 0.4 * forward[0];
+               //view->render.origin[1] = ent->render.origin[1] + bob * 0.4 * forward[1];
+               //view->render.origin[2] = ent->render.origin[2] + bob * 0.4 * forward[2] + cl.viewheight + bob;
                view->render.angles[PITCH] = -r_refdef.viewangles[PITCH] - v_idlescale.value * sin(cl.time*v_iyaw_cycle.value) * v_iyaw_level.value;
                view->render.angles[YAW] = r_refdef.viewangles[YAW] - v_idlescale.value * sin(cl.time*v_ipitch_cycle.value) * v_ipitch_level.value;
                view->render.angles[ROLL] = r_refdef.viewangles[ROLL] - v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value;
                // FIXME: this setup code is somewhat evil (CL_LerpUpdate should be private?)
                CL_LerpUpdate(view);
+               CL_BoundingBoxForEntity(&view->render);
                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;
+               view->render.scale = 1.0 / 3.0;
 
-               // LordHavoc: origin view kick added
-               if (!intimerefresh)
-               {
-                       VectorAdd(r_refdef.viewangles, cl.punchangle, r_refdef.viewangles);
-                       VectorAdd(r_refdef.vieworg, cl.punchvector, r_refdef.vieworg);
-               }
-
-               // copy to refdef
-               r_refdef.viewent = view->render;
+               // link into render entities list
+               if (r_refdef.numentities < r_refdef.maxentities && r_drawviewmodel.integer && !chase_active.integer && !envmap && r_drawentities.integer && !(cl.items & IT_INVISIBILITY) && cl.stats[STAT_HEALTH] > 0 && view->render.model != NULL)
+                       r_refdef.entities[r_refdef.numentities++] = &view->render;
        }
 }
 
@@ -601,4 +601,3 @@ void V_Init (void)
        Cvar_RegisterVariable (&v_kickpitch);
 }
 
-