]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_main.c
fixed a typo in the numtriangles commit (should have been num_triangles)
[xonotic/darkplaces.git] / cl_main.c
index 88151231be0e70853d265a5d6b69e7ef58b8cc1b..d32ac54a5556a3f8b4441f6a08006c8968e9548f 100644 (file)
--- a/cl_main.c
+++ b/cl_main.c
@@ -170,7 +170,7 @@ void CL_Disconnect(void)
        Con_DPrintf("CL_Disconnect\n");
 
 // stop sounds (especially looping!)
-       S_StopAllSounds (true);
+       S_StopAllSounds ();
 
        // clear contents blends
        cl.cshifts[0].percent = 0;
@@ -224,7 +224,7 @@ void CL_EstablishConnection(const char *host)
                return;
 
        // clear menu's connect error message
-       m_return_reason[0] = 0;
+       M_Update_Return_Reason("");
        cls.demonum = -1;
 
        // stop demo loop in case this fails
@@ -237,6 +237,7 @@ void CL_EstablishConnection(const char *host)
                cls.connect_trying = true;
                cls.connect_remainingtries = 3;
                cls.connect_nextsendtime = 0;
+               M_Update_Return_Reason("Trying to connect...");
                if (sv.active)
                {
                        NetConn_ClientFrame();
@@ -252,7 +253,7 @@ void CL_EstablishConnection(const char *host)
        else
        {
                Con_Print("Unable to find a suitable network socket to connect to server.\n");
-               strcpy(m_return_reason, "No network");
+               M_Update_Return_Reason("No network");
        }
 }
 
@@ -534,7 +535,7 @@ void CL_LinkNetworkEntity(entity_t *e)
                        if (e == &cl.viewent && cl.viewentity >= 0 && cl.viewentity < MAX_EDICTS && cl_entities[cl.viewentity].state_current.active)
                        {
                                e->state_current.alpha = cl_entities[cl.viewentity].state_current.alpha;
-                               e->state_current.effects = EF_NOSHADOW | (cl_entities[cl.viewentity].state_current.effects & (EF_ADDITIVE | EF_REFLECTIVE | EF_FULLBRIGHT));
+                               e->state_current.effects = EF_NOSHADOW | (cl_entities[cl.viewentity].state_current.effects & (EF_ADDITIVE | EF_REFLECTIVE | EF_FULLBRIGHT | EF_NODEPTHTEST));
                        }
                }
                else
@@ -568,61 +569,26 @@ void CL_LinkNetworkEntity(entity_t *e)
                                matrix = &tempmatrix;
                        }
                }
-               // set up the render matrix
-               if (e->state_previous.active && e->state_current.modelindex == e->state_previous.modelindex)
+
+               // movement lerp
+               if (e->persistent.lerpdeltatime > 0 && (lerp = (cl.time - e->persistent.lerpstarttime) / e->persistent.lerpdeltatime) < 1)
                {
-                       // movement lerp
-                       if (e->persistent.lerpdeltatime > 0 && (lerp = (cl.time - e->persistent.lerpstarttime) / e->persistent.lerpdeltatime) < 1)
-                       {
-                               // interpolate the origin and angles
-                               VectorLerp(e->persistent.oldorigin, lerp, e->persistent.neworigin, origin);
-                               VectorSubtract(e->persistent.newangles, e->persistent.oldangles, delta);
-                               if (delta[0] < -180) delta[0] += 360;else if (delta[0] >= 180) delta[0] -= 360;
-                               if (delta[1] < -180) delta[1] += 360;else if (delta[1] >= 180) delta[1] -= 360;
-                               if (delta[2] < -180) delta[2] += 360;else if (delta[2] >= 180) delta[2] -= 360;
-                               VectorMA(e->persistent.oldangles, lerp, delta, angles);
-                       }
-                       else
-                       {
-                               // no interpolation
-                               VectorCopy(e->persistent.neworigin, origin);
-                               VectorCopy(e->persistent.newangles, angles);
-                       }
-                       // animation lerp
-                       if (e->render.frame2 == e->state_current.frame)
-                       {
-                               // update frame lerp fraction
-                               e->render.framelerp = 1;
-                               if (e->render.frame2time > e->render.frame1time)
-                               {
-                                       e->render.framelerp = (cl.time - e->render.frame2time) / (e->render.frame2time - e->render.frame1time);
-                                       e->render.framelerp = bound(0, e->render.framelerp, 1);
-                               }
-                       }
-                       else
-                       {
-                               // begin a new frame lerp
-                               e->render.frame1 = e->render.frame2;
-                               e->render.frame1time = e->render.frame2time;
-                               e->render.frame = e->render.frame2 = e->state_current.frame;
-                               e->render.frame2time = cl.time;
-                               e->render.framelerp = 0;
-                               // make sure frame lerp won't last longer than 100ms
-                               // (this mainly helps with models that use framegroups and
-                               // switch between them infrequently)
-                               e->render.frame1time = max(e->render.frame1time, e->render.frame2time - 0.1f);
-                       }
+                       // interpolate the origin and angles
+                       VectorLerp(e->persistent.oldorigin, lerp, e->persistent.neworigin, origin);
+                       VectorSubtract(e->persistent.newangles, e->persistent.oldangles, delta);
+                       if (delta[0] < -180) delta[0] += 360;else if (delta[0] >= 180) delta[0] -= 360;
+                       if (delta[1] < -180) delta[1] += 360;else if (delta[1] >= 180) delta[1] -= 360;
+                       if (delta[2] < -180) delta[2] += 360;else if (delta[2] >= 180) delta[2] -= 360;
+                       VectorMA(e->persistent.oldangles, lerp, delta, angles);
                }
                else
                {
                        // no interpolation
                        VectorCopy(e->persistent.neworigin, origin);
                        VectorCopy(e->persistent.newangles, angles);
-                       e->render.frame = e->render.frame1 = e->render.frame2 = e->state_current.frame;
-                       e->render.frame1time = e->render.frame2time = cl.time;
-                       e->render.framelerp = 1;
                }
 
+               // model setup and some modelflags
                e->render.model = cl.model_precache[e->state_current.modelindex];
                if (e->render.model)
                {
@@ -641,8 +607,33 @@ void CL_LinkNetworkEntity(entity_t *e)
                                e->render.effects |= EF_FULLBRIGHT;
                }
 
+               // animation lerp
+               if (e->render.frame2 == e->state_current.frame)
+               {
+                       // update frame lerp fraction
+                       e->render.framelerp = 1;
+                       if (e->render.frame2time > e->render.frame1time)
+                       {
+                               e->render.framelerp = (cl.time - e->render.frame2time) / (e->render.frame2time - e->render.frame1time);
+                               e->render.framelerp = bound(0, e->render.framelerp, 1);
+                       }
+               }
+               else
+               {
+                       // begin a new frame lerp
+                       e->render.frame1 = e->render.frame2;
+                       e->render.frame1time = e->render.frame2time;
+                       e->render.frame = e->render.frame2 = e->state_current.frame;
+                       e->render.frame2time = cl.time;
+                       e->render.framelerp = 0;
+                       // make sure frame lerp won't last longer than 100ms
+                       // (this mainly helps with models that use framegroups and
+                       // switch between them infrequently)
+                       e->render.frame1time = max(e->render.frame1time, e->render.frame2time - 0.1f);
+               }
                R_LerpAnimation(&e->render);
 
+               // set up the render matrix
                // FIXME: e->render.scale should go away
                Matrix4x4_CreateFromQuakeEntity(&matrix2, origin[0], origin[1], origin[2], angles[0], angles[1], angles[2], e->render.scale);
                // concat the matrices to make the entity relative to its tag
@@ -837,14 +828,11 @@ void CL_LinkNetworkEntity(entity_t *e)
                                light[3] = 350;
                        CL_AllocDlight(&e->render, &e->render.matrix, light[3], light[0], light[1], light[2], 0, 0, e->state_current.skin, e->state_current.lightstyle, !(e->state_current.lightpflags & PFLAGS_NOSHADOW), (e->state_current.lightpflags & PFLAGS_CORONA) != 0);
                }
-               // trails need the previous frame
-               if (e->state_previous.active && e->state_previous.modelindex == e->state_current.modelindex)
-               {
-                       if (e->render.flags & RENDER_GLOWTRAIL)
-                               trailtype = 9;
-                       if (trailtype >= 0)
-                               CL_RocketTrail(e->persistent.trail_origin, origin, trailtype, e->state_current.glowcolor, e);
-               }
+               // do trails
+               if (e->render.flags & RENDER_GLOWTRAIL)
+                       trailtype = 9;
+               if (trailtype >= 0)
+                       CL_RocketTrail(e->persistent.trail_origin, origin, trailtype, e->state_current.glowcolor, e);
                VectorCopy(origin, e->persistent.trail_origin);
                // tenebrae's sprites are all additive mode (weird)
                if (gamemode == GAME_TENEBRAE && e->render.model && e->render.model->type == mod_sprite)
@@ -853,7 +841,7 @@ void CL_LinkNetworkEntity(entity_t *e)
                if (e - cl_entities == cl.viewentity)
                        e->render.flags |= RENDER_EXTERIORMODEL;
                // transparent stuff can't be lit during the opaque stage
-               if (e->render.effects & (EF_ADDITIVE) || e->render.alpha < 1)
+               if (e->render.effects & (EF_ADDITIVE | EF_NODEPTHTEST) || e->render.alpha < 1)
                        e->render.flags |= RENDER_TRANSPARENT;
                // either fullbright or lit
                if (!(e->render.effects & EF_FULLBRIGHT) && !r_fullbright.integer)
@@ -888,16 +876,32 @@ void CL_RelinkWorld(void)
        // FIXME: this should be done at load
        Matrix4x4_CreateIdentity(&ent->render.matrix);
        Matrix4x4_CreateIdentity(&ent->render.inversematrix);
+       R_LerpAnimation(&ent->render);
        CL_BoundingBoxForEntity(&ent->render);
+       ent->render.flags = RENDER_SHADOW;
+       if (!r_fullbright.integer)
+               ent->render.flags |= RENDER_LIGHT;
 }
 
 static void CL_RelinkStaticEntities(void)
 {
        int i;
-       for (i = 0;i < cl_num_static_entities && r_refdef.numentities < r_refdef.maxentities;i++)
+       entity_t *e;
+       for (i = 0, e = cl_static_entities;i < cl_num_static_entities && r_refdef.numentities < r_refdef.maxentities;i++, e++)
        {
-               Mod_CheckLoaded(cl_static_entities[i].render.model);
-               r_refdef.entities[r_refdef.numentities++] = &cl_static_entities[i].render;
+               Mod_CheckLoaded(e->render.model);
+               e->render.flags = 0;
+               // transparent stuff can't be lit during the opaque stage
+               if (e->render.effects & (EF_ADDITIVE | EF_NODEPTHTEST) || e->render.alpha < 1)
+                       e->render.flags |= RENDER_TRANSPARENT;
+               // either fullbright or lit
+               if (!(e->render.effects & EF_FULLBRIGHT) && !r_fullbright.integer)
+                       e->render.flags |= RENDER_LIGHT;
+               // hide player shadow during intermission or nehahra movie
+               if (!(e->render.effects & EF_NOSHADOW) && !(e->render.flags & RENDER_TRANSPARENT))
+                       e->render.flags |= RENDER_SHADOW;
+               R_LerpAnimation(&e->render);
+               r_refdef.entities[r_refdef.numentities++] = &e->render;
        }
 }
 
@@ -992,6 +996,7 @@ static void CL_RelinkEffects(void)
 
                                Matrix4x4_CreateFromQuakeEntity(&ent->render.matrix, e->origin[0], e->origin[1], e->origin[2], 0, 0, 0, 1);
                                Matrix4x4_Invert_Simple(&ent->render.inversematrix, &ent->render.matrix);
+                               R_LerpAnimation(&ent->render);
                                CL_BoundingBoxForEntity(&ent->render);
                        }
                }
@@ -1103,6 +1108,7 @@ void CL_RelinkBeams(void)
                        //ent->render.angles[2] = rand()%360;
                        Matrix4x4_CreateFromQuakeEntity(&ent->render.matrix, org[0], org[1], org[2], -pitch, yaw, lhrandom(0, 360), 1);
                        Matrix4x4_Invert_Simple(&ent->render.inversematrix, &ent->render.matrix);
+                       R_LerpAnimation(&ent->render);
                        CL_BoundingBoxForEntity(&ent->render);
                        VectorMA(org, 30, dist, org);
                        d -= 30;