]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_main.c
made various things take const pointers (optimizer hint), commented out and/or remove...
[xonotic/darkplaces.git] / cl_main.c
index 4c1cad58a96e0455001bf5abf5216bd80fd7b6b2..b387596d772935b2ae58b4190ecc82ccd93dc06c 100644 (file)
--- a/cl_main.c
+++ b/cl_main.c
@@ -108,7 +108,6 @@ void CL_ClearState (void)
        memset(cl_effect, 0, sizeof(cl_effect));
        CL_Screen_NewMap();
        CL_Particles_Clear();
-       CL_Decals_Clear();
        // LordHavoc: have to set up the baseline info for alpha and other stuff
        for (i = 0;i < MAX_EDICTS;i++)
        {
@@ -116,6 +115,8 @@ void CL_ClearState (void)
                ClearStateToDefault(&cl_entities[i].state_previous);
                ClearStateToDefault(&cl_entities[i].state_current);
        }
+
+       CL_CGVM_Clear();
 }
 
 void CL_LerpUpdate(entity_t *e)
@@ -196,6 +197,7 @@ void CL_Disconnect (void)
                NET_SendUnreliableMessage (cls.netcon, &cls.message);
                SZ_Clear (&cls.message);
                NET_Close (cls.netcon);
+               cls.state = ca_disconnected; // prevent this code from executing again during Host_ShutdownServer
                // if running a local server, shut it down
                if (sv.active)
                        Host_ShutdownServer(false);
@@ -241,6 +243,8 @@ void CL_EstablishConnection (char *host)
        cls.demonum = -1;                       // not in the demo loop now
        cls.state = ca_connected;
        cls.signon = 0;                         // need all the signon messages before playing
+
+       CL_ClearState ();
 }
 
 /*
@@ -286,44 +290,24 @@ should be put at.
 */
 static float CL_LerpPoint (void)
 {
-       float   f, frac;
+       float   f;
 
-       f = cl.mtime[0] - cl.mtime[1];
+       // dropped packet, or start of demo
+       if (cl.mtime[1] < cl.mtime[0] - 0.1)
+               cl.mtime[1] = cl.mtime[0] - 0.1;
+
+       cl.time = bound(cl.mtime[1], cl.time, cl.mtime[0]);
 
        // LordHavoc: lerp in listen games as the server is being capped below the client (usually)
+       f = cl.mtime[0] - cl.mtime[1];
        if (!f || cl_nolerp.integer || cls.timedemo || (sv.active && svs.maxclients == 1))
        {
                cl.time = cl.mtime[0];
                return 1;
        }
 
-       if (f > 0.1)
-       {       // dropped packet, or start of demo
-               cl.mtime[1] = cl.mtime[0] - 0.1;
-               f = 0.1;
-       }
-       frac = (cl.time - cl.mtime[1]) / f;
-//     Con_Printf ("frac: %f\n",frac);
-       if (frac < 0)
-       {
-               if (frac < -0.01)
-               {
-                       cl.time = cl.mtime[1];
-//                     Con_Printf ("low frac\n");
-               }
-               frac = 0;
-       }
-       else if (frac > 1)
-       {
-               if (frac > 1.01)
-               {
-                       cl.time = cl.mtime[0];
-//                     Con_Printf ("high frac\n");
-               }
-               frac = 1;
-       }
-
-       return frac;
+       f = (cl.time - cl.mtime[1]) / f;
+       return bound(0, f, 1);
 }
 
 static void CL_RelinkStaticEntities(void)
@@ -354,8 +338,6 @@ static void CL_RelinkNetworkEntities()
        else
                bobjoffset = 0;
 
-       CL_RelinkStaticEntities();
-
 // start on the entity after the world
        for (i = 1, ent = cl_entities + 1;i < MAX_EDICTS /*cl.num_entities*/;i++, ent++)
        {
@@ -494,18 +476,7 @@ static void CL_RelinkNetworkEntities()
                        if (effects & EF_BRIGHTFIELD)
                                CL_EntityParticles (ent);
                        if (effects & EF_MUZZLEFLASH)
-                       {
-                               vec3_t v, v2;
-
-                               AngleVectors (ent->render.angles, v, NULL, NULL);
-
-                               v2[0] = v[0] * 18 + neworg[0];
-                               v2[1] = v[1] * 18 + neworg[1];
-                               v2[2] = v[2] * 18 + neworg[2] + 16;
-                               TraceLine(neworg, v2, v, NULL, 0);
-
-                               CL_AllocDlight (NULL, v, 100, 1, 1, 1, 0, 0.1);
-                       }
+                               ent->persistent.muzzleflash = 100.0f;
                        if (effects & EF_DIMLIGHT)
                        {
                                dlightcolor[0] += 200.0f;
@@ -537,21 +508,29 @@ static void CL_RelinkNetworkEntities()
                                {
                                        vec3_t mins, maxs;
                                        int temp;
+                                       /*
                                        if (ent->render.angles[0] || ent->render.angles[2])
                                        {
-                                               VectorAdd(neworg, ent->render.model->rotatedmins, mins);
-                                               VectorAdd(neworg, ent->render.model->rotatedmaxs, maxs);
+                                               VectorMA(neworg, 0.25f, ent->render.model->rotatedmins, mins);
+                                               VectorMA(neworg, 0.25f, ent->render.model->rotatedmaxs, maxs);
                                        }
                                        else if (ent->render.angles[1])
                                        {
-                                               VectorAdd(neworg, ent->render.model->yawmins, mins);
-                                               VectorAdd(neworg, ent->render.model->yawmaxs, maxs);
+                                               VectorMA(neworg, 0.25f, ent->render.model->yawmins, mins);
+                                               VectorMA(neworg, 0.25f, ent->render.model->yawmaxs, maxs);
                                        }
                                        else
                                        {
-                                               VectorAdd(neworg, ent->render.model->normalmins, mins);
-                                               VectorAdd(neworg, ent->render.model->normalmaxs, maxs);
+                                               VectorMA(neworg, 0.25f, ent->render.model->normalmins, mins);
+                                               VectorMA(neworg, 0.25f, ent->render.model->normalmaxs, maxs);
                                        }
+                                       */
+                                       mins[0] = neworg[0] - 16.0f;
+                                       mins[1] = neworg[1] - 16.0f;
+                                       mins[2] = neworg[2] - 16.0f;
+                                       maxs[0] = neworg[0] + 16.0f;
+                                       maxs[1] = neworg[1] + 16.0f;
+                                       maxs[2] = neworg[2] + 16.0f;
                                        // how many flames to make
                                        temp = (int) (cl.time * 300) - (int) (cl.oldtime * 300);
                                        CL_FlameCube(mins, maxs, temp);
@@ -561,6 +540,59 @@ static void CL_RelinkNetworkEntities()
                                dlightcolor[1] += d * 0.7f;
                                dlightcolor[2] += d * 0.3f;
                        }
+                       if (effects & EF_STARDUST)
+                       {
+                               if (ent->render.model)
+                               {
+                                       vec3_t mins, maxs;
+                                       int temp;
+                                       /*
+                                       if (ent->render.angles[0] || ent->render.angles[2])
+                                       {
+                                               VectorMA(neworg, 0.25f, ent->render.model->rotatedmins, mins);
+                                               VectorMA(neworg, 0.25f, ent->render.model->rotatedmaxs, maxs);
+                                       }
+                                       else if (ent->render.angles[1])
+                                       {
+                                               VectorMA(neworg, 0.25f, ent->render.model->yawmins, mins);
+                                               VectorMA(neworg, 0.25f, ent->render.model->yawmaxs, maxs);
+                                       }
+                                       else
+                                       {
+                                               VectorMA(neworg, 0.25f, ent->render.model->normalmins, mins);
+                                               VectorMA(neworg, 0.25f, ent->render.model->normalmaxs, maxs);
+                                       }
+                                       */
+                                       mins[0] = neworg[0] - 16.0f;
+                                       mins[1] = neworg[1] - 16.0f;
+                                       mins[2] = neworg[2] - 16.0f;
+                                       maxs[0] = neworg[0] + 16.0f;
+                                       maxs[1] = neworg[1] + 16.0f;
+                                       maxs[2] = neworg[2] + 16.0f;
+                                       // how many particles to make
+                                       temp = (int) (cl.time * 200) - (int) (cl.oldtime * 200);
+                                       CL_Stardust(mins, maxs, temp);
+                               }
+                               d = 100;
+                               dlightcolor[0] += d * 1.0f;
+                               dlightcolor[1] += d * 0.7f;
+                               dlightcolor[2] += d * 0.3f;
+                       }
+               }
+
+               if (ent->persistent.muzzleflash > 0)
+               {
+                       vec3_t v, v2;
+
+                       AngleVectors (ent->render.angles, v, NULL, NULL);
+
+                       v2[0] = v[0] * 18 + neworg[0];
+                       v2[1] = v[1] * 18 + neworg[1];
+                       v2[2] = v[2] * 18 + neworg[2] + 16;
+                       TraceLine(neworg, v2, v, NULL, 0, true);
+
+                       CL_AllocDlight (NULL, v, ent->persistent.muzzleflash, 1, 1, 1, 0, 0);
+                       ent->persistent.muzzleflash -= cl.frametime * 1000;
                }
 
                // LordHavoc: if the model has no flags, don't check each
@@ -585,10 +617,9 @@ static void CL_RelinkNetworkEntities()
                                else if (ent->render.model->flags & EF_ROCKET)
                                {
                                        CL_RocketTrail (oldorg, ent->render.origin, 0, ent);
-                                       // LordHavoc: changed from 200, 160, 80 to 250, 200, 100
-                                       dlightcolor[0] += 250.0f;
-                                       dlightcolor[1] += 200.0f;
-                                       dlightcolor[2] += 100.0f;
+                                       dlightcolor[0] += 200.0f;
+                                       dlightcolor[1] += 160.0f;
+                                       dlightcolor[2] +=  80.0f;
                                }
                                else if (ent->render.model->flags & EF_GRENADE)
                                {
@@ -602,14 +633,15 @@ static void CL_RelinkNetworkEntities()
                        }
                }
                // LordHavoc: customizable glow
-               glowsize = ent->state_current.glowsize * 4.0f; // FIXME: interpolate?
+               glowsize = ent->state_current.glowsize; // FIXME: interpolate?
                glowcolor = ent->state_current.glowcolor;
                if (glowsize)
                {
-                       byte *tempcolor = (byte *)&d_8to24table[glowcolor];
-                       dlightcolor[0] += glowsize * tempcolor[0] * (1.0f / 255.0f);
-                       dlightcolor[1] += glowsize * tempcolor[1] * (1.0f / 255.0f);
-                       dlightcolor[2] += glowsize * tempcolor[2] * (1.0f / 255.0f);
+                       qbyte *tempcolor = (qbyte *)&d_8to24table[glowcolor];
+                       // * 4 for the expansion from 0-255 to 0-1023 range,
+                       // / 255 to scale down byte colors
+                       glowsize *= (4.0f / 255.0f);
+                       VectorMA(dlightcolor, glowsize, tempcolor, dlightcolor);
                }
                // LordHavoc: customizable trail
                if (ent->render.flags & RENDER_GLOWTRAIL)
@@ -618,13 +650,11 @@ static void CL_RelinkNetworkEntities()
                if (dlightcolor[0] || dlightcolor[1] || dlightcolor[2])
                {
                        vec3_t vec;
-                       dlightradius = VectorLength(dlightcolor);
-                       d = 1.0f / dlightradius;
                        VectorCopy(neworg, vec);
                        // hack to make glowing player light shine on their gun
                        if (i == cl.viewentity && !chase_active.integer)
                                vec[2] += 30;
-                       CL_AllocDlight (&ent->render, vec, dlightradius, dlightcolor[0] * d, dlightcolor[1] * d, dlightcolor[2] * d, 0, 0);
+                       CL_AllocDlight (/*&ent->render*/ NULL, vec, 1, dlightcolor[0], dlightcolor[1], dlightcolor[2], 0, 0);
                }
 
                if (chase_active.integer)
@@ -647,13 +677,21 @@ static void CL_RelinkNetworkEntities()
        }
 }
 
-static void CL_LerpPlayerVelocity (void)
+void CL_LerpPlayer(float frac)
 {
        int i;
-       float frac, d;
+       float d;
 
-       // fraction from previous network update to current
-       frac = CL_LerpPoint ();
+       if (cl.entitydatabase.numframes)
+       {
+               cl.viewentorigin[0] = cl.viewentoriginold[0] + frac * (cl.viewentoriginnew[0] - cl.viewentoriginold[0]);
+               cl.viewentorigin[1] = cl.viewentoriginold[1] + frac * (cl.viewentoriginnew[1] - cl.viewentoriginold[1]);
+               cl.viewentorigin[2] = cl.viewentoriginold[2] + frac * (cl.viewentoriginnew[2] - cl.viewentoriginold[2]);
+       }
+       else
+               VectorCopy (cl_entities[cl.viewentity].render.origin, cl.viewentorigin);
+
+       cl.viewzoom = cl.viewzoomold + frac * (cl.viewzoomnew - cl.viewzoomold);
 
        for (i = 0;i < 3;i++)
                cl.velocity[i] = cl.mvelocity[1][i] + frac * (cl.mvelocity[0][i] - cl.mvelocity[1][i]);
@@ -750,14 +788,20 @@ static void CL_RelinkEffects()
 
 void CL_RelinkEntities (void)
 {
-       r_refdef.numentities = 0;
+       float frac;
+
+       // fraction from previous network update to current
+       frac = CL_LerpPoint ();
 
-       CL_LerpPlayerVelocity();
+       CL_DecayLights ();
+       CL_RelinkStaticEntities();
        CL_RelinkNetworkEntities();
+       TraceLine_ScanForBModels();
        CL_RelinkEffects();
        CL_MoveParticles();
-       CL_UpdateDecals();
-       CL_UpdateTEnts ();
+       CL_UpdateTEnts();
+
+       CL_LerpPlayer(frac);
 }
 
 
@@ -796,7 +840,14 @@ int CL_ReadFromServer (void)
        if (netshown)
                Con_Printf ("\n");
 
-       CL_RelinkEntities ();
+       r_refdef.numentities = 0;
+       if (cls.state == ca_connected && cl.worldmodel)
+       {
+               CL_RelinkEntities ();
+
+               // run cgame code (which can add more entities)
+               CL_CGVM_Frame();
+       }
 
 //
 // bring the links up to date
@@ -821,12 +872,31 @@ void CL_SendCmd (void)
        // get basic movement from keyboard
                CL_BaseMove (&cmd);
 
+               IN_PreMove(); // OS independent code
+
        // allow mice or other external controllers to add to the move
                IN_Move (&cmd);
 
+               IN_PostMove(); // OS independent code
+
        // send the unreliable message
                CL_SendMove (&cmd);
        }
+#ifndef NOROUTINGFIX
+       else
+       {
+               // LordHavoc: fix for NAT routing of netquake:
+               // bounce back a clc_nop message to the newly allocated server port,
+               // to establish a routing connection for incoming frames,
+               // the server waits for this before sending anything
+               if (realtime > cl.sendnoptime)
+               {
+                       Con_DPrintf("sending clc_nop to get server's attention\n");
+                       cl.sendnoptime = realtime + 3;
+                       MSG_WriteByte(&cls.message, clc_nop);
+               }
+       }
+#endif
 
        if (cls.demoplayback)
        {
@@ -978,6 +1048,6 @@ void CL_Init (void)
 
        CL_Parse_Init();
        CL_Particles_Init();
-       CL_Decals_Init();
        CL_Screen_Init();
+       CL_CGVM_Init();
 }