cvar_t scr_screenshot_jpeg_quality = {CVAR_SAVE, "scr_screenshot_jpeg_quality","0.9", "image quality of saved jpeg"};
cvar_t scr_screenshot_png = {CVAR_SAVE, "scr_screenshot_png","0", "save png instead of targa"};
cvar_t scr_screenshot_gammaboost = {CVAR_SAVE, "scr_screenshot_gammaboost","1", "gamma correction on saved screenshots and videos, 1.0 saves unmodified images"};
-cvar_t scr_screenshot_hwgamma = {CVAR_SAVE, "scr_screenshot_hwgamma","1", "apply the video gamma ramp to saved screenshots and videos"};
cvar_t scr_screenshot_alpha = {0, "scr_screenshot_alpha","0", "try to write an alpha channel to screenshots (debugging feature)"};
cvar_t scr_screenshot_timestamp = {CVAR_SAVE, "scr_screenshot_timestamp", "1", "use a timestamp based number of the type YYYYMMDDHHMMSSsss instead of sequential numbering"};
// scr_screenshot_name is defined in fs.c
cvar_t r_speeds_graph_y = {CVAR_SAVE, "r_speeds_graph_y", "0", "position of graph"};
cvar_t r_speeds_graph_width = {CVAR_SAVE, "r_speeds_graph_width", "256", "size of graph"};
cvar_t r_speeds_graph_height = {CVAR_SAVE, "r_speeds_graph_height", "128", "size of graph"};
+cvar_t r_speeds_graph_maxtimedelta = {CVAR_SAVE, "r_speeds_graph_maxtimedelta", "16667", "maximum timedelta to display in the graph (this value will be the top line)"};
+cvar_t r_speeds_graph_maxdefault = {CVAR_SAVE, "r_speeds_graph_maxdefault", "100", "if the minimum and maximum observed values are closer than this, use this value as the graph range (keeps small numbers from being big graphs)"};
-extern cvar_t v_glslgamma;
extern cvar_t sbar_info_pos;
extern cvar_t r_fog_clear;
-#define WANT_SCREENSHOT_HWGAMMA (scr_screenshot_hwgamma.integer && vid_usinghwgamma)
int jpeg_supported = false;
return;
pic = Draw_CachePic ("gfx/pause");
- DrawQ_Pic ((vid_conwidth.integer - pic->width)/2, (vid_conheight.integer - pic->height)/2, pic, 0, 0, 1, 1, 1, 1, 0);
+ DrawQ_Pic ((vid_conwidth.integer - Draw_GetPicWidth(pic))/2, (vid_conheight.integer - Draw_GetPicHeight(pic))/2, pic, 0, 0, 1, 1, 1, 1, 0);
}
/*
{
case 1: // bottom left
x = 0;
- y = vid_conheight.integer - pic->height;
+ y = vid_conheight.integer - Draw_GetPicHeight(pic);
break;
case 2: // bottom centre
- x = (vid_conwidth.integer - pic->width) / 2;
- y = vid_conheight.integer - pic->height;
+ x = (vid_conwidth.integer - Draw_GetPicWidth(pic)) / 2;
+ y = vid_conheight.integer - Draw_GetPicHeight(pic);
break;
case 3: // bottom right
- x = vid_conwidth.integer - pic->width;
- y = vid_conheight.integer - pic->height;
+ x = vid_conwidth.integer - Draw_GetPicWidth(pic);
+ y = vid_conheight.integer - Draw_GetPicHeight(pic);
break;
case 4: // centre right
- x = vid_conwidth.integer - pic->width;
- y = (vid_conheight.integer - pic->height) / 2;
+ x = vid_conwidth.integer - Draw_GetPicWidth(pic);
+ y = (vid_conheight.integer - Draw_GetPicHeight(pic)) / 2;
break;
case 5: // top right
- x = vid_conwidth.integer - pic->width;
+ x = vid_conwidth.integer - Draw_GetPicWidth(pic);
y = 0;
break;
case 6: // top centre
- x = (vid_conwidth.integer - pic->width) / 2;
+ x = (vid_conwidth.integer - Draw_GetPicWidth(pic)) / 2;
y = 0;
break;
case 7: // top left
break;
case 8: // centre left
x = 0;
- y = (vid_conheight.integer - pic->height) / 2;
+ y = (vid_conheight.integer - Draw_GetPicHeight(pic)) / 2;
break;
default:
return;
{
// lines of console to display
float conlines;
+#ifdef CONFIG_MENU
static int framecounter = 0;
+#endif
Con_CheckResize ();
framecounter++;
}
else
-#endif
framecounter = 0;
+#endif
if (scr_conforcewhiledisconnected.integer && key_dest == key_game && cls.signon != SIGNONS)
key_consoleactive |= KEY_CONSOLEACTIVE_FORCED;
t = (int) ((r_timereport_current - r_timereport_temp) * 1000000.0 + 0.5);
length = dpsnprintf(tempbuf, sizeof(tempbuf), "%8i %s", t, desc);
- length = min(length, (int)sizeof(tempbuf) - 1);
+ if (length < 0)
+ length = (int)sizeof(tempbuf) - 1;
if (r_speeds_longestitem < length)
r_speeds_longestitem = length;
for (;length < r_speeds_longestitem;length++)
extern float viewscalefpsadjusted;
static void R_TimeReport_EndFrame(void)
{
- int i, j, lines, y;
+ int j, lines;
cl_locnode_t *loc;
char string[1024+4096];
mleaf_t *viewleaf;
if (string[0])
{
+ int i, y;
if (string[strlen(string)-1] == '\n')
string[strlen(string)-1] = 0;
lines = 1;
if (r_speeds_graph.integer)
{
// if we currently have no graph data, reset the graph data entirely
+ int i;
if (!cls.r_speeds_graph_data)
for (i = 0;i < r_stat_count;i++)
- cls.r_speeds_graph_datamin[i] = cls.r_speeds_graph_datamax[i] = r_refdef.stats[i];
+ cls.r_speeds_graph_datamin[i] = cls.r_speeds_graph_datamax[i] = 0;
if (cls.r_speeds_graph_length != r_speeds_graph_length.integer)
{
- int i, stat, index, d, graph_length, *graph_data;
+ int stat, index, d, graph_length, *graph_data;
cls.r_speeds_graph_length = r_speeds_graph_length.integer;
cls.r_speeds_graph_current = 0;
if (cls.r_speeds_graph_data)
{
char legend[128];
r_vertexgeneric_t *v;
- int numlines;
+ int i, numlines;
const int *data;
float x, y, width, height, scalex, scaley;
+ int range_default = max(r_speeds_graph_maxdefault.integer, 1);
int color, stat, stats, index, range_min, range_max;
int graph_current, graph_length, *graph_data;
int statindex[R_SPEEDS_GRAPH_COLORS];
continue;
// prefer to graph stats with 0 base, but if they are
// negative we have no choice
- range_min = min(cls.r_speeds_graph_datamin[stat], 0);
- range_max = cls.r_speeds_graph_datamax[stat];
+ range_min = cls.r_speeds_graph_datamin[stat];
+ range_max = max(cls.r_speeds_graph_datamax[stat], range_min + range_default);
// some stats we specifically override the graph scale on
if (stat == r_stat_timedelta)
- range_max = 100000;
- if (range_max == range_min)
- range_max++;
+ range_max = r_speeds_graph_maxtimedelta.integer;
scaley = height / (range_max - range_min);
// generate lines (2 vertices each)
// to deal with incomplete data we walk right to left
Cvar_RegisterVariable (&scr_screenshot_jpeg_quality);
Cvar_RegisterVariable (&scr_screenshot_png);
Cvar_RegisterVariable (&scr_screenshot_gammaboost);
- Cvar_RegisterVariable (&scr_screenshot_hwgamma);
Cvar_RegisterVariable (&scr_screenshot_name_in_mapdir);
Cvar_RegisterVariable (&scr_screenshot_alpha);
Cvar_RegisterVariable (&scr_screenshot_timestamp);
Cvar_RegisterVariable(&r_speeds_graph_y);
Cvar_RegisterVariable(&r_speeds_graph_width);
Cvar_RegisterVariable(&r_speeds_graph_height);
+ Cvar_RegisterVariable(&r_speeds_graph_maxtimedelta);
+ Cvar_RegisterVariable(&r_speeds_graph_maxdefault);
// if we want no console, turn it off here too
if (COM_CheckParm ("-noconsole"))
Cr = R * .500 + G * -.419 + B * -.0813 + 128.;
*/
- if(WANT_SCREENSHOT_HWGAMMA)
- {
- VID_BuildGammaTables(&cls.capturevideo.vidramp[0], 256);
- }
- else
- {
- // identity gamma table
- BuildGammaTable16(1.0f, 1.0f, 1.0f, 0.0f, 1.0f, cls.capturevideo.vidramp, 256);
- BuildGammaTable16(1.0f, 1.0f, 1.0f, 0.0f, 1.0f, cls.capturevideo.vidramp + 256, 256);
- BuildGammaTable16(1.0f, 1.0f, 1.0f, 0.0f, 1.0f, cls.capturevideo.vidramp + 256*2, 256);
- }
+ // identity gamma table
+ BuildGammaTable16(1.0f, 1.0f, 1.0f, 0.0f, 1.0f, cls.capturevideo.vidramp, 256);
+ BuildGammaTable16(1.0f, 1.0f, 1.0f, 0.0f, 1.0f, cls.capturevideo.vidramp + 256, 256);
+ BuildGammaTable16(1.0f, 1.0f, 1.0f, 0.0f, 1.0f, cls.capturevideo.vidramp + 256*2, 256);
if(scr_screenshot_gammaboost.value != 1)
{
double igamma = 1 / scr_screenshot_gammaboost.value;
void SCR_CaptureVideo_SoundFrame(const portable_sampleframe_t *paintbuffer, size_t length)
{
- cls.capturevideo.soundsampleframe += length;
+ cls.capturevideo.soundsampleframe += (int)length;
cls.capturevideo.soundframe(paintbuffer, length);
}
buffer1 = (unsigned char *)Mem_Alloc(tempmempool, size * size * 4);
buffer2 = (unsigned char *)Mem_Alloc(tempmempool, size * size * 3);
+ CL_UpdateEntityShading();
for (j = 0;j < 12;j++)
{
dpsnprintf(filename, sizeof(filename), "env/%s%s.tga", basename, envmapinfo[j].name);
showlmp_t *oldshowlmps = cl.showlmps;
cl.max_showlmps += 16;
cl.showlmps = (showlmp_t *) 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)
+ {
+ if (cl.num_showlmps)
+ memcpy(cl.showlmps, oldshowlmps, cl.num_showlmps * sizeof(showlmp_t));
Mem_Free(oldshowlmps);
+ }
}
for (k = 0;k < cl.max_showlmps;k++)
if (cl.showlmps[k].isactive && !strcmp(cl.showlmps[k].label, lmplabel))
GL_ReadPixelsBGRA(x, y, width, height, buffer1);
- if(gammacorrect && (scr_screenshot_gammaboost.value != 1 || WANT_SCREENSHOT_HWGAMMA))
+ if(gammacorrect && (scr_screenshot_gammaboost.value != 1))
{
int i;
double igamma = 1.0 / scr_screenshot_gammaboost.value;
unsigned short vidramp[256 * 3];
- if(WANT_SCREENSHOT_HWGAMMA)
- {
- VID_BuildGammaTables(&vidramp[0], 256);
- }
- else
- {
- // identity gamma table
- BuildGammaTable16(1.0f, 1.0f, 1.0f, 0.0f, 1.0f, vidramp, 256);
- BuildGammaTable16(1.0f, 1.0f, 1.0f, 0.0f, 1.0f, vidramp + 256, 256);
- BuildGammaTable16(1.0f, 1.0f, 1.0f, 0.0f, 1.0f, vidramp + 256*2, 256);
- }
+ // identity gamma table
+ BuildGammaTable16(1.0f, 1.0f, 1.0f, 0.0f, 1.0f, vidramp, 256);
+ BuildGammaTable16(1.0f, 1.0f, 1.0f, 0.0f, 1.0f, vidramp + 256, 256);
+ BuildGammaTable16(1.0f, 1.0f, 1.0f, 0.0f, 1.0f, vidramp + 256*2, 256);
if(scr_screenshot_gammaboost.value != 1)
{
for (i = 0;i < 256 * 3;i++)
cachepic_t *pic;
for (i = 0, a = scr_touchscreenareas;i < scr_numtouchscreenareas;i++, a++)
{
- if (developer.integer && vid_touchscreen_outlinealpha.value > 0 && a->rect[0] >= 0 && a->rect[1] >= 0 && a->rect[2] >= 4 && a->rect[3] >= 4)
+ if (vid_touchscreen_outlinealpha.value > 0 && a->rect[0] >= 0 && a->rect[1] >= 0 && a->rect[2] >= 4 && a->rect[3] >= 4)
{
DrawQ_Fill(a->rect[0] + 2, a->rect[1] , a->rect[2] - 4, 1 , 1, 1, 1, vid_touchscreen_outlinealpha.value * (0.5f + 0.5f * a->active), 0);
DrawQ_Fill(a->rect[0] + 1, a->rect[1] + 1, a->rect[2] - 2, 1 , 1, 1, 1, vid_touchscreen_outlinealpha.value * (0.5f + 0.5f * a->active), 0);
DrawQ_Fill(a->rect[0] + 1, a->rect[1] + a->rect[3] - 2, a->rect[2] - 2, 1 , 1, 1, 1, vid_touchscreen_outlinealpha.value * (0.5f + 0.5f * a->active), 0);
DrawQ_Fill(a->rect[0] + 2, a->rect[1] + a->rect[3] - 1, a->rect[2] - 4, 1 , 1, 1, 1, vid_touchscreen_outlinealpha.value * (0.5f + 0.5f * a->active), 0);
}
- pic = a->pic ? Draw_CachePic(a->pic) : NULL;
- if (pic && pic->tex != r_texture_notexture)
- DrawQ_Pic(a->rect[0], a->rect[1], Draw_CachePic(a->pic), a->rect[2], a->rect[3], 1, 1, 1, vid_touchscreen_overlayalpha.value * (0.5f + 0.5f * a->active), 0);
+ pic = a->pic ? Draw_CachePic_Flags(a->pic, CACHEPICFLAG_FAILONMISSING) : NULL;
+ if (Draw_IsPicLoaded(pic))
+ DrawQ_Pic(a->rect[0], a->rect[1], pic, a->rect[2], a->rect[3], 1, 1, 1, vid_touchscreen_overlayalpha.value * (0.5f + 0.5f * a->active), 0);
if (a->text && a->text[0])
{
int textwidth = DrawQ_TextWidth(a->text, 0, a->textheight, a->textheight, false, FONT_CHAT);
r_refdef.view.ortho_x = atan(r_refdef.view.frustum_x) * (360.0 / M_PI); // abused as angle by VM_CL_R_SetView
r_refdef.view.ortho_y = atan(r_refdef.view.frustum_y) * (360.0 / M_PI); // abused as angle by VM_CL_R_SetView
- if(!CL_VM_UpdateView(r_stereo_side ? 0.0 : max(0.0, cl.time - cl.oldtime)))
+ // if CSQC is loaded, it is required to provide the CSQC_UpdateView function,
+ // and won't render a view if it does not call that.
+ if (cl.csqc_loaded)
+ CL_VM_UpdateView(r_stereo_side ? 0.0 : max(0.0, cl.time - cl.oldtime));
+ else
+ {
+ CL_UpdateEntityShading();
R_RenderView();
+ }
}
if (!r_stereo_sidebyside.integer && !r_stereo_horizontal.integer && !r_stereo_vertical.integer)
DrawQ_Finish();
- R_DrawGamma();
-
R_Mesh_Finish();
}
// draw the loading plaque
loadingscreenpic = Draw_CachePic_Flags (loadingscreenpic_number ? va(vabuf, sizeof(vabuf), "%s%d", scr_loadingscreen_picture.string, loadingscreenpic_number+1) : scr_loadingscreen_picture.string, loadingscreenpic_number ? CACHEPICFLAG_NOTPERSISTENT : 0);
- w = loadingscreenpic->width;
- h = loadingscreenpic->height;
+ w = Draw_GetPicWidth(loadingscreenpic);
+ h = Draw_GetPicHeight(loadingscreenpic);
// apply scale
w *= scr_loadingscreen_scale.value;
loadingscreen_lastupdate = t;
}
+ // set up the r_texture_gammaramps texture which we need for rendering the loadingscreenpic
+ VID_UpdateGamma();
+ R_UpdateVariables();
+
if(!scr_loadingscreen_background.integer)
clear = true;
loadingscreendone = false;
- if(gamemode == GAME_NEXUIZ || gamemode == GAME_XONOTIC)
+ if(IS_NEXUIZ_DERIVED(gamemode))
{
// play a bit with the palette (experimental)
palette_rgb_pantscolormap[15][0] = (unsigned char) (128 + 127 * sin(cl.time / exp(1.0f) + 0.0f*M_PI/3.0f));