]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_screen.c
Assume that GL_EXT_blend_subtract is supported.
[xonotic/darkplaces.git] / cl_screen.c
index 858673f19f1b6ff01fc3df86ad4c125727b5f68b..36eccda64f572647d72b226c2a161164a218695d 100644 (file)
@@ -777,6 +777,8 @@ const char *r_stat_name[r_stat_count] =
        "bloom",
        "bloom_copypixels",
        "bloom_drawpixels",
+       "rendertargets_used",
+       "rendertargets_pixels",
        "indexbufferuploadcount",
        "indexbufferuploadsize",
        "vertexbufferuploadcount",
@@ -791,9 +793,6 @@ const char *r_stat_name[r_stat_count] =
        "bufferdatasize_index16",
        "bufferdatasize_index32",
        "bufferdatasize_uniform",
-       "animcache_vertexmesh_count",
-       "animcache_vertexmesh_vertices",
-       "animcache_vertexmesh_maxvertices",
        "animcache_skeletal_count",
        "animcache_skeletal_bones",
        "animcache_skeletal_maxbones",
@@ -872,10 +871,6 @@ const char *r_stat_name[r_stat_count] =
        "dynamic_surfaces_because_tcmod_turbulent",
        "dynamic_vertices_because_tcmod_turbulent",
        "dynamic_triangles_because_tcmod_turbulent",
-       "dynamic_batches_because_interleavedarrays",
-       "dynamic_surfaces_because_interleavedarrays",
-       "dynamic_vertices_because_interleavedarrays",
-       "dynamic_triangles_because_interleavedarrays",
        "dynamic_batches_because_nogaps",
        "dynamic_surfaces_because_nogaps",
        "dynamic_vertices_because_nogaps",
@@ -1004,6 +999,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"
@@ -1020,6 +1016,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]
@@ -1807,6 +1804,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)
        {
@@ -1839,6 +1837,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);
@@ -1848,6 +1847,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++)
        {
@@ -1856,7 +1857,7 @@ static void R_Envmap_f (void)
                r_refdef.view.quality = 1;
                r_refdef.view.clear = true;
                R_Mesh_Start();
-               R_RenderView(0, NULL, NULL, r_refdef.view.x, r_refdef.view.y, r_refdef.view.width, r_refdef.view.height);
+               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);
        }
@@ -2050,14 +2051,13 @@ void R_ClearScreen(qboolean fogcolor)
                VectorCopy(r_refdef.fogcolor, clearcolor);
        }
        // clear depth is 1.0
-       // LordHavoc: we use a stencil centered around 128 instead of 0,
-       // to avoid clamping interfering with strange shadow volume
-       // drawing orders
        // clear the screen
-       GL_Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | (vid.stencil ? GL_STENCIL_BUFFER_BIT : 0), clearcolor, 1.0f, 128);
+       GL_Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | (vid.stencil ? GL_STENCIL_BUFFER_BIT : 0), clearcolor, 1.0f, 0);
 }
 
 int r_stereo_side;
+extern cvar_t v_isometric;
+extern cvar_t v_isometric_verticalfov;
 
 static void SCR_DrawScreen (void)
 {
@@ -2067,6 +2067,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;
@@ -2128,7 +2132,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;
@@ -2136,6 +2140,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)
@@ -2230,6 +2236,7 @@ static void SCR_DrawScreen (void)
        DrawQ_Finish();
 
        R_Mesh_Finish();
+       R_RenderTarget_FreeUnused(false);
 }
 
 typedef struct loadingscreenstack_s
@@ -2266,17 +2273,8 @@ static void SCR_SetLoadingScreenTexture(void)
 
        SCR_ClearLoadingScreenTexture();
 
-       if (vid.support.arb_texture_non_power_of_two)
-       {
-               w = vid.width; h = vid.height;
-               loadingscreentexture_w = loadingscreentexture_h = 1;
-       }
-       else
-       {
-               w = CeilPowerOf2(vid.width); h = CeilPowerOf2(vid.height);
-               loadingscreentexture_w = vid.width / (float) w;
-               loadingscreentexture_h = vid.height / (float) h;
-       }
+       w = vid.width; h = vid.height;
+       loadingscreentexture_w = loadingscreentexture_h = 1;
 
        loadingscreentexture = R_LoadTexture2D(r_main_texturepool, "loadingscreentexture", w, h, NULL, TEXTYPE_COLORBUFFER, TEXF_RENDERTARGET | TEXF_FORCENEAREST | TEXF_CLAMP, -1, NULL);
        R_Mesh_CopyToTexture(loadingscreentexture, 0, 0, 0, 0, vid.width, vid.height);
@@ -2517,11 +2515,11 @@ 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, false, true, true);
+               R_SetupShader_Generic(loadingscreentexture, 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);
-       R_SetupShader_Generic(Draw_GetPicTexture(loadingscreenpic), NULL, GL_MODULATE, 1, true, true, false);
+       R_SetupShader_Generic(Draw_GetPicTexture(loadingscreenpic), true, true, false);
        R_Mesh_Draw(0, 4, 0, 2, polygonelement3i, NULL, 0, polygonelement3s, NULL, 0);
        SCR_DrawLoadingStack();
 }
@@ -2794,15 +2792,6 @@ void CL_UpdateScreen(void)
        {
                CHECKGLERROR
                qglDrawBuffer(GL_BACK);CHECKGLERROR
-               // set dithering mode
-               if (gl_dither.integer)
-               {
-                       qglEnable(GL_DITHER);CHECKGLERROR
-               }
-               else
-               {
-                       qglDisable(GL_DITHER);CHECKGLERROR
-               }
        }
 #endif
 
@@ -2820,34 +2809,11 @@ void CL_UpdateScreen(void)
        // calculate r_refdef.view.quality
        r_refdef.view.quality = cl_updatescreen_quality;
 
-#ifndef USE_GLES2
-       if (qglPolygonStipple)
+       if(scr_stipple.integer)
        {
-               if(scr_stipple.integer)
-               {
-                       GLubyte stipple[128];
-                       int i, s, width, parts;
-                       static int frame = 0;
-                       ++frame;
-       
-                       s = scr_stipple.integer;
-                       parts = (s & 007);
-                       width = (s & 070) >> 3;
-       
-                       qglEnable(GL_POLYGON_STIPPLE);CHECKGLERROR // 0x0B42
-                       for(i = 0; i < 128; ++i)
-                       {
-                               int line = i/4;
-                               stipple[i] = (((line >> width) + frame) & ((1 << parts) - 1)) ? 0x00 : 0xFF;
-                       }
-                       qglPolygonStipple(stipple);CHECKGLERROR
-               }
-               else
-               {
-                       qglDisable(GL_POLYGON_STIPPLE);CHECKGLERROR
-               }
+               Con_Print("FIXME: scr_stipple not implemented\n");
+               Cvar_SetValueQuick(&scr_stipple, 0);
        }
-#endif
 
 #ifndef USE_GLES2
        if (R_Stereo_Active())