]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_screen.c
Fix setinfo.
[xonotic/darkplaces.git] / cl_screen.c
index 71a74c08d1d0db1c1d1df7e41e5f5295cf48e1d2..9625b6443bec916e258464a8bd236e6fde49e4a4 100644 (file)
@@ -49,7 +49,8 @@ cvar_t scr_loadingscreen_barcolor = {0, "scr_loadingscreen_barcolor", "0 0 1", "
 cvar_t scr_loadingscreen_barheight = {0, "scr_loadingscreen_barheight", "8", "the height of the loadingscreen progress bar"};
 cvar_t scr_loadingscreen_maxfps = {0, "scr_loadingscreen_maxfps", "10", "restrict maximal FPS for loading screen so it will not update very often (this will make lesser loading times on a maps loading large number of models)"};
 cvar_t scr_infobar_height = {0, "scr_infobar_height", "8", "the height of the infobar items"};
-cvar_t vid_conwidth = {CVAR_SAVE, "vid_conwidth", "640", "virtual width of 2D graphics system"};
+cvar_t vid_conwidthauto = { CVAR_SAVE, "vid_conwidthauto", "1", "automatically update vid_conwidth to match aspect ratio" };
+cvar_t vid_conwidth = {CVAR_SAVE, "vid_conwidth", "640", "virtual width of 2D graphics system (note: changes may be overwritten, see vid_conwidthauto)"};
 cvar_t vid_conheight = {CVAR_SAVE, "vid_conheight", "480", "virtual height of 2D graphics system"};
 cvar_t vid_pixelheight = {CVAR_SAVE, "vid_pixelheight", "1", "adjusts vertical field of vision to account for non-square pixels (1280x1024 on a CRT monitor for example)"};
 cvar_t scr_screenshot_jpeg = {CVAR_SAVE, "scr_screenshot_jpeg","1", "save jpeg instead of targa"};
@@ -793,9 +794,6 @@ const char *r_stat_name[r_stat_count] =
        "bufferdatasize_index16",
        "bufferdatasize_index32",
        "bufferdatasize_uniform",
-       "animcache_vertexmesh_count",
-       "animcache_vertexmesh_vertices",
-       "animcache_vertexmesh_maxvertices",
        "animcache_skeletal_count",
        "animcache_skeletal_bones",
        "animcache_skeletal_maxbones",
@@ -874,10 +872,6 @@ const char *r_stat_name[r_stat_count] =
        "dynamic_surfaces_because_tcmod_turbulent",
        "dynamic_vertices_because_tcmod_turbulent",
        "dynamic_triangles_because_tcmod_turbulent",
-       "dynamic_batches_because_interleavedarrays",
-       "dynamic_surfaces_because_interleavedarrays",
-       "dynamic_vertices_because_interleavedarrays",
-       "dynamic_triangles_because_interleavedarrays",
        "dynamic_batches_because_nogaps",
        "dynamic_surfaces_because_nogaps",
        "dynamic_vertices_because_nogaps",
@@ -1315,6 +1309,7 @@ void CL_Screen_Init(void)
        Cvar_RegisterVariable (&vid_conwidth);
        Cvar_RegisterVariable (&vid_conheight);
        Cvar_RegisterVariable (&vid_pixelheight);
+       Cvar_RegisterVariable (&vid_conwidthauto);
        Cvar_RegisterVariable (&scr_screenshot_jpeg);
        Cvar_RegisterVariable (&scr_screenshot_jpeg_quality);
        Cvar_RegisterVariable (&scr_screenshot_png);
@@ -2058,11 +2053,8 @@ void R_ClearScreen(qboolean fogcolor)
                VectorCopy(r_refdef.fogcolor, clearcolor);
        }
        // clear depth is 1.0
-       // LordHavoc: we use a stencil centered around 128 instead of 0,
-       // to avoid clamping interfering with strange shadow volume
-       // drawing orders
        // clear the screen
-       GL_Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | (vid.stencil ? GL_STENCIL_BUFFER_BIT : 0), clearcolor, 1.0f, 128);
+       GL_Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | (vid.stencil ? GL_STENCIL_BUFFER_BIT : 0), clearcolor, 1.0f, 0);
 }
 
 int r_stereo_side;
@@ -2163,6 +2155,9 @@ static void SCR_DrawScreen (void)
                }
        }
 
+       // Don't apply debugging stuff like r_showsurfaces to the UI
+       r_refdef.view.showdebug = false;
+
        if (!r_stereo_sidebyside.integer && !r_stereo_horizontal.integer && !r_stereo_vertical.integer)
        {
                r_refdef.view.width = vid.width;
@@ -2283,17 +2278,8 @@ static void SCR_SetLoadingScreenTexture(void)
 
        SCR_ClearLoadingScreenTexture();
 
-       if (vid.support.arb_texture_non_power_of_two)
-       {
-               w = vid.width; h = vid.height;
-               loadingscreentexture_w = loadingscreentexture_h = 1;
-       }
-       else
-       {
-               w = CeilPowerOf2(vid.width); h = CeilPowerOf2(vid.height);
-               loadingscreentexture_w = vid.width / (float) w;
-               loadingscreentexture_h = vid.height / (float) h;
-       }
+       w = vid.width; h = vid.height;
+       loadingscreentexture_w = loadingscreentexture_h = 1;
 
        loadingscreentexture = R_LoadTexture2D(r_main_texturepool, "loadingscreentexture", w, h, NULL, TEXTYPE_COLORBUFFER, TEXF_RENDERTARGET | TEXF_FORCENEAREST | TEXF_CLAMP, -1, NULL);
        R_Mesh_CopyToTexture(loadingscreentexture, 0, 0, 0, 0, vid.width, vid.height);
@@ -2534,11 +2520,11 @@ static void SCR_DrawLoadingScreen (qboolean clear)
        if(loadingscreentexture)
        {
                R_Mesh_PrepareVertices_Generic_Arrays(4, loadingscreentexture_vertex3f, NULL, loadingscreentexture_texcoord2f);
-               R_SetupShader_Generic(loadingscreentexture, NULL, GL_MODULATE, 1, false, true, true);
+               R_SetupShader_Generic(loadingscreentexture, false, true, true);
                R_Mesh_Draw(0, 4, 0, 2, polygonelement3i, NULL, 0, polygonelement3s, NULL, 0);
        }
        R_Mesh_PrepareVertices_Generic_Arrays(4, loadingscreenpic_vertex3f, NULL, loadingscreenpic_texcoord2f);
-       R_SetupShader_Generic(Draw_GetPicTexture(loadingscreenpic), NULL, GL_MODULATE, 1, true, true, false);
+       R_SetupShader_Generic(Draw_GetPicTexture(loadingscreenpic), true, true, false);
        R_Mesh_Draw(0, 4, 0, 2, polygonelement3i, NULL, 0, polygonelement3s, NULL, 0);
        SCR_DrawLoadingStack();
 }
@@ -2552,6 +2538,8 @@ static void SCR_DrawLoadingScreen_SharedFinish (qboolean clear)
 
 static double loadingscreen_lastupdate;
 
+static void SCR_UpdateVars(void);
+
 void SCR_UpdateLoadingScreen (qboolean clear, qboolean startup)
 {
        keydest_t       old_key_dest;
@@ -2570,6 +2558,8 @@ void SCR_UpdateLoadingScreen (qboolean clear, qboolean startup)
                loadingscreen_lastupdate = t;
        }
 
+       SCR_UpdateVars();
+
        // set up the r_texture_gammaramps texture which we need for rendering the loadingscreenpic
        VID_UpdateGamma();
        R_UpdateVariables();
@@ -2609,10 +2599,9 @@ void SCR_UpdateLoadingScreen (qboolean clear, qboolean startup)
        SCR_DrawLoadingScreen_SharedSetup(clear);
        SCR_DrawLoadingScreen(clear);
 #else
-       if (qglDrawBuffer)
-               qglDrawBuffer(GL_BACK);
+       qglDrawBuffer(GL_BACK);
        SCR_DrawLoadingScreen_SharedSetup(clear);
-       if (vid.stereobuffer && qglDrawBuffer)
+       if (vid.stereobuffer)
        {
                qglDrawBuffer(GL_BACK_LEFT);
                SCR_DrawLoadingScreen(clear);
@@ -2621,8 +2610,7 @@ void SCR_UpdateLoadingScreen (qboolean clear, qboolean startup)
        }
        else
        {
-               if (qglDrawBuffer)
-                       qglDrawBuffer(GL_BACK);
+               qglDrawBuffer(GL_BACK);
                SCR_DrawLoadingScreen(clear);
        }
 #endif
@@ -2648,6 +2636,43 @@ qboolean R_Stereo_Active(void)
        return (vid.stereobuffer || r_stereo_sidebyside.integer || r_stereo_horizontal.integer || r_stereo_vertical.integer || R_Stereo_ColorMasking());
 }
 
+void SCR_UpdateVars(void)
+{
+       float conwidth = bound(160, vid_conwidth.value, 32768);
+       float conheight = bound(90, vid_conheight.value, 24576);
+       if (vid_conwidthauto.integer)
+               conwidth = floor(conheight * vid.width / (vid.height * vid_pixelheight.value));
+       if (vid_conwidth.value != conwidth)
+               Cvar_SetValue("vid_conwidth", conwidth);
+       if (vid_conheight.value != conheight)
+               Cvar_SetValue("vid_conheight", conheight);
+
+       // bound viewsize
+       if (scr_viewsize.value < 30)
+               Cvar_Set("viewsize", "30");
+       if (scr_viewsize.value > 120)
+               Cvar_Set("viewsize", "120");
+
+       // bound field of view
+       if (scr_fov.value < 1)
+               Cvar_Set("fov", "1");
+       if (scr_fov.value > 170)
+               Cvar_Set("fov", "170");
+
+       // intermission is always full screen
+       if (cl.intermission)
+               sb_lines = 0;
+       else
+       {
+               if (scr_viewsize.value >= 120)
+                       sb_lines = 0;           // no status bar at all
+               else if (scr_viewsize.value >= 110)
+                       sb_lines = 24;          // no inventory
+               else
+                       sb_lines = 24 + 16 + 8;
+       }
+}
+
 extern cvar_t cl_minfps;
 extern cvar_t cl_minfps_fade;
 extern cvar_t cl_minfps_qualitymax;
@@ -2662,7 +2687,6 @@ void CL_UpdateScreen(void)
        vec3_t vieworigin;
        static double drawscreenstart = 0.0;
        double drawscreendelta;
-       float conwidth, conheight;
        r_viewport_t viewport;
 
        if(drawscreenstart)
@@ -2762,37 +2786,7 @@ void CL_UpdateScreen(void)
                return;
        }
 
-       conwidth = bound(160, vid_conwidth.value, 32768);
-       conheight = bound(90, vid_conheight.value, 24576);
-       if (vid_conwidth.value != conwidth)
-               Cvar_SetValue("vid_conwidth", conwidth);
-       if (vid_conheight.value != conheight)
-               Cvar_SetValue("vid_conheight", conheight);
-
-       // bound viewsize
-       if (scr_viewsize.value < 30)
-               Cvar_Set ("viewsize","30");
-       if (scr_viewsize.value > 120)
-               Cvar_Set ("viewsize","120");
-
-       // bound field of view
-       if (scr_fov.value < 1)
-               Cvar_Set ("fov","1");
-       if (scr_fov.value > 170)
-               Cvar_Set ("fov","170");
-
-       // intermission is always full screen
-       if (cl.intermission)
-               sb_lines = 0;
-       else
-       {
-               if (scr_viewsize.value >= 120)
-                       sb_lines = 0;           // no status bar at all
-               else if (scr_viewsize.value >= 110)
-                       sb_lines = 24;          // no inventory
-               else
-                       sb_lines = 24+16+8;
-       }
+       SCR_UpdateVars();
 
        R_FrameData_NewFrame();
        R_BufferData_NewFrame();
@@ -2807,20 +2801,8 @@ void CL_UpdateScreen(void)
        SCR_SetUpToDrawConsole();
 
 #ifndef USE_GLES2
-       if (qglDrawBuffer)
-       {
-               CHECKGLERROR
-               qglDrawBuffer(GL_BACK);CHECKGLERROR
-               // set dithering mode
-               if (gl_dither.integer)
-               {
-                       qglEnable(GL_DITHER);CHECKGLERROR
-               }
-               else
-               {
-                       qglDisable(GL_DITHER);CHECKGLERROR
-               }
-       }
+       CHECKGLERROR
+       qglDrawBuffer(GL_BACK);CHECKGLERROR
 #endif
 
        R_Viewport_InitOrtho(&viewport, &identitymatrix, 0, 0, vid.width, vid.height, 0, 0, vid_conwidth.integer, vid_conheight.integer, -10, 100, NULL);
@@ -2837,34 +2819,11 @@ void CL_UpdateScreen(void)
        // calculate r_refdef.view.quality
        r_refdef.view.quality = cl_updatescreen_quality;
 
-#ifndef USE_GLES2
-       if (qglPolygonStipple)
+       if(scr_stipple.integer)
        {
-               if(scr_stipple.integer)
-               {
-                       GLubyte stipple[128];
-                       int i, s, width, parts;
-                       static int frame = 0;
-                       ++frame;
-       
-                       s = scr_stipple.integer;
-                       parts = (s & 007);
-                       width = (s & 070) >> 3;
-       
-                       qglEnable(GL_POLYGON_STIPPLE);CHECKGLERROR // 0x0B42
-                       for(i = 0; i < 128; ++i)
-                       {
-                               int line = i/4;
-                               stipple[i] = (((line >> width) + frame) & ((1 << parts) - 1)) ? 0x00 : 0xFF;
-                       }
-                       qglPolygonStipple(stipple);CHECKGLERROR
-               }
-               else
-               {
-                       qglDisable(GL_POLYGON_STIPPLE);CHECKGLERROR
-               }
+               Con_Print("FIXME: scr_stipple not implemented\n");
+               Cvar_SetValueQuick(&scr_stipple, 0);
        }
-#endif
 
 #ifndef USE_GLES2
        if (R_Stereo_Active())
@@ -2910,8 +2869,7 @@ void CL_UpdateScreen(void)
        SCR_CaptureVideo();
 #endif
 
-       if (qglFlush)
-               qglFlush(); // FIXME: should we really be using qglFlush here?
+       qglFlush(); // ensure that the commands are submitted to the GPU before we do other things
 
        if (!vid_activewindow)
                VID_SetMouse(false, false, false);