]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_screen.c
NUM_FOR_EDICT now casts to int so that it never returns a 64bit integer on 64bit...
[xonotic/darkplaces.git] / cl_screen.c
index 0d2ce23f344efc6bf8048146a8b838bf3d1e7f0d..7e191f524158332a6591cacfc3731e9db2530e69 100644 (file)
@@ -17,9 +17,13 @@ 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"};
 cvar_t cl_avidemo = {0, "cl_avidemo", "0"};
+cvar_t r_textshadow = {0, "r_textshadow", "0"};
+cvar_t r_letterbox = {0, "r_letterbox", "0"};
 
 int jpeg_supported = false;
 
@@ -31,6 +35,8 @@ float         scr_conlines;           // lines of console to display
 int                    clearconsole;
 int                    clearnotify;
 
+extern int     con_vislines;
+
 qboolean       scr_drawloading = false;
 
 void DrawCrosshair(int num);
@@ -291,6 +297,7 @@ void SCR_DrawConsole (void)
        }
        else
        {
+               con_vislines = 0;
                if (key_dest == key_game || key_dest == key_message)
                        Con_DrawNotify ();      // only draw notify in game
        }
@@ -470,19 +477,18 @@ 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);
+       Cvar_RegisterVariable (&r_textshadow);
+       Cvar_RegisterVariable (&r_letterbox);
 
        Cmd_AddCommand ("sizeup",SCR_SizeUp_f);
        Cmd_AddCommand ("sizedown",SCR_SizeDown_f);
        Cmd_AddCommand ("screenshot",SCR_ScreenShot_f);
        Cmd_AddCommand ("envmap", R_Envmap_f);
 
-       // different default in GAME_FNIGGIUM
-       if (gamemode == GAME_FNIGGIUM)
-               Cvar_SetQuick(&scr_conforcewhiledisconnected, 0);
-       
        scr_initialized = true;
 }
 
@@ -497,7 +503,7 @@ void DrawQ_Pic(float x, float y, char *picname, float width, float height, float
        DrawQ_SuperPic(x,y,picname,width,height,0,0,red,green,blue,alpha,1,0,red,green,blue,alpha,0,1,red,green,blue,alpha,1,1,red,green,blue,alpha,flags);
 }
 
-void DrawQ_String(float x, float y, const char *string, int maxlen, float scalex, float scaley, float red, float green, float blue, float alpha, int flags)
+void DrawQ_String_Real(float x, float y, const char *string, int maxlen, float scalex, float scaley, float red, float green, float blue, float alpha, int flags)
 {
        int size, len;
        drawqueue_t *dq;
@@ -536,6 +542,14 @@ void DrawQ_String(float x, float y, const char *string, int maxlen, float scalex
        r_refdef.drawqueuesize += dq->size;
 }
 
+void DrawQ_String(float x, float y, const char *string, int maxlen, float scalex, float scaley, float red, float green, float blue, float alpha, int flags)
+{
+       if (r_textshadow.integer)
+               DrawQ_String_Real(x+scalex*0.25,y+scaley*0.25,string,maxlen,scalex,scaley,0,0,0,alpha*0.8,flags);
+
+       DrawQ_String_Real(x,y,string,maxlen,scalex,scaley,red,green,blue,alpha,flags); 
+}
+
 void DrawQ_Fill (float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags)
 {
        DrawQ_SuperPic(x,y,NULL,w,h,0,0,red,green,blue,alpha,1,0,red,green,blue,alpha,0,1,red,green,blue,alpha,1,1,red,green,blue,alpha,flags);
@@ -598,14 +612,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;
 }
 
@@ -658,15 +672,23 @@ SCR_ScreenShot_f
 */
 void SCR_ScreenShot_f (void)
 {
-       static int shotnumber = 0;
-       const char *base;
-       char filename[64];
+       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);
 
-       base = "screenshots/dp";
-       if (gamemode == GAME_FNIGGIUM)
-               base = "screenshots/fniggium";
-       
+       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 < 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)))
@@ -677,15 +699,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, 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++;
 }
 
@@ -693,20 +721,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, 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;
        }
 }
@@ -722,21 +772,32 @@ 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"}
+       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;
+       qbyte *buffer3;
 
        if (Cmd_Argc() != 3)
        {
@@ -767,15 +828,25 @@ 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);
+       buffer3 = Mem_Alloc(tempmempool, size * size * 3 + 18);
+
+       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);
                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, 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;
 }
 
@@ -897,10 +968,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");
@@ -927,7 +995,8 @@ void CL_UpdateScreen(void)
                        SCR_DrawNet ();
                        SCR_DrawTurtle ();
                        SCR_DrawPause ();
-                       Sbar_Draw();
+                       if (!r_letterbox.value)
+                               Sbar_Draw();
                        SHOWLMP_drawall();
                        SCR_CheckDrawCenterString();
                }
@@ -952,4 +1021,3 @@ void CL_Screen_NewMap(void)
 {
        SHOWLMP_clear();
 }
-