]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_screen.c
added cl_avidemo cvar (saves a series of tga images named gamedir/dpavi000000.tga...
[xonotic/darkplaces.git] / cl_screen.c
index 8f2f269d9c919c887ddccd50eccffe5f136c756c..212c356ca867691d9c8ee5c0b38b7f2ba742ffb8 100644 (file)
@@ -10,6 +10,7 @@ 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 scr_2dresolution = {CVAR_SAVE, "scr_2dresolution", "1"};
+cvar_t cl_avidemo = {0, "cl_avidemo", "0"};
 
 qboolean       scr_initialized;                // ready to draw
 
@@ -19,11 +20,19 @@ float               scr_conlines;           // lines of console to display
 int                    clearconsole;
 int                    clearnotify;
 
-qboolean       scr_disabled_for_loading;
-//qboolean     scr_drawloading;
+//qboolean     scr_disabled_for_loading;
+qboolean       scr_drawloading = false;
 //float                scr_disabled_time;
 
-static byte menuplyr_pixels[4096];
+static qbyte menuplyr_pixels[4096];
+
+void DrawCrosshair(int num);
+void V_CalcRefdef (void);
+static void SCR_ScreenShot_f (void);
+static void R_Envmap_f (void);
+
+// backend
+void R_ClearScreen(void);
 
 /*
 ===============================================================================
@@ -215,18 +224,16 @@ void SCR_DrawPause (void)
 SCR_DrawLoading
 ==============
 */
-/*
 void SCR_DrawLoading (void)
 {
        cachepic_t      *pic;
 
-       if (!scr_drawloading)
-               return;
+       //if (!scr_drawloading)
+       //      return;
 
        pic = Draw_CachePic ("gfx/loading.lmp");
        DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/loading.lmp", 0, 0, 1, 1, 1, 1, 0);
 }
-*/
 
 
 
@@ -295,9 +302,11 @@ SCR_BeginLoadingPlaque
 
 ================
 */
-/*
 void SCR_BeginLoadingPlaque (void)
 {
+       if (scr_drawloading)
+               return;
+
        S_StopAllSounds (true);
 
 //     if (cls.state != ca_connected)
@@ -311,12 +320,14 @@ void SCR_BeginLoadingPlaque (void)
 //     scr_con_current = 0;
 
        scr_drawloading = true;
-       SCR_UpdateScreen ();
+       CL_UpdateScreen ();
+       scr_drawloading = true;
+       CL_UpdateScreen ();
+       //scr_drawloading = false;
 
 //     scr_disabled_for_loading = true;
 //     scr_disabled_time = realtime;
 }
-*/
 
 /*
 ===============
@@ -324,14 +335,17 @@ SCR_EndLoadingPlaque
 
 ================
 */
-/*
 void SCR_EndLoadingPlaque (void)
 {
+       /*
+       if (!scr_drawloading)
+               return;
+
 //     scr_disabled_for_loading = false;
        scr_drawloading = false;
        Con_ClearNotify ();
+       */
 }
-*/
 
 //=============================================================================
 
@@ -368,8 +382,6 @@ void SCR_DrawNotifyString (void)
        while (1);
 }
 
-void DrawCrosshair(int num);
-
 char r_speeds_string[1024];
 int speedstringcount, r_timereport_active;
 double r_timereport_temp = 0, r_timereport_current = 0, r_timereport_start = 0;
@@ -514,10 +526,13 @@ void CL_Screen_Init(void)
        Cvar_RegisterVariable (&scr_showpause);
        Cvar_RegisterVariable (&scr_centertime);
        Cvar_RegisterVariable (&scr_printspeed);
-       Cvar_RegisterVariable(&scr_2dresolution);
+       Cvar_RegisterVariable (&scr_2dresolution);
+       Cvar_RegisterVariable (&cl_avidemo);
 
        Cmd_AddCommand ("sizeup",SCR_SizeUp_f);
        Cmd_AddCommand ("sizedown",SCR_SizeDown_f);
+       Cmd_AddCommand ("screenshot",SCR_ScreenShot_f);
+       Cmd_AddCommand ("envmap", R_Envmap_f);
 
        scr_initialized = true;
 
@@ -634,7 +649,7 @@ void DrawQ_Fill (float x, float y, float w, float h, float red, float green, flo
 }
 
 //only used for the player color selection menu
-void DrawQ_PicTranslate (int x, int y, char *picname, byte *translation)
+void DrawQ_PicTranslate (int x, int y, char *picname, qbyte *translation)
 {
        int i, c;
        unsigned int trans[4096];
@@ -655,7 +670,7 @@ void DrawQ_PicTranslate (int x, int y, char *picname, byte *translation)
                trans[i] = d_8to24table[translation[menuplyr_pixels[i]]];
 
        // FIXME: this is renderer stuff?
-       R_UpdateTexture (pic->tex, (byte *)trans);
+       R_UpdateTexture (pic->tex, (qbyte *)trans);
 
        DrawQ_Pic(x, y, picname, 0, 0, 1, 1, 1, 1, 0);
 }
@@ -752,8 +767,126 @@ static void SCR_CalcRefdef (void)
        }
 }
 
+/*
+==================
+SCR_ScreenShot_f
+==================
+*/
+void SCR_ScreenShot_f (void)
+{
+       int i;
+       char filename[16];
+       char checkname[MAX_OSPATH];
+//
+// find a file name to save it to
+//
+       strcpy(filename, "dp0000.tga");
+
+       for (i=0 ; i<=9999 ; i++)
+       {
+               filename[2] = (i/1000)%10 + '0';
+               filename[3] = (i/ 100)%10 + '0';
+               filename[4] = (i/  10)%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
+       }
+       if (i==10000)
+       {
+               Con_Printf ("SCR_ScreenShot_f: Couldn't create a TGA file\n");
+               return;
+       }
+
+       if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight))
+               Con_Printf ("Wrote %s\n", filename);
+       else
+               Con_Printf ("unable to write %s\n", filename);
+}
+
+static int cl_avidemo_frame = 0;
 
-void V_CalcRefdef (void);
+void SCR_CaptureAVIDemo(void)
+{
+       char filename[32];
+       sprintf(filename, "dpavi%06d.tga", cl_avidemo_frame);
+       if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight))
+               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);
+               cl_avidemo_frame = 0;
+       }
+}
+
+/*
+===============
+R_Envmap_f
+
+Grab six views for environment mapping tests
+===============
+*/
+struct
+{
+       float angles[3];
+       char *name;
+}
+envmapinfo[6] =
+{
+       {{  0,   0, 0}, "ft"},
+       {{  0,  90, 0}, "rt"},
+       {{  0, 180, 0}, "bk"},
+       {{  0, 270, 0}, "lf"},
+       {{-90,  90, 0}, "up"},
+       {{ 90,  90, 0}, "dn"}
+};
+
+static void R_Envmap_f (void)
+{
+       int j, size;
+       char filename[256], basename[256];
+
+       if (Cmd_Argc() != 3)
+       {
+               Con_Printf ("envmap <basename> <size>: save out 6 cubic environment map images, usable with loadsky, note that size must one of 128, 256, 512, or 1024 and can't be bigger than your current resolution\n");
+               return;
+       }
+
+       strcpy(basename, Cmd_Argv(1));
+       size = atoi(Cmd_Argv(2));
+       if (size != 128 && size != 256 && size != 512 && size != 1024)
+       {
+               Con_Printf("envmap: size must be one of 128, 256, 512, or 1024\n");
+               return;
+       }
+       if (size > vid.realwidth || size > vid.realheight)
+       {
+               Con_Printf("envmap: your resolution is not big enough to render that size\n");
+               return;
+       }
+
+       envmap = true;
+
+       r_refdef.x = 0;
+       r_refdef.y = 0;
+       r_refdef.width = size;
+       r_refdef.height = size;
+
+       r_refdef.fov_x = 90;
+       r_refdef.fov_y = 90;
+
+       for (j = 0;j < 6;j++)
+       {
+               sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
+               VectorCopy(envmapinfo[j].angles, r_refdef.viewangles);
+               R_ClearScreen();
+               R_RenderView ();
+               SCR_ScreenShot(filename, vid.realx, vid.realy, size, size);
+       }
+
+       envmap = false;
+}
 
 //=============================================================================
 
@@ -774,7 +907,7 @@ showlmp_t showlmp[SHOWLMP_MAXLABELS];
 void SHOWLMP_decodehide(void)
 {
        int i;
-       byte *lmplabel;
+       qbyte *lmplabel;
        lmplabel = MSG_ReadString();
        for (i = 0;i < SHOWLMP_MAXLABELS;i++)
                if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
@@ -787,7 +920,7 @@ void SHOWLMP_decodehide(void)
 void SHOWLMP_decodeshow(void)
 {
        int i, k;
-       byte lmplabel[256], picname[256];
+       qbyte lmplabel[256], picname[256];
        float x, y;
        strcpy(lmplabel,MSG_ReadString());
        strcpy(picname, MSG_ReadString());
@@ -839,18 +972,10 @@ void SHOWLMP_clear(void)
                showlmp[i].isactive = false;
 }
 
-void CL_UpdateScreen(void)
+void CL_SetupScreenSize(void)
 {
        static float old2dresolution = -1;
 
-       if (scr_disabled_for_loading)
-               return;
-
-       if (!scr_initialized || !con_initialized)
-               return;                         // not initialized yet
-
-       R_TimeReport("other");
-
        VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
 
        VID_UpdateGamma(false);
@@ -881,6 +1006,21 @@ void CL_UpdateScreen(void)
 
        // determine size of refresh window
        SCR_CalcRefdef();
+}
+
+void CL_UpdateScreen(void)
+{
+       if (!scr_initialized || !con_initialized)
+               return;                         // not initialized yet
+
+       if (cl_avidemo.integer)
+               SCR_CaptureAVIDemo();
+       else
+               cl_avidemo_frame = 0;
+
+       R_TimeReport("other");
+
+       CL_SetupScreenSize();
 
        DrawQ_Clear();
 
@@ -901,6 +1041,12 @@ void CL_UpdateScreen(void)
 
        ui_draw();
 
+       if (scr_drawloading)
+       {
+               scr_drawloading = false;
+               SCR_DrawLoading();
+       }
+
        R_TimeReport("2d");
 
        // add r_speeds text to queue