qboolean scr_initialized; // ready to draw
float scr_con_current;
+int scr_con_margin_bottom;
extern int con_vislines;
// scan the number of characters on the line, not counting color codes
char *newline = strchr(start, '\n');
int l = newline ? (newline - start) : (int)strlen(start);
- int chars = COM_StringLengthNoColors(start, l, NULL);
+ float width = DrawQ_TextWidth_Font(start, l, 8, 8, false, FONT_CENTERPRINT);
- x = (vid_conwidth.integer - chars*8)/2;
+ x = (vid_conwidth.integer - width)/2;
if (l > 0)
{
if (remaining < l)
l = remaining;
- DrawQ_String(x, y, start, l, 8, 8, 1, 1, 1, 1, 0, &color, false);
+ DrawQ_String_Font(x, y, start, l, 8, 8, 1, 1, 1, 1, 0, &color, false, FONT_CENTERPRINT);
remaining -= l;
if (remaining <= 0)
return;
*/
static int SCR_DrawQWDownload(int offset)
{
+ // sync with SCR_DownloadHeight
int len;
float x, y;
float size = 8;
char temp[256];
+
if (!cls.qw_downloadname[0])
{
cls.qw_downloadspeedrate = 0;
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 - len*size) / 2;
+ x = (vid_conwidth.integer - DrawQ_TextWidth_Font(temp, len, size, size, 0, FONT_INFOBAR)) / 2;
y = vid_conheight.integer - size - offset;
- 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);
+ 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;
}
*/
static int SCR_DrawCurlDownload(int offset)
{
+ // sync with SCR_DownloadHeight
int len;
int nDownloads;
int i;
if(addinfo)
{
len = (int)strlen(addinfo);
- x = (vid_conwidth.integer - len*size) / 2;
- 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);
+ x = (vid_conwidth.integer - DrawQ_TextWidth_Font(addinfo, len, size, size, false, FONT_INFOBAR)) / 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);
}
for(i = 0; i != nDownloads; ++i)
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 - len*size) / 2;
- 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);
+ x = (vid_conwidth.integer - DrawQ_TextWidth_Font(temp, len, size, size, false, FONT_INFOBAR)) / 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);
}
Z_Free(downinfo);
int offset = 0;
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()
+{
+ int offset = 0;
+ Curl_downloadinfo_t *downinfo;
+ const char *addinfo;
+ int nDownloads;
+
+ if(cls.qw_downloadname[0])
+ offset += 0;
+
+ downinfo = Curl_GetDownloadInfo(&nDownloads, &addinfo);
+ if(downinfo)
+ {
+ offset += 8 * (nDownloads + (addinfo ? 1 : 0));
+ Z_Free(downinfo);
+ }
+
+ return offset;
}
//=============================================================================
*/
void SCR_DrawConsole (void)
{
+ scr_con_margin_bottom = SCR_DownloadHeight();
if (key_consoleactive & KEY_CONSOLEACTIVE_FORCED)
{
// full screen
- Con_DrawConsole (vid_conheight.integer);
+ Con_DrawConsole (vid_conheight.integer - scr_con_margin_bottom);
}
else if (scr_con_current)
- Con_DrawConsole ((int)scr_con_current);
+ Con_DrawConsole (min((int)scr_con_current, vid_conheight.integer - scr_con_margin_bottom));
else
- {
con_vislines = 0;
- if ((key_dest == key_game || key_dest == key_message) && !r_letterbox.value)
- Con_DrawNotify (); // only draw notify in game
- }
}
/*
//=============================================================================
-char r_speeds_string[1024];
+char r_speeds_timestring[1024];
int speedstringcount, r_timereport_active;
double r_timereport_temp = 0, r_timereport_current = 0, r_timereport_start = 0;
+int r_speeds_longestitem = 0;
void R_TimeReport(char *desc)
{
return;
CHECKGLERROR
- qglFinish();CHECKGLERROR
+ if (r_speeds.integer == 2)
+ qglFinish();
+ CHECKGLERROR
r_timereport_temp = r_timereport_current;
r_timereport_current = Sys_DoubleTime();
t = (int) ((r_timereport_current - r_timereport_temp) * 1000000.0 + 0.5);
- dpsnprintf(tempbuf, sizeof(tempbuf), "%8i %-11s", t, desc);
- length = (int)strlen(tempbuf);
+ length = dpsnprintf(tempbuf, sizeof(tempbuf), "%8i %s", t, desc);
+ length = min(length, (int)sizeof(tempbuf) - 1);
+ if (r_speeds_longestitem < length)
+ r_speeds_longestitem = length;
+ for (;length < r_speeds_longestitem;length++)
+ tempbuf[length] = ' ';
+ tempbuf[length] = 0;
+
if (speedstringcount + length > (vid_conwidth.integer / 8))
{
- strlcat(r_speeds_string, "\n", sizeof(r_speeds_string));
+ strlcat(r_speeds_timestring, "\n", sizeof(r_speeds_timestring));
speedstringcount = 0;
}
- strlcat(r_speeds_string, tempbuf, sizeof(r_speeds_string));
+ strlcat(r_speeds_timestring, tempbuf, sizeof(r_speeds_timestring));
speedstringcount += length;
}
-void R_TimeReport_Frame(void)
+void R_TimeReport_BeginFrame(void)
{
- int i, j, lines, y;
- cl_locnode_t *loc;
+ speedstringcount = 0;
+ r_speeds_timestring[0] = 0;
+ r_timereport_active = false;
+ memset(&r_refdef.stats, 0, sizeof(r_refdef.stats));
- if (r_speeds_string[0])
+ if (r_speeds.integer >= 2 && cls.signon == SIGNONS && cls.state == ca_connected)
{
- if (r_timereport_active)
- {
- r_timereport_current = r_timereport_start;
- R_TimeReport("total");
- }
-
- if (r_speeds_string[strlen(r_speeds_string)-1] == '\n')
- r_speeds_string[strlen(r_speeds_string)-1] = 0;
- lines = 1;
- for (i = 0;r_speeds_string[i];i++)
- if (r_speeds_string[i] == '\n')
- lines++;
- y = vid_conheight.integer - sb_lines - lines * 8;
- i = j = 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, NULL, true);
- if (r_speeds_string[i] == '\n')
- i++;
- y += 8;
- }
- r_speeds_string[0] = 0;
- r_timereport_active = false;
+ r_timereport_active = true;
+ r_timereport_start = r_timereport_current = Sys_DoubleTime();
}
+}
+
+void R_TimeReport_EndFrame(void)
+{
+ int i, j, lines, y;
+ cl_locnode_t *loc;
+ char string[2048];
+
+ string[0] = 0;
if (r_speeds.integer && cls.signon == SIGNONS && cls.state == ca_connected)
{
- speedstringcount = 0;
- r_speeds_string[0] = 0;
- r_timereport_active = false;
// 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(r_speeds_string + strlen(r_speeds_string), "Location: %s\n", loc->name);
- sprintf(r_speeds_string + strlen(r_speeds_string), "org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n", r_view.origin[0], r_view.origin[1], r_view.origin[2], r_view.forward[0], r_view.forward[1], r_view.forward[2]);
- sprintf(r_speeds_string + strlen(r_speeds_string), "%5i entities%6i surfaces%6i triangles%5i leafs%5i portals%6i particles\n", 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);
- sprintf(r_speeds_string + strlen(r_speeds_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);
+ sprintf(string + strlen(string), "Location: %s\n", loc->name);
+ sprintf(string + strlen(string), "org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n", r_view.origin[0], r_view.origin[1], r_view.origin[2], r_view.forward[0], r_view.forward[1], r_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 particles%6i decals\n", r_refdef.stats.world_leafs, r_refdef.stats.world_portals, r_refdef.stats.particles, r_refdef.stats.decals);
+ 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(r_speeds_string + strlen(r_speeds_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);
+ 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(r_speeds_string + strlen(r_speeds_string), "rendered%6i meshes%8i triangles\n", r_refdef.stats.meshes, r_refdef.stats.meshes_elements / 3);
+ 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));
memset(&r_refdef.stats, 0, sizeof(r_refdef.stats));
+ speedstringcount = 0;
+ r_speeds_timestring[0] = 0;
+ r_timereport_active = false;
+
if (r_speeds.integer >= 2)
{
r_timereport_active = true;
r_timereport_start = r_timereport_current = Sys_DoubleTime();
}
}
+
+ if (string[0])
+ {
+ if (string[strlen(string)-1] == '\n')
+ string[strlen(string)-1] = 0;
+ lines = 1;
+ for (i = 0;string[i];i++)
+ if (string[i] == '\n')
+ lines++;
+ y = vid_conheight.integer - sb_lines - lines * 8;
+ i = j = 0;
+ DrawQ_Fill(0, y, vid_conwidth.integer, lines * 8, 0, 0, 0, 0.5, 0);
+ while (string[i])
+ {
+ j = i;
+ while (string[i] && string[i] != '\n')
+ i++;
+ if (i - j > 0)
+ DrawQ_String(0, y, string + j, i - j, 8, 8, 1, 1, 1, 1, 0, NULL, true);
+ if (string[i] == '\n')
+ i++;
+ y += 8;
+ }
+ }
}
/*
SCR_CaptureVideo_RIFF_Write32(nMatching); // nEntriesInUse
SCR_CaptureVideo_RIFF_WriteFourCC(dwChunkId); // dwChunkId
SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.videofile_ix_movistart & (fs_offset_t) 0xFFFFFFFFu);
- SCR_CaptureVideo_RIFF_Write32(((long long) cls.capturevideo.videofile_ix_movistart) >> 32);
+ SCR_CaptureVideo_RIFF_Write32(((fs_offset_t) cls.capturevideo.videofile_ix_movistart) >> 32);
SCR_CaptureVideo_RIFF_Write32(0); // dwReserved
for(i = 0; i < cls.capturevideo.riffindexbuffer.cursize; i += 16)
FS_Seek(cls.capturevideo.videofile, masteridx_start + 16 * *masteridx_count, SEEK_SET);
SCR_CaptureVideo_RIFF_Write32(ix & (fs_offset_t) 0xFFFFFFFFu);
- SCR_CaptureVideo_RIFF_Write32(((long long) ix) >> 32);
+ SCR_CaptureVideo_RIFF_Write32(((fs_offset_t) ix) >> 32);
SCR_CaptureVideo_RIFF_Write32(pos - ix);
SCR_CaptureVideo_RIFF_Write32(nMatching);
SCR_CaptureVideo_RIFF_Flush();
cls.capturevideo.frame = 0;
cls.capturevideo.soundsampleframe = 0;
cls.capturevideo.realtime = cl_capturevideo_realtime.integer != 0;
- cls.capturevideo.screenbuffer = (unsigned char *)Mem_Alloc(tempmempool, vid.width * vid.height * 3);
- cls.capturevideo.outbuffer = (unsigned char *)Mem_Alloc(tempmempool, width * height * (3+3+3) + 18);
+ cls.capturevideo.screenbuffer = (unsigned char *)Mem_Alloc(tempmempool, vid.width * vid.height * 4);
+ cls.capturevideo.outbuffer = (unsigned char *)Mem_Alloc(tempmempool, width * height * (4+4) + 18);
gamma = 1.0/scr_screenshot_gammaboost.value;
dpsnprintf(cls.capturevideo.basename, sizeof(cls.capturevideo.basename), "video/dpvideo%03i", cl_capturevideo_number.integer);
Cvar_SetValueQuick(&cl_capturevideo_number, cl_capturevideo_number.integer + 1);
memset(&cls.capturevideo, 0, sizeof(cls.capturevideo));
}
-// converts from RGB24 to I420 colorspace (identical to YV12 except chroma plane order is reversed), this colorspace is handled by the Intel(r) 4:2:0 codec on Windows
-void SCR_CaptureVideo_ConvertFrame_RGB_to_I420_flip(int width, int height, unsigned char *instart, unsigned char *outstart)
+// converts from BGRA32 to I420 colorspace (identical to YV12 except chroma plane order is reversed), this colorspace is handled by the Intel(r) 4:2:0 codec on Windows
+void SCR_CaptureVideo_ConvertFrame_BGRA_to_I420_flip(int width, int height, unsigned char *instart, unsigned char *outstart)
{
int x, y;
+ int blockr, blockg, blockb;
int outoffset = (width/2)*(height/2);
unsigned char *b, *out;
// process one line at a time, and CbCr every other line at 2 pixel intervals
for (y = 0;y < height;y++)
{
// 1x1 Y
- for (b = instart + (height-1-y)*width*3, out = outstart + y*width, x = 0;x < width;x++, b += 3, out++)
- *out = cls.capturevideo.yuvnormalizetable[0][cls.capturevideo.rgbtoyuvscaletable[0][0][b[0]] + cls.capturevideo.rgbtoyuvscaletable[0][1][b[1]] + cls.capturevideo.rgbtoyuvscaletable[0][2][b[2]]];
+ for (b = instart + (height-1-y)*width*4, out = outstart + y*width, x = 0;x < width;x++, b += 4, out++)
+ {
+ blockr = b[2];
+ blockg = b[1];
+ blockb = b[0];
+ *out = cls.capturevideo.yuvnormalizetable[0][cls.capturevideo.rgbtoyuvscaletable[0][0][blockr] + cls.capturevideo.rgbtoyuvscaletable[0][1][blockg] + cls.capturevideo.rgbtoyuvscaletable[0][2][blockb]];
+ }
if ((y & 1) == 0)
{
// 2x2 Cr and Cb planes
-#if 0
- // low quality, no averaging
- for (b = instart + (height-2-y)*width*3, out = outstart + width*height + (y/2)*(width/2), x = 0;x < width/2;x++, b += 6, out++)
- {
- // Cr
- out[0 ] = cls.capturevideo.yuvnormalizetable[1][cls.capturevideo.rgbtoyuvscaletable[1][0][b[0]] + cls.capturevideo.rgbtoyuvscaletable[1][1][b[1]] + cls.capturevideo.rgbtoyuvscaletable[1][2][b[2]] + 128];
- // Cb
- out[outoffset] = cls.capturevideo.yuvnormalizetable[2][cls.capturevideo.rgbtoyuvscaletable[2][0][b[0]] + cls.capturevideo.rgbtoyuvscaletable[2][1][b[1]] + cls.capturevideo.rgbtoyuvscaletable[2][2][b[2]] + 128];
- }
-#else
- // high quality, averaging
- int inpitch = width*3;
- for (b = instart + (height-2-y)*width*3, out = outstart + width*height + (y/2)*(width/2), x = 0;x < width/2;x++, b += 6, out++)
+ int inpitch = width*4;
+ for (b = instart + (height-2-y)*width*4, out = outstart + width*height + (y/2)*(width/2), x = 0;x < width/2;x++, b += 8, out++)
{
- int blockr, blockg, blockb;
- blockr = (b[0] + b[3] + b[inpitch+0] + b[inpitch+3]) >> 2;
- blockg = (b[1] + b[4] + b[inpitch+1] + b[inpitch+4]) >> 2;
- blockb = (b[2] + b[5] + b[inpitch+2] + b[inpitch+5]) >> 2;
+ blockr = (b[2] + b[6] + b[inpitch+2] + b[inpitch+6]) >> 2;
+ blockg = (b[1] + b[5] + b[inpitch+1] + b[inpitch+5]) >> 2;
+ blockb = (b[0] + b[4] + b[inpitch+0] + b[inpitch+4]) >> 2;
// Cr
out[0 ] = cls.capturevideo.yuvnormalizetable[1][cls.capturevideo.rgbtoyuvscaletable[1][0][blockr] + cls.capturevideo.rgbtoyuvscaletable[1][1][blockg] + cls.capturevideo.rgbtoyuvscaletable[1][2][blockb] + 128];
// Cb
out[outoffset] = cls.capturevideo.yuvnormalizetable[2][cls.capturevideo.rgbtoyuvscaletable[2][0][blockr] + cls.capturevideo.rgbtoyuvscaletable[2][1][blockg] + cls.capturevideo.rgbtoyuvscaletable[2][2][blockb] + 128];
}
-#endif
}
}
}
-static void SCR_ScaleDown(unsigned char *in, int inw, int inh, unsigned char *out, int outw, int outh)
+static void SCR_ScaleDownBGRA(unsigned char *in, int inw, int inh, unsigned char *out, int outw, int outh)
{
// TODO optimize this function
// memcpy is faster than me
if(inw == outw && inh == outh)
{
- memcpy(out, in, 3 * inw * inh);
+ memcpy(out, in, 4 * inw * inh);
return;
}
{
float inx0 = x / (float)outw * inw; int inx0_i = floor(inx0);
float inx1 = (x+1) / (float)outw * inw; int inx1_i = ceil(inx1);
- float r = 0, g = 0, b = 0;
+ float r = 0, g = 0, b = 0, alpha = 0;
int xx, yy;
for(yy = iny0_i; yy < iny1_i; ++yy)
for(xx = inx0_i; xx < inx1_i; ++xx)
{
float a = ya * (min(xx+1, inx1) - max(inx0, xx));
- r += a * in[3*(xx + inw * yy)+0];
- g += a * in[3*(xx + inw * yy)+1];
- b += a * in[3*(xx + inw * yy)+2];
+ r += a * in[4*(xx + inw * yy)+0];
+ g += a * in[4*(xx + inw * yy)+1];
+ b += a * in[4*(xx + inw * yy)+2];
+ alpha += a * in[4*(xx + inw * yy)+3];
}
}
- out[3*(x + outw * y)+0] = r * area;
- out[3*(x + outw * y)+1] = g * area;
- out[3*(x + outw * y)+2] = b * area;
+ out[4*(x + outw * y)+0] = r * area;
+ out[4*(x + outw * y)+1] = g * area;
+ out[4*(x + outw * y)+2] = b * area;
+ out[4*(x + outw * y)+3] = alpha * area;
}
}
}
if (!cls.capturevideo.videofile)
return false;
// FIXME: width/height must be multiple of 2, enforce this?
- qglReadPixels (x, y, vid.width, vid.height, GL_RGB, GL_UNSIGNED_BYTE, cls.capturevideo.screenbuffer);CHECKGLERROR
- SCR_ScaleDown (cls.capturevideo.screenbuffer, vid.width, vid.height, cls.capturevideo.outbuffer, width, height);
+ 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);
in = cls.capturevideo.outbuffer;
- out = cls.capturevideo.outbuffer + width*height*3;
- SCR_CaptureVideo_ConvertFrame_RGB_to_I420_flip(width, height, in, out);
+ out = cls.capturevideo.outbuffer + width*height*4;
+ SCR_CaptureVideo_ConvertFrame_BGRA_to_I420_flip(width, height, in, out);
x = width*height+(width/2)*(height/2)*2;
SCR_CaptureVideo_RIFF_OverflowCheck(8 + x);
for (;cls.capturevideo.frame < newframenum;cls.capturevideo.frame++)
//=============================================================================
-// LordHavoc: SHOWLMP stuff
-#define SHOWLMP_MAXLABELS 256
-typedef struct showlmp_s
-{
- qboolean isactive;
- float x;
- float y;
- char label[32];
- char pic[128];
-}
-showlmp_t;
-
-showlmp_t showlmp[SHOWLMP_MAXLABELS];
-
void SHOWLMP_decodehide(void)
{
int i;
char *lmplabel;
lmplabel = MSG_ReadString();
- for (i = 0;i < SHOWLMP_MAXLABELS;i++)
- if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
+ for (i = 0;i < cl.num_showlmps;i++)
+ if (cl.showlmps[i].isactive && strcmp(cl.showlmps[i].label, lmplabel) == 0)
{
- showlmp[i].isactive = false;
+ cl.showlmps[i].isactive = false;
return;
}
}
void SHOWLMP_decodeshow(void)
{
- int i, k;
+ int k;
char lmplabel[256], picname[256];
float x, y;
strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
x = MSG_ReadShort();
y = MSG_ReadShort();
}
- k = -1;
- for (i = 0;i < SHOWLMP_MAXLABELS;i++)
- if (showlmp[i].isactive)
- {
- if (strcmp(showlmp[i].label, lmplabel) == 0)
- {
- k = i;
- break; // drop out to replace it
- }
- }
- else if (k < 0) // find first empty one to replace
- k = i;
- if (k < 0)
- return; // none found to replace
- // change existing one
- showlmp[k].isactive = true;
- strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label));
- strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic));
- showlmp[k].x = x;
- showlmp[k].y = y;
+ if (!cl.showlmps || cl.num_showlmps >= cl.max_showlmps)
+ {
+ showlmp_t *oldshowlmps = cl.showlmps;
+ cl.max_showlmps += 16;
+ cl.showlmps = Mem_Alloc(cls.levelmempool, cl.max_showlmps * sizeof(showlmp_t));
+ if (cl.num_showlmps)
+ memcpy(cl.showlmps, oldshowlmps, cl.num_showlmps * sizeof(showlmp_t));
+ if (oldshowlmps)
+ Mem_Free(oldshowlmps);
+ }
+ for (k = 0;k < cl.max_showlmps;k++)
+ if (cl.showlmps[k].isactive && !strcmp(cl.showlmps[k].label, lmplabel))
+ break;
+ if (k == cl.max_showlmps)
+ for (k = 0;k < cl.max_showlmps;k++)
+ if (!cl.showlmps[k].isactive)
+ break;
+ cl.showlmps[k].isactive = true;
+ strlcpy (cl.showlmps[k].label, lmplabel, sizeof (cl.showlmps[k].label));
+ strlcpy (cl.showlmps[k].pic, picname, sizeof (cl.showlmps[k].pic));
+ cl.showlmps[k].x = x;
+ cl.showlmps[k].y = y;
+ cl.num_showlmps = max(cl.num_showlmps, k + 1);
}
void SHOWLMP_drawall(void)
{
int i;
- for (i = 0;i < SHOWLMP_MAXLABELS;i++)
- if (showlmp[i].isactive)
- DrawQ_Pic(showlmp[i].x, showlmp[i].y, Draw_CachePic(showlmp[i].pic, true), 0, 0, 1, 1, 1, 1, 0);
-}
-
-void SHOWLMP_clear(void)
-{
- int i;
- for (i = 0;i < SHOWLMP_MAXLABELS;i++)
- showlmp[i].isactive = false;
+ for (i = 0;i < cl.num_showlmps;i++)
+ if (cl.showlmps[i].isactive)
+ DrawQ_Pic(cl.showlmps[i].x, cl.showlmps[i].y, Draw_CachePic(cl.showlmps[i].pic, true), 0, 0, 1, 1, 1, 1, 0);
}
/*
return false;
CHECKGLERROR
- qglReadPixels (x, y, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer1);CHECKGLERROR
+ qglReadPixels (x, y, width, height, jpeg ? GL_RGB : GL_BGR, GL_UNSIGNED_BYTE, buffer1);CHECKGLERROR
if (scr_screenshot_gammaboost.value != 1 && gammacorrect)
{
if (jpeg)
ret = JPEG_SaveImage_preflipped (filename, width, height, buffer2);
else
- ret = Image_WriteTGARGB_preflipped (filename, width, height, buffer2, buffer3);
+ ret = Image_WriteTGABGR_preflipped (filename, width, height, buffer2, buffer3);
return ret;
}
{
R_Mesh_Start();
- if (r_timereport_active)
- R_TimeReport("setup");
+ R_TimeReport_BeginFrame();
R_UpdateVariables();
}
// draw 2D stuff
+ if(!scr_con_current && !(key_consoleactive & KEY_CONSOLEACTIVE_FORCED))
+ if ((key_dest == key_game || key_dest == key_message) && !r_letterbox.value)
+ Con_DrawNotify (); // only draw notify in game
if (cls.signon == SIGNONS)
{
R_TimeReport("2d");
if (cls.signon == SIGNONS)
- R_TimeReport_Frame();
+ R_TimeReport_EndFrame();
DrawQ_Finish();
R_DrawGamma();
R_Mesh_Finish();
-
- if (r_timereport_active)
- R_TimeReport("meshfinish");
}
void SCR_UpdateLoadingScreen (qboolean clear)
r_view.colormask[1] = 1;
r_view.colormask[2] = 1;
- if (r_timereport_active)
- R_TimeReport("other");
-
SCR_SetUpToDrawConsole();
- if (r_timereport_active)
- R_TimeReport("start");
-
CHECKGLERROR
+ qglDrawBuffer(GL_BACK);CHECKGLERROR
qglViewport(0, 0, vid.width, vid.height);CHECKGLERROR
qglDisable(GL_SCISSOR_TEST);CHECKGLERROR
qglDepthMask(1);CHECKGLERROR
qglColorMask(1,1,1,1);CHECKGLERROR
qglClearColor(0,0,0,0);CHECKGLERROR
- qglClear(GL_COLOR_BUFFER_BIT);CHECKGLERROR
+ R_ClearScreen();
+ r_view.clear = false;
if(scr_stipple.integer)
{
else
qglDisable(GL_POLYGON_STIPPLE);
- 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;
SCR_CaptureVideo();
VID_Finish(true);
- if (r_timereport_active)
- R_TimeReport("finish");
}
void CL_Screen_NewMap(void)
{
- SHOWLMP_clear();
}