cvar_t scr_showram = {CVAR_SAVE, "showram","1"};
cvar_t scr_showturtle = {CVAR_SAVE, "showturtle","0"};
cvar_t scr_showpause = {CVAR_SAVE, "showpause","1"};
+cvar_t scr_showbrand = {0, "showbrand","0"};
cvar_t scr_printspeed = {0, "scr_printspeed","8"};
cvar_t vid_conwidth = {CVAR_SAVE, "vid_conwidth", "640"};
cvar_t vid_conheight = {CVAR_SAVE, "vid_conheight", "480"};
cvar_t vid_pixelaspect = {CVAR_SAVE, "vid_pixelaspect", "1"};
-cvar_t scr_screenshot_jpeg = {CVAR_SAVE, "scr_screenshot_jpeg","0"};
+cvar_t scr_screenshot_jpeg = {CVAR_SAVE, "scr_screenshot_jpeg","1"};
cvar_t scr_screenshot_jpeg_quality = {CVAR_SAVE, "scr_screenshot_jpeg_quality","0.9"};
cvar_t scr_screenshot_gamma = {CVAR_SAVE, "scr_screenshot_gamma","2.2"};
-cvar_t scr_screenshot_name = {0, "scr_screenshot_name","dp"};
+// scr_screenshot_name is defined in fs.c
cvar_t cl_capturevideo = {0, "cl_capturevideo", "0"};
+cvar_t cl_capturevideo_sound = {0, "cl_capturevideo_sound", "0"};
cvar_t cl_capturevideo_fps = {0, "cl_capturevideo_fps", "30"};
cvar_t cl_capturevideo_rawrgb = {0, "cl_capturevideo_rawrgb", "0"};
cvar_t cl_capturevideo_rawyv12 = {0, "cl_capturevideo_rawyv12", "0"};
// backend
void R_ClearScreen(void);
+// color tag printing
+static vec4_t string_colors[] =
+{
+ // Quake3 colors
+ // LordHavoc: why on earth is cyan before magenta in Quake3?
+ // LordHavoc: note: Doom3 uses white for [0] and [7]
+ {0.0, 0.0, 0.0, 1.0}, // black
+ {1.0, 0.0, 0.0, 1.0}, // red
+ {0.0, 1.0, 0.0, 1.0}, // green
+ {1.0, 1.0, 0.0, 1.0}, // yellow
+ {0.0, 0.0, 1.0, 1.0}, // blue
+ {0.0, 1.0, 1.0, 1.0}, // cyan
+ {1.0, 0.0, 1.0, 1.0}, // magenta
+ {1.0, 1.0, 1.0, 1.0}, // white
+ // [515]'s BX_COLOREDTEXT extension
+ {1.0, 1.0, 1.0, 0.5}, // half transparent
+ {0.5, 0.5, 0.5, 1.0} // half brightness
+ // Black's color table
+ //{1.0, 1.0, 1.0, 1.0},
+ //{1.0, 0.0, 0.0, 1.0},
+ //{0.0, 1.0, 0.0, 1.0},
+ //{0.0, 0.0, 1.0, 1.0},
+ //{1.0, 1.0, 0.0, 1.0},
+ //{0.0, 1.0, 1.0, 1.0},
+ //{1.0, 0.0, 1.0, 1.0},
+ //{0.1, 0.1, 0.1, 1.0}
+};
+
+#define STRING_COLORS_COUNT (sizeof(string_colors) / sizeof(vec4_t))
+
+// color is read and changed in the end
+void DrawQ_ColoredString( float x, float y, const char *text, int maxlen, float scalex, float scaley, float basered, float basegreen, float baseblue, float basealpha, int flags, int *outcolor )
+{
+ vec_t *color;
+ int len;
+ int colorindex;
+ const char *start, *current;
+
+ if( !outcolor || *outcolor == -1 ) {
+ colorindex = STRING_COLOR_DEFAULT;
+ } else {
+ colorindex = *outcolor;
+ }
+ color = string_colors[colorindex];
+
+ if( maxlen < 1)
+ len = (int)strlen( text );
+ else
+ len = min( maxlen, (int) strlen( text ) );
+
+ start = current = text;
+ while( len > 0 ) {
+ // check for color control char
+ if( *current == STRING_COLOR_TAG ) {
+ // get next char
+ current++;
+ len--;
+ if( len == 0 ) {
+ break;
+ }
+ // display the tag char?
+ if( *current == STRING_COLOR_TAG ) {
+ // only display one of the two
+ start = current;
+ // get the next char
+ current++;
+ len--;
+ } else if( '0' <= *current && *current <= '9' ) {
+ colorindex = 0;
+ do {
+ colorindex = colorindex * 10 + (*current - '0');
+ // only read as long as it makes a valid index
+ if( colorindex >= (int)STRING_COLORS_COUNT ) {
+ // undo the last operation
+ colorindex /= 10;
+ break;
+ }
+ current++;
+ len--;
+ } while( len > 0 && '0' <= *current && *current <= '9' );
+ // set the color
+ color = string_colors[colorindex];
+ // we jump over the color tag
+ start = current;
+ }
+ }
+ // go on and read normal text in until the next control char
+ while( len > 0 && *current != STRING_COLOR_TAG ) {
+ current++;
+ len--;
+ }
+ // display the text
+ if( start != current ) {
+ // draw the string
+ DrawQ_String( x, y, start, current - start, scalex, scaley, basered * color[0], basegreen * color[1], baseblue * color[2], basealpha * color[3], flags );
+ // update x to be at the new start position
+ x += (current - start) * scalex;
+ // set start accordingly
+ start = current;
+ }
+ }
+
+ // return the last colorindex
+ if( outcolor ) {
+ *outcolor = colorindex;
+ }
+}
+
/*
===============================================================================
int l;
int x, y;
int remaining;
+ int color;
// the finale prints the characters one at a time
if (cl.intermission)
start = scr_centerstring;
if (scr_center_lines <= 4)
- y = vid.conheight*0.35;
+ y = vid_conheight.integer*0.35;
else
y = 48;
+ color = -1;
do
{
// scan the width of the line
- for (l=0 ; l<vid.conwidth/8 ; l++)
+ for (l=0 ; l<vid_conwidth.integer/8 ; l++)
if (start[l] == '\n' || !start[l])
break;
- x = (vid.conwidth - l*8)/2;
+ x = (vid_conwidth.integer - l*8)/2;
if (l > 0)
{
if (remaining < l)
l = remaining;
- DrawQ_String(x, y, start, l, 8, 8, 1, 1, 1, 1, 0);
+ DrawQ_ColoredString(x, y, start, l, 8, 8, 1, 1, 1, 1, 0, &color);
remaining -= l;
if (remaining <= 0)
return;
if (count < 3)
return;
- DrawQ_Pic (0, 0, "gfx/turtle.lmp", 0, 0, 1, 1, 1, 1, 0);
+ DrawQ_Pic (0, 0, "gfx/turtle", 0, 0, 1, 1, 1, 1, 0);
}
/*
if (cls.demoplayback)
return;
- DrawQ_Pic (64, 0, "gfx/net.lmp", 0, 0, 1, 1, 1, 1, 0);
+ DrawQ_Pic (64, 0, "gfx/net", 0, 0, 1, 1, 1, 1, 0);
}
/*
if (!cl.paused)
return;
- pic = Draw_CachePic ("gfx/pause.lmp");
- DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/pause.lmp", 0, 0, 1, 1, 1, 1, 0);
+ pic = Draw_CachePic ("gfx/pause", true);
+ DrawQ_Pic ((vid_conwidth.integer - pic->width)/2, (vid_conheight.integer - pic->height)/2, "gfx/pause", 0, 0, 1, 1, 1, 1, 0);
}
+/*
+==============
+SCR_DrawBrand
+==============
+*/
+void SCR_DrawBrand (void)
+{
+ cachepic_t *pic;
+ float x, y;
+
+ if (!scr_showbrand.value)
+ return;
+ pic = Draw_CachePic ("gfx/brand", true);
+ switch ((int)scr_showbrand.value)
+ {
+ case 1: // bottom left
+ x = 0;
+ y = vid_conheight.integer - pic->height;
+ break;
+ case 2: // bottom centre
+ x = (vid_conwidth.integer - pic->width) / 2;
+ y = vid_conheight.integer - pic->height;
+ break;
+ case 3: // bottom right
+ x = vid_conwidth.integer - pic->width;
+ y = vid_conheight.integer - pic->height;
+ break;
+ case 4: // centre right
+ x = vid_conwidth.integer - pic->width;
+ y = (vid_conheight.integer - pic->height) / 2;
+ break;
+ case 5: // top right
+ x = vid_conwidth.integer - pic->width;
+ y = 0;
+ break;
+ case 6: // top centre
+ x = (vid_conwidth.integer - pic->width) / 2;
+ y = 0;
+ break;
+ case 7: // top left
+ x = 0;
+ y = 0;
+ break;
+ case 8: // centre left
+ x = 0;
+ y = (vid_conheight.integer - pic->height) / 2;
+ break;
+ default:
+ return;
+ }
+ DrawQ_Pic (x, y, "gfx/brand", 0, 0, 1, 1, 1, 1, 0);
+}
//=============================================================================
// decide on the height of the console
if (key_consoleactive & KEY_CONSOLEACTIVE_USER)
- conlines = vid.conheight/2; // half screen
+ conlines = vid_conheight.integer/2; // half screen
else
conlines = 0; // none visible
if (key_consoleactive & KEY_CONSOLEACTIVE_FORCED)
{
// full screen
- Con_DrawConsole (vid.conheight);
+ Con_DrawConsole (vid_conheight.integer);
}
else if (scr_con_current)
Con_DrawConsole (scr_con_current);
*/
void SCR_BeginLoadingPlaque (void)
{
- S_StopAllSounds ();
+ Host_StartVideo();
+ S_StopAllSounds();
SCR_UpdateLoadingScreen();
}
int length;
int t;
- if (!r_timereport_active)
+ if (!r_timereport_active || r_showtrispass)
return;
+ qglFinish();
r_timereport_temp = r_timereport_current;
r_timereport_current = Sys_DoubleTime();
t = (int) ((r_timereport_current - r_timereport_temp) * 1000000.0);
- sprintf(tempbuf, "%8i %s", t, desc);
- length = strlen(tempbuf);
+ dpsnprintf(tempbuf, sizeof(tempbuf), "%8i %s", t, desc);
+ length = (int)strlen(tempbuf);
while (length < 20)
tempbuf[length++] = ' ';
tempbuf[length] = 0;
- if (speedstringcount + length > (vid.conwidth / 8))
+ if (speedstringcount + length > (vid_conwidth.integer / 8))
{
- strcat(r_speeds_string, "\n");
+ strlcat(r_speeds_string, "\n", sizeof(r_speeds_string));
speedstringcount = 0;
}
// skip the space at the beginning if it's the first on the line
if (speedstringcount == 0)
{
- strcat(r_speeds_string, tempbuf + 1);
+ strlcat(r_speeds_string, tempbuf + 1, sizeof(r_speeds_string));
speedstringcount = length - 1;
}
else
{
- strcat(r_speeds_string, tempbuf);
+ strlcat(r_speeds_string, tempbuf, sizeof(r_speeds_string));
speedstringcount += length;
}
}
{
speedstringcount = 0;
sprintf(r_speeds_string + strlen(r_speeds_string), "org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n", r_vieworigin[0], r_vieworigin[1], r_vieworigin[2], r_viewforward[0], r_viewforward[1], r_viewforward[2]);
- sprintf(r_speeds_string + strlen(r_speeds_string), "world:%6i faces%6i nodes%6i leafs%6i dlitwalls\n", c_faces, c_nodes, c_leafs, c_light_polys);
- sprintf(r_speeds_string + strlen(r_speeds_string), "%5i models%5i bmodels%5i sprites%6i particles%4i dlights\n", c_models, c_bmodels, c_sprites, c_particles, c_dlights);
- sprintf(r_speeds_string + strlen(r_speeds_string), "%6i modeltris%6i meshs%6i meshtris\n", c_alias_polys, c_meshs, c_meshelements / 3);
- sprintf(r_speeds_string + strlen(r_speeds_string), "bloom %s: %i copies (%i pixels) %i draws (%i pixels)\n", c_bloom ? "active" : "inactive", c_bloomcopies, c_bloomcopypixels, c_bloomdraws, c_bloomdrawpixels);
- sprintf(r_speeds_string + strlen(r_speeds_string), "realtime lighting:%4i lights%4i clears%4i scissored\n", c_rt_lights, c_rt_clears, c_rt_scissored);
- sprintf(r_speeds_string + strlen(r_speeds_string), "dynamic: %6i shadowmeshes%6i shadowtris%6i lightmeshes%6i lighttris\n", c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris);
- sprintf(r_speeds_string + strlen(r_speeds_string), "precomputed: %6i shadowmeshes%6i shadowtris\n", c_rtcached_shadowmeshes, c_rtcached_shadowtris);
-
- c_alias_polys = 0;
- c_light_polys = 0;
- c_faces = 0;
- c_nodes = 0;
- c_leafs = 0;
- c_models = 0;
- c_bmodels = 0;
- c_sprites = 0;
- c_particles = 0;
- c_dlights = 0;
- c_meshs = 0;
- c_meshelements = 0;
- c_rt_lights = 0;
- c_rt_clears = 0;
- c_rt_scissored = 0;
- c_rt_shadowmeshes = 0;
- c_rt_shadowtris = 0;
- c_rt_lightmeshes = 0;
- c_rt_lighttris = 0;
- c_rtcached_shadowmeshes = 0;
- c_rtcached_shadowtris = 0;
- c_bloom = 0;
- c_bloomcopies = 0;
- c_bloomcopypixels = 0;
- c_bloomdraws = 0;
- c_bloomdrawpixels = 0;
+ sprintf(r_speeds_string + strlen(r_speeds_string), "%5i entities%6i surfaces%6i triangles%5i leafs%5i portals%6i particles\n", renderstats.entities, renderstats.entities_surfaces, renderstats.entities_triangles, renderstats.world_leafs, renderstats.world_portals, renderstats.particles);
+ sprintf(r_speeds_string + strlen(r_speeds_string), "%4i lights%4i clears%4i scissored%7i light%7i shadow%i7 dynamic\n", renderstats.lights, renderstats.lights_clears, renderstats.lights_scissored, renderstats.lights_lighttriangles, renderstats.lights_shadowtriangles, renderstats.lights_dynamicshadowtriangles);
+ if (renderstats.bloom)
+ sprintf(r_speeds_string + strlen(r_speeds_string), "rendered%6i meshes%8i triangles bloompixels%8i copied%8i drawn\n", renderstats.meshes, renderstats.meshes_elements / 3, renderstats.bloom_copypixels, renderstats.bloom_drawpixels);
+ else
+ sprintf(r_speeds_string + strlen(r_speeds_string), "rendered%6i meshes%8i triangles\n", renderstats.meshes, renderstats.meshes_elements / 3);
r_timereport_start = Sys_DoubleTime();
}
+
+ memset(&renderstats, 0, sizeof(renderstats));
}
void R_TimeReport_End(void)
for (i = 0;r_speeds_string[i];i++)
if (r_speeds_string[i] == '\n')
lines++;
- y = vid.conheight - sb_lines - lines * 8;
+ y = vid_conheight.integer - sb_lines - lines * 8;
i = j = 0;
- DrawQ_Fill(0, y, vid.conwidth, 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;
Cvar_RegisterVariable (&scr_showram);
Cvar_RegisterVariable (&scr_showturtle);
Cvar_RegisterVariable (&scr_showpause);
+ Cvar_RegisterVariable (&scr_showbrand);
Cvar_RegisterVariable (&scr_centertime);
Cvar_RegisterVariable (&scr_printspeed);
Cvar_RegisterVariable (&vid_conwidth);
Cvar_RegisterVariable (&scr_screenshot_jpeg_quality);
Cvar_RegisterVariable (&scr_screenshot_gamma);
Cvar_RegisterVariable (&cl_capturevideo);
+ Cvar_RegisterVariable (&cl_capturevideo_sound);
Cvar_RegisterVariable (&cl_capturevideo_fps);
Cvar_RegisterVariable (&cl_capturevideo_rawrgb);
Cvar_RegisterVariable (&cl_capturevideo_rawyv12);
}
static int picelements[6] = {0, 1, 2, 0, 2, 3};
-void DrawQ_Pic(float x, float y, char *picname, float width, float height, float red, float green, float blue, float alpha, int flags)
+void DrawQ_Pic(float x, float y, const char *picname, float width, float height, float red, float green, float blue, float alpha, int flags)
{
DrawQ_SuperPic(x,y,picname,width,height,0,0,red,green,blue,alpha,1,0,red,green,blue,alpha,0,1,red,green,blue,alpha,1,1,red,green,blue,alpha,flags);
}
if (alpha < (1.0f / 255.0f))
return;
if (maxlen < 1)
- len = strlen(string);
+ len = (int)strlen(string);
else
for (len = 0;len < maxlen && string[len];len++);
for (;len > 0 && string[0] == ' ';string++, x += scalex, len--);
for (;len > 0 && string[len - 1] == ' ';len--);
if (len < 1)
return;
- if (x >= vid.conwidth || y >= vid.conheight || x < (-scalex * len) || y < (-scaley))
+ if (x >= vid_conwidth.integer || y >= vid_conheight.integer || x < (-scalex * len) || y < (-scaley))
return;
size = sizeof(*dq) + ((len + 1 + 3) & ~3);
if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
green = bound(0, green, 1);
blue = bound(0, blue, 1);
alpha = bound(0, alpha, 1);
- dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
+ dq = (drawqueue_t *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
dq->size = size;
dq->command = DRAWQUEUE_STRING;
dq->flags = flags;
DrawQ_String_Real(x,y,string,maxlen,scalex,scaley,red,green,blue,alpha,flags);
}
+
+
void DrawQ_Fill (float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags)
{
DrawQ_SuperPic(x,y,NULL,w,h,0,0,red,green,blue,alpha,1,0,red,green,blue,alpha,0,1,red,green,blue,alpha,1,1,red,green,blue,alpha,flags);
}
-void DrawQ_SuperPic(float x, float y, char *picname, float width, float height, float s1, float t1, float r1, float g1, float b1, float a1, float s2, float t2, float r2, float g2, float b2, float a2, float s3, float t3, float r3, float g3, float b3, float a3, float s4, float t4, float r4, float g4, float b4, float a4, int flags)
+void DrawQ_SuperPic(float x, float y, const char *picname, float width, float height, float s1, float t1, float r1, float g1, float b1, float a1, float s2, float t2, float r2, float g2, float b2, float a2, float s3, float t3, float r3, float g3, float b3, float a3, float s4, float t4, float r4, float g4, float b4, float a4, int flags)
{
float floats[36];
cachepic_t *pic;
memset(&mesh, 0, sizeof(mesh));
if (picname && picname[0])
{
- pic = Draw_CachePic(picname);
+ pic = Draw_CachePic(picname, false);
if (width == 0)
width = pic->width;
if (height == 0)
size += sizeof(float[4]) * mesh->num_vertices;
if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
return;
- dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
+ dq = (drawqueue_t *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
dq->size = size;
dq->command = DRAWQUEUE_MESH;
dq->flags = flags;
dq->scalex = 0;
dq->scaley = 0;
p = (void *)(dq + 1);
- m = p;p = (qbyte*)p + sizeof(drawqueuemesh_t);
+ m = (drawqueuemesh_t *)p;p = (unsigned char*)p + sizeof(drawqueuemesh_t);
m->num_triangles = mesh->num_triangles;
m->num_vertices = mesh->num_vertices;
m->texture = mesh->texture;
- m->data_element3i = p;memcpy(m->data_element3i , mesh->data_element3i , m->num_triangles * sizeof(int[3]));p = (qbyte*)p + m->num_triangles * sizeof(int[3]);
- m->data_vertex3f = p;memcpy(m->data_vertex3f , mesh->data_vertex3f , m->num_vertices * sizeof(float[3]));p = (qbyte*)p + m->num_vertices * sizeof(float[3]);
- m->data_texcoord2f = p;memcpy(m->data_texcoord2f, mesh->data_texcoord2f, m->num_vertices * sizeof(float[2]));p = (qbyte*)p + m->num_vertices * sizeof(float[2]);
- m->data_color4f = p;memcpy(m->data_color4f , mesh->data_color4f , m->num_vertices * sizeof(float[4]));p = (qbyte*)p + m->num_vertices * sizeof(float[4]);
+ m->data_element3i = (int *)p;memcpy(m->data_element3i , mesh->data_element3i , m->num_triangles * sizeof(int[3]));p = (unsigned char*)p + m->num_triangles * sizeof(int[3]);
+ m->data_vertex3f = (float *)p;memcpy(m->data_vertex3f , mesh->data_vertex3f , m->num_vertices * sizeof(float[3]));p = (unsigned char*)p + m->num_vertices * sizeof(float[3]);
+ m->data_texcoord2f = (float *)p;memcpy(m->data_texcoord2f, mesh->data_texcoord2f, m->num_vertices * sizeof(float[2]));p = (unsigned char*)p + m->num_vertices * sizeof(float[2]);
+ m->data_color4f = (float *)p;memcpy(m->data_color4f , mesh->data_color4f , m->num_vertices * sizeof(float[4]));p = (unsigned char*)p + m->num_vertices * sizeof(float[4]);
r_refdef.drawqueuesize += dq->size;
}
Con_DPrint("DrawQueue full !\n");
return;
}
- dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
+ dq = (drawqueue_t *) (r_refdef.drawqueue + r_refdef.drawqueuesize);
dq->size = sizeof(*dq);
dq->command = DRAWQUEUE_SETCLIP;
dq->x = x;
Con_DPrint("DrawQueue full !\n");
return;
}
- dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
+ dq = (drawqueue_t *) (r_refdef.drawqueue + r_refdef.drawqueuesize);
dq->size = sizeof(*dq);
dq->command = DRAWQUEUE_RESETCLIP;
dq->x = 0;
static char oldname[MAX_QPATH];
char base[MAX_QPATH];
char filename[MAX_QPATH];
- qbyte *buffer1;
- qbyte *buffer2;
- qbyte *buffer3;
+ unsigned char *buffer1;
+ unsigned char *buffer2;
+ unsigned char *buffer3;
qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
sprintf (base, "screenshots/%s", scr_screenshot_name.string);
sprintf(filename, "%s%06d.%s", base, shotnumber, jpeg ? "jpg" : "tga");
- buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
- buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
- buffer3 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3 + 18);
+ buffer1 = (unsigned char *)Mem_Alloc(tempmempool, vid.width * vid.height * 3);
+ buffer2 = (unsigned char *)Mem_Alloc(tempmempool, vid.width * vid.height * 3);
+ buffer3 = (unsigned char *)Mem_Alloc(tempmempool, vid.width * vid.height * 3 + 18);
- if (SCR_ScreenShot (filename, buffer1, buffer2, buffer3, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
+ if (SCR_ScreenShot (filename, buffer1, buffer2, buffer3, 0, 0, vid.width, vid.height, false, false, false, jpeg, true))
Con_Printf("Wrote %s\n", filename);
else
Con_Printf("unable to write %s\n", filename);
double cl_capturevideo_framerate = 0;
static int cl_capturevideo_soundrate = 0;
static int cl_capturevideo_frame = 0;
-static qbyte *cl_capturevideo_buffer = NULL;
+static unsigned char *cl_capturevideo_buffer = NULL;
static qfile_t *cl_capturevideo_videofile = NULL;
-static qfile_t *cl_capturevideo_soundfile = NULL;
+qfile_t *cl_capturevideo_soundfile = NULL;
static short cl_capturevideo_rgbtoyuvscaletable[3][3][256];
static unsigned char cl_capturevideo_yuvnormalizetable[3][256];
//static unsigned char cl_capturevideo_rgbgammatable[3][256];
{
double gamma, g;
unsigned int i;
- qbyte out[44];
+ unsigned char out[44];
if (cl_capturevideo_active)
return;
// soundrate is figured out on the first SoundFrame
cl_capturevideo_framerate = bound(1, cl_capturevideo_fps.value, 1000);
cl_capturevideo_soundrate = 0;
cl_capturevideo_frame = 0;
- cl_capturevideo_buffer = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * (3+3+3) + 18);
+ cl_capturevideo_buffer = (unsigned char *)Mem_Alloc(tempmempool, vid.width * vid.height * (3+3+3) + 18);
gamma = 1.0/scr_screenshot_gamma.value;
/*
if (cl_capturevideo_rawrgb.integer)
{
cl_capturevideo_format = CAPTUREVIDEOFORMAT_RAWRGB;
- cl_capturevideo_videofile = FS_Open ("video/dpvideo.rgb", "wb", false);
+ cl_capturevideo_videofile = FS_Open ("video/dpvideo.rgb", "wb", false, true);
}
else if (cl_capturevideo_rawyv12.integer)
{
cl_capturevideo_format = CAPTUREVIDEOFORMAT_RAWYV12;
- cl_capturevideo_videofile = FS_Open ("video/dpvideo.yv12", "wb", false);
+ cl_capturevideo_videofile = FS_Open ("video/dpvideo.yv12", "wb", false, true);
}
else if (scr_screenshot_jpeg.integer)
{
cl_capturevideo_videofile = NULL;
}
- cl_capturevideo_soundfile = FS_Open ("video/dpvideo.wav", "wb", false);
-
- // wave header will be filled out when video ends
- memset(out, 0, 44);
- FS_Write (cl_capturevideo_soundfile, out, 44);
+ if (cl_capturevideo_sound.integer)
+ {
+ cl_capturevideo_soundfile = FS_Open ("video/dpvideo.wav", "wb", false, true);
+ // wave header will be filled out when video ends
+ memset(out, 0, 44);
+ FS_Write (cl_capturevideo_soundfile, out, 44);
+ }
+ else
+ cl_capturevideo_soundfile = NULL;
}
void SCR_CaptureVideo_EndVideo(void)
{
int i, n;
- qbyte out[44];
+ unsigned char out[44];
if (!cl_capturevideo_active)
return;
cl_capturevideo_active = false;
// finish the wave file
if (cl_capturevideo_soundfile)
{
- i = FS_Tell (cl_capturevideo_soundfile);
+ i = (int)FS_Tell (cl_capturevideo_soundfile);
//"RIFF", (int) unknown (chunk size), "WAVE",
//"fmt ", (int) 16 (chunk size), (short) format 1 (uncompressed PCM), (short) 2 channels, (int) unknown rate, (int) unknown bytes per second, (short) 4 bytes per sample (channels * bytes per channel), (short) 16 bits per channel
//"data", (int) unknown (chunk size)
qboolean SCR_CaptureVideo_VideoFrame(int newframenum)
{
- int x = vid.realx, y = vid.realy, width = vid.realwidth, height = vid.realheight;
+ int x = 0, y = 0, width = vid.width, height = vid.height;
unsigned char *b, *out;
char filename[32];
int outoffset = (width/2)*(height/2);
- //return SCR_ScreenShot(filename, cl_capturevideo_buffer, cl_capturevideo_buffer + vid.realwidth * vid.realheight * 3, cl_capturevideo_buffer + vid.realwidth * vid.realheight * 6, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg);
+ //return SCR_ScreenShot(filename, cl_capturevideo_buffer, cl_capturevideo_buffer + vid.width * vid.height * 3, cl_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
switch (cl_capturevideo_format)
{
}
return true;
case CAPTUREVIDEOFORMAT_TARGA:
- //return Image_WriteTGARGB_preflipped (filename, width, height, cl_capturevideo_buffer, cl_capturevideo_buffer + vid.realwidth * vid.realheight * 3, );
+ //return Image_WriteTGARGB_preflipped (filename, width, height, cl_capturevideo_buffer, cl_capturevideo_buffer + vid.width * vid.height * 3, );
memset (cl_capturevideo_buffer, 0, 18);
cl_capturevideo_buffer[2] = 2; // uncompressed type
cl_capturevideo_buffer[12] = (width >> 0) & 0xFF;
}
}
-void SCR_CaptureVideo_SoundFrame(qbyte *bufstereo16le, size_t length, int rate)
+void SCR_CaptureVideo_SoundFrame(unsigned char *bufstereo16le, size_t length, int rate)
{
+ if (!cl_capturevideo_soundfile)
+ return;
cl_capturevideo_soundrate = rate;
- if (FS_Write (cl_capturevideo_soundfile, bufstereo16le, 4 * length) < 4 * length)
+ if (FS_Write (cl_capturevideo_soundfile, bufstereo16le, 4 * length) < (fs_offset_t)(4 * length))
{
Cvar_SetValueQuick(&cl_capturevideo, 0);
Con_Printf("video sound saving failed on frame %i, out of disk space? stopping video capture.\n", cl_capturevideo_frame);
Con_Printf("You can not change the video framerate while recording a video.\n");
Cvar_SetValueQuick(&cl_capturevideo_fps, cl_capturevideo_framerate);
}
- newframenum = (Sys_DoubleTime() - cl_capturevideo_starttime) * cl_capturevideo_framerate;
+ if (cl_capturevideo_soundfile)
+ {
+ // preserve sound sync by duplicating frames when running slow
+ newframenum = (Sys_DoubleTime() - cl_capturevideo_starttime) * cl_capturevideo_framerate;
+ }
+ else
+ newframenum = cl_capturevideo_frame + 1;
// if falling behind more than one second, stop
if (newframenum - cl_capturevideo_frame > (int)ceil(cl_capturevideo_framerate))
{
Grab six views for environment mapping tests
===============
*/
-struct
+struct envmapinfo_s
{
float angles[3];
char *name;
}
envmapinfo[12] =
{
- {{ 0, 0, 0}, "rt", true, false, false},
- {{ 0, 90, 0}, "ft", true, false, false},
- {{ 0, 180, 0}, "lf", true, false, false},
- {{ 0, 270, 0}, "bk", true, false, false},
- {{-90, 180, 0}, "up", false, true, false},
- {{ 90, 180, 0}, "dn", false, true, false},
+ {{ 0, 0, 0}, "rt", false, false, false},
+ {{ 0, 270, 0}, "ft", false, false, false},
+ {{ 0, 180, 0}, "lf", false, false, false},
+ {{ 0, 90, 0}, "bk", false, false, false},
+ {{-90, 180, 0}, "up", true, true, false},
+ {{ 90, 180, 0}, "dn", true, true, false},
{{ 0, 0, 0}, "px", true, true, true},
{{ 0, 90, 0}, "py", false, true, false},
{
int j, size;
char filename[256], basename[256];
- qbyte *buffer1;
- qbyte *buffer2;
- qbyte *buffer3;
+ unsigned char *buffer1;
+ unsigned char *buffer2;
+ unsigned char *buffer3;
if (Cmd_Argc() != 3)
{
Con_Print("envmap: size must be one of 128, 256, 512, or 1024\n");
return;
}
- if (size > vid.realwidth || size > vid.realheight)
+ if (size > vid.width || size > vid.height)
{
Con_Print("envmap: your resolution is not big enough to render that size\n");
return;
r_refdef.fov_x = 90;
r_refdef.fov_y = 90;
- buffer1 = Mem_Alloc(tempmempool, size * size * 3);
- buffer2 = Mem_Alloc(tempmempool, size * size * 3);
- buffer3 = Mem_Alloc(tempmempool, size * size * 3 + 18);
+ buffer1 = (unsigned char *)Mem_Alloc(tempmempool, size * size * 3);
+ buffer2 = (unsigned char *)Mem_Alloc(tempmempool, size * size * 3);
+ buffer3 = (unsigned char *)Mem_Alloc(tempmempool, size * size * 3 + 18);
for (j = 0;j < 12;j++)
{
R_Mesh_Start();
R_RenderView();
R_Mesh_Finish();
- SCR_ScreenShot(filename, buffer1, buffer2, buffer3, vid.realx, vid.realy + vid.realheight - (r_refdef.y + r_refdef.height), size, size, envmapinfo[j].flipx, envmapinfo[j].flipy, envmapinfo[j].flipdiagonaly, false);
+ SCR_ScreenShot(filename, buffer1, buffer2, buffer3, 0, vid.height - (r_refdef.y + r_refdef.height), size, size, envmapinfo[j].flipx, envmapinfo[j].flipy, envmapinfo[j].flipdiagonaly, false, false);
}
Mem_Free (buffer1);
void SHOWLMP_decodehide(void)
{
int i;
- qbyte *lmplabel;
+ char *lmplabel;
lmplabel = MSG_ReadString();
for (i = 0;i < SHOWLMP_MAXLABELS;i++)
if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
void SHOWLMP_decodeshow(void)
{
int i, k;
- qbyte lmplabel[256], picname[256];
+ char lmplabel[256], picname[256];
float x, y;
strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
strlcpy (picname, MSG_ReadString(), sizeof (picname));
{
float conwidth, conheight;
- VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
-
VID_UpdateGamma(false);
conwidth = bound(320, vid_conwidth.value, 2048);
if (vid_conheight.value != conheight)
Cvar_SetValue("vid_conheight", conheight);
- vid.conwidth = vid_conwidth.integer;
- vid.conheight = vid_conheight.integer;
-
-/* if (vid.realheight > 240)
- {
- vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
- vid.conheight = bound(240, vid.conheight, vid.realheight);
- }
- else
- vid.conheight = 240;*/
+ vid_conwidth.integer = vid_conwidth.integer;
+ vid_conheight.integer = vid_conheight.integer;
SCR_SetUpToDrawConsole();
}
SCR_DrawConsole();
+ SCR_DrawBrand();
+
SCR_UpdateScreen();
}