Con_DPrintf("CL_Disconnect\n");
// stop sounds (especially looping!)
- S_StopAllSounds (true);
+ S_StopAllSounds ();
// clear contents blends
cl.cshifts[0].percent = 0;
return;
// clear menu's connect error message
- m_return_reason[0] = 0;
+ M_Update_Return_Reason("");
cls.demonum = -1;
// stop demo loop in case this fails
cls.connect_trying = true;
cls.connect_remainingtries = 3;
cls.connect_nextsendtime = 0;
+ M_Update_Return_Reason("Trying to connect...");
if (sv.active)
{
NetConn_ClientFrame();
else
{
Con_Print("Unable to find a suitable network socket to connect to server.\n");
- strcpy(m_return_reason, "No network");
+ M_Update_Return_Reason("No network");
}
}
// skip inactive entities and world
if (!e->state_current.active || e == cl_entities)
return;
+ e->render.alpha = e->state_current.alpha * (1.0f / 255.0f); // FIXME: interpolate?
+ e->render.scale = e->state_current.scale * (1.0f / 16.0f); // FIXME: interpolate?
+ e->render.flags = e->state_current.flags;
+ e->render.effects = e->state_current.effects;
+ if (e->state_current.flags & RENDER_COLORMAPPED)
+ e->render.colormap = e->state_current.colormap;
+ else if (cl.scores != NULL && e->state_current.colormap)
+ e->render.colormap = cl.scores[e->state_current.colormap - 1].colors; // color it
+ else
+ e->render.colormap = -1; // no special coloring
+ e->render.skinnum = e->state_current.skin;
if (e->render.flags & RENDER_VIEWMODEL)
{
if (!r_drawviewmodel.integer || chase_active.integer || envmap)
if (e == &cl.viewent && cl.viewentity >= 0 && cl.viewentity < MAX_EDICTS && cl_entities[cl.viewentity].state_current.active)
{
e->state_current.alpha = cl_entities[cl.viewentity].state_current.alpha;
- e->state_current.effects = EF_NOSHADOW | (cl_entities[cl.viewentity].state_current.effects & (EF_ADDITIVE | EF_REFLECTIVE | EF_FULLBRIGHT));
+ e->state_current.effects = EF_NOSHADOW | (cl_entities[cl.viewentity].state_current.effects & (EF_ADDITIVE | EF_REFLECTIVE | EF_FULLBRIGHT | EF_NODEPTHTEST));
}
}
else
CL_LinkNetworkEntity(t);
// make relative to the entity
matrix = &t->render.matrix;
+ // some properties of the tag entity carry over
+ e->render.flags |= t->render.flags & RENDER_EXTERIORMODEL;
// if a valid tagindex is used, make it relative to that tag instead
// FIXME: use a model function to get tag info (need to handle skeletal)
if (e->state_current.tagentity && e->state_current.tagindex >= 1 && (model = t->render.model) && e->state_current.tagindex <= t->render.model->alias.aliasnum_tags)
matrix = &tempmatrix;
}
}
- e->render.alpha = e->state_current.alpha * (1.0f / 255.0f); // FIXME: interpolate?
- e->render.scale = e->state_current.scale * (1.0f / 16.0f); // FIXME: interpolate?
- e->render.flags = e->state_current.flags;
- if (e - cl_entities == cl.viewentity)
- e->render.flags |= RENDER_EXTERIORMODEL;
- e->render.effects = e->state_current.effects;
- if (e->state_current.flags & RENDER_COLORMAPPED)
- e->render.colormap = e->state_current.colormap;
- else if (cl.scores != NULL && e->state_current.colormap)
- e->render.colormap = cl.scores[e->state_current.colormap - 1].colors; // color it
- else
- e->render.colormap = -1; // no special coloring
- e->render.skinnum = e->state_current.skin;
- // set up the render matrix
- if (e->state_previous.active && e->state_current.modelindex == e->state_previous.modelindex)
+
+ // movement lerp
+ if (e->persistent.lerpdeltatime > 0 && (lerp = (cl.time - e->persistent.lerpstarttime) / e->persistent.lerpdeltatime) < 1)
{
- // movement lerp
- if (e->persistent.lerpdeltatime > 0 && (lerp = (cl.time - e->persistent.lerpstarttime) / e->persistent.lerpdeltatime) < 1)
- {
- // interpolate the origin and angles
- VectorLerp(e->persistent.oldorigin, lerp, e->persistent.neworigin, origin);
- VectorSubtract(e->persistent.newangles, e->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(e->persistent.oldangles, lerp, delta, angles);
- }
- else
- {
- // no interpolation
- VectorCopy(e->persistent.neworigin, origin);
- VectorCopy(e->persistent.newangles, angles);
- }
- // animation lerp
- if (e->render.frame2 == e->state_current.frame)
- {
- // update frame lerp fraction
- e->render.framelerp = 1;
- if (e->render.frame2time > e->render.frame1time)
- {
- e->render.framelerp = (cl.time - e->render.frame2time) / (e->render.frame2time - e->render.frame1time);
- e->render.framelerp = bound(0, e->render.framelerp, 1);
- }
- }
- else
- {
- // begin a new frame lerp
- e->render.frame1 = e->render.frame2;
- e->render.frame1time = e->render.frame2time;
- e->render.frame = e->render.frame2 = e->state_current.frame;
- e->render.frame2time = cl.time;
- e->render.framelerp = 0;
- // make sure frame lerp won't last longer than 100ms
- // (this mainly helps with models that use framegroups and
- // switch between them infrequently)
- e->render.frame1time = max(e->render.frame1time, e->render.frame2time - 0.1f);
- }
+ // interpolate the origin and angles
+ VectorLerp(e->persistent.oldorigin, lerp, e->persistent.neworigin, origin);
+ VectorSubtract(e->persistent.newangles, e->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(e->persistent.oldangles, lerp, delta, angles);
}
else
{
// no interpolation
VectorCopy(e->persistent.neworigin, origin);
VectorCopy(e->persistent.newangles, angles);
- e->render.frame = e->render.frame1 = e->render.frame2 = e->state_current.frame;
- e->render.frame1time = e->render.frame2time = cl.time;
- e->render.framelerp = 1;
}
+ // model setup and some modelflags
e->render.model = cl.model_precache[e->state_current.modelindex];
if (e->render.model)
{
if (cl_itembobheight.value)
origin[2] += (cos(cl.time * cl_itembobspeed.value * (2.0 * M_PI)) + 1.0) * 0.5 * cl_itembobheight.value;
}
+ // transfer certain model flags to effects
+ if (e->render.model->flags2 & EF_FULLBRIGHT)
+ e->render.effects |= EF_FULLBRIGHT;
}
+ // animation lerp
+ if (e->render.frame2 == e->state_current.frame)
+ {
+ // update frame lerp fraction
+ e->render.framelerp = 1;
+ if (e->render.frame2time > e->render.frame1time)
+ {
+ e->render.framelerp = (cl.time - e->render.frame2time) / (e->render.frame2time - e->render.frame1time);
+ e->render.framelerp = bound(0, e->render.framelerp, 1);
+ }
+ }
+ else
+ {
+ // begin a new frame lerp
+ e->render.frame1 = e->render.frame2;
+ e->render.frame1time = e->render.frame2time;
+ e->render.frame = e->render.frame2 = e->state_current.frame;
+ e->render.frame2time = cl.time;
+ e->render.framelerp = 0;
+ // make sure frame lerp won't last longer than 100ms
+ // (this mainly helps with models that use framegroups and
+ // switch between them infrequently)
+ e->render.frame1time = max(e->render.frame1time, e->render.frame2time - 0.1f);
+ }
R_LerpAnimation(&e->render);
+ // set up the render matrix
// FIXME: e->render.scale should go away
Matrix4x4_CreateFromQuakeEntity(&matrix2, origin[0], origin[1], origin[2], angles[0], angles[1], angles[2], e->render.scale);
// concat the matrices to make the entity relative to its tag
light[3] = 350;
CL_AllocDlight(&e->render, &e->render.matrix, light[3], light[0], light[1], light[2], 0, 0, e->state_current.skin, e->state_current.lightstyle, !(e->state_current.lightpflags & PFLAGS_NOSHADOW), (e->state_current.lightpflags & PFLAGS_CORONA) != 0);
}
- // trails need the previous frame
- if (e->state_previous.active && e->state_previous.modelindex == e->state_current.modelindex)
- {
- if (e->render.flags & RENDER_GLOWTRAIL)
- trailtype = 9;
- if (trailtype >= 0)
- CL_RocketTrail(e->persistent.trail_origin, origin, trailtype, e->state_current.glowcolor, e);
- }
+ // do trails
+ if (e->render.flags & RENDER_GLOWTRAIL)
+ trailtype = 9;
+ if (trailtype >= 0)
+ CL_RocketTrail(e->persistent.trail_origin, origin, trailtype, e->state_current.glowcolor, e);
VectorCopy(origin, e->persistent.trail_origin);
- // note: the cl.viewentity and intermission check is to hide player
- // shadow during intermission and during the Nehahra movie and
- // Nehahra cinematics
- if (!(e->render.effects & (EF_NOSHADOW | EF_ADDITIVE))
- && (e->render.alpha == 1)
- && !(e->render.flags & RENDER_VIEWMODEL)
- && ((e - cl_entities) != cl.viewentity || (!cl.intermission && cl.protocol != PROTOCOL_NEHAHRAMOVIE && !cl_noplayershadow.integer)))
- e->render.flags |= RENDER_SHADOW;
- if (!(e->render.effects & EF_FULLBRIGHT))
+ // tenebrae's sprites are all additive mode (weird)
+ if (gamemode == GAME_TENEBRAE && e->render.model && e->render.model->type == mod_sprite)
+ e->render.effects |= EF_ADDITIVE;
+ // player model is only shown with chase_active on
+ if (e - cl_entities == cl.viewentity)
+ e->render.flags |= RENDER_EXTERIORMODEL;
+ // transparent stuff can't be lit during the opaque stage
+ if (e->render.effects & (EF_ADDITIVE | EF_NODEPTHTEST) || e->render.alpha < 1)
+ e->render.flags |= RENDER_TRANSPARENT;
+ // either fullbright or lit
+ if (!(e->render.effects & EF_FULLBRIGHT) && !r_fullbright.integer)
e->render.flags |= RENDER_LIGHT;
+ // hide player shadow during intermission or nehahra movie
+ if (!(e->render.effects & EF_NOSHADOW)
+ && !(e->render.flags & (RENDER_VIEWMODEL | RENDER_TRANSPARENT))
+ && (!(e->render.flags & RENDER_EXTERIORMODEL) || (!cl.intermission && cl.protocol != PROTOCOL_NEHAHRAMOVIE && !cl_noplayershadow.integer)))
+ e->render.flags |= RENDER_SHADOW;
// as soon as player is known we can call V_CalcRefDef
if ((e - cl_entities) == cl.viewentity)
V_CalcRefdef();
if (e->render.model && e->render.model->name[0] == '*' && e->render.model->TraceBox)
cl_brushmodel_entities[cl_num_brushmodel_entities++] = &e->render;
- if (gamemode == GAME_TENEBRAE && e->render.model && e->render.model->type == mod_sprite)
- e->render.effects |= EF_ADDITIVE;
// don't show entities with no modelindex (note: this still shows
// entities which have a modelindex that resolved to a NULL model)
if (e->render.model && !(e->render.effects & EF_NODRAW) && r_refdef.numentities < r_refdef.maxentities)
// FIXME: this should be done at load
Matrix4x4_CreateIdentity(&ent->render.matrix);
Matrix4x4_CreateIdentity(&ent->render.inversematrix);
+ R_LerpAnimation(&ent->render);
CL_BoundingBoxForEntity(&ent->render);
+ ent->render.flags = RENDER_SHADOW;
+ if (!r_fullbright.integer)
+ ent->render.flags |= RENDER_LIGHT;
}
static void CL_RelinkStaticEntities(void)
{
int i;
- for (i = 0;i < cl_num_static_entities && r_refdef.numentities < r_refdef.maxentities;i++)
+ entity_t *e;
+ for (i = 0, e = cl_static_entities;i < cl_num_static_entities && r_refdef.numentities < r_refdef.maxentities;i++, e++)
{
- Mod_CheckLoaded(cl_static_entities[i].render.model);
- r_refdef.entities[r_refdef.numentities++] = &cl_static_entities[i].render;
+ Mod_CheckLoaded(e->render.model);
+ e->render.flags = 0;
+ // transparent stuff can't be lit during the opaque stage
+ if (e->render.effects & (EF_ADDITIVE | EF_NODEPTHTEST) || e->render.alpha < 1)
+ e->render.flags |= RENDER_TRANSPARENT;
+ // either fullbright or lit
+ if (!(e->render.effects & EF_FULLBRIGHT) && !r_fullbright.integer)
+ e->render.flags |= RENDER_LIGHT;
+ // hide player shadow during intermission or nehahra movie
+ if (!(e->render.effects & EF_NOSHADOW) && !(e->render.flags & RENDER_TRANSPARENT))
+ e->render.flags |= RENDER_SHADOW;
+ R_LerpAnimation(&e->render);
+ r_refdef.entities[r_refdef.numentities++] = &e->render;
}
}
Matrix4x4_CreateFromQuakeEntity(&ent->render.matrix, e->origin[0], e->origin[1], e->origin[2], 0, 0, 0, 1);
Matrix4x4_Invert_Simple(&ent->render.inversematrix, &ent->render.matrix);
+ R_LerpAnimation(&ent->render);
CL_BoundingBoxForEntity(&ent->render);
}
}
return;
//VectorCopy (org, ent->render.origin);
ent->render.model = b->model;
- ent->render.effects = EF_FULLBRIGHT;
+ //ent->render.effects = EF_FULLBRIGHT;
//ent->render.angles[0] = pitch;
//ent->render.angles[1] = yaw;
//ent->render.angles[2] = rand()%360;
Matrix4x4_CreateFromQuakeEntity(&ent->render.matrix, org[0], org[1], org[2], -pitch, yaw, lhrandom(0, 360), 1);
Matrix4x4_Invert_Simple(&ent->render.inversematrix, &ent->render.matrix);
+ R_LerpAnimation(&ent->render);
CL_BoundingBoxForEntity(&ent->render);
VectorMA(org, 30, dist, org);
d -= 30;