X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=cl_main.c;h=30b275604c1db4386e04fe46e530bd9582c24a7f;hb=142ec9e43c5bd046ce3a33e822167373bf244d21;hp=b5e15010e29ae9a94b42e64e9168ac4427a212e8;hpb=b75264749687c3f6ca073e270401283c5f0bc612;p=xonotic%2Fdarkplaces.git diff --git a/cl_main.c b/cl_main.c index b5e15010..30b27560 100644 --- a/cl_main.c +++ b/cl_main.c @@ -106,8 +106,8 @@ void CL_ClearState (void) memset(cl_beams, 0, sizeof(cl_beams)); memset(cl_dlights, 0, sizeof(cl_dlights)); 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++) { @@ -115,29 +115,31 @@ 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, int frame, int modelindex) +void CL_LerpUpdate(entity_t *e) { entity_persistent_t *p; entity_render_t *r; p = &e->persistent; r = &e->render; - if (p->modelindex != modelindex) + if (p->modelindex != e->state_current.modelindex) { // reset all interpolation information - p->modelindex = modelindex; - p->frame1 = p->frame2 = frame; + p->modelindex = e->state_current.modelindex; + p->frame1 = p->frame2 = e->state_current.frame; p->frame1time = p->frame2time = cl.time; p->framelerp = 1; } - else if (p->frame2 != frame) + else if (p->frame2 != e->state_current.frame) { // transition to new frame p->frame1 = p->frame2; p->frame1time = p->frame2time; - p->frame2 = frame; + p->frame2 = e->state_current.frame; p->frame2time = cl.time; p->framelerp = 0; } @@ -148,6 +150,9 @@ void CL_LerpUpdate(entity_t *e, int frame, int modelindex) p->framelerp = bound(0, p->framelerp, 1); } + r->model = cl.model_precache[e->state_current.modelindex]; + Mod_CheckLoaded(r->model); + r->frame = e->state_current.frame; r->frame1 = p->frame1; r->frame2 = p->frame2; r->framelerp = p->framelerp; @@ -165,6 +170,9 @@ This is also called on Host_Error, so it shouldn't cause any errors */ void CL_Disconnect (void) { + if (cls.state == ca_dedicated) + return; + // stop sounds (especially looping!) S_StopAllSounds (true); @@ -189,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); @@ -218,6 +227,13 @@ Host should be either "local" or a net address to be passed on */ void CL_EstablishConnection (char *host) { + sizebuf_t buf; + qbyte data[128]; + + buf.maxsize = 128; + buf.cursize = 0; + buf.data = data; + if (cls.state == ca_dedicated) return; @@ -234,6 +250,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 (); } /* @@ -260,11 +278,11 @@ static void CL_PrintEntities_f (void) Con_Printf ("EMPTY\n"); continue; } - strncpy(name, ent->render.model->name, 30); - name[30] = 0; - for (j = strlen(name);j < 30;j++) + strncpy(name, ent->render.model->name, 25); + name[25] = 0; + for (j = strlen(name);j < 25;j++) name[j] = ' '; - Con_Printf ("%s:%04i (%5i %5i %5i) [%3i %3i %3i]\n", name, ent->render.frame, (int) ent->render.origin[0], (int) ent->render.origin[1], (int) ent->render.origin[2], (int) ent->render.angles[0] % 360, (int) ent->render.angles[1] % 360, (int) ent->render.angles[2] % 360); + Con_Printf ("%s:%04i (%5i %5i %5i) [%3i %3i %3i] %4.2f %5.3f\n", name, ent->render.frame, (int) ent->render.origin[0], (int) ent->render.origin[1], (int) ent->render.origin[2], (int) ent->render.angles[0] % 360, (int) ent->render.angles[1] % 360, (int) ent->render.angles[2] % 360, ent->render.scale, ent->render.alpha); } } @@ -279,44 +297,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) @@ -347,8 +345,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++) { @@ -427,8 +423,8 @@ static void CL_RelinkNetworkEntities() // if the delta is large, assume a teleport and don't lerp VectorSubtract(ent->state_current.origin, ent->state_previous.origin, delta); - // LordHavoc: increased tolerance from 100 to 200 - if ((sv.active && svs.maxclients == 1 && !(ent->state_current.flags & RENDER_STEP)) || cls.timedemo || DotProduct(delta, delta) > 200*200 || cl_nolerp.integer) + // LordHavoc: increased tolerance from 100 to 200, and now to 1000 + if ((sv.active && svs.maxclients == 1 && !(ent->state_current.flags & RENDER_STEP)) || cls.timedemo || DotProduct(delta, delta) > 1000*1000 || cl_nolerp.integer) lerp = 1; else { @@ -458,15 +454,12 @@ static void CL_RelinkNetworkEntities() VectorCopy (neworg, ent->persistent.trail_origin); // persistent.modelindex will be updated by CL_LerpUpdate - if (ent->state_current.modelindex != ent->persistent.modelindex || !ent->state_previous.active) + if (ent->state_current.modelindex != ent->persistent.modelindex) VectorCopy(neworg, oldorg); VectorCopy (neworg, ent->render.origin); ent->render.flags = ent->state_current.flags; ent->render.effects = effects = ent->state_current.effects; - ent->render.model = cl.model_precache[ent->state_current.modelindex]; - Mod_CheckLoaded(ent->render.model); - ent->render.frame = ent->state_current.frame; if (cl.scores == NULL || !ent->state_current.colormap) ent->render.colormap = -1; // no special coloring else @@ -474,11 +467,9 @@ static void CL_RelinkNetworkEntities() ent->render.skinnum = ent->state_current.skin; ent->render.alpha = ent->state_current.alpha * (1.0f / 255.0f); // FIXME: interpolate? ent->render.scale = ent->state_current.scale * (1.0f / 16.0f); // FIXME: interpolate? - glowsize = ent->state_current.glowsize * 4.0f; // FIXME: interpolate? - glowcolor = ent->state_current.glowcolor; // update interpolation info - CL_LerpUpdate(ent, ent->state_current.frame, ent->state_current.modelindex); + CL_LerpUpdate(ent); // handle effects now... dlightradius = 0; @@ -500,9 +491,9 @@ static void CL_RelinkNetworkEntities() 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); + TraceLine(neworg, v2, v, NULL, 0, true); - CL_AllocDlight (NULL, v, 100, 1, 1, 1, 0, 0.1); + CL_AllocDlight (NULL, v, 100, 1, 1, 1, 0, 0); } if (effects & EF_DIMLIGHT) { @@ -583,9 +574,10 @@ static void CL_RelinkNetworkEntities() else if (ent->render.model->flags & EF_ROCKET) { CL_RocketTrail (oldorg, ent->render.origin, 0, ent); - dlightcolor[0] += 200.0f; - dlightcolor[1] += 160.0f; - dlightcolor[2] += 80.0f; + // LordHavoc: changed from 200, 160, 80 to 250, 200, 100 + dlightcolor[0] += 250.0f; + dlightcolor[1] += 200.0f; + dlightcolor[2] += 100.0f; } else if (ent->render.model->flags & EF_GRENADE) { @@ -599,9 +591,11 @@ static void CL_RelinkNetworkEntities() } } // LordHavoc: customizable glow + glowsize = ent->state_current.glowsize * 4.0f; // FIXME: interpolate? + glowcolor = ent->state_current.glowcolor; if (glowsize) { - byte *tempcolor = (byte *)&d_8to24table[glowcolor]; + qbyte *tempcolor = (qbyte *)&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); @@ -619,7 +613,7 @@ static void CL_RelinkNetworkEntities() // 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, dlightradius, dlightcolor[0] * d, dlightcolor[1] * d, dlightcolor[2] * d, 0, 0); } if (chase_active.integer) @@ -642,13 +636,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]); @@ -745,14 +747,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); } @@ -791,7 +799,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 @@ -816,12 +831,29 @@ 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); } + 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); + } + } if (cls.demoplayback) { @@ -973,5 +1005,6 @@ void CL_Init (void) CL_Parse_Init(); CL_Particles_Init(); - CL_Decals_Init(); + CL_Screen_Init(); + CL_CGVM_Init(); }