]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_screen.c
Tomaz fixed the envmap command; it was saving black images, and now saves images...
[xonotic/darkplaces.git] / cl_screen.c
index b8038ba79cd22f6b3e7fad775fd17556d7bf5560..0fa9a6d8e78dea02983c47a423988db41ce92f9b 100644 (file)
@@ -5,10 +5,11 @@
 #include "cl_collision.h"
 
 cvar_t scr_viewsize = {CVAR_SAVE, "viewsize","100"};
-cvar_t scr_fov = {CVAR_SAVE, "fov","90"};      // 10 - 170
+cvar_t scr_fov = {CVAR_SAVE, "fov","90"};      // 1 - 170
 cvar_t scr_conspeed = {CVAR_SAVE, "scr_conspeed","900"}; // LordHavoc: quake used 300
 cvar_t scr_conalpha = {CVAR_SAVE, "scr_conalpha", "1"};
 cvar_t scr_conbrightness = {CVAR_SAVE, "scr_conbrightness", "0.2"};
+cvar_t scr_conforcewhiledisconnected = {CVAR_SAVE, "scr_conforcewhiledisconnected", "1"};
 cvar_t scr_centertime = {0, "scr_centertime","2"};
 cvar_t scr_showram = {CVAR_SAVE, "showram","1"};
 cvar_t scr_showturtle = {CVAR_SAVE, "showturtle","0"};
@@ -18,6 +19,7 @@ cvar_t vid_conwidth = {CVAR_SAVE, "vid_conwidth", "640"};
 cvar_t vid_conheight = {CVAR_SAVE, "vid_conheight", "480"};
 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"};
 cvar_t cl_avidemo = {0, "cl_avidemo", "0"};
 
 int jpeg_supported = false;
@@ -62,7 +64,7 @@ Called for important messages that should stay in the center of the screen
 for a few moments
 ==============
 */
-void SCR_CenterPrint (char *str)
+void SCR_CenterPrint(char *str)
 {
        strlcpy (scr_centerstring, str, sizeof (scr_centerstring));
        scr_centertime_off = scr_centertime.value;
@@ -243,7 +245,7 @@ void SCR_SetUpToDrawConsole (void)
 {
        Con_CheckResize ();
 
-       if (key_dest == key_game && cls.signon != SIGNONS)
+       if (key_dest == key_game && cls.signon != SIGNONS && scr_conforcewhiledisconnected.integer)
                key_consoleactive |= KEY_CONSOLEACTIVE_FORCED;
        else
                key_consoleactive &= ~KEY_CONSOLEACTIVE_FORCED;
@@ -461,6 +463,7 @@ void CL_Screen_Init(void)
        Cvar_RegisterVariable (&scr_conspeed);
        Cvar_RegisterVariable (&scr_conalpha);
        Cvar_RegisterVariable (&scr_conbrightness);
+       Cvar_RegisterVariable (&scr_conforcewhiledisconnected);
        Cvar_RegisterVariable (&scr_showram);
        Cvar_RegisterVariable (&scr_showturtle);
        Cvar_RegisterVariable (&scr_showpause);
@@ -592,14 +595,14 @@ void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags)
        dq->scalex = 0;
        dq->scaley = 0;
        p = (void *)(dq + 1);
-       m = p;(qbyte *)p += sizeof(drawqueuemesh_t);
+       m = p;p = (qbyte*)p + sizeof(drawqueuemesh_t);
        m->num_triangles = mesh->num_triangles;
        m->num_vertices = mesh->num_vertices;
        m->texture = mesh->texture;
-       m->data_element3i  = p;memcpy(m->data_element3i , mesh->data_element3i , m->num_triangles * sizeof(int[3]));(qbyte *)p += m->num_triangles * sizeof(int[3]);
-       m->data_vertex3f   = p;memcpy(m->data_vertex3f  , mesh->data_vertex3f  , m->num_vertices * sizeof(float[3]));(qbyte *)p += m->num_vertices * sizeof(float[3]);
-       m->data_texcoord2f = p;memcpy(m->data_texcoord2f, mesh->data_texcoord2f, m->num_vertices * sizeof(float[2]));(qbyte *)p += m->num_vertices * sizeof(float[2]);
-       m->data_color4f    = p;memcpy(m->data_color4f   , mesh->data_color4f   , m->num_vertices * sizeof(float[4]));(qbyte *)p += m->num_vertices * sizeof(float[4]);
+       m->data_element3i  = p;memcpy(m->data_element3i , mesh->data_element3i , m->num_triangles * sizeof(int[3]));p = (qbyte*)p + m->num_triangles * sizeof(int[3]);
+       m->data_vertex3f   = p;memcpy(m->data_vertex3f  , mesh->data_vertex3f  , m->num_vertices * sizeof(float[3]));p = (qbyte*)p + m->num_vertices * sizeof(float[3]);
+       m->data_texcoord2f = p;memcpy(m->data_texcoord2f, mesh->data_texcoord2f, m->num_vertices * sizeof(float[2]));p = (qbyte*)p + m->num_vertices * sizeof(float[2]);
+       m->data_color4f    = p;memcpy(m->data_color4f   , mesh->data_color4f   , m->num_vertices * sizeof(float[4]));p = (qbyte*)p + m->num_vertices * sizeof(float[4]);
        r_refdef.drawqueuesize += dq->size;
 }
 
@@ -608,7 +611,7 @@ void DrawQ_SetClipArea(float x, float y, float width, float height)
        drawqueue_t * dq;
        if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
        {
-               Con_DPrintf("DrawQueue full !\n");
+               Con_DPrint("DrawQueue full !\n");
                return;
        }
        dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
@@ -629,7 +632,7 @@ void DrawQ_ResetClipArea(void)
        drawqueue_t *dq;
        if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
        {
-               Con_DPrintf("DrawQueue full !\n");
+               Con_DPrint("DrawQueue full !\n");
                return;
        }
        dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
@@ -645,97 +648,6 @@ void DrawQ_ResetClipArea(void)
        r_refdef.drawqueuesize += dq->size;
 }
 
-/*
-====================
-CalcFov
-====================
-*/
-float CalcFov (float fov_x, float width, float height)
-{
-       // calculate vision size and alter by aspect, then convert back to angle
-       return atan (height / (width / tan(fov_x/360*M_PI))) * 360 / M_PI;
-}
-
-/*
-=================
-SCR_CalcRefdef
-
-Must be called whenever vid changes
-Internal use only
-=================
-*/
-static void SCR_CalcRefdef (void)
-{
-       float size;
-       int contents;
-
-//========================================
-
-// 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 < 10)
-               Cvar_Set ("fov","10");
-       if (scr_fov.value > 170)
-               Cvar_Set ("fov","170");
-
-// intermission is always full screen
-       if (cl.intermission)
-       {
-               size = 1;
-               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;
-               size = scr_viewsize.value * (1.0 / 100.0);
-       }
-
-       if (size >= 1)
-       {
-               r_refdef.width = vid.realwidth;
-               r_refdef.height = vid.realheight;
-               r_refdef.x = 0;
-               r_refdef.y = 0;
-       }
-       else
-       {
-               r_refdef.width = vid.realwidth * size;
-               r_refdef.height = vid.realheight * size;
-               r_refdef.x = (vid.realwidth - r_refdef.width)/2;
-               r_refdef.y = (vid.realheight - r_refdef.height)/2;
-       }
-
-       r_refdef.width = bound(0, r_refdef.width, vid.realwidth);
-       r_refdef.height = bound(0, r_refdef.height, vid.realheight);
-       r_refdef.x = bound(0, r_refdef.x, vid.realwidth - r_refdef.width) + vid.realx;
-       r_refdef.y = bound(0, r_refdef.y, vid.realheight - r_refdef.height) + vid.realy;
-
-       // LordHavoc: viewzoom (zoom in for sniper rifles, etc)
-       r_refdef.fov_x = scr_fov.value * cl.viewzoom;
-       r_refdef.fov_y = CalcFov (r_refdef.fov_x, r_refdef.width, r_refdef.height);
-
-       if (cl.worldmodel)
-       {
-               Mod_CheckLoaded(cl.worldmodel);
-               contents = CL_PointSuperContents(r_vieworigin);
-               if (contents & SUPERCONTENTS_LIQUIDSMASK)
-               {
-                       r_refdef.fov_x *= (sin(cl.time * 4.7) * 0.015 + 0.985);
-                       r_refdef.fov_y *= (sin(cl.time * 3.0) * 0.015 + 0.985);
-               }
-       }
-}
-
 /*
 ==================
 SCR_ScreenShot_f
@@ -743,35 +655,33 @@ SCR_ScreenShot_f
 */
 void SCR_ScreenShot_f (void)
 {
-       static int i = 0;
-       char filename[16];
-       char checkname[MAX_OSPATH];
-       const char* extens;
+       int shotnumber;
+       char base[MAX_QPATH];
+       char filename[MAX_QPATH];
        qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
 
-       if (jpeg)
-               extens = "jpg";
-       else
-               extens = "tga";
-
+       sprintf (base, "screenshots/%s", scr_screenshot_name.string);
+       
        // find a file name to save it to
-       for (; i<=9999 ; i++)
-       {
-               sprintf (filename, "dp%04i.%s", i, extens);
-               sprintf (checkname, "%s/%s", fs_gamedir, filename);
-               if (!FS_SysFileExists(checkname))
+       for (shotnumber=0;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 (i==10000)
+       if (shotnumber >= 1000000)
        {
-               Con_Print("SCR_ScreenShot_f: Couldn't create the image file\n");
+               Con_Print("SCR_ScreenShot_f: Couldn't create the image file\n");
                return;
        }
 
-       if (SCR_ScreenShot (filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
-               Con_Printf ("Wrote %s\n", filename);
+       if (jpeg)
+               sprintf(filename, "%s%06d.jpg", base, shotnumber);
+       else
+               sprintf(filename, "%s%06d.tga", base, shotnumber);
+
+       if (SCR_ScreenShot(filename, 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);
+               Con_Printf("unable to write %s\n", filename);
+       shotnumber++;
 }
 
 static int cl_avidemo_frame = 0;
@@ -782,11 +692,11 @@ void SCR_CaptureAVIDemo(void)
        qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
 
        if (jpeg)
-               sprintf(filename, "dpavi%06d.jpg", cl_avidemo_frame);
+               sprintf(filename, "video/dp%06d.jpg", cl_avidemo_frame);
        else
-               sprintf(filename, "dpavi%06d.tga", cl_avidemo_frame);
+               sprintf(filename, "video/dp%06d.tga", cl_avidemo_frame);
 
-       if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
+       if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
                cl_avidemo_frame++;
        else
        {
@@ -807,15 +717,16 @@ struct
 {
        float angles[3];
        char *name;
+       qboolean flipx, flipy;
 }
 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"}
+       {{  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}
 };
 
 static void R_Envmap_f (void)
@@ -825,7 +736,7 @@ static void R_Envmap_f (void)
 
        if (Cmd_Argc() != 3)
        {
-               Con_Print("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");
+               Con_Print("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;
        }
 
@@ -833,12 +744,12 @@ static void R_Envmap_f (void)
        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");
+               Con_Print("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");
+               Con_Print("envmap: your resolution is not big enough to render that size\n");
                return;
        }
 
@@ -857,8 +768,10 @@ static void R_Envmap_f (void)
                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);
                R_ClearScreen();
+               R_Mesh_Start();
                R_RenderView();
-               SCR_ScreenShot(filename, vid.realx, vid.realy + vid.realheight - (r_refdef.y + r_refdef.height), size, size, false);
+               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);
        }
 
        envmap = false;
@@ -974,9 +887,6 @@ void CL_SetupScreenSize(void)
                vid.conheight = 240;*/
 
        SCR_SetUpToDrawConsole();
-
-       // determine size of refresh window
-       SCR_CalcRefdef();
 }
 
 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
@@ -1040,4 +950,3 @@ void CL_Screen_NewMap(void)
 {
        SHOWLMP_clear();
 }
-