cvar_t cl_explosions_lifetime = {CVAR_SAVE, "cl_explosions_lifetime", "0.5"};
cvar_t cl_stainmaps = {CVAR_SAVE, "cl_stainmaps", "1"};
+cvar_t cl_stainmapsclearonload = {CVAR_SAVE, "cl_stainmapsclearonload", "0"};
cvar_t cl_beams_polygons = {CVAR_SAVE, "cl_beams_polygons", "1"};
cvar_t cl_beams_relative = {CVAR_SAVE, "cl_beams_relative", "1"};
// LordHavoc: have to set up the baseline info for alpha and other stuff
for (i = 0;i < cl_max_entities;i++)
{
- ClearStateToDefault(&cl_entities[i].state_baseline);
- ClearStateToDefault(&cl_entities[i].state_previous);
- ClearStateToDefault(&cl_entities[i].state_current);
+ cl_entities[i].state_baseline = defaultstate;
+ cl_entities[i].state_previous = defaultstate;
+ cl_entities[i].state_current = defaultstate;
}
CL_CGVM_Clear();
// 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)
{
// blend the matrices
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)
{
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;
}
R_LerpAnimation(&e->render);
if (e->state_previous.active && e->state_previous.modelindex == e->state_current.modelindex)
{
if (e->render.flags & RENDER_GLOWTRAIL)
- CL_RocketTrail2(e->persistent.trail_origin, origin, e->state_current.glowcolor, e);
- else if (trailtype >= 0)
- CL_RocketTrail(e->persistent.trail_origin, origin, trailtype, e);
+ 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)
Matrix4x4_CreateIdentity(&ent->render.matrix);
Matrix4x4_CreateIdentity(&ent->render.inversematrix);
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_refdef.entities[r_refdef.numentities++] = &e->render;
}
}
ent = &cl.viewent;
ent->state_previous = ent->state_current;
- ClearStateToDefault(&ent->state_current);
+ ent->state_current = defaultstate;
ent->state_current.time = cl.time;
ent->state_current.number = -1;
ent->state_current.active = true;
// if coming from the player, update the start position
//if (b->entity == cl.viewentity)
// VectorCopy (cl_entities[cl.viewentity].render.origin, b->start);
- if (cl_beams_relative.integer && b->entity && cl_entities[b->entity].state_current.active && b->relativestartvalid)
+ if (cl_beams_relative.integer && b->entity == cl.viewentity && b->entity && cl_entities[b->entity].state_current.active && b->relativestartvalid)
{
entity_state_t *p = &cl_entities[b->entity].state_previous;
//entity_state_t *c = &cl_entities[b->entity].state_current;
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;
Cvar_RegisterVariable(&cl_explosions_size_end);
Cvar_RegisterVariable(&cl_explosions_lifetime);
Cvar_RegisterVariable(&cl_stainmaps);
+ Cvar_RegisterVariable(&cl_stainmapsclearonload);
Cvar_RegisterVariable(&cl_beams_polygons);
Cvar_RegisterVariable(&cl_beams_relative);
Cvar_RegisterVariable(&cl_beams_lightatend);