]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_screen.c
moved ixtable definition and initialization code to mathlib (and added Mathlib_Init...
[xonotic/darkplaces.git] / gl_screen.c
index eb7a176ab360324117cda10fadd392ece8aab418..977c4a04520841e6a638c6d7e12eb9543731d2cc 100644 (file)
@@ -70,24 +70,24 @@ console is:
 */
 
 
-int                    glx, gly, glwidth, glheight;
-
-float          scr_con_current;
-float          scr_conlines;           // lines of console to display
-
-float          oldscreensize, oldfov;
-cvar_t         scr_viewsize = {"viewsize","100", true};
-cvar_t         scr_fov = {"fov","90"}; // 10 - 170
-cvar_t         scr_conspeed = {"scr_conspeed","300"};
-cvar_t         scr_centertime = {"scr_centertime","2"};
-cvar_t         scr_showram = {"showram","1"};
-cvar_t         scr_showturtle = {"showturtle","0"};
-cvar_t         scr_showpause = {"showpause","1"};
-cvar_t         scr_printspeed = {"scr_printspeed","8"};
-cvar_t         showfps = {"showfps", "0", true};
-cvar_t         r_render = {"r_render", "1"};
-
-extern cvar_t  crosshair;
+int            glx, gly, glwidth, glheight;
+
+float  scr_con_current;
+float  scr_conlines;           // lines of console to display
+
+float  oldscreensize, oldfov;
+cvar_t scr_viewsize = {CVAR_SAVE, "viewsize","100"};
+cvar_t scr_fov = {CVAR_SAVE, "fov","90"};      // 10 - 170
+cvar_t scr_conspeed = {CVAR_SAVE, "scr_conspeed","900"}; // LordHavoc: quake used 300
+cvar_t scr_centertime = {0, "scr_centertime","2"};
+cvar_t scr_showram = {CVAR_SAVE, "showram","1"};
+cvar_t scr_showturtle = {CVAR_SAVE, "showturtle","0"};
+cvar_t scr_showpause = {CVAR_SAVE, "showpause","1"};
+cvar_t scr_printspeed = {0, "scr_printspeed","8"};
+cvar_t showfps = {CVAR_SAVE, "showfps", "0"};
+cvar_t r_render = {0, "r_render", "1"};
+cvar_t r_brightness = {CVAR_SAVE, "r_brightness", "1"}; // LordHavoc: a method of operating system independent color correction
+cvar_t r_contrast = {CVAR_SAVE, "r_contrast", "1"}; // LordHavoc: a method of operating system independent color correction
 
 qboolean       scr_initialized;                // ready to draw
 
@@ -98,10 +98,6 @@ qpic_t               *scr_turtle;
 int                    clearconsole;
 int                    clearnotify;
 
-extern int                     sb_lines;
-
-extern viddef_t        vid;                            // global video state
-
 qboolean       scr_disabled_for_loading;
 //qboolean     scr_drawloading;
 //float                scr_disabled_time;
@@ -212,7 +208,7 @@ void SCR_CheckDrawCenterString (void)
                scr_erase_lines = scr_center_lines;
 
        scr_centertime_off -= host_frametime;
-       
+
        if (scr_centertime_off <= 0 && !cl.intermission)
                return;
        if (key_dest != key_game)
@@ -278,33 +274,30 @@ static void SCR_CalcRefdef (void)
 
 // intermission is always full screen  
        if (cl.intermission)
-               size = 120;
-       else
-               size = scr_viewsize.value;
-
-       if (size >= 120)
-               sb_lines = 0;           // no status bar at all
-       else if (size >= 110)
-               sb_lines = 24;          // no inventory
-       else
-               sb_lines = 24+16+8;
-
-       if (scr_viewsize.value >= 100.0)
        {
                full = true;
-               size = 100.0;
+               size = 1;
+               sb_lines = 0;
        }
        else
-               size = scr_viewsize.value;
-       if (cl.intermission)
        {
-               full = true;
-               size = 100;
-               sb_lines = 0;
+               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;
+
+               if (scr_viewsize.value >= 100.0)
+               {
+                       full = true;
+                       size = 1.0f;
+               }
+               else
+                       size = scr_viewsize.value * (1.0f / 100.0f);
        }
-       size /= 100.0;
 
-       // LordHavoc: always fullyscreen rendering
+       // LordHavoc: always fullscreen rendering
        h = vid.height/* - sb_lines*/;
 
        r_refdef.vrect.width = vid.width * size;
@@ -359,18 +352,18 @@ void SCR_SizeDown_f (void)
 
 //============================================================================
 
-void gl_screen_start()
+void gl_screen_start(void)
 {
        scr_ram = Draw_PicFromWad ("ram");
        scr_net = Draw_PicFromWad ("net");
        scr_turtle = Draw_PicFromWad ("turtle");
 }
 
-void gl_screen_shutdown()
+void gl_screen_shutdown(void)
 {
 }
 
-void gl_screen_newmap()
+void gl_screen_newmap(void)
 {
 }
 
@@ -392,6 +385,8 @@ void GL_Screen_Init (void)
        Cvar_RegisterVariable (&scr_printspeed);
        Cvar_RegisterVariable (&showfps);
        Cvar_RegisterVariable (&r_render);
+       Cvar_RegisterVariable (&r_brightness);
+       Cvar_RegisterVariable (&r_contrast);
 #ifdef NORENDER
        r_render.value = 0;
 #endif
@@ -591,7 +586,7 @@ void SCR_ScreenShot_f (void)
        char            filename[80]; 
        char            checkname[MAX_OSPATH];
        int                     i;
-// 
+//
 // find a file name to save it to 
 // 
        strcpy(filename,"dp0000.tga");
@@ -601,7 +596,7 @@ void SCR_ScreenShot_f (void)
                filename[2] = (i/1000)%10 + '0'; 
                filename[3] = (i/ 100)%10 + '0'; 
                filename[4] = (i/  10)%10 + '0'; 
-               filename[5] = (i/   1)%10 + '0'; 
+               filename[5] = (i/   1)%10 + '0';
                sprintf (checkname, "%s/%s", com_gamedir, filename);
                if (Sys_FileTime(checkname) == -1)
                        break;  // file doesn't exist
@@ -693,7 +688,7 @@ void SCR_DrawNotifyString (void)
 //             for (j=0 ; j<l ; j++, x+=8)
 //                     Draw_Character (x, y, start[j]);        
                Draw_String (x, y, start, l);
-                       
+
                y += 8;
 
                while (*start && *start != '\n')
@@ -710,22 +705,32 @@ void SCR_DrawNotifyString (void)
 void DrawCrosshair(int num);
 void GL_Set2D (void);
 
-extern void SHOWLMP_drawall();
-extern cvar_t contrast;
-extern cvar_t brightness;
-extern cvar_t gl_lightmode;
-extern cvar_t r_speeds2;
-
-void GL_BrightenScreen()
+void GL_BrightenScreen(void)
 {
        float f;
+
+       if (r_brightness.value < 0.1f)
+               Cvar_SetValue("r_brightness", 0.1f);
+       if (r_brightness.value > 5.0f)
+               Cvar_SetValue("r_brightness", 5.0f);
+
+       if (r_contrast.value < 0.2f)
+               Cvar_SetValue("r_contrast", 0.2f);
+       if (r_contrast.value > 1.0f)
+               Cvar_SetValue("r_contrast", 1.0f);
+
+       if (!(lighthalf && !hardwaregammasupported) && r_brightness.value < 1.01f && r_contrast.value > 0.99f)
+               return;
+
        if (!r_render.value)
                return;
+
        glDisable(GL_TEXTURE_2D);
        glEnable(GL_BLEND);
-       f = bound(1.0f, brightness.value, 5.0f);
-       if (f != brightness.value)
-               Cvar_SetValue("brightness", f);
+       f = r_brightness.value;
+       // only apply lighthalf using software color correction if hardware is not available (speed reasons)
+       if (lighthalf && !hardwaregammasupported)
+               f *= 2;
        if (f >= 1.01f)
        {
                glBlendFunc (GL_DST_COLOR, GL_ONE);
@@ -743,19 +748,20 @@ void GL_BrightenScreen()
                }
                glEnd ();
        }
-       glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-       f = bound(0.2f, contrast.value, 1.0f);
-       if (f != contrast.value)
-               Cvar_SetValue("contrast", f);
-       if (contrast.value < 0.99f)
+       if (r_contrast.value <= 0.99f)
        {
+               glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+               if (lighthalf && hardwaregammasupported)
+                       glColor4f (0.5, 0.5, 0.5, 1 - r_contrast.value);
+               else
+                       glColor4f (1, 1, 1, 1 - r_contrast.value);
                glBegin (GL_TRIANGLES);
-               glColor4f (1, 1, 1, 1-contrast.value);
                glVertex2f (-5000, -5000);
                glVertex2f (10000, -5000);
                glVertex2f (-5000, 10000);
                glEnd ();
        }
+       glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
        glEnable (GL_CULL_FACE);
        glEnable (GL_DEPTH_TEST);
@@ -773,13 +779,16 @@ text to the screen.
 LordHavoc: due to my rewrite of R_WorldNode, it no longer takes 256k of stack space :)
 ==================
 */
-void GL_Finish();
+void GL_Finish(void);
+void R_Clip_DisplayBuffer(void);
 void SCR_UpdateScreen (void)
 {
        double  time1 = 0, time2;
 
        if (r_speeds.value)
-               time1 = Sys_FloatTime ();
+               time1 = Sys_DoubleTime ();
+
+       VID_UpdateGamma(false);
 
        if (scr_disabled_for_loading)
        {
@@ -799,7 +808,7 @@ void SCR_UpdateScreen (void)
 
 
        GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
-       
+
        //
        // determine size of refresh window
        //
@@ -833,6 +842,8 @@ void SCR_UpdateScreen (void)
 
        GL_Set2D();
 
+       R_Clip_DisplayBuffer();
+
        SCR_DrawRam();
        SCR_DrawNet();
        SCR_DrawTurtle();
@@ -849,9 +860,11 @@ void SCR_UpdateScreen (void)
        else if (cl.intermission == 2)
                Sbar_FinaleOverlay();
 
-       SCR_DrawConsole();      
+       SCR_DrawConsole();
        M_Draw();
 
+       ui_draw();
+
 //     if (scr_drawloading)
 //             SCR_DrawLoading();
 
@@ -861,23 +874,34 @@ void SCR_UpdateScreen (void)
                double newtime;
                char temp[32];
                int calc;
-               newtime = Sys_FloatTime();
+               newtime = Sys_DoubleTime();
                calc = (int) ((1.0 / (newtime - currtime)) + 0.5);
                sprintf(temp, "%4i fps", calc);
                currtime = newtime;
                Draw_String(vid.width - (8*8), vid.height - sb_lines - 8, temp, 9999);
        }
 
-       if (r_speeds2.value)
+       // LordHavoc: only print info if renderer is being used
+       if (r_speeds2.value && !con_forcedup)
        {
-               extern char r_speeds2_string1[81], r_speeds2_string2[81], r_speeds2_string3[81], r_speeds2_string4[81], r_speeds2_string5[81], r_speeds2_string6[81], r_speeds2_string7[81];
-               Draw_String(0, vid.height - sb_lines - 56, r_speeds2_string1, 80);
-               Draw_String(0, vid.height - sb_lines - 48, r_speeds2_string2, 80);
-               Draw_String(0, vid.height - sb_lines - 40, r_speeds2_string3, 80);
-               Draw_String(0, vid.height - sb_lines - 32, r_speeds2_string4, 80);
-               Draw_String(0, vid.height - sb_lines - 24, r_speeds2_string5, 80);
-               Draw_String(0, vid.height - sb_lines - 16, r_speeds2_string6, 80);
-               Draw_String(0, vid.height - sb_lines -  8, r_speeds2_string7, 80);
+               int i, j, lines, y;
+               lines = 1;
+               for (i = 0;r_speeds2_string[i];i++)
+                       if (r_speeds2_string[i] == '\n')
+                               lines++;
+               y = vid.height - sb_lines - lines * 8 - 8;
+               i = j = 0;
+               while (r_speeds2_string[i])
+               {
+                       j = i;
+                       while (r_speeds2_string[i] && r_speeds2_string[i] != '\n')
+                               i++;
+                       if (i - j > 0)
+                               Draw_String(0, y, r_speeds2_string + j, i - j);
+                       if (r_speeds2_string[i] == '\n')
+                               i++;
+                       y += 8;
+               }
        }
 
        V_UpdateBlends();
@@ -888,14 +912,14 @@ void SCR_UpdateScreen (void)
 
        if (r_speeds.value)
        {
-               time2 = Sys_FloatTime ();
+               time2 = Sys_DoubleTime ();
                Con_Printf ("%3i ms  %4i wpoly %4i epoly %4i transpoly %4i lightpoly %4i BSPnodes %4i BSPleafs %4i BSPfaces %4i models %4i bmodels %4i sprites %4i particles %3i dlights\n", (int)((time2-time1)*1000), c_brush_polys, c_alias_polys, currenttranspoly, c_light_polys, c_nodes, c_leafs, c_faces, c_models, c_bmodels, c_sprites, c_particles, c_dlights);
        }
        GL_EndRendering ();
 }
 
 // for profiling, this is separated
-void GL_Finish()
+void GL_Finish(void)
 {
        if (!r_render.value)
                return;