]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_screen.c
now displays light number (and total number of lights) in r_editlights mode
[xonotic/darkplaces.git] / cl_screen.c
index c1255701451f3a041a25242966ff56469b37dca3..13d8a52c86ee07b94339fd1a6cb2c6483279f7dd 100644 (file)
@@ -2,20 +2,30 @@
 #include "quakedef.h"
 #include "cl_video.h"
 #include "jpeg.h"
+#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"};
 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 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;
 
 qboolean       scr_initialized;                // ready to draw
 
@@ -25,12 +35,11 @@ float               scr_conlines;           // lines of console to display
 int                    clearconsole;
 int                    clearnotify;
 
-qboolean       scr_drawloading = false;
+extern int     con_vislines;
 
-static qbyte menuplyr_pixels[4096];
+qboolean       scr_drawloading = false;
 
 void DrawCrosshair(int num);
-void V_CalcRefdef (void);
 static void SCR_ScreenShot_f (void);
 static void R_Envmap_f (void);
 
@@ -60,9 +69,9 @@ 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)
 {
-       strncpy (scr_centerstring, str, sizeof(scr_centerstring)-1);
+       strlcpy (scr_centerstring, str, sizeof (scr_centerstring));
        scr_centertime_off = scr_centertime.value;
        scr_centertime_start = cl.time;
 
@@ -241,7 +250,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;
@@ -288,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
        }
@@ -304,7 +314,7 @@ void SCR_BeginLoadingPlaque (void)
        if (scr_drawloading)
                return;
 
-       S_StopAllSounds (true);
+       S_StopAllSounds ();
 
        scr_drawloading = true;
        CL_UpdateScreen ();
@@ -364,13 +374,12 @@ void R_TimeReport_Start(void)
        if (r_timereport_active)
        {
                speedstringcount = 0;
-               AngleVectors (r_refdef.viewangles, vpn, NULL, NULL);
                sprintf(r_speeds_string,
-                       "org:'%+8.2f %+8.2f %+8.2f' ang:'%+4.0f %+4.0f %+4.0f' dir:'%+2.3f %+2.3f %+2.3f'\n"
+                       "org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n"
                        "world:%6i faces%6i nodes%6i leafs%6i dlitwalls\n"
                        "%5i models%5i bmodels%5i sprites%6i particles%4i dlights\n"
                        "%6i modeltris%6i meshs%6i meshtris\n",
-                       r_refdef.vieworg[0], r_refdef.vieworg[1], r_refdef.vieworg[2], r_refdef.viewangles[0], r_refdef.viewangles[1], r_refdef.viewangles[2], vpn[0], vpn[1], vpn[2],
+                       r_vieworigin[0], r_vieworigin[1], r_vieworigin[2], r_viewforward[0], r_viewforward[1], r_viewforward[2],
                        c_faces, c_nodes, c_leafs, c_light_polys,
                        c_models, c_bmodels, c_sprites, c_particles, c_dlights,
                        c_alias_polys, c_meshs, c_meshelements / 3);
@@ -455,21 +464,25 @@ void SCR_SizeDown_f (void)
 
 void CL_Screen_Init(void)
 {
-       qpic_t *dat;
-
        Cvar_RegisterVariable (&scr_fov);
        Cvar_RegisterVariable (&scr_viewsize);
        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);
        Cvar_RegisterVariable (&scr_centertime);
        Cvar_RegisterVariable (&scr_printspeed);
-       Cvar_RegisterVariable (&scr_2dresolution);
+       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);
@@ -477,19 +490,6 @@ void CL_Screen_Init(void)
        Cmd_AddCommand ("envmap", R_Envmap_f);
 
        scr_initialized = true;
-
-       // HACK HACK HACK
-       // load the image data for the player image in the config menu
-       dat = (qpic_t *)FS_LoadFile ("gfx/menuplyr.lmp", false);
-       if (!dat)
-               Sys_Error("unable to load gfx/menuplyr.lmp");
-       SwapPic (dat);
-
-       if (dat->width*dat->height <= 4096)
-               memcpy (menuplyr_pixels, dat->data, dat->width * dat->height);
-       else
-               Con_Printf("gfx/menuplyr.lmp larger than 4k buffer");
-       Mem_Free(dat);
 }
 
 void DrawQ_Clear(void)
@@ -503,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;
@@ -542,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);
@@ -562,21 +570,21 @@ void DrawQ_SuperPic(float x, float y, char *picname, float width, float height,
                        height = pic->height;
                mesh.texture = pic->tex;
        }
-       mesh.numtriangles = 2;
-       mesh.numvertices = 4;
-       mesh.element3i = picelements;
-       mesh.vertex3f = floats;
-       mesh.texcoord2f = floats + 12;
-       mesh.color4f = floats + 20;
+       mesh.num_triangles = 2;
+       mesh.num_vertices = 4;
+       mesh.data_element3i = picelements;
+       mesh.data_vertex3f = floats;
+       mesh.data_texcoord2f = floats + 12;
+       mesh.data_color4f = floats + 20;
        memset(floats, 0, sizeof(floats));
-       mesh.vertex3f[0] = mesh.vertex3f[9] = x;
-       mesh.vertex3f[1] = mesh.vertex3f[4] = y;
-       mesh.vertex3f[3] = mesh.vertex3f[6] = x + width;
-       mesh.vertex3f[7] = mesh.vertex3f[10] = y + height;
-       mesh.texcoord2f[0] = s1;mesh.texcoord2f[1] = t1;mesh.color4f[ 0] = r1;mesh.color4f[ 1] = g1;mesh.color4f[ 2] = b1;mesh.color4f[ 3] = a1;
-       mesh.texcoord2f[2] = s2;mesh.texcoord2f[3] = t2;mesh.color4f[ 4] = r2;mesh.color4f[ 5] = g2;mesh.color4f[ 6] = b2;mesh.color4f[ 7] = a2;
-       mesh.texcoord2f[4] = s4;mesh.texcoord2f[5] = t4;mesh.color4f[ 8] = r4;mesh.color4f[ 9] = g4;mesh.color4f[10] = b4;mesh.color4f[11] = a4;
-       mesh.texcoord2f[6] = s3;mesh.texcoord2f[7] = t3;mesh.color4f[12] = r3;mesh.color4f[13] = g3;mesh.color4f[14] = b3;mesh.color4f[15] = a3;
+       mesh.data_vertex3f[0] = mesh.data_vertex3f[9] = x;
+       mesh.data_vertex3f[1] = mesh.data_vertex3f[4] = y;
+       mesh.data_vertex3f[3] = mesh.data_vertex3f[6] = x + width;
+       mesh.data_vertex3f[7] = mesh.data_vertex3f[10] = y + height;
+       mesh.data_texcoord2f[0] = s1;mesh.data_texcoord2f[1] = t1;mesh.data_color4f[ 0] = r1;mesh.data_color4f[ 1] = g1;mesh.data_color4f[ 2] = b1;mesh.data_color4f[ 3] = a1;
+       mesh.data_texcoord2f[2] = s2;mesh.data_texcoord2f[3] = t2;mesh.data_color4f[ 4] = r2;mesh.data_color4f[ 5] = g2;mesh.data_color4f[ 6] = b2;mesh.data_color4f[ 7] = a2;
+       mesh.data_texcoord2f[4] = s4;mesh.data_texcoord2f[5] = t4;mesh.data_color4f[ 8] = r4;mesh.data_color4f[ 9] = g4;mesh.data_color4f[10] = b4;mesh.data_color4f[11] = a4;
+       mesh.data_texcoord2f[6] = s3;mesh.data_texcoord2f[7] = t3;mesh.data_color4f[12] = r3;mesh.data_color4f[13] = g3;mesh.data_color4f[14] = b3;mesh.data_color4f[15] = a3;
        DrawQ_Mesh (&mesh, flags);
 }
 
@@ -588,10 +596,10 @@ void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags)
        drawqueuemesh_t *m;
        size = sizeof(*dq);
        size += sizeof(drawqueuemesh_t);
-       size += sizeof(int[3]) * mesh->numtriangles;
-       size += sizeof(float[3]) * mesh->numvertices;
-       size += sizeof(float[2]) * mesh->numvertices;
-       size += sizeof(float[4]) * mesh->numvertices;
+       size += sizeof(int[3]) * mesh->num_triangles;
+       size += sizeof(float[3]) * mesh->num_vertices;
+       size += sizeof(float[2]) * mesh->num_vertices;
+       size += sizeof(float[4]) * mesh->num_vertices;
        if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
                return;
        dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
@@ -604,106 +612,57 @@ 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->numtriangles = mesh->numtriangles;
-       m->numvertices = mesh->numvertices;
+       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->element3i  = p;memcpy(m->element3i , mesh->element3i , m->numtriangles * sizeof(int[3]));(qbyte *)p += m->numtriangles * sizeof(int[3]);
-       m->vertex3f   = p;memcpy(m->vertex3f  , mesh->vertex3f  , m->numvertices * sizeof(float[3]));(qbyte *)p += m->numvertices * sizeof(float[3]);
-       m->texcoord2f = p;memcpy(m->texcoord2f, mesh->texcoord2f, m->numvertices * sizeof(float[2]));(qbyte *)p += m->numvertices * sizeof(float[2]);
-       m->color4f    = p;memcpy(m->color4f   , mesh->color4f   , m->numvertices * sizeof(float[4]));(qbyte *)p += m->numvertices * 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;
 }
 
-/*
-====================
-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)
+void DrawQ_SetClipArea(float x, float y, float width, float height)
 {
-       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)
+       drawqueue_t * dq;
+       if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
        {
-               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;
+               Con_DPrint("DrawQueue full !\n");
+               return;
        }
+       dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
+       dq->size = sizeof(*dq);
+       dq->command = DRAWQUEUE_SETCLIP;
+       dq->x = x;
+       dq->y = y;
+       dq->scalex = width;
+       dq->scaley = height;
+       dq->flags = 0;
+       dq->color = 0;
 
-       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);
+       r_refdef.drawqueuesize += dq->size;
+}
 
-       if (cl.worldmodel)
+void DrawQ_ResetClipArea(void)
+{
+       drawqueue_t *dq;
+       if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
        {
-               Mod_CheckLoaded(cl.worldmodel);
-               contents = cl.worldmodel ? cl.worldmodel->PointContents(cl.worldmodel, r_refdef.vieworg) : CONTENTS_EMPTY;
-               if (contents != CONTENTS_EMPTY && contents != CONTENTS_SOLID)
-               {
-                       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);
-               }
+               Con_DPrint("DrawQueue full !\n");
+               return;
        }
+       dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
+       dq->size = sizeof(*dq);
+       dq->command = DRAWQUEUE_RESETCLIP;
+       dq->x = 0;
+       dq->y = 0;
+       dq->scalex = 0;
+       dq->scaley = 0;
+       dq->flags = 0;
+       dq->color = 0;
+
+       r_refdef.drawqueuesize += dq->size;
 }
 
 /*
@@ -713,49 +672,91 @@ SCR_ScreenShot_f
 */
 void SCR_ScreenShot_f (void)
 {
-       static int i = 0;
-       char filename[16];
-       char checkname[MAX_OSPATH];
-       const char* extens;
+       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);
 
-       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++)
+       if (strcmp (oldname, scr_screenshot_name.string))
        {
-               sprintf (filename, "dp%04i.%s", i, extens);
-               sprintf (checkname, "%s/%s", fs_gamedir, filename);
-               if (!FS_SysFileExists(checkname))
-                       break;
+               sprintf(oldname, "%s", scr_screenshot_name.string);
+               shotnumber = 0;
        }
-       if (i==10000)
+
+       // 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)))
+                       break;
+       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);
+       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, 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);
+               Con_Printf("unable to write %s\n", filename);
+
+       Mem_Free (buffer1);
+       Mem_Free (buffer2);
+       Mem_Free (buffer3);
+
+       shotnumber++;
 }
 
 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];
-       sprintf(filename, "dpavi%06d.tga", cl_avidemo_frame);
-       if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, false))
+       qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
+
+       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);
+       }
+
+       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;
        }
 }
@@ -771,38 +772,49 @@ 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)
        {
-               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;
        }
 
-       strcpy(basename, Cmd_Argv(1));
+       strlcpy (basename, Cmd_Argv(1), sizeof (basename));
        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;
        }
 
@@ -816,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);
-               VectorCopy(envmapinfo[j].angles, r_refdef.viewangles);
+               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_RenderView ();
-               SCR_ScreenShot(filename, vid.realx, vid.realy, size, size, false);
+               R_Mesh_Start();
+               R_RenderView();
+               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;
 }
 
@@ -862,8 +884,8 @@ void SHOWLMP_decodeshow(void)
        int i, k;
        qbyte lmplabel[256], picname[256];
        float x, y;
-       strcpy(lmplabel,MSG_ReadString());
-       strcpy(picname, MSG_ReadString());
+       strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
+       strlcpy (picname, MSG_ReadString(), sizeof (picname));
        if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
        {
                x = MSG_ReadByte();
@@ -890,8 +912,8 @@ void SHOWLMP_decodeshow(void)
                return; // none found to replace
        // change existing one
        showlmp[k].isactive = true;
-       strcpy(showlmp[k].label, lmplabel);
-       strcpy(showlmp[k].pic, picname);
+       strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label));
+       strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic));
        showlmp[k].x = x;
        showlmp[k].y = y;
 }
@@ -913,38 +935,31 @@ void SHOWLMP_clear(void)
 
 void CL_SetupScreenSize(void)
 {
-       static float old2dresolution = -1;
+       float conwidth, conheight;
 
        VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
 
        VID_UpdateGamma(false);
 
-       if (scr_2dresolution.value != old2dresolution)
-       {
-               Cvar_SetValue("scr_2dresolution", bound(0.0f, scr_2dresolution.value, 1.0f));
-               old2dresolution = scr_2dresolution.value;
-       }
+       conwidth = bound(320, vid_conwidth.value, 2048);
+       conheight = bound(200, vid_conheight.value, 1536);
+       if (vid_conwidth.value != conwidth)
+               Cvar_SetValue("vid_conwidth", conwidth);
+       if (vid_conheight.value != conheight)
+               Cvar_SetValue("vid_conheight", conheight);
 
-       if (vid.realwidth > 320)
-       {
-               vid.conwidth = (vid.realwidth - 320) * scr_2dresolution.value + 320;
-               vid.conwidth = bound(320, vid.conwidth, vid.realwidth);
-       }
-       else
-               vid.conwidth = 320;
+       vid.conwidth = vid_conwidth.integer;
+       vid.conheight = vid_conheight.integer;
 
-       if (vid.realheight > 240)
+/*     if (vid.realheight > 240)
        {
                vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
                vid.conheight = bound(240, vid.conheight, vid.realheight);
        }
        else
-               vid.conheight = 240;
+               vid.conheight = 240;*/
 
        SCR_SetUpToDrawConsole();
-
-       // determine size of refresh window
-       SCR_CalcRefdef();
 }
 
 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
@@ -953,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");
@@ -965,9 +977,6 @@ void CL_UpdateScreen(void)
 
        DrawQ_Clear();
 
-       if (!intimerefresh)
-               V_CalcRefdef();
-
        if (cls.signon == SIGNONS)
                R_TimeReport("setup");
 
@@ -986,13 +995,15 @@ void CL_UpdateScreen(void)
                        SCR_DrawNet ();
                        SCR_DrawTurtle ();
                        SCR_DrawPause ();
-                       Sbar_Draw();
+                       if (!r_letterbox.value)
+                               Sbar_Draw();
                        SHOWLMP_drawall();
                        SCR_CheckDrawCenterString();
                }
-               ui_draw();
+               MR_Draw();
+               UI_Callback_Draw();
                CL_DrawVideo();
-               M_Draw();
+               //ui_draw();
                if (cls.signon == SIGNONS)
                {
                        R_TimeReport("2d");
@@ -1010,4 +1021,3 @@ void CL_Screen_NewMap(void)
 {
        SHOWLMP_clear();
 }
-