}
}
+static const vec3_t nomodelmins = {-16, -16, -16};
+static const vec3_t nomodelmaxs = {16, 16, 16};
+void CL_BoundingBoxForEntity(entity_render_t *ent)
+{
+ if (ent->model)
+ {
+ if (ent->angles[0] || ent->angles[2])
+ {
+ // pitch or roll
+ VectorAdd(ent->origin, ent->model->rotatedmins, ent->mins);
+ VectorAdd(ent->origin, ent->model->rotatedmaxs, ent->maxs);
+ }
+ else if (ent->angles[1])
+ {
+ // yaw
+ VectorAdd(ent->origin, ent->model->yawmins, ent->mins);
+ VectorAdd(ent->origin, ent->model->yawmaxs, ent->maxs);
+ }
+ else
+ {
+ VectorAdd(ent->origin, ent->model->normalmins, ent->mins);
+ VectorAdd(ent->origin, ent->model->normalmaxs, ent->maxs);
+ }
+ }
+ else
+ {
+ VectorAdd(ent->origin, nomodelmins, ent->mins);
+ VectorAdd(ent->origin, nomodelmaxs, ent->maxs);
+ }
+}
+
void CL_LerpUpdate(entity_t *e)
{
entity_persistent_t *p;
{
entity_t *ent;
int i, effects, temp;
- float f, d, bobjrotate, bobjoffset, dlightradius, lerp;
+ float d, bobjrotate, bobjoffset, lerp;
vec3_t oldorg, neworg, delta, dlightcolor, v, v2, mins, maxs;
bobjrotate = ANGLEMOD(100*cl.time);
if (!ent->state_previous.active)
{
// only one state available
- lerp = 1;
- VectorCopy (ent->state_current.origin, oldorg); // skip trails
- VectorCopy (ent->state_current.origin, neworg);
- VectorCopy (ent->state_current.angles, ent->render.angles);
+ VectorCopy (ent->persistent.neworigin, neworg);
+ VectorCopy (ent->persistent.newangles, ent->render.angles);
+ VectorCopy (neworg, oldorg);
}
else
{
// 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, 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
+ VectorSubtract(ent->persistent.neworigin, ent->persistent.oldorigin, delta);
+ if (ent->persistent.lerpdeltatime > 0)
{
- f = ent->state_current.time - ent->state_previous.time;
- if (f > 0)
- lerp = (cl.time - ent->state_previous.time) / f;
+ lerp = (cl.time - ent->persistent.lerpstarttime) / ent->persistent.lerpdeltatime;
+ if (lerp < 1)
+ {
+ // interpolate the origin and angles
+ VectorMA(ent->persistent.oldorigin, lerp, delta, neworg);
+ VectorSubtract(ent->persistent.newangles, ent->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(ent->persistent.oldangles, lerp, delta, ent->render.angles);
+ }
else
- lerp = 1;
- }
- if (lerp >= 1)
- {
- // no interpolation
- VectorCopy (ent->state_current.origin, neworg);
- VectorCopy (ent->state_current.angles, ent->render.angles);
+ {
+ // no interpolation
+ VectorCopy (ent->persistent.neworigin, neworg);
+ VectorCopy (ent->persistent.newangles, ent->render.angles);
+ }
}
else
{
- // interpolate the origin and angles
- VectorMA(ent->state_previous.origin, lerp, delta, neworg);
- VectorSubtract(ent->state_current.angles, ent->state_previous.angles, 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(ent->state_previous.angles, lerp, delta, ent->render.angles);
+ // no interpolation
+ VectorCopy (ent->persistent.neworigin, neworg);
+ VectorCopy (ent->persistent.newangles, ent->render.angles);
}
}
VectorCopy (neworg, ent->render.origin);
ent->render.flags = ent->state_current.flags;
ent->render.effects = effects = ent->state_current.effects;
- if (cl.scores == NULL || !ent->state_current.colormap)
+ if (ent->state_current.flags & RENDER_COLORMAPPED)
+ ent->render.colormap = ent->state_current.colormap;
+ else if (cl.scores == NULL || !ent->state_current.colormap)
ent->render.colormap = -1; // no special coloring
else
ent->render.colormap = cl.scores[ent->state_current.colormap - 1].colors; // color it
CL_LerpUpdate(ent);
// handle effects now...
- dlightradius = 0;
dlightcolor[0] = 0;
dlightcolor[1] = 0;
dlightcolor[2] = 0;
continue;
}
- if (ent->render.model == NULL)
+ // don't show entities with no modelindex (note: this still shows
+ // entities which have a modelindex that resolved to a NULL model)
+ if (!ent->state_current.modelindex)
continue;
if (effects & EF_NODRAW)
continue;
- if (ent->render.angles[0] || ent->render.angles[2])
- {
- // pitch or roll
- VectorAdd(ent->render.origin, ent->render.model->rotatedmins, ent->render.mins);
- VectorAdd(ent->render.origin, ent->render.model->rotatedmaxs, ent->render.maxs);
- }
- else if (ent->render.angles[1])
- {
- // yaw
- VectorAdd(ent->render.origin, ent->render.model->yawmins, ent->render.mins);
- VectorAdd(ent->render.origin, ent->render.model->yawmaxs, ent->render.maxs);
- }
- else
- {
- VectorAdd(ent->render.origin, ent->render.model->normalmins, ent->render.mins);
- VectorAdd(ent->render.origin, ent->render.model->normalmaxs, ent->render.maxs);
- }
+ CL_BoundingBoxForEntity(&ent->render);
+ if (ent->render.model && ent->render.model->name[0] == '*' && ent->render.model->type == mod_brush)
+ cl_brushmodel_entities[cl_num_brushmodel_entities++] = &ent->render;
if (r_refdef.numentities < r_refdef.maxentities)
r_refdef.entities[r_refdef.numentities++] = &ent->render;
- if (ent->render.model->name[0] == '*' && ent->render.model->type == mod_brush)
- cl_brushmodel_entities[cl_num_brushmodel_entities++] = &ent->render;
-
if (cl_num_entities < i + 1)
cl_num_entities = i + 1;
}
ent->render.scale = 1;
ent->render.alpha = 1;
- if (ent->render.angles[0] || ent->render.angles[2])
- {
- // pitch or roll
- VectorAdd(ent->render.origin, ent->render.model->rotatedmins, ent->render.mins);
- VectorAdd(ent->render.origin, ent->render.model->rotatedmaxs, ent->render.maxs);
- }
- else if (ent->render.angles[1])
- {
- // yaw
- VectorAdd(ent->render.origin, ent->render.model->yawmins, ent->render.mins);
- VectorAdd(ent->render.origin, ent->render.model->yawmaxs, ent->render.maxs);
- }
- else
- {
- VectorAdd(ent->render.origin, ent->render.model->normalmins, ent->render.mins);
- VectorAdd(ent->render.origin, ent->render.model->normalmaxs, ent->render.maxs);
- }
+ CL_BoundingBoxForEntity(&ent->render);
}
}
}
if (cl_num_entities < 1)
cl_num_entities = 1;
cl_brushmodel_entities[cl_num_brushmodel_entities++] = &cl_entities[0].render;
+ CL_BoundingBoxForEntity(&cl_entities[0].render);
}
void CL_RelinkEntities (void)
cl_num_entities = 0;
cl_num_brushmodel_entities = 0;
- if (cls.state == ca_connected && cl.worldmodel)
+ if (cls.state == ca_connected && cls.signon == SIGNONS)
{
CL_RelinkEntities ();
CL_SendMove (&cmd);
}
#ifndef NOROUTINGFIX
- else
+ else if (cls.signon == 0 && !cls.demoplayback)
{
// LordHavoc: fix for NAT routing of netquake:
// bounce back a clc_nop message to the newly allocated server port,
// 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);
+ Con_DPrintf("sending clc_nop to get server's attention\n");
+ {
+ sizebuf_t buf;
+ qbyte data[128];
+ buf.maxsize = 128;
+ buf.cursize = 0;
+ buf.data = data;
+ MSG_WriteByte(&buf, clc_nop);
+ if (NET_SendUnreliableMessage (cls.netcon, &buf) == -1)
+ {
+ Con_Printf ("CL_SendCmd: lost server connection\n");
+ CL_Disconnect ();
+ }
+ }
}
}
#endif
if (!NET_CanSendMessage (cls.netcon))
{
Con_DPrintf ("CL_WriteToServer: can't send\n");
+ if (developer.integer)
+ SZ_HexDumpToConsole(&cls.message);
return;
}