X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=cl_screen.c;h=921378429df0de63dd2e48d2750379f90ae25dc0;hp=17ad5a7f2bf122bd45c5ee252d5452edec07bb3a;hb=9d6f77621de650ffaaecb65a3485d51378632925;hpb=446a6bb71c7ac5f1d7fe4dc1f6b41d0f01f4a91a diff --git a/cl_screen.c b/cl_screen.c index 17ad5a7f..92137842 100644 --- a/cl_screen.c +++ b/cl_screen.c @@ -38,7 +38,7 @@ cvar_t scr_showturtle = {CVAR_SAVE, "showturtle","0", "show turtle icon when fra cvar_t scr_showpause = {CVAR_SAVE, "showpause","1", "show pause icon when game is paused"}; cvar_t scr_showbrand = {0, "showbrand","0", "shows gfx/brand.tga in a corner of the screen (different values select different positions, including centered)"}; cvar_t scr_printspeed = {0, "scr_printspeed","0", "speed of intermission printing (episode end texts), a value of 0 disables the slow printing"}; -cvar_t scr_loadingscreen_background = {0, "scr_loadingscreen_background","0", "show the last visible background during loading screen (costs one screenful of video memory)"}; +cvar_t scr_loadingscreen_background = {0, "scr_loadingscreen_background","1", "show the last visible background during loading screen (costs one screenful of video memory)"}; cvar_t scr_loadingscreen_scale = {0, "scr_loadingscreen_scale","1", "scale factor of the background"}; cvar_t scr_loadingscreen_scale_base = {0, "scr_loadingscreen_scale_base","0", "0 = console pixels, 1 = video pixels"}; cvar_t scr_loadingscreen_scale_limit = {0, "scr_loadingscreen_scale_limit","0", "0 = no limit, 1 = until first edge hits screen edge, 2 = until last edge hits screen edge, 3 = until width hits screen width, 4 = until height hits screen height"}; @@ -56,7 +56,6 @@ cvar_t scr_screenshot_jpeg = {CVAR_SAVE, "scr_screenshot_jpeg","1", "save jpeg i 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 @@ -113,10 +112,8 @@ cvar_t r_speeds_graph_maxdefault = {CVAR_SAVE, "r_speeds_graph_maxdefault", "100 -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; @@ -255,14 +252,12 @@ static void SCR_CheckDrawCenterString (void) static void SCR_DrawNetGraph_DrawGraph (int graphx, int graphy, int graphwidth, int graphheight, float graphscale, int graphlimit, const char *label, float textsize, int packetcounter, netgraphitem_t *netgraph) { netgraphitem_t *graph; - int j, x, y, numlines; + int j, x, y; int totalbytes = 0; char bytesstring[128]; float g[NETGRAPH_PACKETS][7]; float *a; float *b; - r_vertexgeneric_t vertex[(NETGRAPH_PACKETS+2)*6*2]; - r_vertexgeneric_t *v; DrawQ_Fill(graphx, graphy, graphwidth, graphheight + textsize * 2, 0, 0, 0, 0.5, 0); // draw the bar graph itself memset(g, 0, sizeof(g)); @@ -302,38 +297,18 @@ static void SCR_DrawNetGraph_DrawGraph (int graphx, int graphy, int graphwidth, g[j][6] = bound(0.0f, g[j][6], 1.0f); } // render the lines for the graph - numlines = 0; - v = vertex; 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; - VectorSet(v->vertex3f, graphx + graphwidth * a[0], graphy + graphheight * a[2], 0.0f);Vector4Set(v->color4f, 1.0f, 1.0f, 0.0f, 1.0f);Vector2Set(v->texcoord2f, 0.0f, 0.0f);v++; - VectorSet(v->vertex3f, graphx + graphwidth * b[0], graphy + graphheight * b[2], 0.0f);Vector4Set(v->color4f, 1.0f, 1.0f, 0.0f, 1.0f);Vector2Set(v->texcoord2f, 0.0f, 0.0f);v++; - - VectorSet(v->vertex3f, graphx + graphwidth * a[0], graphy + graphheight * a[1], 0.0f);Vector4Set(v->color4f, 1.0f, 0.0f, 0.0f, 1.0f);Vector2Set(v->texcoord2f, 0.0f, 0.0f);v++; - VectorSet(v->vertex3f, graphx + graphwidth * b[0], graphy + graphheight * b[1], 0.0f);Vector4Set(v->color4f, 1.0f, 0.0f, 0.0f, 1.0f);Vector2Set(v->texcoord2f, 0.0f, 0.0f);v++; - - VectorSet(v->vertex3f, graphx + graphwidth * a[0], graphy + graphheight * a[5], 0.0f);Vector4Set(v->color4f, 0.0f, 1.0f, 0.0f, 1.0f);Vector2Set(v->texcoord2f, 0.0f, 0.0f);v++; - VectorSet(v->vertex3f, graphx + graphwidth * b[0], graphy + graphheight * b[5], 0.0f);Vector4Set(v->color4f, 0.0f, 1.0f, 0.0f, 1.0f);Vector2Set(v->texcoord2f, 0.0f, 0.0f);v++; - - VectorSet(v->vertex3f, graphx + graphwidth * a[0], graphy + graphheight * a[4], 0.0f);Vector4Set(v->color4f, 1.0f, 1.0f, 1.0f, 1.0f);Vector2Set(v->texcoord2f, 0.0f, 0.0f);v++; - VectorSet(v->vertex3f, graphx + graphwidth * b[0], graphy + graphheight * b[4], 0.0f);Vector4Set(v->color4f, 1.0f, 1.0f, 1.0f, 1.0f);Vector2Set(v->texcoord2f, 0.0f, 0.0f);v++; - - VectorSet(v->vertex3f, graphx + graphwidth * a[0], graphy + graphheight * a[3], 0.0f);Vector4Set(v->color4f, 1.0f, 0.5f, 0.0f, 1.0f);Vector2Set(v->texcoord2f, 0.0f, 0.0f);v++; - VectorSet(v->vertex3f, graphx + graphwidth * b[0], graphy + graphheight * b[3], 0.0f);Vector4Set(v->color4f, 1.0f, 0.5f, 0.0f, 1.0f);Vector2Set(v->texcoord2f, 0.0f, 0.0f);v++; - - VectorSet(v->vertex3f, graphx + graphwidth * a[0], graphy + graphheight * a[6], 0.0f);Vector4Set(v->color4f, 0.0f, 0.0f, 1.0f, 1.0f);Vector2Set(v->texcoord2f, 0.0f, 0.0f);v++; - VectorSet(v->vertex3f, graphx + graphwidth * b[0], graphy + graphheight * b[6], 0.0f);Vector4Set(v->color4f, 0.0f, 0.0f, 1.0f, 1.0f);Vector2Set(v->texcoord2f, 0.0f, 0.0f);v++; - - numlines += 6; - } - if (numlines > 0) - { - R_Mesh_PrepareVertices_Generic(numlines*2, vertex, NULL, 0); - DrawQ_Lines(0.0f, numlines, 0, false); + DrawQ_Line(1, graphx + graphwidth * a[0], graphy + graphheight * a[2], graphx + graphwidth * b[0], graphy + graphheight * b[2], 1.0f, 1.0f, 1.0f, 1.0f, 0); + DrawQ_Line(1, 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(1, 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(1, 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(1, 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); + DrawQ_Line(1, graphx + graphwidth * a[0], graphy + graphheight * a[6], graphx + graphwidth * b[0], graphy + graphheight * b[6], 0.0f, 0.0f, 1.0f, 1.0f, 0); } x = graphx; y = graphy + graphheight; @@ -460,7 +435,7 @@ static void SCR_DrawPause (void) 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); } /* @@ -482,26 +457,26 @@ static void SCR_DrawBrand (void) { 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 @@ -510,7 +485,7 @@ static void SCR_DrawBrand (void) 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; @@ -802,6 +777,8 @@ const char *r_stat_name[r_stat_count] = "bloom", "bloom_copypixels", "bloom_drawpixels", + "rendertargets_used", + "rendertargets_pixels", "indexbufferuploadcount", "indexbufferuploadsize", "vertexbufferuploadcount", @@ -954,7 +931,8 @@ void R_TimeReport(const char *desc) 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++) @@ -1000,7 +978,7 @@ extern cvar_t r_viewscale; 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; @@ -1028,6 +1006,7 @@ static void R_TimeReport_EndFrame(void) "bouncegrid:%4i lights%6i particles%6i traces%6i hits%6i splats%6i bounces\n" "photon cache efficiency:%6i cached%6i traced%6ianimated\n" "%6i draws%8i vertices%8i triangles bloompixels%8i copied%8i drawn\n" +"%3i rendertargets%8i pixels\n" "updated%5i indexbuffers%8i bytes%5i vertexbuffers%8i bytes\n" "animcache%5ib gpuskeletal%7i vertices (%7i with normals)\n" "fastbatch%5i count%5i surfaces%7i vertices %7i triangles\n" @@ -1044,6 +1023,7 @@ static void R_TimeReport_EndFrame(void) , r_refdef.stats[r_stat_bouncegrid_lights], r_refdef.stats[r_stat_bouncegrid_particles], r_refdef.stats[r_stat_bouncegrid_traces], r_refdef.stats[r_stat_bouncegrid_hits], r_refdef.stats[r_stat_bouncegrid_splats], r_refdef.stats[r_stat_bouncegrid_bounces] , r_refdef.stats[r_stat_photoncache_cached], r_refdef.stats[r_stat_photoncache_traced], r_refdef.stats[r_stat_photoncache_animated] , r_refdef.stats[r_stat_draws], r_refdef.stats[r_stat_draws_vertices], r_refdef.stats[r_stat_draws_elements] / 3, r_refdef.stats[r_stat_bloom_copypixels], r_refdef.stats[r_stat_bloom_drawpixels] +, r_refdef.stats[r_stat_rendertargets_used], r_refdef.stats[r_stat_rendertargets_pixels] , r_refdef.stats[r_stat_indexbufferuploadcount], r_refdef.stats[r_stat_indexbufferuploadsize], r_refdef.stats[r_stat_vertexbufferuploadcount], r_refdef.stats[r_stat_vertexbufferuploadsize] , r_refdef.stats[r_stat_animcache_skeletal_bones], r_refdef.stats[r_stat_animcache_shape_vertices], r_refdef.stats[r_stat_animcache_shade_vertices] , r_refdef.stats[r_stat_batch_fast_batches], r_refdef.stats[r_stat_batch_fast_surfaces], r_refdef.stats[r_stat_batch_fast_vertices], r_refdef.stats[r_stat_batch_fast_triangles] @@ -1064,6 +1044,7 @@ static void R_TimeReport_EndFrame(void) if (string[0]) { + int i, y; if (string[strlen(string)-1] == '\n') string[strlen(string)-1] = 0; lines = 1; @@ -1095,12 +1076,13 @@ static void R_TimeReport_EndFrame(void) 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] = 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) @@ -1134,8 +1116,7 @@ static void R_TimeReport_EndFrame(void) if (cls.r_speeds_graph_length) { char legend[128]; - r_vertexgeneric_t *v; - int numlines; + int i; const int *data; float x, y, width, height, scalex, scaley; int range_default = max(r_speeds_graph_maxdefault.integer, 1); @@ -1215,9 +1196,6 @@ static void R_TimeReport_EndFrame(void) // legend text is drawn after the graphs // render the graph lines, we'll go back and render the legend text later scalex = (float)width / (1000000.0 * r_speeds_graph_seconds.value); - // get space in a vertex buffer to draw this - numlines = stats * (graph_length - 1); - v = R_Mesh_PrepareVertices_Generic_Lock(numlines * 2); stats = 0; for (color = 0;color < R_SPEEDS_GRAPH_COLORS;color++) { @@ -1240,39 +1218,19 @@ static void R_TimeReport_EndFrame(void) sum = 0; for (i = 0;i < graph_length - 1;) { - v->vertex3f[0] = x + width - sum * scalex; - if (v->vertex3f[0] < x) - v->vertex3f[0] = x; - v->vertex3f[1] = y + height - (data[index] - range_min) * scaley; - v->vertex3f[2] = 0; - v->color4f[0] = r_speeds_graph_colors[color][0]; - v->color4f[1] = r_speeds_graph_colors[color][1]; - v->color4f[2] = r_speeds_graph_colors[color][2]; - v->color4f[3] = r_speeds_graph_colors[color][3]; - v->texcoord2f[0] = 0; - v->texcoord2f[1] = 0; - v++; + float x1, y1, x2, y2; + x1 = max(x, x + width - sum * scalex); + y1 = y + height - (data[index] - range_min) * scaley; sum += graph_data[r_stat_timedelta * graph_length + index]; index--; if (index < 0) index = graph_length - 1; i++; - v->vertex3f[0] = x + width - sum * scalex; - if (v->vertex3f[0] < x) - v->vertex3f[0] = x; - v->vertex3f[1] = y + height - (data[index] - range_min) * scaley; - v->vertex3f[2] = 0; - v->color4f[0] = r_speeds_graph_colors[color][0]; - v->color4f[1] = r_speeds_graph_colors[color][1]; - v->color4f[2] = r_speeds_graph_colors[color][2]; - v->color4f[3] = r_speeds_graph_colors[color][3]; - v->texcoord2f[0] = 0; - v->texcoord2f[1] = 0; - v++; + x2 = max(x, x + width - sum * scalex); + y2 = y + height - (data[index] - range_min) * scaley; + DrawQ_Line(1, x1, y1, x2, y2, r_speeds_graph_colors[color][0], r_speeds_graph_colors[color][1], r_speeds_graph_colors[color][2], r_speeds_graph_colors[color][3], 0); } } - R_Mesh_PrepareVertices_Generic_Unlock(); - DrawQ_Lines(0.0f, numlines, 0, false); } // return to not drawing anything if r_render is 0 @@ -1361,7 +1319,6 @@ void CL_Screen_Init(void) 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); @@ -1608,17 +1565,10 @@ Cb = R * -.169 + G * -.332 + B * .500 + 128.; 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; @@ -1776,7 +1726,7 @@ static void SCR_CaptureVideo_VideoFrame(int newframestepframenum) 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); } @@ -1861,6 +1811,7 @@ static void R_Envmap_f (void) char filename[MAX_QPATH], basename[MAX_QPATH]; unsigned char *buffer1; unsigned char *buffer2; + r_rendertarget_t *rt; if (Cmd_Argc() != 3) { @@ -1893,6 +1844,7 @@ static void R_Envmap_f (void) r_refdef.view.depth = 1; r_refdef.view.useperspective = true; r_refdef.view.isoverlay = false; + r_refdef.view.ismain = true; r_refdef.view.frustum_x = 1; // tan(45 * M_PI / 180.0); r_refdef.view.frustum_y = 1; // tan(45 * M_PI / 180.0); @@ -1902,6 +1854,9 @@ static void R_Envmap_f (void) buffer1 = (unsigned char *)Mem_Alloc(tempmempool, size * size * 4); buffer2 = (unsigned char *)Mem_Alloc(tempmempool, size * size * 3); + // TODO: use TEXTYPE_COLORBUFFER16F and output to .exr files as well? + rt = R_RenderTarget_Get(size, size, TEXTYPE_DEPTHBUFFER24STENCIL8, true, TEXTYPE_COLORBUFFER, TEXTYPE_UNUSED, TEXTYPE_UNUSED, TEXTYPE_UNUSED); + CL_UpdateEntityShading(); for (j = 0;j < 12;j++) { dpsnprintf(filename, sizeof(filename), "env/%s%s.tga", basename, envmapinfo[j].name); @@ -1909,7 +1864,7 @@ static void R_Envmap_f (void) r_refdef.view.quality = 1; r_refdef.view.clear = true; R_Mesh_Start(); - R_RenderView(); + R_RenderView(rt->fbo, rt->depthtexture, rt->colortexture[0], 0, 0, size, size); R_Mesh_Finish(); SCR_ScreenShot(filename, buffer1, buffer2, 0, vid.height - (r_refdef.view.y + r_refdef.view.height), size, size, envmapinfo[j].flipx, envmapinfo[j].flipy, envmapinfo[j].flipdiagonaly, false, false, false, false); } @@ -1957,10 +1912,12 @@ void SHOWLMP_decodeshow(void) 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)) @@ -2002,22 +1959,15 @@ qboolean SCR_ScreenShot(char *filename, unsigned char *buffer1, unsigned char *b 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++) @@ -2073,7 +2023,7 @@ static void SCR_DrawTouchscreenOverlay(void) 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); @@ -2082,9 +2032,9 @@ static void SCR_DrawTouchscreenOverlay(void) 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); @@ -2116,6 +2066,8 @@ void R_ClearScreen(qboolean fogcolor) } int r_stereo_side; +extern cvar_t v_isometric; +extern cvar_t v_isometric_verticalfov; static void SCR_DrawScreen (void) { @@ -2125,6 +2077,10 @@ static void SCR_DrawScreen (void) R_UpdateVariables(); + // this will be set back to 0 by R_RenderView during CL_VM_UpdateView + r_refdef.draw2dstage = 1; + R_ResetViewRendering2D_Common(0, NULL, NULL, 0, 0, vid.width, vid.height, vid_conwidth.integer, vid_conheight.integer); + // Quake uses clockwise winding, so these are swapped r_refdef.view.cullface_front = GL_BACK; r_refdef.view.cullface_back = GL_FRONT; @@ -2179,23 +2135,44 @@ static void SCR_DrawScreen (void) r_refdef.view.z = 0; } - // LordHavoc: viewzoom (zoom in for sniper rifles, etc) - // LordHavoc: this is designed to produce widescreen fov values - // when the screen is wider than 4/3 width/height aspect, to do - // this it simply assumes the requested fov is the vertical fov - // for a 4x3 display, if the ratio is not 4x3 this makes the fov - // higher/lower according to the ratio - r_refdef.view.useperspective = true; - r_refdef.view.frustum_y = tan(scr_fov.value * M_PI / 360.0) * (3.0/4.0) * cl.viewzoom; - r_refdef.view.frustum_x = r_refdef.view.frustum_y * (float)r_refdef.view.width / (float)r_refdef.view.height / vid_pixelheight.value; - - r_refdef.view.frustum_x *= r_refdef.frustumscale_x; - r_refdef.view.frustum_y *= r_refdef.frustumscale_y; - 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 (v_isometric.integer) + { + r_refdef.view.useperspective = false; + r_refdef.view.frustum_y = v_isometric_verticalfov.value * cl.viewzoom; + r_refdef.view.frustum_x = r_refdef.view.frustum_y * (float)r_refdef.view.width / (float)r_refdef.view.height / vid_pixelheight.value; + r_refdef.view.frustum_x *= r_refdef.frustumscale_x; + r_refdef.view.frustum_y *= r_refdef.frustumscale_y; + r_refdef.view.ortho_x = r_refdef.view.frustum_x; // used by VM_CL_R_SetView + r_refdef.view.ortho_y = r_refdef.view.frustum_y; // used by VM_CL_R_SetView + } + else + { + // LordHavoc: viewzoom (zoom in for sniper rifles, etc) + // LordHavoc: this is designed to produce widescreen fov values + // when the screen is wider than 4/3 width/height aspect, to do + // this it simply assumes the requested fov is the vertical fov + // for a 4x3 display, if the ratio is not 4x3 this makes the fov + // higher/lower according to the ratio + r_refdef.view.useperspective = true; + r_refdef.view.frustum_y = tan(scr_fov.value * M_PI / 360.0) * (3.0 / 4.0) * cl.viewzoom; + r_refdef.view.frustum_x = r_refdef.view.frustum_y * (float)r_refdef.view.width / (float)r_refdef.view.height / vid_pixelheight.value; + + r_refdef.view.frustum_x *= r_refdef.frustumscale_x; + r_refdef.view.frustum_y *= r_refdef.frustumscale_y; + 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 + } + r_refdef.view.ismain = true; - if(!CL_VM_UpdateView(r_stereo_side ? 0.0 : max(0.0, cl.time - cl.oldtime))) - R_RenderView(); + // 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(0, NULL, NULL, r_refdef.view.x, r_refdef.view.y, r_refdef.view.width, r_refdef.view.height); + } } if (!r_stereo_sidebyside.integer && !r_stereo_horizontal.integer && !r_stereo_vertical.integer) @@ -2280,9 +2257,8 @@ static void SCR_DrawScreen (void) DrawQ_Finish(); - R_DrawGamma(); - R_Mesh_Finish(); + R_RenderTarget_FreeUnused(false); } typedef struct loadingscreenstack_s @@ -2506,8 +2482,8 @@ static void SCR_DrawLoadingScreen_SharedSetup (qboolean clear) // 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; @@ -2570,7 +2546,7 @@ static void SCR_DrawLoadingScreen (qboolean clear) if(loadingscreentexture) { R_Mesh_PrepareVertices_Generic_Arrays(4, loadingscreentexture_vertex3f, NULL, loadingscreentexture_texcoord2f); - R_SetupShader_Generic(loadingscreentexture, NULL, GL_MODULATE, 1, true, true, true); + R_SetupShader_Generic(loadingscreentexture, NULL, GL_MODULATE, 1, false, true, true); R_Mesh_Draw(0, 4, 0, 2, polygonelement3i, NULL, 0, polygonelement3s, NULL, 0); } R_Mesh_PrepareVertices_Generic_Arrays(4, loadingscreenpic_vertex3f, NULL, loadingscreenpic_texcoord2f); @@ -2606,6 +2582,10 @@ void SCR_UpdateLoadingScreen (qboolean clear, qboolean startup) 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;