cvar_t cl_capturevideo_nameformat = {CVAR_SAVE, "cl_capturevideo_nameformat", "dpvideo", "prefix for saved videos (the date is encoded using strftime escapes)"};
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 cl_capturevideo_ogg = {CVAR_SAVE, "cl_capturevideo_ogg", "1", "save captured video data as Ogg/Vorbis/Theora streams"};
+cvar_t cl_capturevideo_framestep = {CVAR_SAVE, "cl_capturevideo_framestep", "1", "when set to n >= 1, render n frames to capture one (useful for motion blur like effects)"};
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 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 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;
-#define WANT_SCREENSHOT_HWGAMMA (scr_screenshot_hwgamma.integer && !(r_glsl.integer && v_glslgamma.integer))
+extern cvar_t sbar_info_pos;
+#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 + 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;
}
}
+static int R_CountLeafTriangles(const dp_model_t *model, const mleaf_t *leaf)
+{
+ int i, triangles = 0;
+ for (i = 0;i < leaf->numleafsurfaces;i++)
+ triangles += model->data_surfaces[leaf->firstleafsurface[i]].num_triangles;
+ return triangles;
+}
+
void R_TimeReport_EndFrame(void)
{
int i, j, lines, y;
cl_locnode_t *loc;
char string[1024+4096];
+ mleaf_t *viewleaf;
string[0] = 0;
if (r_speeds.integer && cls.signon == SIGNONS && cls.state == ca_connected)
// put the location name in the r_speeds display as it greatly helps
// when creating loc files
loc = CL_Locs_FindNearest(cl.movement_origin);
+ viewleaf = (r_refdef.scene.worldmodel && r_refdef.scene.worldmodel->brush.PointInLeaf) ? r_refdef.scene.worldmodel->brush.PointInLeaf(r_refdef.scene.worldmodel, r_refdef.view.origin) : NULL;
dpsnprintf(string, sizeof(string),
"%s%s\n"
"%3i renders org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n"
+"%5i viewleaf%5i cluster%2i area%4i brushes%4i surfaces(%7i triangles)\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"
"%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]
+, viewleaf ? (int)(viewleaf - r_refdef.scene.worldmodel->brush.data_leafs) : -1, viewleaf ? viewleaf->clusterindex : -1, viewleaf ? viewleaf->areaindex : -1, viewleaf ? viewleaf->numleafbrushes : 0, viewleaf ? viewleaf->numleafsurfaces : 0, viewleaf ? R_CountLeafTriangles(r_refdef.scene.worldmodel, viewleaf) : 0
, 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
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);
Cvar_RegisterVariable (&cl_capturevideo_nameformat);
Cvar_RegisterVariable (&cl_capturevideo_number);
Cvar_RegisterVariable (&cl_capturevideo_ogg);
+ Cvar_RegisterVariable (&cl_capturevideo_framestep);
Cvar_RegisterVariable (&r_letterbox);
Cvar_RegisterVariable(&r_stereo_separation);
Cvar_RegisterVariable(&r_stereo_sidebyside);
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))
{
cls.capturevideo.width = width;
cls.capturevideo.height = height;
cls.capturevideo.active = true;
- cls.capturevideo.framerate = bound(1, cl_capturevideo_fps.value, 1001);
+ cls.capturevideo.framerate = bound(1, cl_capturevideo_fps.value, 1001) * bound(1, cl_capturevideo_framestep.integer, 64);
+ cls.capturevideo.framestep = cl_capturevideo_framestep.integer;
cls.capturevideo.soundrate = S_GetSoundRate();
cls.capturevideo.soundchannels = S_GetSoundChannels();
cls.capturevideo.startrealtime = realtime;
}
}
-void SCR_CaptureVideo_VideoFrame(int newframenum)
+void SCR_CaptureVideo_VideoFrame(int newframestepframenum)
{
int x = 0, y = 0;
int width = cls.capturevideo.width, height = cls.capturevideo.height;
+ if(newframestepframenum == cls.capturevideo.framestepframe)
+ return;
+
CHECKGLERROR
//return SCR_ScreenShot(filename, cls.capturevideo.buffer, cls.capturevideo.buffer + vid.width * vid.height * 3, cls.capturevideo.buffer + vid.width * vid.height * 6, 0, 0, vid.width, vid.height, false, false, false, jpeg, true);
// speed is critical here, so do saving as directly as possible
qglReadPixels (x, y, vid.width, vid.height, GL_BGRA, GL_UNSIGNED_BYTE, cls.capturevideo.screenbuffer);CHECKGLERROR
SCR_ScaleDownBGRA (cls.capturevideo.screenbuffer, vid.width, vid.height, cls.capturevideo.outbuffer, width, height);
- cls.capturevideo.videoframes(newframenum - cls.capturevideo.frame);
- cls.capturevideo.frame = newframenum;
+ cls.capturevideo.videoframes(newframestepframenum - cls.capturevideo.framestepframe);
+ cls.capturevideo.framestepframe = newframestepframenum;
if(cl_capturevideo_printfps.integer)
{
void SCR_CaptureVideo(void)
{
int newframenum;
- if (cl_capturevideo.integer && r_render.integer)
+ if (cl_capturevideo.integer)
{
if (!cls.capturevideo.active)
SCR_CaptureVideo_BeginVideo();
- if (cls.capturevideo.framerate != cl_capturevideo_fps.value)
+ if (cls.capturevideo.framerate != cl_capturevideo_fps.value * cl_capturevideo_framestep.integer)
{
Con_Printf("You can not change the video framerate while recording a video.\n");
- Cvar_SetValueQuick(&cl_capturevideo_fps, cls.capturevideo.framerate);
+ Cvar_SetValueQuick(&cl_capturevideo_fps, cls.capturevideo.framerate / (double) cl_capturevideo_framestep.integer);
}
// for AVI saving we have to make sure that sound is saved before video
if (cls.capturevideo.soundrate && !cls.capturevideo.soundsampleframe)
return;
}
// write frames
- SCR_CaptureVideo_VideoFrame(newframenum);
+ SCR_CaptureVideo_VideoFrame(newframenum / cls.capturevideo.framestep);
+ cls.capturevideo.frame = newframenum;
if (cls.capturevideo.error)
{
Cvar_SetValueQuick(&cl_capturevideo, 0);
int indices[3] = {0,1,2};
qboolean ret;
- if (!r_render.integer)
- return false;
-
CHECKGLERROR
qglReadPixels (x, y, width, height, jpeg ? GL_RGB : GL_BGR, GL_UNSIGNED_BYTE, buffer1);CHECKGLERROR
qglClearStencil(128);CHECKGLERROR
}
// clear the screen
- if (r_render.integer)
- GL_Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | (gl_stencil ? GL_STENCIL_BUFFER_BIT : 0));
+ GL_Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | (gl_stencil ? GL_STENCIL_BUFFER_BIT : 0));
// set dithering mode
if (gl_dither.integer)
{
int r_stereo_side;
+extern void Sbar_ShowFPS(void);
void SCR_DrawScreen (void)
{
R_Mesh_Start();
SCR_DrawPause ();
if (!r_letterbox.value)
Sbar_Draw();
+ Sbar_ShowFPS();
SHOWLMP_drawall();
SCR_CheckDrawCenterString();
}
static float loadingscreentexture_vertex3f[12];
static float loadingscreentexture_texcoord2f[8];
-static void SCR_ClearLoadingScreenTexture()
+static void SCR_ClearLoadingScreenTexture(void)
{
if(loadingscreentexture)
R_FreeTexture(loadingscreentexture);
loadingscreentexture = NULL;
}
-extern rtexturepool_t r_main_texturepool;
-static void SCR_SetLoadingScreenTexture()
+extern rtexturepool_t *r_main_texturepool;
+static void SCR_SetLoadingScreenTexture(void)
{
int w, h;
float loadingscreentexture_w;
loadingscreentexture_h = vid.height / (float) h;
}
- loadingscreentexture = R_LoadTexture2D(&r_main_texturepool, "loadingscreentexture", w, h, NULL, TEXTYPE_BGRA, TEXF_FORCENEAREST | TEXF_CLAMP | TEXF_ALWAYSPRECACHE, NULL);
+ loadingscreentexture = R_LoadTexture2D(r_main_texturepool, "loadingscreentexture", w, h, NULL, TEXTYPE_BGRA, TEXF_FORCENEAREST | TEXF_CLAMP | TEXF_ALWAYSPRECACHE, NULL);
R_Mesh_TexBind(0, R_GetTexture(loadingscreentexture));
GL_ActiveTexture(0);
CHECKGLERROR
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];
// ^^^^^^^^^^ blue component
// ^^^^^^ bottom row
// ^^^^^^^^^^^^ alpha is always on
- R_Mesh_Draw(0, 4, 0, 2, NULL, polygonelements, 0, 0);
+ R_Mesh_Draw(0, 4, 0, 2, polygonelement3i, polygonelement3s, 0, 0);
// make sure everything is cleared, including the progress indicator
if(loadingscreenheight < 8)
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
R_Mesh_ResetTextureState();
R_Mesh_TexBind(0, R_GetTexture(loadingscreentexture));
R_Mesh_TexCoordPointer(0, 2, loadingscreentexture_texcoord2f, 0, 0);
- R_Mesh_Draw(0, 4, 0, 2, NULL, polygonelements, 0, 0);
+ R_Mesh_Draw(0, 4, 0, 2, polygonelement3i, polygonelement3s, 0, 0);
}
R_Mesh_VertexPointer(loadingscreenpic_vertex3f, 0, 0);
R_Mesh_ResetTextureState();
R_Mesh_TexBind(0, R_GetTexture(loadingscreenpic->tex));
R_Mesh_TexCoordPointer(0, 2, loadingscreenpic_texcoord2f, 0, 0);
- R_Mesh_Draw(0, 4, 0, 2, NULL, polygonelements, 0, 0);
+ R_Mesh_Draw(0, 4, 0, 2, polygonelement3i, polygonelement3s, 0, 0);
SCR_DrawLoadingStack();
}
int old_key_consoleactive;
// don't do anything if not initialized yet
- if (vid_hidden || !scr_refresh.integer || cls.state == ca_dedicated)
+ if (vid_hidden || cls.state == ca_dedicated)
return;
if(loadingscreentime == realtime)
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;
extern cvar_t cl_minfps_qualityscale;
static double cl_updatescreen_rendertime = 0;
static double cl_updatescreen_quality = 1;
+extern void Sbar_ShowFPS_Update(void);
void CL_UpdateScreen(void)
{
double rendertime1;
float conwidth, conheight;
+ float f;
+
+ Sbar_ShowFPS_Update();
- if (!scr_initialized || !con_initialized)
+ if (!scr_initialized || !con_initialized || !scr_refresh.integer)
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));
}
- if (vid_hidden || !scr_refresh.integer)
+ if (vid_hidden)
return;
rendertime1 = Sys_DoubleTime();
- conwidth = bound(320, vid_conwidth.value, 2048);
- conheight = bound(200, vid_conheight.value, 1536);
+ conwidth = bound(160, vid_conwidth.value, 32768);
+ conheight = bound(90, vid_conheight.value, 24576);
if (vid_conwidth.value != conwidth)
Cvar_SetValue("vid_conwidth", conwidth);
if (vid_conheight.value != conheight)
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;