]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_main.c
added r_rtworld, r_rtworldshadows, r_rtdlight, r_rtdlightshadows, and r_lightmapinten...
[xonotic/darkplaces.git] / cl_main.c
index 75e5d57c5493dbf3547d341365794de7a42a8373..88151231be0e70853d265a5d6b69e7ef58b8cc1b 100644 (file)
--- a/cl_main.c
+++ b/cl_main.c
@@ -53,6 +53,7 @@ cvar_t cl_explosions_size_end = {CVAR_SAVE, "cl_explosions_size_end", "128"};
 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"};
@@ -145,9 +146,9 @@ void CL_ClearState(void)
        // 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();
@@ -512,6 +513,17 @@ void CL_LinkNetworkEntity(entity_t *e)
                // 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)
@@ -534,7 +546,10 @@ void CL_LinkNetworkEntity(entity_t *e)
                        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
@@ -553,19 +568,6 @@ void CL_LinkNetworkEntity(entity_t *e)
                                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)
                {
@@ -634,6 +636,9 @@ void CL_LinkNetworkEntity(entity_t *e)
                                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);
@@ -836,28 +841,33 @@ void CL_LinkNetworkEntity(entity_t *e)
                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) || 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)
@@ -903,7 +913,7 @@ static void CL_RelinkNetworkEntities(void)
 
        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;
@@ -1007,7 +1017,7 @@ void CL_RelinkBeams(void)
                // 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;
@@ -1087,7 +1097,7 @@ void CL_RelinkBeams(void)
                                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;
@@ -1324,6 +1334,7 @@ void CL_Init (void)
        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);