X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=cl_screen.c;h=4768f4b7d6b46c55c4b9491b14e1395ef50c33d9;hb=d24b0dc4d2297293d799603e4a3a473048ec4bc5;hp=b268e8448396ccd256720384d5a942464f5723a2;hpb=4da490fe21a712e43936dfb2e2d8657c0ee63136;p=xonotic%2Fdarkplaces.git diff --git a/cl_screen.c b/cl_screen.c index b268e844..4768f4b7 100644 --- a/cl_screen.c +++ b/cl_screen.c @@ -34,17 +34,19 @@ cvar_t cl_capturevideo_realtime = {0, "cl_capturevideo_realtime", "0", "causes v cvar_t cl_capturevideo_fps = {0, "cl_capturevideo_fps", "30", "how many frames per second to save (29.97 for NTSC, 30 for typical PC video, 15 can be useful)"}; cvar_t cl_capturevideo_number = {CVAR_SAVE, "cl_capturevideo_number", "1", "number to append to video filename, incremented each time a capture begins"}; cvar_t r_letterbox = {0, "r_letterbox", "0", "reduces vertical height of view to simulate a letterboxed movie effect (can be used by mods for cutscenes)"}; -cvar_t r_stereo_separation = {0, "r_stereo_separation", "4", "separation of eyes in the world (try negative values too)"}; -cvar_t r_stereo_sidebyside = {0, "r_stereo_sidebyside", "0", "side by side views (for those who can't afford glasses but can afford eye strain)"}; +cvar_t r_stereo_separation = {0, "r_stereo_separation", "4", "separation distance of eyes in the world (negative values are only useful for cross-eyed viewing)"}; +cvar_t r_stereo_sidebyside = {0, "r_stereo_sidebyside", "0", "side by side views for those who can't afford glasses but can afford eye strain (note: use a negative r_stereo_separation if you want cross-eyed viewing)"}; cvar_t r_stereo_redblue = {0, "r_stereo_redblue", "0", "red/blue anaglyph stereo glasses (note: most of these glasses are actually red/cyan, try that one too)"}; cvar_t r_stereo_redcyan = {0, "r_stereo_redcyan", "0", "red/cyan anaglyph stereo glasses, the kind given away at drive-in movies like Creature From The Black Lagoon In 3D"}; cvar_t r_stereo_redgreen = {0, "r_stereo_redgreen", "0", "red/green anaglyph stereo glasses (for those who don't mind yellow)"}; +cvar_t r_stereo_angle = {0, "r_stereo_angle", "0", "separation angle of eyes (makes the views look different directions, as an example, 90 gives a 90 degree separation where the views are 45 degrees left and 45 degrees right)"}; cvar_t scr_zoomwindow = {CVAR_SAVE, "scr_zoomwindow", "0", "displays a zoomed in overlay window"}; cvar_t scr_zoomwindow_viewsizex = {CVAR_SAVE, "scr_zoomwindow_viewsizex", "20", "horizontal viewsize of zoom window"}; cvar_t scr_zoomwindow_viewsizey = {CVAR_SAVE, "scr_zoomwindow_viewsizey", "20", "vertical viewsize of zoom window"}; cvar_t scr_zoomwindow_fov = {CVAR_SAVE, "scr_zoomwindow_fov", "20", "fov of zoom window"}; cvar_t scr_stipple = {0, "scr_stipple", "0", "interlacing-like stippling of the display"}; cvar_t scr_refresh = {0, "scr_refresh", "1", "allows you to completely shut off rendering for benchmarking purposes"}; +cvar_t shownetgraph = {CVAR_SAVE, "shownetgraph", "0", "shows a graph of packet sizes and other information, 0 = off, 1 = show client netgraph, 2 = show client and server netgraphs (when hosting a server)"}; int jpeg_supported = false; @@ -104,7 +106,6 @@ void SCR_CenterPrint(char *str) void SCR_DrawCenterString (void) { char *start; - int l; int x, y; int remaining; int color; @@ -130,36 +131,25 @@ void SCR_DrawCenterString (void) do { // scan the number of characters on the line, not counting color codes - int chars = 0; - for (l=0 ; l= '0' && start[l+1] <= '9')) - l++; - else - chars++; - } + char *newline = strchr(start, '\n'); + int l = newline ? (newline - start) : (int)strlen(start); + int chars = COM_StringLengthNoColors(start, l, NULL); + x = (vid_conwidth.integer - chars*8)/2; if (l > 0) { if (remaining < l) l = remaining; - DrawQ_ColoredString(x, y, start, l, 8, 8, 1, 1, 1, 1, 0, &color); + DrawQ_String(x, y, start, l, 8, 8, 1, 1, 1, 1, 0, &color, false); remaining -= l; if (remaining <= 0) return; } - y += 8; - while (*start && *start != '\n') - start++; - - if (!*start) + if (!newline) break; - start++; // skip the \n + start = newline + 1; // skip the \n } while (1); } @@ -183,6 +173,134 @@ void SCR_CheckDrawCenterString (void) SCR_DrawCenterString (); } +void SCR_DrawNetGraph_DrawGraph (int graphx, int graphy, int barwidth, int barheight, int bardivide, const char *label, float textsize, int packetcounter, int numparameters, const int **parameters, const float parametercolors[][4]) +{ + int j, k, x, y, index, offset, height; + // draw the bar graph itself + // advance the packet counter because it is the latest packet column being + // built up and should come last + packetcounter = (packetcounter + 1) % NETGRAPH_PACKETS; + for (j = 0;j < NETGRAPH_PACKETS;j++) + { + x = graphx + j * barwidth; + y = graphy + barheight; + index = (packetcounter + j) % NETGRAPH_PACKETS; + if (parameters[0][index] == NETGRAPH_LOSTPACKET) + DrawQ_Fill(x, y - barheight, barwidth, barheight, 1, 0, 0, 1, 0); + else if (parameters[0][index] == NETGRAPH_CHOKEDPACKET) + DrawQ_Fill(x, y - min(2, barheight), barwidth, min(2, barheight), 1, 1, 0, 1, 0); + else + { + offset = 0; + for (k = 0;k < numparameters;k++) + { + height = (parameters[k][index] + bardivide - 1) / bardivide; + height = min(height, barheight - offset); + offset += height; + if (height) + DrawQ_Fill(x, y - offset, barwidth, height, parametercolors[k][0], parametercolors[k][1], parametercolors[k][2], parametercolors[k][3], 0); + } + } + } +} + +const float netgraphcolors[3][4] = +{ + {1 , 0.5, 0 , 1}, + {1 , 1 , 1 , 1}, + {0 , 1 , 0 , 1}, +}; + +void SCR_DrawNetGraph_DrawConnection_Client (netconn_t *conn, int graphx, int graphy, int barwidth, int barheight, int bardivide, const char *labelincoming, int separator, const char *labeloutgoing, float textsize) +{ + int numparameters; + const int *parameters[3]; + // dim background + DrawQ_Fill(graphx , graphy, barwidth * NETGRAPH_PACKETS, barheight + textsize, 0, 0, 0, 0.5, 0); + DrawQ_Fill(graphx + barwidth * NETGRAPH_PACKETS + separator, graphy, barwidth * NETGRAPH_PACKETS, barheight + textsize, 0, 0, 0, 0.5, 0); + // draw the bar graphs + numparameters = 3; + parameters[0] = conn->incoming_unreliablesize; + parameters[1] = conn->incoming_reliablesize; + parameters[2] = conn->incoming_acksize; + SCR_DrawNetGraph_DrawGraph(graphx, graphy, barwidth, barheight, bardivide, labelincoming, textsize, conn->incoming_packetcounter, numparameters, parameters, netgraphcolors); + parameters[0] = conn->outgoing_unreliablesize; + parameters[1] = conn->outgoing_reliablesize; + parameters[2] = conn->outgoing_acksize; + SCR_DrawNetGraph_DrawGraph(graphx + barwidth * NETGRAPH_PACKETS + separator, graphy, barwidth, barheight, bardivide, labeloutgoing, textsize, conn->outgoing_packetcounter, numparameters, parameters, netgraphcolors); + // draw labels + DrawQ_String(graphx , graphy + barheight, labelincoming, 0, textsize, textsize, 1, 1, 1, 1, 0, NULL, false); + DrawQ_String(graphx + barwidth * NETGRAPH_PACKETS + separator, graphy + barheight, labeloutgoing, 0, textsize, textsize, 1, 1, 1, 1, 0, NULL, false); +} + +void SCR_DrawNetGraph_DrawConnection_Server (netconn_t *conn, int graphx, int graphy, int barwidth, int barheight, int bardivide, const char *labeloutgoing, int separator, const char *labelincoming, float textsize) +{ + int numparameters; + const int *parameters[3]; + // dim background + DrawQ_Fill(graphx , graphy, barwidth * NETGRAPH_PACKETS, barheight + textsize, 0, 0, 0, 0.5, 0); + DrawQ_Fill(graphx + barwidth * NETGRAPH_PACKETS + separator, graphy, barwidth * NETGRAPH_PACKETS, barheight + textsize, 0, 0, 0, 0.5, 0); + // draw the bar graphs + numparameters = 3; + parameters[0] = conn->outgoing_unreliablesize; + parameters[1] = conn->outgoing_reliablesize; + parameters[2] = conn->outgoing_acksize; + SCR_DrawNetGraph_DrawGraph(graphx , graphy, barwidth, barheight, bardivide, labeloutgoing, textsize, conn->outgoing_packetcounter, numparameters, parameters, netgraphcolors); + parameters[0] = conn->incoming_unreliablesize; + parameters[1] = conn->incoming_reliablesize; + parameters[2] = conn->incoming_acksize; + SCR_DrawNetGraph_DrawGraph(graphx + barwidth * NETGRAPH_PACKETS + separator, graphy, barwidth, barheight, bardivide, labelincoming, textsize, conn->incoming_packetcounter, numparameters, parameters, netgraphcolors); + // draw labels + DrawQ_String(graphx , graphy + barheight, labeloutgoing, 0, textsize, textsize, 1, 1, 1, 1, 0, NULL, false); + DrawQ_String(graphx + barwidth * NETGRAPH_PACKETS + separator, graphy + barheight, labelincoming, 0, textsize, textsize, 1, 1, 1, 1, 0, NULL, false); +} + +/* +============== +SCR_DrawNetGraph +============== +*/ +void SCR_DrawNetGraph (void) +{ + int i, separator1, separator2, barwidth, barheight, bardivide, netgraph_x, netgraph_y, textsize, index, netgraphsperrow; + + if (cls.state != ca_connected) + return; + if (!cls.netcon) + return; + if (!shownetgraph.integer) + return; + + separator1 = 2; + separator2 = 4; + textsize = 8; + barwidth = 1; + barheight = 50; + bardivide = 20; + + netgraphsperrow = (vid_conwidth.integer + separator2) / (barwidth * NETGRAPH_PACKETS * 2 + separator1 + separator2); + netgraphsperrow = max(netgraphsperrow, 1); + + index = 0; + netgraph_x = (vid_conwidth.integer + separator2) - (1 + (index % netgraphsperrow)) * (barwidth * NETGRAPH_PACKETS * 2 + separator1 + separator2); + netgraph_y = (vid_conheight.integer - 48 + separator2) - (1 + (index / netgraphsperrow)) * (barheight + textsize + separator2); + SCR_DrawNetGraph_DrawConnection_Client(cls.netcon, netgraph_x, netgraph_y, barwidth, barheight, bardivide, "incoming", separator1, "outgoing", textsize); + index++; + + if (sv.active && shownetgraph.integer >= 2) + { + for (i = 0;i < svs.maxclients;i++) + { + if (!svs.clients[i].netconnection) + continue; + netgraph_x = (vid_conwidth.integer + separator2) - (1 + (index % netgraphsperrow)) * (barwidth * NETGRAPH_PACKETS * 2 + separator1 + separator2); + netgraph_y = (vid_conheight.integer - 48 + separator2) - (1 + (index / netgraphsperrow)) * (barheight + textsize + separator2); + SCR_DrawNetGraph_DrawConnection_Server(svs.clients[i].netconnection, netgraph_x, netgraph_y, barwidth, barheight, bardivide, va("%s", svs.clients[i].name), separator1, "", textsize); + index++; + } + } +} + /* ============== SCR_DrawTurtle @@ -337,8 +455,8 @@ static int SCR_DrawQWDownload(int offset) len = (int)strlen(temp); x = (vid_conwidth.integer - len*size) / 2; y = vid_conheight.integer - size - offset; - DrawQ_Pic(0, y, NULL, vid_conwidth.integer, size, 0, 0, 0, 0.5, 0); - DrawQ_String(x, y, temp, len, size, size, 1, 1, 1, 1, 0); + DrawQ_Fill(0, y, vid_conwidth.integer, size, 0, 0, 0, 0.5, 0); + DrawQ_String(x, y, temp, len, size, size, 1, 1, 1, 1, 0, NULL, true); return 8; } @@ -368,8 +486,8 @@ static int SCR_DrawCurlDownload(int offset) { len = (int)strlen(addinfo); x = (vid_conwidth.integer - len*size) / 2; - DrawQ_Pic(0, y - size, NULL, vid_conwidth.integer, size, 1, 1, 1, 0.8, 0); - DrawQ_String(x, y - size, addinfo, len, size, size, 0, 0, 0, 1, 0); + DrawQ_Fill(0, y - size, vid_conwidth.integer, size, 1, 1, 1, 0.8, 0); + DrawQ_String(x, y - size, addinfo, len, size, size, 0, 0, 0, 1, 0, NULL, true); } for(i = 0; i != nDownloads; ++i) @@ -382,8 +500,8 @@ static int SCR_DrawCurlDownload(int offset) 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 - len*size) / 2; - DrawQ_Pic(0, y + i * size, NULL, vid_conwidth.integer, size, 0, 0, 0, 0.8, 0); - DrawQ_String(x, y + i * size, temp, len, size, size, 1, 1, 1, 1, 0); + DrawQ_Fill(0, y + i * size, vid_conwidth.integer, size, 0, 0, 0, 0.8, 0); + DrawQ_String(x, y + i * size, temp, len, size, size, 1, 1, 1, 1, 0, NULL, true); } Z_Free(downinfo); @@ -533,14 +651,14 @@ void R_TimeReport_Frame(void) lines++; y = vid_conheight.integer - sb_lines - lines * 8; i = j = 0; - DrawQ_Pic(0, y, NULL, vid_conwidth.integer, lines * 8, 0, 0, 0, 0.5, 0); + DrawQ_Fill(0, y, vid_conwidth.integer, lines * 8, 0, 0, 0, 0.5, 0); while (r_speeds_string[i]) { j = i; while (r_speeds_string[i] && r_speeds_string[i] != '\n') i++; if (i - j > 0) - DrawQ_String(0, y, r_speeds_string + j, i - j, 8, 8, 1, 1, 1, 1, 0); + DrawQ_String(0, y, r_speeds_string + j, i - j, 8, 8, 1, 1, 1, 1, 0, NULL, true); if (r_speeds_string[i] == '\n') i++; y += 8; @@ -631,12 +749,14 @@ void CL_Screen_Init(void) Cvar_RegisterVariable(&r_stereo_redblue); Cvar_RegisterVariable(&r_stereo_redcyan); Cvar_RegisterVariable(&r_stereo_redgreen); + Cvar_RegisterVariable(&r_stereo_angle); Cvar_RegisterVariable(&scr_zoomwindow); Cvar_RegisterVariable(&scr_zoomwindow_viewsizex); Cvar_RegisterVariable(&scr_zoomwindow_viewsizey); Cvar_RegisterVariable(&scr_zoomwindow_fov); Cvar_RegisterVariable(&scr_stipple); Cvar_RegisterVariable(&scr_refresh); + Cvar_RegisterVariable(&shownetgraph); Cmd_AddCommand ("sizeup",SCR_SizeUp_f, "increase view size (increases viewsize cvar)"); Cmd_AddCommand ("sizedown",SCR_SizeDown_f, "decrease view size (decreases viewsize cvar)"); @@ -1536,7 +1656,7 @@ void SCR_DrawScreen (void) // this it simply assumes the requested fov is the vertical fov // for a 4x3 display, if the ratio is not 4x3 this makes the fov // higher/lower according to the ratio - r_view.frustum_y = tan(scr_fov.value * cl.viewzoom * M_PI / 360.0) * (3.0/4.0); + r_view.frustum_y = tan(scr_fov.value * M_PI / 360.0) * (3.0/4.0) * cl.viewzoom; r_view.frustum_x = r_view.frustum_y * (float)r_view.width / (float)r_view.height / vid_pixelheight.value; r_view.frustum_x *= r_refdef.frustumscale_x; @@ -1556,7 +1676,7 @@ void SCR_DrawScreen (void) r_view.y = 0; r_view.z = 0; - r_view.frustum_y = tan(scr_zoomwindow_fov.value * cl.viewzoom * M_PI / 360.0) * (3.0/4.0); + r_view.frustum_y = tan(scr_zoomwindow_fov.value * M_PI / 360.0) * (3.0/4.0) * cl.viewzoom; r_view.frustum_x = r_view.frustum_y * vid_pixelheight.value * (float)r_view.width / (float)r_view.height; r_view.frustum_x *= r_refdef.frustumscale_x; @@ -1589,6 +1709,7 @@ void SCR_DrawScreen (void) SHOWLMP_drawall(); SCR_CheckDrawCenterString(); } + SCR_DrawNetGraph (); MR_Draw(); CL_DrawVideo(); R_Shadow_EditLights_DrawSelectedLightProperties(); @@ -1647,6 +1768,7 @@ void SCR_UpdateLoadingScreen (qboolean clear) y = (vid_conheight.integer - pic->height)/2; GL_Color(1,1,1,1); GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + GL_DepthRange(0, 1); GL_DepthTest(false); R_Mesh_VertexPointer(vertex3f, 0, 0); R_Mesh_ColorPointer(NULL, 0, 0); @@ -1779,11 +1901,13 @@ void CL_UpdateScreen(void) if (r_timereport_active) R_TimeReport("clear"); + qglDrawBuffer(GL_BACK); + if (vid.stereobuffer || r_stereo_redblue.integer || r_stereo_redgreen.integer || r_stereo_redcyan.integer || r_stereo_sidebyside.integer) { matrix4x4_t originalmatrix = r_view.matrix; matrix4x4_t offsetmatrix; - Matrix4x4_CreateTranslate(&offsetmatrix, 0, r_stereo_separation.value * -0.5f, 0); + Matrix4x4_CreateFromQuakeEntity(&offsetmatrix, 0, r_stereo_separation.value * 0.5f, 0, 0, r_stereo_angle.value * 0.5f, 0, 1); Matrix4x4_Concat(&r_view.matrix, &originalmatrix, &offsetmatrix); if (r_stereo_sidebyside.integer) @@ -1801,7 +1925,7 @@ void CL_UpdateScreen(void) SCR_DrawScreen(); - Matrix4x4_CreateTranslate(&offsetmatrix, 0, r_stereo_separation.value * 0.5f, 0); + Matrix4x4_CreateFromQuakeEntity(&offsetmatrix, 0, r_stereo_separation.value * -0.5f, 0, 0, r_stereo_angle.value * -0.5f, 0, 1); Matrix4x4_Concat(&r_view.matrix, &originalmatrix, &offsetmatrix); if (r_stereo_sidebyside.integer) @@ -1822,10 +1946,7 @@ void CL_UpdateScreen(void) r_view.matrix = originalmatrix; } else - { - qglDrawBuffer(GL_BACK); SCR_DrawScreen(); - } SCR_CaptureVideo();