X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=cl_screen.c;h=71a74c08d1d0db1c1d1df7e41e5f5295cf48e1d2;hb=90a141660eecdb9cfe07bebeb7b07ac4f1ee448f;hp=abde7491d46ee60e730a7c891418a01be47be255;hpb=477b95bb0bd3ee638ceefd2fc3251a43ff4212d0;p=xonotic%2Fdarkplaces.git diff --git a/cl_screen.c b/cl_screen.c index abde7491..71a74c08 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"}; @@ -252,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)); @@ -299,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; @@ -457,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); } /* @@ -479,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 @@ -507,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; @@ -799,6 +777,8 @@ const char *r_stat_name[r_stat_count] = "bloom", "bloom_copypixels", "bloom_drawpixels", + "rendertargets_used", + "rendertargets_pixels", "indexbufferuploadcount", "indexbufferuploadsize", "vertexbufferuploadcount", @@ -1026,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" @@ -1042,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] @@ -1134,8 +1116,7 @@ static void R_TimeReport_EndFrame(void) if (cls.r_speeds_graph_length) { char legend[128]; - r_vertexgeneric_t *v; - int i, 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 @@ -1853,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) { @@ -1885,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); @@ -1894,6 +1854,8 @@ 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++) { @@ -1902,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); } @@ -2070,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); @@ -2104,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) { @@ -2113,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; @@ -2174,7 +2142,7 @@ static void SCR_DrawScreen (void) // 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_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; @@ -2182,6 +2150,8 @@ static void SCR_DrawScreen (void) 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 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) @@ -2189,7 +2159,7 @@ static void SCR_DrawScreen (void) else { CL_UpdateEntityShading(); - R_RenderView(); + R_RenderView(0, NULL, NULL, r_refdef.view.x, r_refdef.view.y, r_refdef.view.width, r_refdef.view.height); } } @@ -2276,6 +2246,7 @@ static void SCR_DrawScreen (void) DrawQ_Finish(); R_Mesh_Finish(); + R_RenderTarget_FreeUnused(false); } typedef struct loadingscreenstack_s @@ -2499,8 +2470,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; @@ -2563,7 +2534,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);