]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_parse.c
changed r_speeds glFinish to only occur when set to 2, not 1 or 3
[xonotic/darkplaces.git] / cl_parse.c
index 673a26fcababb301904d87105539936d34ce931a..a64e1ffd4d9fa23214da496121cf84b50d622d9b 100644 (file)
@@ -290,12 +290,15 @@ void CL_KeepaliveMessage (qboolean readmessages)
 {
        float time;
        static double nextmsg = -1;
+#if 0
+       static double lasttime = -1;
+#endif
        int oldreadcount;
        qboolean oldbadread;
        sizebuf_t old;
 
        // no need if server is local and definitely not if this is a demo
-       if (!cls.netcon || cls.protocol == PROTOCOL_QUAKEWORLD)
+       if (!cls.netcon || cls.protocol == PROTOCOL_QUAKEWORLD || cls.signon >= SIGNONS)
                return;
 
        if (readmessages)
@@ -314,6 +317,14 @@ void CL_KeepaliveMessage (qboolean readmessages)
                memcpy(net_message.data, olddata, net_message.cursize);
        }
 
+#if 0
+       if((time = Sys_DoubleTime()) >= lasttime + 1)
+       {
+               Con_Printf("long delta: %f\n", time - lasttime);
+       }
+       lasttime = Sys_DoubleTime();
+#endif
+
        if (cls.netcon && (time = Sys_DoubleTime()) >= nextmsg)
        {
                sizebuf_t       msg;
@@ -411,9 +422,15 @@ static void CL_SetupWorldModel(void)
        // load or reload .loc file for team chat messages
        CL_Locs_Reload_f();
 
+       // make sure we send enough keepalives
+       CL_KeepaliveMessage(false);
+
        // reset particles and other per-level things
        R_Modules_NewMap();
 
+       // make sure we send enough keepalives
+       CL_KeepaliveMessage(false);
+
        // load the team chat beep if possible
        cl.foundtalk2wav = FS_FileExists("sound/misc/talk2.wav");
 
@@ -1011,8 +1028,7 @@ void CL_BeginDownloads(qboolean aborteddownload)
                {
                        if (cl.model_precache[cl.loadmodel_current] && cl.model_precache[cl.loadmodel_current]->Draw)
                                continue;
-                       if (cls.signon < SIGNONS)
-                               CL_KeepaliveMessage(true);
+                       CL_KeepaliveMessage(true);
                        cl.model_precache[cl.loadmodel_current] = Mod_ForName(cl.model_name[cl.loadmodel_current], false, false, cl.loadmodel_current == 1);
                        if (cl.model_precache[cl.loadmodel_current] && cl.model_precache[cl.loadmodel_current]->Draw && cl.loadmodel_current == 1)
                        {
@@ -1039,8 +1055,7 @@ void CL_BeginDownloads(qboolean aborteddownload)
                {
                        if (cl.sound_precache[cl.loadsound_current] && S_IsSoundPrecached(cl.sound_precache[cl.loadsound_current]))
                                continue;
-                       if (cls.signon < SIGNONS)
-                               CL_KeepaliveMessage(true);
+                       CL_KeepaliveMessage(true);
                        // Don't lock the sfx here, S_ServerSounds already did that
                        cl.sound_precache[cl.loadsound_current] = S_PrecacheSound(cl.sound_name[cl.loadsound_current], false, false);
                }
@@ -1086,8 +1101,7 @@ void CL_BeginDownloads(qboolean aborteddownload)
                        }
                        if (cl.model_precache[cl.downloadmodel_current] && cl.model_precache[cl.downloadmodel_current]->Draw)
                                continue;
-                       if (cls.signon < SIGNONS)
-                               CL_KeepaliveMessage(true);
+                       CL_KeepaliveMessage(true);
                        if (strcmp(cl.model_name[cl.downloadmodel_current], "null") && !FS_FileExists(cl.model_name[cl.downloadmodel_current]))
                        {
                                if (cl.downloadmodel_current == 1)
@@ -1136,8 +1150,7 @@ void CL_BeginDownloads(qboolean aborteddownload)
                        }
                        if (cl.sound_precache[cl.downloadsound_current] && S_IsSoundPrecached(cl.sound_precache[cl.downloadsound_current]))
                                continue;
-                       if (cls.signon < SIGNONS)
-                               CL_KeepaliveMessage(true);
+                       CL_KeepaliveMessage(true);
                        dpsnprintf(soundname, sizeof(soundname), "sound/%s", cl.sound_name[cl.downloadsound_current]);
                        if (!FS_FileExists(soundname) && !FS_FileExists(cl.sound_name[cl.downloadsound_current]))
                        {
@@ -1731,15 +1744,40 @@ void CL_MoveLerpEntityStates(entity_t *ent)
                VectorCopy(ent->state_current.origin, ent->persistent.neworigin);
                VectorCopy(ent->state_current.angles, ent->persistent.newangles);
                // reset animation interpolation as well
-               ent->render.frame1 = ent->render.frame2 = ent->state_current.frame;
-               ent->render.frame1time = ent->render.frame2time = cl.time;
-               ent->render.framelerp = 1;
+               ent->render.framegroupblend[0].frame = ent->render.framegroupblend[1].frame = ent->state_current.frame;
+               ent->render.framegroupblend[0].start = ent->render.framegroupblend[1].start = cl.time;
+               ent->render.framegroupblend[0].lerp = 1;ent->render.framegroupblend[1].lerp = 0;
                ent->render.shadertime = cl.time;
                // reset various persistent stuff
                ent->persistent.muzzleflash = 0;
                ent->persistent.trail_allowed = false;
        }
-       else if (DotProduct(odelta, odelta) > 1000*1000 || (cl.fixangle[0] && !cl.fixangle[1]))
+       else if ((ent->state_previous.effects & EF_TELEPORT_BIT) != (ent->state_current.effects & EF_TELEPORT_BIT))
+       {
+               // don't interpolate the move
+               ent->persistent.lerpdeltatime = 0;
+               ent->persistent.lerpstarttime = cl.mtime[1];
+               VectorCopy(ent->state_current.origin, ent->persistent.oldorigin);
+               VectorCopy(ent->state_current.angles, ent->persistent.oldangles);
+               VectorCopy(ent->state_current.origin, ent->persistent.neworigin);
+               VectorCopy(ent->state_current.angles, ent->persistent.newangles);
+               ent->persistent.trail_allowed = false;
+
+               if(ent->state_current.frame != ent->state_previous.frame)
+               {
+                       // if we ALSO changed animation frame in the process (but ONLY then!)
+                       // then let's reset the animation interpolation too
+                       ent->render.framegroupblend[0].frame = ent->render.framegroupblend[1].frame = ent->state_current.frame;
+                       ent->render.framegroupblend[0].start = ent->render.framegroupblend[1].start = cl.time;
+                       ent->render.framegroupblend[0].lerp = 1;ent->render.framegroupblend[1].lerp = 0;
+               }
+
+               // note that this case must do everything the following case does too
+       }
+       else if (DotProduct(odelta, odelta) > 1000*1000
+               || (cl.fixangle[0] && !cl.fixangle[1])
+               || (ent->state_previous.tagindex != ent->state_current.tagindex)
+               || (ent->state_previous.tagentity != ent->state_current.tagentity))
        {
                // don't interpolate the move
                // (the fixangle[] check detects teleports, but not constant fixangles
@@ -1969,10 +2007,10 @@ void CL_ParseStatic (int large)
 
 // copy it to the current state
        ent->render.model = cl.model_precache[ent->state_baseline.modelindex];
-       ent->render.frame1 = ent->render.frame2 = ent->state_baseline.frame;
-       ent->render.framelerp = 0;
+       ent->render.framegroupblend[0].frame = ent->state_baseline.frame;
+       ent->render.framegroupblend[0].lerp = 1;
        // make torchs play out of sync
-       ent->render.frame1time = ent->render.frame2time = lhrandom(-10, -1);
+       ent->render.framegroupblend[0].start = lhrandom(-10, -1);
        ent->render.skinnum = ent->state_baseline.skin;
        ent->render.effects = ent->state_baseline.effects;
        ent->render.alpha = 1;
@@ -3066,8 +3104,7 @@ void CL_ParseServerMessage(void)
 
        cl.last_received_message = realtime;
 
-       if (cls.netcon && cls.signon < SIGNONS)
-               CL_KeepaliveMessage(false);
+       CL_KeepaliveMessage(false);
 
 //
 // if recording demos, copy the message out