X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=cl_screen.c;h=7e191f524158332a6591cacfc3731e9db2530e69;hb=9976ca010e51f14b9dfe4c5bc1f945344d3d9bf7;hp=a616b57f4eec2c7f44241387b6447f490aa595aa;hpb=ac1f5e196e3de73f49c12ee29537a78e8aa3aa0a;p=xonotic%2Fdarkplaces.git diff --git a/cl_screen.c b/cl_screen.c index a616b57f..7e191f52 100644 --- a/cl_screen.c +++ b/cl_screen.c @@ -9,6 +9,7 @@ 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"}; @@ -16,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; @@ -30,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); @@ -62,7 +69,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 +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; @@ -290,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 } @@ -461,6 +469,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); @@ -468,9 +477,12 @@ 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); @@ -491,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; @@ -530,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); @@ -592,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; } @@ -608,7 +628,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 +649,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); @@ -652,34 +672,48 @@ 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))) break; if (shotnumber >= 1000000) { - Con_Printf("SCR_ScreenShot_f: Couldn't create the image file\n"); + Con_Print("SCR_ScreenShot_f: Couldn't create the image file\n"); 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++; } @@ -687,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; } } @@ -716,25 +772,36 @@ 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_Printf ("envmap : 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 : 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; } @@ -742,12 +809,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; } @@ -761,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; } @@ -891,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"); @@ -921,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(); } @@ -946,4 +1021,3 @@ void CL_Screen_NewMap(void) { SHOWLMP_clear(); } -