]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_screen.c
Tomaz optimized the cl_avidemo mode by making it keep around the image processing...
[xonotic/darkplaces.git] / cl_screen.c
index 0fa9a6d8e78dea02983c47a423988db41ce92f9b..51ef135382b7a512e5ebf584b9087b4682e0109f 100644 (file)
@@ -655,15 +655,24 @@ 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;
        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)
@@ -677,10 +686,17 @@ void SCR_ScreenShot_f (void)
        else
                sprintf(filename, "%s%06d.tga", base, shotnumber);
 
-       if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
+       buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
+       buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
+
+       if (SCR_ScreenShot (filename, buffer1, buffer2, 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);
+
        shotnumber++;
 }
 
@@ -688,20 +704,43 @@ static int cl_avidemo_frame = 0;
 
 void SCR_CaptureAVIDemo(void)
 {
+       static qbyte *avi_buffer1 = NULL;
+       static qbyte *avi_buffer2 = NULL;
        char filename[32];
        qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
 
+       if (cl_avidemo.integer)
+       {
+               if (avi_buffer1 == NULL)
+               {
+                       avi_buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
+                       avi_buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
+               }
+       }
+       else
+       {
+               if (avi_buffer1 != NULL)
+               {
+                       Mem_Free (avi_buffer1);
+                       Mem_Free (avi_buffer2);
+                       avi_buffer1 = NULL;
+                       avi_buffer2 = NULL;
+               }
+               cl_avidemo_frame = 0;
+               return;
+       }
+
        if (jpeg)
                sprintf(filename, "video/dp%06d.jpg", cl_avidemo_frame);
        else
                sprintf(filename, "video/dp%06d.tga", cl_avidemo_frame);
 
-       if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
+       if (SCR_ScreenShot(filename, avi_buffer1, avi_buffer2, 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;
        }
 }
@@ -717,22 +756,31 @@ struct
 {
        float angles[3];
        char *name;
-       qboolean flipx, flipy;
-}
-envmapinfo[6] =
-{
-       {{  0,   0, 0}, "rt",  true, false},
-       {{  0,  90, 0}, "ft",  true, false},
-       {{  0, 180, 0}, "lf",  true, false},
-       {{  0, 270, 0}, "bk",  true, false},
-       {{-90, 180, 0}, "up", false,  true},
-       {{ 90, 180, 0}, "dn", false,  true}
+       qboolean flipx, flipy, flipdiagonaly;
+}
+envmapinfo[12] =
+{
+       {{  0,   0, 0}, "rt",  true, false, false},
+       {{  0,  90, 0}, "ft",  true, false, false},
+       {{  0, 180, 0}, "lf",  true, false, false},
+       {{  0, 270, 0}, "bk",  true, false, false},
+       {{-90, 180, 0}, "up", false,  true, false},
+       {{ 90, 180, 0}, "dn", false,  true, false},
+
+       {{  0,   0, 0}, "px",  true,  true,  true},
+       {{  0,  90, 0}, "py", false,  true, false},
+       {{  0, 180, 0}, "nx", false, false,  true},
+       {{  0, 270, 0}, "ny",  true, false, false},
+       {{-90, 180, 0}, "pz", false, false,  true},
+       {{ 90, 180, 0}, "nz", false, false,  true}
 };
 
 static void R_Envmap_f (void)
 {
        int j, size;
        char filename[256], basename[256];
+       qbyte *buffer1;
+       qbyte *buffer2;
 
        if (Cmd_Argc() != 3)
        {
@@ -763,7 +811,10 @@ static void R_Envmap_f (void)
        r_refdef.fov_x = 90;
        r_refdef.fov_y = 90;
 
-       for (j = 0;j < 6;j++)
+       buffer1 = Mem_Alloc(tempmempool, size * size * 3);
+       buffer2 = Mem_Alloc(tempmempool, size * size * 3);
+
+       for (j = 0;j < 12;j++)
        {
                sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
                Matrix4x4_CreateFromQuakeEntity(&r_refdef.viewentitymatrix, r_vieworigin[0], r_vieworigin[1], r_vieworigin[2], envmapinfo[j].angles[0], envmapinfo[j].angles[1], envmapinfo[j].angles[2], 1);
@@ -771,9 +822,12 @@ 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, false, false);
+               SCR_ScreenShot(filename, buffer1, buffer2, 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);
+
        envmap = false;
 }
 
@@ -895,10 +949,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");