]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_screen.c
broke rtlights, oops (shadowtest was reversed)
[xonotic/darkplaces.git] / cl_screen.c
index 5bd91ecd57027659142e72c4d194ddc7e1484976..0f9f6ae8fc8644998e49753143546dfd1aead713 100644 (file)
@@ -17,6 +17,7 @@ cvar_t scr_showpause = {CVAR_SAVE, "showpause","1"};
 cvar_t scr_printspeed = {0, "scr_printspeed","8"};
 cvar_t vid_conwidth = {CVAR_SAVE, "vid_conwidth", "640"};
 cvar_t vid_conheight = {CVAR_SAVE, "vid_conheight", "480"};
+cvar_t vid_pixelaspect = {CVAR_SAVE, "vid_pixelaspect", "1"};
 cvar_t scr_screenshot_jpeg = {CVAR_SAVE, "scr_screenshot_jpeg","0"};
 cvar_t scr_screenshot_jpeg_quality = {CVAR_SAVE, "scr_screenshot_jpeg_quality","0.9"};
 cvar_t scr_screenshot_name = {0, "scr_screenshot_name","dp"};
@@ -471,6 +472,7 @@ void CL_Screen_Init(void)
        Cvar_RegisterVariable (&scr_printspeed);
        Cvar_RegisterVariable (&vid_conwidth);
        Cvar_RegisterVariable (&vid_conheight);
+       Cvar_RegisterVariable (&vid_pixelaspect);
        Cvar_RegisterVariable (&scr_screenshot_jpeg);
        Cvar_RegisterVariable (&scr_screenshot_jpeg_quality);
        Cvar_RegisterVariable (&cl_avidemo);
@@ -655,15 +657,25 @@ SCR_ScreenShot_f
 */
 void SCR_ScreenShot_f (void)
 {
-       int shotnumber;
+       static int shotnumber;
+       static char oldname[MAX_QPATH];
        char base[MAX_QPATH];
        char filename[MAX_QPATH];
+       qbyte *buffer1;
+       qbyte *buffer2;
+       qbyte *buffer3;
        qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
 
        sprintf (base, "screenshots/%s", scr_screenshot_name.string);
-       
+
+       if (strcmp (oldname, scr_screenshot_name.string))
+       {
+               sprintf(oldname, "%s", scr_screenshot_name.string);
+               shotnumber = 0;
+       }
+
        // find a file name to save it to
-       for (shotnumber=0;shotnumber < 1000000;shotnumber++)
+       for (;shotnumber < 1000000;shotnumber++)
                if (!FS_SysFileExists(va("%s/%s%06d.tga", fs_gamedir, base, shotnumber)) && !FS_SysFileExists(va("%s/%s%06d.jpg", fs_gamedir, base, shotnumber)))
                        break;
        if (shotnumber >= 1000000)
@@ -672,15 +684,21 @@ void SCR_ScreenShot_f (void)
                return;
        }
 
-       if (jpeg)
-               sprintf(filename, "%s%06d.jpg", base, shotnumber);
-       else
-               sprintf(filename, "%s%06d.tga", base, shotnumber);
+       sprintf(filename, "%s%06d.%s", base, shotnumber, jpeg ? "jpg" : "tga");
+
+       buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
+       buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
+       buffer3 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3 + 18);
 
-       if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
+       if (SCR_ScreenShot (filename, buffer1, buffer2, buffer3, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
                Con_Printf("Wrote %s\n", filename);
        else
                Con_Printf("unable to write %s\n", filename);
+
+       Mem_Free (buffer1);
+       Mem_Free (buffer2);
+       Mem_Free (buffer3);
+
        shotnumber++;
 }
 
@@ -688,20 +706,42 @@ static int cl_avidemo_frame = 0;
 
 void SCR_CaptureAVIDemo(void)
 {
+       static qbyte *avi_buffer1 = NULL;
+       static qbyte *avi_buffer2 = NULL;
+       static qbyte *avi_buffer3 = NULL;
        char filename[32];
        qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
 
-       if (jpeg)
-               sprintf(filename, "video/dp%06d.jpg", cl_avidemo_frame);
-       else
-               sprintf(filename, "video/dp%06d.tga", cl_avidemo_frame);
+       if (!cl_avidemo.integer)
+       {
+               if (avi_buffer1 != NULL)
+               {
+                       Mem_Free (avi_buffer1);
+                       Mem_Free (avi_buffer2);
+                       Mem_Free (avi_buffer3);
+                       avi_buffer1 = NULL;
+                       avi_buffer2 = NULL;
+                       avi_buffer3 = NULL;
+               }
+               cl_avidemo_frame = 0;
+               return;
+       }
+
+       if (avi_buffer1 == NULL)
+       {
+               avi_buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
+               avi_buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
+               avi_buffer3 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3 + 18);
+       }
 
-       if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
+       sprintf(filename, "video/dp%06d.%s", cl_avidemo_frame, jpeg ? "jpg" : "tga");
+
+       if (SCR_ScreenShot(filename, avi_buffer1, avi_buffer2, avi_buffer3, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
                cl_avidemo_frame++;
        else
        {
                Cvar_SetValueQuick(&cl_avidemo, 0);
-               Con_Printf("avi saving failed on frame %i, out of disk space?  stopping avi demo catpure.\n", cl_avidemo_frame);
+               Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo capture.\n", cl_avidemo_frame);
                cl_avidemo_frame = 0;
        }
 }
@@ -740,6 +780,9 @@ static void R_Envmap_f (void)
 {
        int j, size;
        char filename[256], basename[256];
+       qbyte *buffer1;
+       qbyte *buffer2;
+       qbyte *buffer3;
 
        if (Cmd_Argc() != 3)
        {
@@ -770,6 +813,10 @@ static void R_Envmap_f (void)
        r_refdef.fov_x = 90;
        r_refdef.fov_y = 90;
 
+       buffer1 = Mem_Alloc(tempmempool, size * size * 3);
+       buffer2 = Mem_Alloc(tempmempool, size * size * 3);
+       buffer3 = Mem_Alloc(tempmempool, size * size * 3 + 18);
+
        for (j = 0;j < 12;j++)
        {
                sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
@@ -778,9 +825,13 @@ static void R_Envmap_f (void)
                R_Mesh_Start();
                R_RenderView();
                R_Mesh_Finish();
-               SCR_ScreenShot(filename, vid.realx, vid.realy + vid.realheight - (r_refdef.y + r_refdef.height), size, size, envmapinfo[j].flipx, envmapinfo[j].flipy, envmapinfo[j].flipdiagonaly, false);
+               SCR_ScreenShot(filename, buffer1, buffer2, buffer3, vid.realx, vid.realy + vid.realheight - (r_refdef.y + r_refdef.height), size, size, envmapinfo[j].flipx, envmapinfo[j].flipy, envmapinfo[j].flipdiagonaly, false);
        }
 
+       Mem_Free (buffer1);
+       Mem_Free (buffer2);
+       Mem_Free (buffer3);
+
        envmap = false;
 }
 
@@ -902,10 +953,7 @@ void CL_UpdateScreen(void)
        if (!scr_initialized || !con_initialized || vid_hidden)
                return;                         // not initialized yet
 
-       if (cl_avidemo.integer)
-               SCR_CaptureAVIDemo();
-       else
-               cl_avidemo_frame = 0;
+       SCR_CaptureAVIDemo();
 
        if (cls.signon == SIGNONS)
                R_TimeReport("other");