]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_main.c
replaced host_sleep with cl_maxfps_alwayssleep cvar (requires cl_maxfps)
[xonotic/darkplaces.git] / cl_main.c
index a66560cc3271076aa596c859977fdd13e59c06c4..af8c3103a53c1858cfef06dfbdd2ef12ab3decab 100644 (file)
--- a/cl_main.c
+++ b/cl_main.c
@@ -72,6 +72,8 @@ cvar_t cl_beams_quakepositionhack = {CVAR_SAVE, "cl_beams_quakepositionhack", "1
 cvar_t cl_beams_instantaimhack = {CVAR_SAVE, "cl_beams_instantaimhack", "0", "makes your lightning gun aiming update instantly"};
 cvar_t cl_beams_lightatend = {CVAR_SAVE, "cl_beams_lightatend", "0", "make a light at the end of the beam"};
 
+cvar_t cl_deathfade = {CVAR_SAVE, "cl_deathfade", "0", "fade screen to dark red when dead, value = how fast the fade is"};
+
 cvar_t cl_noplayershadow = {CVAR_SAVE, "cl_noplayershadow", "0","hide player shadow"};
 
 cvar_t cl_dlights_decayradius = {CVAR_SAVE, "cl_dlights_decayradius", "1", "reduces size of light flashes over time"};
@@ -441,7 +443,7 @@ static void CL_PrintEntities_f(void)
                        modelname = ent->render.model->name;
                else
                        modelname = "--no model--";
-               Con_Printf("%3i: %-25s:%4i (%5i %5i %5i) [%3i %3i %3i] %4.2f %5.3f\n", i, modelname, ent->render.frame2, (int) ent->state_current.origin[0], (int) ent->state_current.origin[1], (int) ent->state_current.origin[2], (int) ent->state_current.angles[0] % 360, (int) ent->state_current.angles[1] % 360, (int) ent->state_current.angles[2] % 360, ent->render.scale, ent->render.alpha);
+               Con_Printf("%3i: %-25s:%4i (%5i %5i %5i) [%3i %3i %3i] %4.2f %5.3f\n", i, modelname, ent->render.framegroupblend[0].frame, (int) ent->state_current.origin[0], (int) ent->state_current.origin[1], (int) ent->state_current.origin[2], (int) ent->state_current.angles[0] % 360, (int) ent->state_current.angles[1] % 360, (int) ent->state_current.angles[2] % 360, ent->render.scale, ent->render.alpha);
        }
 }
 
@@ -461,7 +463,7 @@ static void CL_ModelIndexList_f(void)
 
        while(cl.model_precache[i] && i != MAX_MODELS)
        { // Valid Model
-               if(cl.model_precache[i]->loaded || cl.model_precache[i]->isworldmodel)
+               if(cl.model_precache[i]->loaded || i == 1)
                        Con_Printf("%3i: %-30s %-8s %-10i\n", i, cl.model_precache[i]->name, cl.model_precache[i]->modeldatatypestring, cl.model_precache[i]->surfmesh.num_triangles);
                else
                        Con_Printf("%3i: %-30s %-30s\n", i, cl.model_precache[i]->name, "--no local model found--");
@@ -487,32 +489,13 @@ static void CL_SoundIndexList_f(void)
        }
 }
 
-static void CL_UpdateRenderEntity_Lighting(entity_render_t *ent)
-{
-       vec3_t tempdiffusenormal;
-
-       // fetch the lighting from the worldmodel data
-       VectorSet(ent->modellight_ambient, r_refdef.scene.ambient * (2.0f / 128.0f), r_refdef.scene.ambient * (2.0f / 128.0f), r_refdef.scene.ambient * (2.0f / 128.0f));
-       VectorClear(ent->modellight_diffuse);
-       VectorClear(tempdiffusenormal);
-       if ((ent->flags & RENDER_LIGHT) && cl.worldmodel && cl.worldmodel->brush.LightPoint)
-       {
-               vec3_t org;
-               Matrix4x4_OriginFromMatrix(&ent->matrix, org);
-               cl.worldmodel->brush.LightPoint(cl.worldmodel, org, ent->modellight_ambient, ent->modellight_diffuse, tempdiffusenormal);
-       }
-       else // highly rare
-               VectorSet(ent->modellight_ambient, 1, 1, 1);
-
-       // move the light direction into modelspace coordinates for lighting code
-       Matrix4x4_Transform3x3(&ent->inversematrix, tempdiffusenormal, ent->modellight_lightdir);
-       if(VectorLength2(ent->modellight_lightdir) <= 0)
-               VectorSet(ent->modellight_lightdir, 0, 0, 1); // have to set SOME valid vector here
-       VectorNormalize(ent->modellight_lightdir);
-}
+/*
+===============
+CL_UpdateRenderEntity
 
-//static const vec3_t nomodelmins = {-16, -16, -16};
-//static const vec3_t nomodelmaxs = {16, 16, 16};
+Updates inversematrix, animation interpolation factors, scale, and mins/maxs
+===============
+*/
 void CL_UpdateRenderEntity(entity_render_t *ent)
 {
        vec3_t org;
@@ -564,7 +547,6 @@ void CL_UpdateRenderEntity(entity_render_t *ent)
                ent->maxs[1] = org[1] + 16;
                ent->maxs[2] = org[2] + 16;
        }
-       CL_UpdateRenderEntity_Lighting(ent);
 }
 
 /*
@@ -613,6 +595,7 @@ entity_render_t *CL_NewTempEntity(double shadertime)
        render->shadertime = shadertime;
        render->alpha = 1;
        VectorSet(render->colormod, 1, 1, 1);
+       VectorSet(render->glowmod, 1, 1, 1);
        return render;
 }
 
@@ -758,6 +741,16 @@ void CL_RelinkLightFlashes(void)
                }
        }
 
+       if (!cl.lightstyle)
+       {
+               for (j = 0;j < cl.max_lightstyle;j++)
+               {
+                       r_refdef.scene.rtlightstylevalue[j] = 1;
+                       r_refdef.scene.lightstylevalue[j] = 256;
+               }
+               return;
+       }
+
 // light animations
 // 'm' is normal light, 'a' is no light, 'z' is double bright
        f = cl.time * 10;
@@ -765,7 +758,7 @@ void CL_RelinkLightFlashes(void)
        frac = f - i;
        for (j = 0;j < cl.max_lightstyle;j++)
        {
-               if (!cl.lightstyle || !cl.lightstyle[j].length)
+               if (!cl.lightstyle[j].length)
                {
                        r_refdef.scene.rtlightstylevalue[j] = 1;
                        r_refdef.scene.lightstylevalue[j] = 256;
@@ -787,39 +780,40 @@ void CL_RelinkLightFlashes(void)
 
 void CL_AddQWCTFFlagModel(entity_t *player, int skin)
 {
+       int frame = player->render.framegroupblend[0].frame;
        float f;
        entity_render_t *flagrender;
        matrix4x4_t flagmatrix;
 
        // this code taken from QuakeWorld
        f = 14;
-       if (player->render.frame2 >= 29 && player->render.frame2 <= 40)
+       if (frame >= 29 && frame <= 40)
        {
-               if (player->render.frame2 >= 29 && player->render.frame2 <= 34)
+               if (frame >= 29 && frame <= 34)
                { //axpain
-                       if      (player->render.frame2 == 29) f = f + 2;
-                       else if (player->render.frame2 == 30) f = f + 8;
-                       else if (player->render.frame2 == 31) f = f + 12;
-                       else if (player->render.frame2 == 32) f = f + 11;
-                       else if (player->render.frame2 == 33) f = f + 10;
-                       else if (player->render.frame2 == 34) f = f + 4;
+                       if      (frame == 29) f = f + 2;
+                       else if (frame == 30) f = f + 8;
+                       else if (frame == 31) f = f + 12;
+                       else if (frame == 32) f = f + 11;
+                       else if (frame == 33) f = f + 10;
+                       else if (frame == 34) f = f + 4;
                }
-               else if (player->render.frame2 >= 35 && player->render.frame2 <= 40)
+               else if (frame >= 35 && frame <= 40)
                { // pain
-                       if      (player->render.frame2 == 35) f = f + 2;
-                       else if (player->render.frame2 == 36) f = f + 10;
-                       else if (player->render.frame2 == 37) f = f + 10;
-                       else if (player->render.frame2 == 38) f = f + 8;
-                       else if (player->render.frame2 == 39) f = f + 4;
-                       else if (player->render.frame2 == 40) f = f + 2;
+                       if      (frame == 35) f = f + 2;
+                       else if (frame == 36) f = f + 10;
+                       else if (frame == 37) f = f + 10;
+                       else if (frame == 38) f = f + 8;
+                       else if (frame == 39) f = f + 4;
+                       else if (frame == 40) f = f + 2;
                }
        }
-       else if (player->render.frame2 >= 103 && player->render.frame2 <= 118)
+       else if (frame >= 103 && frame <= 118)
        {
-               if      (player->render.frame2 >= 103 && player->render.frame2 <= 104) f = f + 6;  //nailattack
-               else if (player->render.frame2 >= 105 && player->render.frame2 <= 106) f = f + 6;  //light
-               else if (player->render.frame2 >= 107 && player->render.frame2 <= 112) f = f + 7;  //rocketattack
-               else if (player->render.frame2 >= 112 && player->render.frame2 <= 118) f = f + 7;  //shotattack
+               if      (frame >= 103 && frame <= 104) f = f + 6;  //nailattack
+               else if (frame >= 105 && frame <= 106) f = f + 6;  //light
+               else if (frame >= 107 && frame <= 112) f = f + 7;  //rocketattack
+               else if (frame >= 112 && frame <= 118) f = f + 7;  //shotattack
        }
        // end of code taken from QuakeWorld
 
@@ -831,6 +825,7 @@ void CL_AddQWCTFFlagModel(entity_t *player, int skin)
        flagrender->skinnum = skin;
        flagrender->alpha = 1;
        VectorSet(flagrender->colormod, 1, 1, 1);
+       VectorSet(flagrender->glowmod, 1, 1, 1);
        // attach the flag to the player matrix
        Matrix4x4_CreateFromQuakeEntity(&flagmatrix, -f, -22, 0, 0, 0, -45, 1);
        Matrix4x4_Concat(&flagrender->matrix, &player->render.matrix, &flagmatrix);
@@ -884,6 +879,7 @@ void CL_UpdateNetworkEntity(entity_t *e, int recursionlimit, qboolean interpolat
        e->render.flags = e->state_current.flags;
        e->render.effects = e->state_current.effects;
        VectorScale(e->state_current.colormod, (1.0f / 32.0f), e->render.colormod);
+       VectorScale(e->state_current.glowmod, (1.0f / 32.0f), e->render.glowmod);
        if(e >= cl.entities && e < cl.entities + cl.num_entities)
                e->render.entitynumber = e - cl.entities;
        else
@@ -917,10 +913,10 @@ void CL_UpdateNetworkEntity(entity_t *e, int recursionlimit, qboolean interpolat
                {
                        // blend the matrices
                        memset(&blendmatrix, 0, sizeof(blendmatrix));
-                       for (j = 0;j < 4 && t->render.frameblend[j].lerp > 0;j++)
+                       for (j = 0;j < MAX_FRAMEBLENDS && t->render.frameblend[j].lerp > 0;j++)
                        {
                                matrix4x4_t tagmatrix;
-                               Mod_Alias_GetTagMatrix(model, t->render.frameblend[j].frame, e->state_current.tagindex - 1, &tagmatrix);
+                               Mod_Alias_GetTagMatrix(model, t->render.frameblend[j].subframe, e->state_current.tagindex - 1, &tagmatrix);
                                d = t->render.frameblend[j].lerp;
                                for (l = 0;l < 4;l++)
                                        for (k = 0;k < 4;k++)
@@ -997,7 +993,10 @@ void CL_UpdateNetworkEntity(entity_t *e, int recursionlimit, qboolean interpolat
                if (e->render.model->type == mod_alias)
                        angles[0] = -angles[0];
                if ((e->render.effects & EF_SELECTABLE) && cl.cmd.cursor_entitynumber == e->state_current.number)
+               {
                        VectorScale(e->render.colormod, 2, e->render.colormod);
+                       VectorScale(e->render.glowmod, 2, e->render.glowmod);
+               }
        }
        // if model is alias or this is a tenebrae-like dlight, reverse pitch direction
        else if (e->state_current.lightpflags & PFLAGS_FULLDYNAMIC)
@@ -1011,27 +1010,29 @@ void CL_UpdateNetworkEntity(entity_t *e, int recursionlimit, qboolean interpolat
        }
 
        // animation lerp
-       if (e->render.frame2 == frame)
+       if (e->render.framegroupblend[0].frame == frame)
        {
                // update frame lerp fraction
-               e->render.framelerp = 1;
-               if (e->render.frame2time > e->render.frame1time)
+               e->render.framegroupblend[0].lerp = 1;
+               e->render.framegroupblend[1].lerp = 0;
+               if (e->render.framegroupblend[0].start > e->render.framegroupblend[1].start)
                {
                        // 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.framelerp = (cl.time - e->render.frame2time) / min(e->render.frame2time - e->render.frame1time, 0.1);
-                       e->render.framelerp = bound(0, e->render.framelerp, 1);
+                       e->render.framegroupblend[0].lerp = (cl.time - e->render.framegroupblend[0].start) / min(e->render.framegroupblend[0].start - e->render.framegroupblend[1].start, 0.1);
+                       e->render.framegroupblend[0].lerp = bound(0, e->render.framegroupblend[0].lerp, 1);
+                       e->render.framegroupblend[1].lerp = 1 - e->render.framegroupblend[0].lerp;
                }
        }
        else
        {
                // begin a new frame lerp
-               e->render.frame1 = e->render.frame2;
-               e->render.frame1time = e->render.frame2time;
-               e->render.frame2 = frame;
-               e->render.frame2time = cl.time;
-               e->render.framelerp = 0;
+               e->render.framegroupblend[1] = e->render.framegroupblend[0];
+               e->render.framegroupblend[1].lerp = 1;
+               e->render.framegroupblend[0].frame = frame;
+               e->render.framegroupblend[0].start = cl.time;
+               e->render.framegroupblend[0].lerp = 0;
        }
 
        // set up the render matrix
@@ -1246,7 +1247,7 @@ void CL_UpdateViewModel(void)
        ent->state_previous = ent->state_current;
        ent->state_current = defaultstate;
        ent->state_current.time = cl.time;
-       ent->state_current.number = -1;
+       ent->state_current.number = (unsigned short)-1;
        ent->state_current.active = true;
        ent->state_current.modelindex = cl.stats[STAT_WEAPON];
        ent->state_current.frame = cl.stats[STAT_WEAPONFRAME];
@@ -1266,9 +1267,9 @@ void CL_UpdateViewModel(void)
        // reset animation interpolation on weaponmodel if model changed
        if (ent->state_previous.modelindex != ent->state_current.modelindex)
        {
-               ent->render.frame1 = ent->render.frame2 = ent->state_current.frame;
-               ent->render.frame1time = ent->render.frame2time = cl.time;
-               ent->render.framelerp = 1;
+               ent->render.framegroupblend[0].frame = ent->render.framegroupblend[1].frame = ent->state_current.frame;
+               ent->render.framegroupblend[0].start = ent->render.framegroupblend[1].start = cl.time;
+               ent->render.framegroupblend[0].lerp = 1;ent->render.framegroupblend[1].lerp = 0;
        }
        CL_UpdateNetworkEntity(ent, 32, true);
 }
@@ -1359,7 +1360,7 @@ void CL_LinkNetworkEntity(entity_t *e)
                trace_t trace;
                matrix4x4_t tempmatrix;
                Matrix4x4_Transform(&e->render.matrix, muzzleflashorigin, v2);
-               trace = CL_Move(origin, vec3_origin, vec3_origin, v2, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, true, false, NULL, false);
+               trace = CL_TraceLine(origin, v2, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, true, false, NULL, false);
                Matrix4x4_Normalize(&tempmatrix, &e->render.matrix);
                Matrix4x4_SetOrigin(&tempmatrix, trace.endpos[0], trace.endpos[1], trace.endpos[2]);
                Matrix4x4_Scale(&tempmatrix, 150, 1);
@@ -1452,6 +1453,7 @@ void CL_RelinkWorld(void)
        if (!r_fullbright.integer)
                ent->render.flags |= RENDER_LIGHT;
        VectorSet(ent->render.colormod, 1, 1, 1);
+       VectorSet(ent->render.glowmod, 1, 1, 1);
        CL_UpdateRenderEntity(&ent->render);
        r_refdef.scene.worldentity = &ent->render;
        r_refdef.scene.worldmodel = cl.worldmodel;
@@ -1474,6 +1476,7 @@ static void CL_RelinkStaticEntities(void)
                if (!(e->render.effects & (EF_NOSHADOW | EF_ADDITIVE | EF_NODEPTHTEST)) && (e->render.alpha >= 1))
                        e->render.flags |= RENDER_SHADOW;
                VectorSet(e->render.colormod, 1, 1, 1);
+               VectorSet(e->render.glowmod, 1, 1, 1);
                R_LerpAnimation(&e->render);
                CL_UpdateRenderEntity(&e->render);
                r_refdef.scene.entities[r_refdef.scene.numentities++] = &e->render;
@@ -1537,13 +1540,21 @@ static void CL_RelinkEffects(void)
                        if (r_draweffects.integer && (entrender = CL_NewTempEntity(e->starttime)))
                        {
                                // interpolation stuff
-                               entrender->frame1 = intframe;
-                               entrender->frame2 = intframe + 1;
-                               if (entrender->frame2 >= e->endframe)
-                                       entrender->frame2 = -1; // disappear
-                               entrender->framelerp = frame - intframe;
-                               entrender->frame1time = e->frame1time;
-                               entrender->frame2time = e->frame2time;
+                               entrender->framegroupblend[0].frame = intframe;
+                               entrender->framegroupblend[0].lerp = 1 - frame - intframe;
+                               entrender->framegroupblend[0].start = e->frame1time;
+                               if (intframe + 1 >= e->endframe)
+                               {
+                                       entrender->framegroupblend[1].frame = 0; // disappear
+                                       entrender->framegroupblend[1].lerp = 0;
+                                       entrender->framegroupblend[1].start = 0;
+                               }
+                               else
+                               {
+                                       entrender->framegroupblend[1].frame = intframe + 1;
+                                       entrender->framegroupblend[1].lerp = frame - intframe;
+                                       entrender->framegroupblend[1].start = e->frame2time;
+                               }
 
                                // normal stuff
                                if(e->modelindex < MAX_MODELS)
@@ -1552,6 +1563,7 @@ static void CL_RelinkEffects(void)
                                        entrender->model = cl.csqc_model_precache[-(e->modelindex+1)];
                                entrender->alpha = 1;
                                VectorSet(entrender->colormod, 1, 1, 1);
+                               VectorSet(entrender->glowmod, 1, 1, 1);
 
                                Matrix4x4_CreateFromQuakeEntity(&entrender->matrix, e->origin[0], e->origin[1], e->origin[2], 0, 0, 0, 1);
                                CL_UpdateRenderEntity(entrender);
@@ -1698,6 +1710,7 @@ static void CL_RelinkQWNails(void)
                entrender->model = cl.model_precache[cl.qw_modelindex_spike];
                entrender->alpha = 1;
                VectorSet(entrender->colormod, 1, 1, 1);
+               VectorSet(entrender->glowmod, 1, 1, 1);
 
                Matrix4x4_CreateFromQuakeEntity(&entrender->matrix, v[0], v[1], v[2], v[3], v[4], v[5], 1);
                CL_UpdateRenderEntity(entrender);
@@ -1924,9 +1937,10 @@ void CL_Locs_FreeNode(cl_locnode_t *node)
                {
                        *pointer = node->next;
                        Mem_Free(node);
+                       return;
                }
        }
-       Con_Printf("CL_Locs_FreeNode: no such node! (%p)\n", node);
+       Con_Printf("CL_Locs_FreeNode: no such node! (%p)\n", (void *)node);
 }
 
 void CL_Locs_AddNode(vec3_t mins, vec3_t maxs, const char *name)
@@ -2246,6 +2260,7 @@ void CL_Init (void)
        Cvar_RegisterVariable (&cl_anglespeedkey);
        Cvar_RegisterVariable (&cl_shownet);
        Cvar_RegisterVariable (&cl_nolerp);
+       Cvar_RegisterVariable (&cl_deathfade);
        Cvar_RegisterVariable (&lookspring);
        Cvar_RegisterVariable (&lookstrafe);
        Cvar_RegisterVariable (&sensitivity);