X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=cl_parse.c;h=b33a23d79294976accaed6ede7ca3dcd15ad43d9;hb=31ad3dd6c6d2d35ef22a6e88205fe0926b1e0150;hp=6bbe93388e03889ba82abce6f7401d05ab09375a;hpb=f5822de9dd7f185161528e3830692ae75bbeef67;p=xonotic%2Fdarkplaces.git diff --git a/cl_parse.c b/cl_parse.c index 6bbe9338..b33a23d7 100644 --- a/cl_parse.c +++ b/cl_parse.c @@ -107,22 +107,6 @@ void CL_Parse_Init(void) qboolean Nehahrademcompatibility; // LordHavoc: to allow playback of the early Nehahra movie segments int dpprotocol; // LordHavoc: version of network protocol, or 0 if not DarkPlaces -/* -=============== -CL_EntityNum - -This error checks and tracks the total number of entities -=============== -*/ -entity_t *CL_EntityNum (int num) -{ - if (num >= MAX_EDICTS) - Host_Error ("CL_EntityNum: %i is an invalid number",num); - - return &cl_entities[num]; -} - - /* ================== CL_ParseStartSoundPacket @@ -138,7 +122,7 @@ void CL_ParseStartSoundPacket(int largesoundindex) float attenuation; int i; - field_mask = MSG_ReadByte(); + field_mask = MSG_ReadByte(); if (field_mask & SND_VOLUME) volume = MSG_ReadByte (); @@ -518,6 +502,52 @@ void CL_ValidateState(entity_state_t *s) } } +void CL_MoveLerpEntityStates(entity_t *ent) +{ + float odelta[3], adelta[3]; + VectorSubtract(ent->state_current.origin, ent->persistent.neworigin, odelta); + VectorSubtract(ent->state_current.angles, ent->persistent.newangles, adelta); + if (!ent->state_previous.active || cls.timedemo || DotProduct(odelta, odelta) > 1000*1000 || cl_nolerp.integer) + { + // we definitely shouldn't lerp + 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); + } + else// if (ent->state_current.flags & RENDER_STEP) + { + // monster interpolation + if (DotProduct(odelta, odelta) + DotProduct(adelta, adelta) > 0.01) + { + ent->persistent.lerpdeltatime = cl.time - ent->persistent.lerpstarttime; + ent->persistent.lerpstarttime = cl.mtime[1]; + VectorCopy(ent->persistent.neworigin, ent->persistent.oldorigin); + VectorCopy(ent->persistent.newangles, ent->persistent.oldangles); + VectorCopy(ent->state_current.origin, ent->persistent.neworigin); + VectorCopy(ent->state_current.angles, ent->persistent.newangles); + } + } + /* + else + { + // not a monster + ent->persistent.lerpstarttime = cl.mtime[1]; + // no lerp if it's singleplayer + //if (sv.active && svs.maxclients == 1 && !ent->state_current.flags & RENDER_STEP) + // ent->persistent.lerpdeltatime = 0; + //else + ent->persistent.lerpdeltatime = cl.mtime[0] - cl.mtime[1]; + VectorCopy(ent->persistent.neworigin, ent->persistent.oldorigin); + VectorCopy(ent->persistent.newangles, ent->persistent.oldangles); + VectorCopy(ent->state_current.origin, ent->persistent.neworigin); + VectorCopy(ent->state_current.angles, ent->persistent.newangles); + } + */ +} + /* ================== CL_ParseUpdate @@ -553,10 +583,7 @@ void CL_ParseUpdate (int bits) if (num < 1) Host_Error("CL_ParseUpdate: invalid entity number (%i)\n", num); - // mark as visible (no kill this frame) - entlife[num] = 2; - - ent = CL_EntityNum (num); + ent = cl_entities + num; for (i = 0;i < 32;i++) if (bits & (1 << i)) @@ -569,10 +596,13 @@ void CL_ParseUpdate (int bits) if (bits & U_DELTA) new = ent->state_current; else + { new = ent->state_baseline; + new.active = true; + } + new.number = num; new.time = cl.mtime[0]; - new.flags = 0; if (bits & U_MODEL) new.modelindex = (new.modelindex & 0xFF00) | MSG_ReadByte(); if (bits & U_FRAME) new.frame = (new.frame & 0xFF00) | MSG_ReadByte(); @@ -622,25 +652,14 @@ void CL_ParseUpdate (int bits) if (new.active) CL_ValidateState(&new); - if (new.flags & RENDER_STEP) // FIXME: rename this flag? + ent->state_previous = ent->state_current; + ent->state_current = new; + if (ent->state_current.active) { - // make time identical for memcmp - new.time = ent->state_current.time; - if (memcmp(&new, &ent->state_current, sizeof(entity_state_t))) - { - // set it back to what it should be - new.time = cl.mtime[0] + 0.1; - // state has changed - ent->state_previous = ent->state_current; - ent->state_current = new; - // assume 10fps animation - //ent->state_previous.time = cl.mtime[0] - 0.1; - } - } - else - { - ent->state_previous = ent->state_current; - ent->state_current = new; + CL_MoveLerpEntityStates(ent); + cl_entities_active[ent->state_current.number] = true; + // mark as visible (no kill this frame) + entlife[ent->state_current.number] = 2; } } @@ -653,13 +672,14 @@ void CL_ReadEntityFrame(void) EntityFrame_FetchFrame(&cl.entitydatabase, EntityFrame_MostRecentlyRecievedFrameNum(&cl.entitydatabase), &entityframe); for (i = 0;i < entityframe.numentities;i++) { - // the entity lives again... - entlife[entityframe.entitydata[i].number] = 2; // copy the states ent = &cl_entities[entityframe.entitydata[i].number]; ent->state_previous = ent->state_current; ent->state_current = entityframe.entitydata[i]; - ent->state_current.time = cl.mtime[0]; + CL_MoveLerpEntityStates(ent); + // the entity lives again... + entlife[ent->state_current.number] = 2; + cl_entities_active[ent->state_current.number] = true; } VectorCopy(cl.viewentoriginnew, cl.viewentoriginold); VectorCopy(entityframe.eye, cl.viewentoriginnew); @@ -1182,6 +1202,9 @@ void CL_ParseServerMessage (void) if (i >= cl.maxclients) Host_Error ("CL_ParseServerMessage: svc_updatecolors >= cl.maxclients"); cl.scores[i].colors = MSG_ReadByte (); + // update our color cvar if our color changed + if (i == cl.playerentity - 1) + Cvar_SetValue ("_cl_color", cl.scores[i].colors); break; case svc_particle: @@ -1198,13 +1221,15 @@ void CL_ParseServerMessage (void) case svc_spawnbaseline: i = MSG_ReadShort (); - // must use CL_EntityNum() to force cl.num_entities up - CL_ParseBaseline (CL_EntityNum(i), false); + if (i < 0 || i >= MAX_EDICTS) + Host_Error ("CL_ParseServerMessage: svc_spawnbaseline: invalid entity number %i", i); + CL_ParseBaseline (cl_entities + i, false); break; case svc_spawnbaseline2: i = MSG_ReadShort (); - // must use CL_EntityNum() to force cl.num_entities up - CL_ParseBaseline (CL_EntityNum(i), true); + if (i < 0 || i >= MAX_EDICTS) + Host_Error ("CL_ParseServerMessage: svc_spawnbaseline2: invalid entity number %i", i); + CL_ParseBaseline (cl_entities + i, true); break; case svc_spawnstatic: CL_ParseStatic (false);