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 scr_screenshot_name_in_mapdir = {CVAR_SAVE, "scr_screenshot_name_in_mapdir", "0", "if set to 1, screenshots are placed in a subdirectory named like the map they are from"};
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)"};
cvar_t cl_demo_mousegrab = {0, "cl_demo_mousegrab", "0", "Allows reading the mouse input while playing demos. Useful for camera mods developed in csqc. (0: never, 1: always)"};
extern cvar_t r_glsl;
extern cvar_t v_glslgamma;
extern cvar_t sbar_info_pos;
-#define WANT_SCREENSHOT_HWGAMMA (scr_screenshot_hwgamma.integer && !(r_glsl.integer && v_glslgamma.integer))
+#define WANT_SCREENSHOT_HWGAMMA (scr_screenshot_hwgamma.integer && vid_usinghwgamma)
int jpeg_supported = false;
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])
+void SCR_DrawNetGraph_DrawGraph (int graphx, int graphy, int graphwidth, int graphheight, float graphscale, const char *label, float textsize, int packetcounter, netgraphitem_t *netgraph)
{
- int j, k, x, y, index, offset, height;
+ netgraphitem_t *graph;
+ int j, x, y;
+ int totalbytes = 0;
+ char bytesstring[128];
+ float g[NETGRAPH_PACKETS][6];
+ float *a;
+ float *b;
+ DrawQ_Fill(graphx, graphy, graphwidth, graphheight + textsize * 2, 0, 0, 0, 0.5, 0);
// 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;
+ memset(g, 0, sizeof(g));
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);
+ graph = netgraph + j;
+ g[j][0] = 1.0f - 0.25f * (realtime - graph->time);
+ g[j][1] = 1.0f;
+ g[j][2] = 1.0f;
+ g[j][3] = 1.0f;
+ g[j][4] = 1.0f;
+ g[j][5] = 1.0f;
+ if (graph->unreliablebytes == NETGRAPH_LOSTPACKET)
+ g[j][1] = 0.00f;
+ else if (graph->unreliablebytes == NETGRAPH_CHOKEDPACKET)
+ g[j][2] = 0.96f;
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);
- }
+ g[j][3] = 1.0f - graph->unreliablebytes * graphscale;
+ g[j][4] = g[j][3] - graph->reliablebytes * graphscale;
+ g[j][5] = g[j][4] - graph->ackbytes * graphscale;
+ // count bytes in the last second
+ if (realtime - graph->time < 1.0f)
+ totalbytes += graph->unreliablebytes + graph->reliablebytes + graph->ackbytes;
}
+ g[j][1] = bound(0.0f, g[j][1], 1.0f);
+ g[j][2] = bound(0.0f, g[j][2], 1.0f);
+ g[j][3] = bound(0.0f, g[j][3], 1.0f);
+ g[j][4] = bound(0.0f, g[j][4], 1.0f);
+ g[j][5] = bound(0.0f, g[j][5], 1.0f);
}
-}
-
-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);
+ // render the lines for the graph
+ for (j = 0;j < NETGRAPH_PACKETS;j++)
+ {
+ a = g[j];
+ b = g[(j+1)%NETGRAPH_PACKETS];
+ if (a[0] < 0.0f || b[0] > 1.0f || b[0] < a[0])
+ continue;
+ DrawQ_Line(0.0f, graphx + graphwidth * a[0], graphy + graphheight * a[2], graphx + graphwidth * b[0], graphy + graphheight * b[2], 1.0f, 1.0f, 0.0f, 1.0f, 0);
+ DrawQ_Line(0.0f, graphx + graphwidth * a[0], graphy + graphheight * a[1], graphx + graphwidth * b[0], graphy + graphheight * b[1], 1.0f, 0.0f, 0.0f, 1.0f, 0);
+ DrawQ_Line(0.0f, graphx + graphwidth * a[0], graphy + graphheight * a[5], graphx + graphwidth * b[0], graphy + graphheight * b[5], 0.0f, 1.0f, 0.0f, 1.0f, 0);
+ DrawQ_Line(0.0f, graphx + graphwidth * a[0], graphy + graphheight * a[4], graphx + graphwidth * b[0], graphy + graphheight * b[4], 1.0f, 1.0f, 1.0f, 1.0f, 0);
+ DrawQ_Line(0.0f, graphx + graphwidth * a[0], graphy + graphheight * a[3], graphx + graphwidth * b[0], graphy + graphheight * b[3], 1.0f, 0.5f, 0.0f, 1.0f, 0);
+ }
+ x = graphx;
+ y = graphy + graphheight;
+ dpsnprintf(bytesstring, sizeof(bytesstring), "%i", totalbytes);
+ DrawQ_String(x, y, label , 0, textsize, textsize, 1.0f, 1.0f, 1.0f, 1.0f, 0, NULL, false);y += textsize;
+ DrawQ_String(x, y, bytesstring, 0, textsize, textsize, 1.0f, 1.0f, 1.0f, 1.0f, 0, NULL, false);y += textsize;
}
/*
*/
void SCR_DrawNetGraph (void)
{
- int i, separator1, separator2, barwidth, barheight, bardivide, netgraph_x, netgraph_y, textsize, index, netgraphsperrow;
+ int i, separator1, separator2, graphwidth, graphheight, netgraph_x, netgraph_y, textsize, index, netgraphsperrow;
+ float graphscale;
+ netconn_t *c;
if (cls.state != ca_connected)
return;
separator1 = 2;
separator2 = 4;
textsize = 8;
- barwidth = 1;
- barheight = 50;
- bardivide = 20;
+ graphwidth = 120;
+ graphheight = 70;
+ graphscale = 1.0f / 1500.0f;
- netgraphsperrow = (vid_conwidth.integer + separator2) / (barwidth * NETGRAPH_PACKETS * 2 + separator1 + separator2);
+ netgraphsperrow = (vid_conwidth.integer + separator2) / (graphwidth * 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 - sbar_info_pos.integer + separator2) - (1 + (index / netgraphsperrow)) * (barheight + textsize + separator2);
- SCR_DrawNetGraph_DrawConnection_Client(cls.netcon, netgraph_x, netgraph_y, barwidth, barheight, bardivide, "incoming", separator1, "outgoing", textsize);
+ netgraph_x = (vid_conwidth.integer + separator2) - (1 + (index % netgraphsperrow)) * (graphwidth * 2 + separator1 + separator2);
+ netgraph_y = (vid_conheight.integer - 48 - sbar_info_pos.integer + separator2) - (1 + (index / netgraphsperrow)) * (graphheight + textsize + separator2);
+ c = cls.netcon;
+ SCR_DrawNetGraph_DrawGraph(netgraph_x , netgraph_y, graphwidth, graphheight, graphscale, "incoming", textsize, c->incoming_packetcounter, c->incoming_netgraph);
+ SCR_DrawNetGraph_DrawGraph(netgraph_x + graphwidth + separator1, netgraph_y, graphwidth, graphheight, graphscale, "outgoing", textsize, c->outgoing_packetcounter, c->outgoing_netgraph);
index++;
if (sv.active && shownetgraph.integer >= 2)
{
for (i = 0;i < svs.maxclients;i++)
{
- if (!svs.clients[i].netconnection)
+ c = svs.clients[i].netconnection;
+ if (!c)
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);
+ netgraph_x = (vid_conwidth.integer + separator2) - (1 + (index % netgraphsperrow)) * (graphwidth * 2 + separator1 + separator2);
+ netgraph_y = (vid_conheight.integer - 48 + separator2) - (1 + (index / netgraphsperrow)) * (graphheight + textsize + separator2);
+ SCR_DrawNetGraph_DrawGraph(netgraph_x , netgraph_y, graphwidth, graphheight, graphscale, va("%s", svs.clients[i].name), textsize, c->outgoing_packetcounter, c->outgoing_netgraph);
+ SCR_DrawNetGraph_DrawGraph(netgraph_x + graphwidth + separator1, netgraph_y, graphwidth, graphheight, graphscale, "" , textsize, c->incoming_packetcounter, c->incoming_netgraph);
index++;
}
}
SCR_DrawInfobar
==============
*/
-static void SCR_DrawInfobar()
+static void SCR_DrawInfobar(void)
{
int offset = 0;
if(scr_infobartime_off > 0)
Con_DPrintf("broken console margin calculation: %d != %d\n", offset, scr_con_margin_bottom);
}
-static int SCR_InfobarHeight()
+static int SCR_InfobarHeight(void)
{
int offset = 0;
Curl_downloadinfo_t *downinfo;
Cvar_RegisterVariable (&scr_screenshot_jpeg_quality);
Cvar_RegisterVariable (&scr_screenshot_gammaboost);
Cvar_RegisterVariable (&scr_screenshot_hwgamma);
+ Cvar_RegisterVariable (&scr_screenshot_name_in_mapdir);
Cvar_RegisterVariable (&cl_capturevideo);
Cvar_RegisterVariable (&cl_capturevideo_printfps);
Cvar_RegisterVariable (&cl_capturevideo_width);
static char old_prefix_name[MAX_QPATH];
char prefix_name[MAX_QPATH];
char filename[MAX_QPATH];
+ char mapname[MAX_QPATH];
unsigned char *buffer1;
unsigned char *buffer2;
unsigned char *buffer3;
qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
- dpsnprintf (prefix_name, sizeof(prefix_name), "%s", Sys_TimeString(scr_screenshot_name.string));
+ // TODO maybe make capturevideo and screenshot use similar name patterns?
+ if (scr_screenshot_name_in_mapdir.integer && cl.worldmodel && *cl.worldmodel->name) {
+ // figure out the map's filename without path or extension
+ strlcpy(mapname, FS_FileWithoutPath(cl.worldmodel->name), sizeof(mapname));
+ if (strrchr(mapname, '.'))
+ *(strrchr(mapname, '.')) = 0;
+ dpsnprintf (prefix_name, sizeof(prefix_name), "%s/%s", mapname, Sys_TimeString(scr_screenshot_name.string));
+ } else {
+ dpsnprintf (prefix_name, sizeof(prefix_name), "%s", Sys_TimeString(scr_screenshot_name.string));
+ }
if (strcmp(old_prefix_name, prefix_name))
{
static float loadingscreentexture_vertex3f[12];
static float loadingscreentexture_texcoord2f[8];
-static void SCR_ClearLoadingScreenTexture()
+static void SCR_ClearLoadingScreenTexture(void)
{
if(loadingscreentexture)
R_FreeTexture(loadingscreentexture);
}
extern rtexturepool_t *r_main_texturepool;
-static void SCR_SetLoadingScreenTexture()
+static void SCR_SetLoadingScreenTexture(void)
{
int w, h;
float loadingscreentexture_w;
loadingscreentexture_texcoord2f[6] = 0;loadingscreentexture_texcoord2f[7] = 0;
}
-void SCR_UpdateLoadingScreenIfShown()
+void SCR_UpdateLoadingScreenIfShown(void)
{
if(realtime == loadingscreentime)
SCR_UpdateLoadingScreen(loadingscreencleared);
return total;
}
-static void SCR_DrawLoadingStack()
+static void SCR_DrawLoadingStack(void)
{
float verts[12];
float colors[16];
static void SCR_DrawLoadingScreen_SharedSetup (qboolean clear)
{
+ r_viewport_t viewport;
float x, y;
// release mouse grab while loading
if (!vid.fullscreen)
VID_SetMouse(false, false, false);
CHECKGLERROR
- qglViewport(0, 0, vid.width, vid.height);CHECKGLERROR
+ R_Viewport_InitOrtho(&viewport, &identitymatrix, 0, 0, vid.width, vid.height, 0, 0, vid_conwidth.integer, vid_conheight.integer, -10, 100, NULL);
+ R_SetViewport(&viewport);
//qglDisable(GL_SCISSOR_TEST);CHECKGLERROR
//qglDepthMask(1);CHECKGLERROR
qglColorMask(1,1,1,1);CHECKGLERROR
if (clear)
qglClear(GL_COLOR_BUFFER_BIT);CHECKGLERROR
R_Textures_Frame();
- GL_SetupView_Mode_Ortho(0, 0, vid_conwidth.integer, vid_conheight.integer, -10, 100);
R_Mesh_Start();
R_Mesh_Matrix(&identitymatrix);
// draw the loading plaque
key_consoleactive = old_key_consoleactive;
}
+qboolean R_Stereo_ColorMasking(void)
+{
+ return r_stereo_redblue.integer || r_stereo_redgreen.integer || r_stereo_redcyan.integer;
+}
+
+qboolean R_Stereo_Active(void)
+{
+ return (vid.stereobuffer || r_stereo_sidebyside.integer || R_Stereo_ColorMasking());
+}
+
extern cvar_t cl_minfps;
extern cvar_t cl_minfps_fade;
extern cvar_t cl_minfps_qualitymax;
{
double rendertime1;
float conwidth, conheight;
+ float f;
if (!scr_initialized || !con_initialized)
return; // not initialized yet
if(gamemode == GAME_NEXUIZ)
{
// play a bit with the palette (experimental)
- palette_rgb_pantscolormap[15][0] = (unsigned char) (128 + 127 * sin(cl.time / exp(1) + 0*M_PI/3));
- palette_rgb_pantscolormap[15][1] = (unsigned char) (128 + 127 * sin(cl.time / exp(1) + 2*M_PI/3));
- palette_rgb_pantscolormap[15][2] = (unsigned char) (128 + 127 * sin(cl.time / exp(1) + 4*M_PI/3));
- palette_rgb_shirtcolormap[15][0] = (unsigned char) (128 + 127 * sin(cl.time / M_PI + 5*M_PI/3));
- palette_rgb_shirtcolormap[15][1] = (unsigned char) (128 + 127 * sin(cl.time / M_PI + 3*M_PI/3));
- palette_rgb_shirtcolormap[15][2] = (unsigned char) (128 + 127 * sin(cl.time / M_PI + 1*M_PI/3));
+ palette_rgb_pantscolormap[15][0] = (unsigned char) (128 + 127 * sin(cl.time / exp(1.0f) + 0.0f*M_PI/3.0f));
+ palette_rgb_pantscolormap[15][1] = (unsigned char) (128 + 127 * sin(cl.time / exp(1.0f) + 2.0f*M_PI/3.0f));
+ palette_rgb_pantscolormap[15][2] = (unsigned char) (128 + 127 * sin(cl.time / exp(1.0f) + 4.0f*M_PI/3.0f));
+ palette_rgb_shirtcolormap[15][0] = (unsigned char) (128 + 127 * sin(cl.time / M_PI + 5.0f*M_PI/3.0f));
+ palette_rgb_shirtcolormap[15][1] = (unsigned char) (128 + 127 * sin(cl.time / M_PI + 3.0f*M_PI/3.0f));
+ palette_rgb_shirtcolormap[15][2] = (unsigned char) (128 + 127 * sin(cl.time / M_PI + 1.0f*M_PI/3.0f));
memcpy(palette_rgb_pantsscoreboard[15], palette_rgb_pantscolormap[15], sizeof(*palette_rgb_pantscolormap));
memcpy(palette_rgb_shirtscoreboard[15], palette_rgb_shirtcolormap[15], sizeof(*palette_rgb_shirtcolormap));
}
R_ClearScreen(false);
r_refdef.view.clear = false;
r_refdef.view.isoverlay = false;
- r_refdef.view.quality = bound(cl_minfps_qualitymin.value, pow(cl_updatescreen_quality, cl_minfps_qualitypower.value) * cl_minfps_qualityscale.value, cl_minfps_qualitymax.value);
+ f = pow((float)cl_updatescreen_quality, cl_minfps_qualitypower.value) * cl_minfps_qualityscale.value;
+ r_refdef.view.quality = bound(cl_minfps_qualitymin.value, f, cl_minfps_qualitymax.value);
if(scr_stipple.integer)
{
else
qglDisable(GL_POLYGON_STIPPLE);
- if (vid.stereobuffer || r_stereo_redblue.integer || r_stereo_redgreen.integer || r_stereo_redcyan.integer || r_stereo_sidebyside.integer)
+ if (R_Stereo_Active())
{
matrix4x4_t originalmatrix = r_refdef.view.matrix;
matrix4x4_t offsetmatrix;