X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=cl_screen.c;h=0c05593927e3195fba5a77c47a019311d1a0ff83;hb=0de01be8e5014bfd5afe696387770d81383bd8ee;hp=9dbeb5620b4084d3835a11f72c556ea0d0d94dfa;hpb=e0eea3add3769f5ce1acdfa52dfbea9c3532b003;p=xonotic%2Fdarkplaces.git diff --git a/cl_screen.c b/cl_screen.c index 9dbeb562..0c055939 100644 --- a/cl_screen.c +++ b/cl_screen.c @@ -81,6 +81,8 @@ float scr_centertime_off; int scr_center_lines; int scr_erase_lines; int scr_erase_center; +char scr_infobarstring[MAX_INPUTLINE]; +float scr_infobartime_off; /* ============== @@ -90,7 +92,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(const char *str) { strlcpy (scr_centerstring, str, sizeof (scr_centerstring)); scr_centertime_off = scr_centertime.value; @@ -442,7 +444,7 @@ SCR_DrawQWDownload */ static int SCR_DrawQWDownload(int offset) { - // sync with SCR_DownloadHeight + // sync with SCR_InfobarHeight int len; float x, y; float size = 8; @@ -466,12 +468,30 @@ static int SCR_DrawQWDownload(int offset) else dpsnprintf(temp, sizeof(temp), "Downloading %s %3i%% (%i/%i) at %i bytes/s\n", cls.qw_downloadname, cls.qw_downloadpercent, cls.qw_downloadmemorycursize, cls.qw_downloadmemorymaxsize, cls.qw_downloadspeedrate); len = (int)strlen(temp); - x = (vid_conwidth.integer - DrawQ_TextWidth_Font(temp, len, 0, FONT_INFOBAR) * size) / 2; + x = (vid_conwidth.integer - DrawQ_TextWidth_Font(temp, len, true, FONT_INFOBAR) * size) / 2; y = vid_conheight.integer - size - offset; DrawQ_Fill(0, y, vid_conwidth.integer, size, 0, 0, 0, cls.signon == SIGNONS ? 0.5 : 1, 0); DrawQ_String_Font(x, y, temp, len, size, size, 1, 1, 1, 1, 0, NULL, true, FONT_INFOBAR); return 8; } +/* +============== +SCR_DrawInfobarString +============== +*/ +static int SCR_DrawInfobarString(int offset) +{ + int len; + float x, y; + float size = 8; + + len = (int)strlen(scr_infobarstring); + x = (vid_conwidth.integer - DrawQ_TextWidth_Font(scr_infobarstring, len, false, FONT_INFOBAR) * size) / 2; + y = vid_conheight.integer - size - offset; + DrawQ_Fill(0, y, vid_conwidth.integer, size, 0, 0, 0, cls.signon == SIGNONS ? 0.5 : 1, 0); + DrawQ_String_Font(x, y, scr_infobarstring, len, size, size, 1, 1, 1, 1, 0, NULL, false, FONT_INFOBAR); + return 8; +} /* ============== @@ -480,7 +500,7 @@ SCR_DrawCurlDownload */ static int SCR_DrawCurlDownload(int offset) { - // sync with SCR_DownloadHeight + // sync with SCR_InfobarHeight int len; int nDownloads; int i; @@ -499,7 +519,7 @@ static int SCR_DrawCurlDownload(int offset) if(addinfo) { len = (int)strlen(addinfo); - x = (vid_conwidth.integer - DrawQ_TextWidth_Font(addinfo, len, false, FONT_INFOBAR) * size) / 2; + x = (vid_conwidth.integer - DrawQ_TextWidth_Font(addinfo, len, true, FONT_INFOBAR) * size) / 2; DrawQ_Fill(0, y - size, vid_conwidth.integer, size, 1, 1, 1, cls.signon == SIGNONS ? 0.8 : 1, 0); DrawQ_String_Font(x, y - size, addinfo, len, size, size, 0, 0, 0, 1, 0, NULL, true, FONT_INFOBAR); } @@ -513,7 +533,7 @@ static int SCR_DrawCurlDownload(int offset) else dpsnprintf(temp, sizeof(temp), "Downloading %s ... %5.1f%% @ %.1f KiB/s\n", downinfo[i].filename, 100.0 * downinfo[i].progress, downinfo[i].speed / 1024.0); len = (int)strlen(temp); - x = (vid_conwidth.integer - DrawQ_TextWidth_Font(temp, len, false, FONT_INFOBAR) * size) / 2; + x = (vid_conwidth.integer - DrawQ_TextWidth_Font(temp, len, true, FONT_INFOBAR) * size) / 2; DrawQ_Fill(0, y + i * size, vid_conwidth.integer, size, 0, 0, 0, cls.signon == SIGNONS ? 0.5 : 1, 0); DrawQ_String_Font(x, y + i * size, temp, len, size, size, 1, 1, 1, 1, 0, NULL, true, FONT_INFOBAR); } @@ -525,27 +545,34 @@ static int SCR_DrawCurlDownload(int offset) /* ============== -SCR_DrawDownload +SCR_DrawInfobar ============== */ -static void SCR_DrawDownload() +static void SCR_DrawInfobar() { int offset = 0; + if(scr_infobartime_off > 0) + offset += SCR_DrawInfobarString(offset); offset += SCR_DrawQWDownload(offset); offset += SCR_DrawCurlDownload(offset); if(offset != scr_con_margin_bottom) Con_DPrintf("broken console margin calculation: %d != %d\n", offset, scr_con_margin_bottom); } -static int SCR_DownloadHeight() +static int SCR_InfobarHeight() { int offset = 0; Curl_downloadinfo_t *downinfo; const char *addinfo; int nDownloads; + if (cl.time > cl.oldtime) + scr_infobartime_off -= cl.time - cl.oldtime; + if(scr_infobartime_off > 0) + offset += 8; + if(cls.qw_downloadname[0]) - offset += 0; + offset += 8; downinfo = Curl_GetDownloadInfo(&nDownloads, &addinfo); if(downinfo) @@ -557,6 +584,23 @@ static int SCR_DownloadHeight() return offset; } +/* +============== +SCR_InfoBar_f +============== +*/ +void SCR_InfoBar_f(void) +{ + if(Cmd_Argc() == 3) + { + scr_infobartime_off = atof(Cmd_Argv(1)); + strlcpy(scr_infobarstring, Cmd_Argv(2), sizeof(scr_infobarstring)); + } + else + { + Con_Printf("usage:\ninfobar expiretime \"string\"\n"); + } +} //============================================================================= /* @@ -603,7 +647,7 @@ SCR_DrawConsole */ void SCR_DrawConsole (void) { - scr_con_margin_bottom = SCR_DownloadHeight(); + scr_con_margin_bottom = SCR_InfobarHeight(); if (key_consoleactive & KEY_CONSOLEACTIVE_FORCED) { // full screen @@ -697,18 +741,23 @@ void R_TimeReport_EndFrame(void) // put the location name in the r_speeds display as it greatly helps // when creating loc files loc = CL_Locs_FindNearest(cl.movement_origin); - if (loc) - sprintf(string + strlen(string), "Location: %s\n", loc->name); - sprintf(string + strlen(string), "%3i renders org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n", r_refdef.stats.renders, r_refdef.view.origin[0], r_refdef.view.origin[1], r_refdef.view.origin[2], r_refdef.view.forward[0], r_refdef.view.forward[1], r_refdef.view.forward[2]); - sprintf(string + strlen(string), "%7i surfaces%7i triangles %5i entities (%7i surfaces%7i triangles)\n", r_refdef.stats.world_surfaces, r_refdef.stats.world_triangles, r_refdef.stats.entities, r_refdef.stats.entities_surfaces, r_refdef.stats.entities_triangles); - sprintf(string + strlen(string), "%5i leafs%5i portals%6i/%6i particles%6i/%6i decals %3i%% quality\n", r_refdef.stats.world_leafs, r_refdef.stats.world_portals, r_refdef.stats.particles, cl.num_particles, r_refdef.stats.decals, cl.num_decals, (int)(100 * r_refdef.view.quality)); - sprintf(string + strlen(string), "%7i lightmap updates (%7i pixels)\n", r_refdef.stats.lightmapupdates, r_refdef.stats.lightmapupdatepixels); - sprintf(string + strlen(string), "%4i lights%4i clears%4i scissored%7i light%7i shadow%7i dynamic\n", r_refdef.stats.lights, r_refdef.stats.lights_clears, r_refdef.stats.lights_scissored, r_refdef.stats.lights_lighttriangles, r_refdef.stats.lights_shadowtriangles, r_refdef.stats.lights_dynamicshadowtriangles); - if (r_refdef.stats.bloom) - sprintf(string + strlen(string), "rendered%6i meshes%8i triangles bloompixels%8i copied%8i drawn\n", r_refdef.stats.meshes, r_refdef.stats.meshes_elements / 3, r_refdef.stats.bloom_copypixels, r_refdef.stats.bloom_drawpixels); - else - sprintf(string + strlen(string), "rendered%6i meshes%8i triangles\n", r_refdef.stats.meshes, r_refdef.stats.meshes_elements / 3); - strlcat(string, r_speeds_timestring, sizeof(string)); + dpsnprintf(string, sizeof(string), +"%s%s\n" +"%3i renders org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n" +"%7i surfaces%7i triangles %5i entities (%7i surfaces%7i triangles)\n" +"%5i leafs%5i portals%6i/%6i particles%6i/%6i decals %3i%% quality\n" +"%7i lightmap updates (%7i pixels)\n" +"%4i lights%4i clears%4i scissored%7i light%7i shadow%7i dynamic\n" +"rendered%6i meshes%8i triangles bloompixels%8i copied%8i drawn\n" +"%s" +, loc ? "Location: " : "", loc ? loc->name : "" +, r_refdef.stats.renders, r_refdef.view.origin[0], r_refdef.view.origin[1], r_refdef.view.origin[2], r_refdef.view.forward[0], r_refdef.view.forward[1], r_refdef.view.forward[2] +, r_refdef.stats.world_surfaces, r_refdef.stats.world_triangles, r_refdef.stats.entities, r_refdef.stats.entities_surfaces, r_refdef.stats.entities_triangles +, r_refdef.stats.world_leafs, r_refdef.stats.world_portals, r_refdef.stats.particles, cl.num_particles, r_refdef.stats.decals, cl.num_decals, (int)(100 * r_refdef.view.quality) +, r_refdef.stats.lightmapupdates, r_refdef.stats.lightmapupdatepixels +, r_refdef.stats.lights, r_refdef.stats.lights_clears, r_refdef.stats.lights_scissored, r_refdef.stats.lights_lighttriangles, r_refdef.stats.lights_shadowtriangles, r_refdef.stats.lights_dynamicshadowtriangles +, r_refdef.stats.meshes, r_refdef.stats.meshes_elements / 3, r_refdef.stats.bloom_copypixels, r_refdef.stats.bloom_drawpixels +, r_speeds_timestring); memset(&r_refdef.stats, 0, sizeof(r_refdef.stats)); @@ -824,6 +873,7 @@ void CL_Screen_Init(void) Cmd_AddCommand ("sizedown",SCR_SizeDown_f, "decrease view size (decreases viewsize cvar)"); Cmd_AddCommand ("screenshot",SCR_ScreenShot_f, "takes a screenshot of the next rendered frame"); Cmd_AddCommand ("envmap", R_Envmap_f, "render a cubemap (skybox) of the current scene"); + Cmd_AddCommand ("infobar", SCR_InfoBar_f, "display a text in the infobar (usage: infobar expiretime string)"); scr_initialized = true; } @@ -844,11 +894,11 @@ void SCR_ScreenShot_f (void) unsigned char *buffer3; qboolean jpeg = (scr_screenshot_jpeg.integer != 0); - sprintf (base, "screenshots/%s", scr_screenshot_name.string); + dpsnprintf (base, sizeof(base), "screenshots/%s", scr_screenshot_name.string); if (strcmp (oldname, scr_screenshot_name.string)) { - sprintf(oldname, "%s", scr_screenshot_name.string); + dpsnprintf(oldname, sizeof(oldname), "%s", scr_screenshot_name.string); shotnumber = 0; } @@ -862,7 +912,7 @@ void SCR_ScreenShot_f (void) return; } - sprintf(filename, "%s%06d.%s", base, shotnumber, jpeg ? "jpg" : "tga"); + dpsnprintf(filename, sizeof(filename), "%s%06d.%s", base, shotnumber, jpeg ? "jpg" : "tga"); buffer1 = (unsigned char *)Mem_Alloc(tempmempool, vid.width * vid.height * 3); buffer2 = (unsigned char *)Mem_Alloc(tempmempool, vid.width * vid.height * 3); @@ -1733,7 +1783,7 @@ static void R_Envmap_f (void) for (j = 0;j < 12;j++) { - sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name); + dpsnprintf(filename, sizeof(filename), "env/%s%s.tga", basename, envmapinfo[j].name); Matrix4x4_CreateFromQuakeEntity(&r_refdef.view.matrix, r_refdef.view.origin[0], r_refdef.view.origin[1], r_refdef.view.origin[2], envmapinfo[j].angles[0], envmapinfo[j].angles[1], envmapinfo[j].angles[2], 1); r_refdef.view.quality = 1; r_refdef.view.clear = true; @@ -2013,7 +2063,7 @@ void SCR_DrawScreen (void) SCR_DrawBrand(); - SCR_DrawDownload(); + SCR_DrawInfobar(); if (r_timereport_active) R_TimeReport("2d"); @@ -2038,7 +2088,8 @@ void SCR_UpdateLoadingScreen (qboolean clear) if (vid_hidden || !scr_refresh.integer) return; // release mouse grab while loading - VID_GrabMouse(false); + if (!vid.fullscreen) + VID_SetMouse(false, false, false); CHECKGLERROR qglViewport(0, 0, vid.width, vid.height);CHECKGLERROR //qglDisable(GL_SCISSOR_TEST);CHECKGLERROR @@ -2112,7 +2163,6 @@ void CL_UpdateScreen(void) { double rendertime1; float conwidth, conheight; - qboolean grabmouse; if (!scr_initialized || !con_initialized) return; // not initialized yet @@ -2272,23 +2322,16 @@ void CL_UpdateScreen(void) else cl_updatescreen_quality = 1; - if (key_consoleactive) - grabmouse = false; + if (!vid_activewindow) + VID_SetMouse(false, false, false); + else if (key_consoleactive) + VID_SetMouse(vid.fullscreen, false, false); else if (key_dest == key_menu_grabbed) - grabmouse = true; + VID_SetMouse(true, vid_mouse.integer && !in_client_mouse, true); else if (key_dest == key_menu) - grabmouse = !in_client_mouse; - else if (key_dest == key_game) - grabmouse = vid_mouse.integer && !cls.demoplayback && !cl.csqc_wantsmousemove; + VID_SetMouse(vid.fullscreen, vid_mouse.integer && !in_client_mouse, true); else - grabmouse = false; - vid.mouseaim = grabmouse; - if (vid.fullscreen) - grabmouse = true; - if (!vid_activewindow) - grabmouse = false; - - VID_GrabMouse(grabmouse); + VID_SetMouse(vid.fullscreen, vid_mouse.integer && !cls.demoplayback && !cl.csqc_wantsmousemove, true); VID_Finish(); }