]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_main.c
Add full support for csqc's sensitivityscale (no clamping yet, so you can actually...
[xonotic/darkplaces.git] / cl_main.c
index 5f809935cb3b72269cb4be570156eb315c6ea9f6..66d68acf4a7d595dc418f0b0298097c1195122f6 100644 (file)
--- a/cl_main.c
+++ b/cl_main.c
@@ -21,6 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #include "quakedef.h"
 #include "cl_collision.h"
+#include "cl_gecko.h"
 #include "cl_video.h"
 #include "image.h"
 #include "csprogs.h"
@@ -63,7 +64,7 @@ cvar_t cl_explosions_size_start = {CVAR_SAVE, "cl_explosions_size_start", "16","
 cvar_t cl_explosions_size_end = {CVAR_SAVE, "cl_explosions_size_end", "128","ending alpha of an explosion shell (just before it disappears)"};
 cvar_t cl_explosions_lifetime = {CVAR_SAVE, "cl_explosions_lifetime", "0.5","how long an explosion shell lasts"};
 
-cvar_t cl_stainmaps = {CVAR_SAVE, "cl_stainmaps", "1","stains lightmaps, much faster than decals but blurred"};
+cvar_t cl_stainmaps = {CVAR_SAVE, "cl_stainmaps", "0","stains lightmaps, much faster than decals but blurred"};
 cvar_t cl_stainmaps_clearonload = {CVAR_SAVE, "cl_stainmaps_clearonload", "1","clear stainmaps on map restart"};
 
 cvar_t cl_beams_polygons = {CVAR_SAVE, "cl_beams_polygons", "1","use beam polygons instead of models"};
@@ -89,6 +90,7 @@ client_static_t       cls;
 client_state_t cl;
 
 #define MAX_PARTICLES                  32768   // default max # of particles at one time
+#define MAX_DECALS                             32768   // default max # of decals at one time
 #define ABSOLUTE_MIN_PARTICLES 512             // no fewer than this no matter what's on the command line
 
 /*
@@ -110,6 +112,7 @@ void CL_ClearState(void)
 
        // reset the view zoom interpolation
        cl.mviewzoom[0] = cl.mviewzoom[1] = 1;
+       cl.sensitivityscale = 1.0f;
 
        // enable rendering of the world and such
        cl.csqc_vidvars.drawworld = true;
@@ -134,6 +137,8 @@ void CL_ClearState(void)
        cl.max_lightstyle = MAX_LIGHTSTYLES;
        cl.max_brushmodel_entities = MAX_EDICTS;
        cl.max_particles = MAX_PARTICLES;
+       cl.max_decals = MAX_DECALS;
+       cl.max_showlmps = 0;
 
 // COMMANDLINEOPTION: Client: -particles <number> changes maximum number of particles at once, default 32768
        i = COM_CheckParm ("-particles");
@@ -158,6 +163,8 @@ void CL_ClearState(void)
        cl.lightstyle = (lightstyle_t *)Mem_Alloc(cls.levelmempool, cl.max_lightstyle * sizeof(lightstyle_t));
        cl.brushmodel_entities = (int *)Mem_Alloc(cls.levelmempool, cl.max_brushmodel_entities * sizeof(int));
        cl.particles = (particle_t *) Mem_Alloc(cls.levelmempool, cl.max_particles * sizeof(particle_t));
+       cl.decals = (decal_t *) Mem_Alloc(cls.levelmempool, cl.max_decals * sizeof(decal_t));
+       cl.showlmps = NULL;
 
        // LordHavoc: have to set up the baseline info for alpha and other stuff
        for (i = 0;i < cl.max_entities;i++)
@@ -201,6 +208,9 @@ void CL_ClearState(void)
        // mark all frames invalid for delta
        memset(cl.qw_deltasequence, -1, sizeof(cl.qw_deltasequence));
 
+       // set bestweapon data back to Quake data
+       IN_BestWeapon_ResetData();
+
        CL_Screen_NewMap();
 }
 
@@ -756,6 +766,7 @@ void CL_RelinkLightFlashes(void)
        {
                if (!cl.lightstyle || !cl.lightstyle[j].length)
                {
+                       r_refdef.rtlightstylevalue[j] = 1;
                        r_refdef.lightstylevalue[j] = 256;
                        continue;
                }
@@ -763,7 +774,13 @@ void CL_RelinkLightFlashes(void)
                l = (i-1) % cl.lightstyle[j].length;
                k = cl.lightstyle[j].map[k] - 'a';
                l = cl.lightstyle[j].map[l] - 'a';
-               r_refdef.lightstylevalue[j] = (unsigned short)(((k*frac)+(l*(1-frac)))*22);
+               // rtlightstylevalue is always interpolated because it has no bad
+               // consequences for performance
+               // lightstylevalue is subject to a cvar for performance reasons;
+               // skipping lightmap updates on most rendered frames substantially
+               // improves framerates (but makes light fades look bad)
+               r_refdef.rtlightstylevalue[j] = ((k*frac)+(l*(1-frac)))*(22/256.0f);
+               r_refdef.lightstylevalue[j] = r_lerplightstyles.integer ? (unsigned short)(((k*frac)+(l*(1-frac)))*22) : k*22;
        }
 }
 
@@ -855,11 +872,11 @@ void CL_UpdateNetworkEntity(entity_t *e, int recursionlimit, qboolean interpolat
        {
                unsigned char *cbcolor;
                e->render.colormap = e->state_current.colormap;
-               cbcolor = (unsigned char *) (&palette_pantscolormap[e->render.colormap & 0xF]);
+               cbcolor = palette_rgb_pantscolormap[e->render.colormap & 0xF];
                e->render.colormap_pantscolor[0] = cbcolor[0] * (1.0f / 255.0f);
                e->render.colormap_pantscolor[1] = cbcolor[1] * (1.0f / 255.0f);
                e->render.colormap_pantscolor[2] = cbcolor[2] * (1.0f / 255.0f);
-               cbcolor = (unsigned char *) (&palette_shirtcolormap[(e->render.colormap & 0xF0) >> 4]);
+               cbcolor = palette_rgb_shirtcolormap[(e->render.colormap & 0xF0) >> 4];
                e->render.colormap_shirtcolor[0] = cbcolor[0] * (1.0f / 255.0f);
                e->render.colormap_shirtcolor[1] = cbcolor[1] * (1.0f / 255.0f);
                e->render.colormap_shirtcolor[2] = cbcolor[2] * (1.0f / 255.0f);
@@ -868,11 +885,11 @@ void CL_UpdateNetworkEntity(entity_t *e, int recursionlimit, qboolean interpolat
        {
                unsigned char *cbcolor;
                e->render.colormap = cl.scores[e->state_current.colormap - 1].colors; // color it
-               cbcolor = (unsigned char *) (&palette_pantscolormap[e->render.colormap & 0xF]);
+               cbcolor = palette_rgb_pantscolormap[e->render.colormap & 0xF];
                e->render.colormap_pantscolor[0] = cbcolor[0] * (1.0f / 255.0f);
                e->render.colormap_pantscolor[1] = cbcolor[1] * (1.0f / 255.0f);
                e->render.colormap_pantscolor[2] = cbcolor[2] * (1.0f / 255.0f);
-               cbcolor = (unsigned char *) (&palette_shirtcolormap[(e->render.colormap & 0xF0) >> 4]);
+               cbcolor = palette_rgb_shirtcolormap[(e->render.colormap & 0xF0) >> 4];
                e->render.colormap_shirtcolor[0] = cbcolor[0] * (1.0f / 255.0f);
                e->render.colormap_shirtcolor[1] = cbcolor[1] * (1.0f / 255.0f);
                e->render.colormap_shirtcolor[2] = cbcolor[2] * (1.0f / 255.0f);
@@ -1384,7 +1401,7 @@ void CL_LinkNetworkEntity(entity_t *e)
                // * 4 for the expansion from 0-255 to 0-1023 range,
                // / 255 to scale down byte colors
                dlightradius = max(dlightradius, e->state_current.glowsize * 4);
-               VectorMA(dlightcolor, (1.0f / 255.0f), (unsigned char *)&palette_complete[e->state_current.glowcolor], dlightcolor);
+               VectorMA(dlightcolor, (1.0f / 255.0f), palette_rgb[e->state_current.glowcolor], dlightcolor);
        }
        // make the glow dlight
        if (dlightradius > 0 && (dlightcolor[0] || dlightcolor[1] || dlightcolor[2]) && !(e->render.flags & RENDER_VIEWMODEL) && r_refdef.numlights < MAX_DLIGHTS)
@@ -1789,7 +1806,8 @@ void CL_UpdateWorld(void)
                CL_RelinkLightFlashes();
                CSQC_RelinkAllEntities(ENTMASK_ENGINE | ENTMASK_ENGINEVIEWMODELS);
 
-               // move particles
+               // move decals, particles, and any other effects
+               CL_MoveDecals();
                CL_MoveParticles();
                R_MoveExplosions();
        }
@@ -1816,13 +1834,23 @@ static void CL_Fog_f (void)
 {
        if (Cmd_Argc () == 1)
        {
-               Con_Printf("\"fog\" is \"%f %f %f %f\"\n", r_refdef.fog_density, r_refdef.fog_red, r_refdef.fog_green, r_refdef.fog_blue);
+               Con_Printf("\"fog\" is \"%f %f %f %f %f %f\"\n", r_refdef.fog_density, r_refdef.fog_red, r_refdef.fog_green, r_refdef.fog_blue, r_refdef.fog_start, r_refdef.fog_end);
                return;
        }
-       r_refdef.fog_density = atof(Cmd_Argv(1));
-       r_refdef.fog_red = atof(Cmd_Argv(2));
-       r_refdef.fog_green = atof(Cmd_Argv(3));
-       r_refdef.fog_blue = atof(Cmd_Argv(4));
+       r_refdef.fog_start = 0;
+       r_refdef.fog_end = 1000000000;
+       if(Cmd_Argc() > 1)
+               r_refdef.fog_density = atof(Cmd_Argv(1));
+       if(Cmd_Argc() > 2)
+               r_refdef.fog_red = atof(Cmd_Argv(2));
+       if(Cmd_Argc() > 3)
+               r_refdef.fog_green = atof(Cmd_Argv(3));
+       if(Cmd_Argc() > 4)
+               r_refdef.fog_blue = atof(Cmd_Argv(4));
+       if(Cmd_Argc() > 5)
+               r_refdef.fog_start = atof(Cmd_Argv(5));
+       if(Cmd_Argc() > 6)
+               r_refdef.fog_end = atof(Cmd_Argv(6));
 }
 
 /*
@@ -2293,6 +2321,9 @@ void CL_Init (void)
        CL_Screen_Init();
 
        CL_Video_Init();
+#ifdef SUPPORT_GECKO
+       CL_Gecko_Init();
+#endif
 }