From c09e10b6153bf23fd0cf62a89c64e6f655fddc6d Mon Sep 17 00:00:00 2001 From: havoc Date: Sat, 26 Sep 2009 18:40:01 +0000 Subject: [PATCH] fix several bugs with viewport code (r_shadows works again, r_water works again) fixed a bug where r_hdr might cause multiple reallocations of textures every frame in r_water code git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9245 d7cf8633-e32d-0410-b094-e92efae38249 --- gl_draw.c | 2 +- gl_rmain.c | 90 +++++++++++++++++++++++++++++---------------------- r_shadow.c | 94 ++++++++++++++++++++++-------------------------------- 3 files changed, 91 insertions(+), 95 deletions(-) diff --git a/gl_draw.c b/gl_draw.c index bea00075..3fb3bf08 100644 --- a/gl_draw.c +++ b/gl_draw.c @@ -785,7 +785,7 @@ void _DrawQ_Setup(void) return; r_refdef.draw2dstage = true; CHECKGLERROR - R_Viewport_InitOrtho(&viewport, &identitymatrix, r_refdef.view.x, r_refdef.view.y, r_refdef.view.width, r_refdef.view.height, 0, 0, vid_conwidth.integer, vid_conheight.integer, -10, 100, NULL); + R_Viewport_InitOrtho(&viewport, &identitymatrix, r_refdef.view.x, vid.height - r_refdef.view.y - r_refdef.view.height, r_refdef.view.width, r_refdef.view.height, 0, 0, vid_conwidth.integer, vid_conheight.integer, -10, 100, NULL); R_SetViewport(&viewport); GL_ColorMask(r_refdef.view.colormask[0], r_refdef.view.colormask[1], r_refdef.view.colormask[2], 1); qglDepthFunc(GL_LEQUAL);CHECKGLERROR diff --git a/gl_rmain.c b/gl_rmain.c index d4d7ecb2..f98be95a 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -165,6 +165,8 @@ static struct r_bloomstate_s float screentexcoord2f[8]; float bloomtexcoord2f[8]; float offsettexcoord2f[8]; + + r_viewport_t viewport; } r_bloomstate; @@ -193,7 +195,7 @@ char r_qwskincache[MAX_SCOREBOARD][MAX_QPATH]; skinframe_t *r_qwskincache_skinframe[MAX_SCOREBOARD]; /// vertex coordinates for a quad that covers the screen exactly -const static float r_screenvertex3f[12] = +const float r_screenvertex3f[12] = { 0, 0, 0, 1, 0, 0, @@ -3485,11 +3487,11 @@ void R_SetupView(qboolean allowwaterclippingplane) } if (!r_refdef.view.useperspective) - R_Viewport_InitOrtho(&r_refdef.view.viewport, &r_refdef.view.matrix, r_refdef.view.x, r_refdef.view.y, r_refdef.view.width, r_refdef.view.height, -r_refdef.view.ortho_x, -r_refdef.view.ortho_y, r_refdef.view.ortho_x, r_refdef.view.ortho_y, -r_refdef.farclip, r_refdef.farclip, customclipplane); + R_Viewport_InitOrtho(&r_refdef.view.viewport, &r_refdef.view.matrix, r_refdef.view.x, vid.height - r_refdef.view.height - r_refdef.view.y, r_refdef.view.width, r_refdef.view.height, -r_refdef.view.ortho_x, -r_refdef.view.ortho_y, r_refdef.view.ortho_x, r_refdef.view.ortho_y, -r_refdef.farclip, r_refdef.farclip, customclipplane); else if (gl_stencil && r_useinfinitefarclip.integer) - R_Viewport_InitPerspectiveInfinite(&r_refdef.view.viewport, &r_refdef.view.matrix, r_refdef.view.x, r_refdef.view.y, r_refdef.view.width, r_refdef.view.height, r_refdef.view.frustum_x, r_refdef.view.frustum_y, r_refdef.nearclip, customclipplane); + R_Viewport_InitPerspectiveInfinite(&r_refdef.view.viewport, &r_refdef.view.matrix, r_refdef.view.x, vid.height - r_refdef.view.height - r_refdef.view.y, r_refdef.view.width, r_refdef.view.height, r_refdef.view.frustum_x, r_refdef.view.frustum_y, r_refdef.nearclip, customclipplane); else - R_Viewport_InitPerspective(&r_refdef.view.viewport, &r_refdef.view.matrix, r_refdef.view.x, r_refdef.view.y, r_refdef.view.width, r_refdef.view.height, r_refdef.view.frustum_x, r_refdef.view.frustum_y, r_refdef.nearclip, r_refdef.farclip, customclipplane); + R_Viewport_InitPerspective(&r_refdef.view.viewport, &r_refdef.view.matrix, r_refdef.view.x, vid.height - r_refdef.view.height - r_refdef.view.y, r_refdef.view.width, r_refdef.view.height, r_refdef.view.frustum_x, r_refdef.view.frustum_y, r_refdef.nearclip, r_refdef.farclip, customclipplane); R_SetViewport(&r_refdef.view.viewport); } @@ -3499,9 +3501,9 @@ void R_ResetViewRendering2D(void) DrawQ_Finish(); // GL is weird because it's bottom to top, r_refdef.view.y is top to bottom - R_Viewport_InitOrtho(&viewport, &identitymatrix, r_refdef.view.x, r_refdef.view.y, r_refdef.view.width, r_refdef.view.height, 0, 0, 1, 1, -10, 100, NULL); + R_Viewport_InitOrtho(&viewport, &identitymatrix, r_refdef.view.x, vid.height - r_refdef.view.height - r_refdef.view.y, r_refdef.view.width, r_refdef.view.height, 0, 0, 1, 1, -10, 100, NULL); R_SetViewport(&viewport); - GL_Scissor(r_refdef.view.x, vid.height - r_refdef.view.y - r_refdef.view.height, r_refdef.view.width, r_refdef.view.height); + GL_Scissor(viewport.x, viewport.y, viewport.width, viewport.height); GL_Color(1, 1, 1, 1); GL_ColorMask(r_refdef.view.colormask[0], r_refdef.view.colormask[1], r_refdef.view.colormask[2], 1); GL_BlendFunc(GL_ONE, GL_ZERO); @@ -3527,10 +3529,8 @@ void R_ResetViewRendering3D(void) { DrawQ_Finish(); - // GL is weird because it's bottom to top, r_refdef.view.y is top to bottom - qglViewport(r_refdef.view.x, vid.height - (r_refdef.view.y + r_refdef.view.height), r_refdef.view.width, r_refdef.view.height);CHECKGLERROR R_SetupView(true); - GL_Scissor(r_refdef.view.x, vid.height - r_refdef.view.y - r_refdef.view.height, r_refdef.view.width, r_refdef.view.height); + GL_Scissor(r_refdef.view.viewport.x, r_refdef.view.viewport.y, r_refdef.view.viewport.width, r_refdef.view.viewport.height); GL_Color(1, 1, 1, 1); GL_ColorMask(r_refdef.view.colormask[0], r_refdef.view.colormask[1], r_refdef.view.colormask[2], 1); GL_BlendFunc(GL_ONE, GL_ZERO); @@ -3563,8 +3563,8 @@ static void R_Water_StartFrame(void) // set waterwidth and waterheight to the water resolution that will be // used (often less than the screen resolution for faster rendering) - waterwidth = (int)bound(1, r_refdef.view.width * r_water_resolutionmultiplier.value, r_refdef.view.width); - waterheight = (int)bound(1, r_refdef.view.height * r_water_resolutionmultiplier.value, r_refdef.view.height); + waterwidth = (int)bound(1, vid.width * r_water_resolutionmultiplier.value, vid.width); + waterheight = (int)bound(1, vid.height * r_water_resolutionmultiplier.value, vid.height); // calculate desired texture sizes // can't use water if the card does not support the texture size @@ -3601,6 +3601,10 @@ static void R_Water_StartFrame(void) r_waterstate.textureheight = textureheight; } + // when doing a reduced render (HDR) we want to use a smaller area + waterwidth = (int)bound(1, r_refdef.view.width * r_water_resolutionmultiplier.value, r_refdef.view.width); + waterheight = (int)bound(1, r_refdef.view.height * r_water_resolutionmultiplier.value, r_refdef.view.height); + if (r_waterstate.waterwidth) { r_waterstate.enabled = true; @@ -3740,7 +3744,7 @@ static void R_Water_ProcessPlanes(void) R_Mesh_TexBind(0, R_GetTexture(p->texture_refraction)); GL_ActiveTexture(0); CHECKGLERROR - qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_refdef.view.x, vid.height - (r_refdef.view.y + r_refdef.view.height), r_refdef.view.width, r_refdef.view.height);CHECKGLERROR + qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_refdef.view.viewport.x, r_refdef.view.viewport.y, r_refdef.view.viewport.width, r_refdef.view.viewport.height);CHECKGLERROR } if (p->materialflags & (MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFLECTION)) @@ -3771,7 +3775,7 @@ static void R_Water_ProcessPlanes(void) R_Mesh_TexBind(0, R_GetTexture(p->texture_reflection)); GL_ActiveTexture(0); CHECKGLERROR - qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_refdef.view.x, vid.height - (r_refdef.view.y + r_refdef.view.height), r_refdef.view.width, r_refdef.view.height);CHECKGLERROR + qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_refdef.view.viewport.x, r_refdef.view.viewport.y, r_refdef.view.viewport.width, r_refdef.view.viewport.height);CHECKGLERROR } } r_waterstate.renderingscene = false; @@ -3794,11 +3798,11 @@ void R_Bloom_StartFrame(void) // set bloomwidth and bloomheight to the bloom resolution that will be // used (often less than the screen resolution for faster rendering) - r_bloomstate.bloomwidth = bound(1, r_bloom_resolution.integer, r_refdef.view.width); - r_bloomstate.bloomheight = r_bloomstate.bloomwidth * r_refdef.view.height / r_refdef.view.width; - r_bloomstate.bloomheight = bound(1, r_bloomstate.bloomheight, r_refdef.view.height); - r_bloomstate.bloomwidth = min(r_bloomstate.bloomwidth, gl_max_texture_size); - r_bloomstate.bloomheight = min(r_bloomstate.bloomheight, gl_max_texture_size); + r_bloomstate.bloomwidth = bound(1, r_bloom_resolution.integer, vid.height); + r_bloomstate.bloomheight = r_bloomstate.bloomwidth * vid.height / vid.width; + r_bloomstate.bloomheight = bound(1, r_bloomstate.bloomheight, vid.height); + r_bloomstate.bloomwidth = bound(1, r_bloomstate.bloomwidth, gl_max_texture_size); + r_bloomstate.bloomheight = bound(1, r_bloomstate.bloomheight, gl_max_texture_size); // calculate desired texture sizes if (gl_support_arb_texture_non_power_of_two) @@ -3851,6 +3855,13 @@ void R_Bloom_StartFrame(void) r_bloomstate.texture_bloom = R_LoadTexture2D(r_main_texturepool, "bloom", r_bloomstate.bloomtexturewidth, r_bloomstate.bloomtextureheight, NULL, TEXTYPE_BGRA, TEXF_FORCELINEAR | TEXF_CLAMP | TEXF_ALWAYSPRECACHE, NULL); } + // when doing a reduced render (HDR) we want to use a smaller area + r_bloomstate.bloomwidth = bound(1, r_bloom_resolution.integer, r_refdef.view.height); + r_bloomstate.bloomheight = r_bloomstate.bloomwidth * r_refdef.view.height / r_refdef.view.width; + r_bloomstate.bloomheight = bound(1, r_bloomstate.bloomheight, r_refdef.view.height); + r_bloomstate.bloomwidth = bound(1, r_bloomstate.bloomwidth, r_bloomstate.bloomtexturewidth); + r_bloomstate.bloomheight = bound(1, r_bloomstate.bloomheight, r_bloomstate.bloomtextureheight); + // set up a texcoord array for the full resolution screen image // (we have to keep this around to copy back during final render) r_bloomstate.screentexcoord2f[0] = 0; @@ -3878,6 +3889,8 @@ void R_Bloom_StartFrame(void) r_bloomstate.enabled = true; r_bloomstate.hdr = r_hdr.integer != 0; } + + R_Viewport_InitOrtho(&r_bloomstate.viewport, &identitymatrix, r_refdef.view.x, vid.height - r_bloomstate.bloomheight - r_refdef.view.y, r_bloomstate.bloomwidth, r_bloomstate.bloomheight, 0, 0, 1, 1, -10, 100, NULL); } void R_Bloom_CopyBloomTexture(float colorscale) @@ -3886,7 +3899,7 @@ void R_Bloom_CopyBloomTexture(float colorscale) // scale down screen texture to the bloom texture size CHECKGLERROR - qglViewport(r_refdef.view.x, vid.height - (r_refdef.view.y + r_bloomstate.bloomheight), r_bloomstate.bloomwidth, r_bloomstate.bloomheight);CHECKGLERROR + R_SetViewport(&r_bloomstate.viewport); GL_BlendFunc(GL_ONE, GL_ZERO); GL_Color(colorscale, colorscale, colorscale, 1); // TODO: optimize with multitexture or GLSL @@ -3901,8 +3914,8 @@ void R_Bloom_CopyBloomTexture(float colorscale) R_Mesh_TexBind(0, R_GetTexture(r_bloomstate.texture_bloom)); GL_ActiveTexture(0); CHECKGLERROR - qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_refdef.view.x, vid.height - (r_refdef.view.y + r_bloomstate.bloomheight), r_bloomstate.bloomwidth, r_bloomstate.bloomheight);CHECKGLERROR - r_refdef.stats.bloom_copypixels += r_bloomstate.bloomwidth * r_bloomstate.bloomheight; + qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_bloomstate.viewport.x, r_bloomstate.viewport.y, r_bloomstate.viewport.width, r_bloomstate.viewport.height);CHECKGLERROR + r_refdef.stats.bloom_copypixels += r_bloomstate.viewport.width * r_bloomstate.viewport.height; } void R_Bloom_CopyHDRTexture(void) @@ -3910,8 +3923,8 @@ void R_Bloom_CopyHDRTexture(void) R_Mesh_TexBind(0, R_GetTexture(r_bloomstate.texture_bloom)); GL_ActiveTexture(0); CHECKGLERROR - qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_refdef.view.x, vid.height - (r_refdef.view.y + r_refdef.view.height), r_refdef.view.width, r_refdef.view.height);CHECKGLERROR - r_refdef.stats.bloom_copypixels += r_refdef.view.width * r_refdef.view.height; + qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_refdef.view.viewport.x, r_refdef.view.viewport.y, r_refdef.view.viewport.width, r_refdef.view.viewport.height);CHECKGLERROR + r_refdef.stats.bloom_copypixels += r_refdef.view.viewport.width * r_refdef.view.viewport.height; } void R_Bloom_MakeTexture(void) @@ -3928,7 +3941,7 @@ void R_Bloom_MakeTexture(void) // we have a bloom image in the framebuffer CHECKGLERROR - qglViewport(r_refdef.view.x, vid.height - (r_refdef.view.y + r_bloomstate.bloomheight), r_bloomstate.bloomwidth, r_bloomstate.bloomheight);CHECKGLERROR + R_SetViewport(&r_bloomstate.viewport); for (x = 1;x < min(r_bloom_colorexponent.value, 32);) { @@ -3944,8 +3957,8 @@ void R_Bloom_MakeTexture(void) // copy the vertically blurred bloom view to a texture GL_ActiveTexture(0); CHECKGLERROR - qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_refdef.view.x, vid.height - (r_refdef.view.y + r_bloomstate.bloomheight), r_bloomstate.bloomwidth, r_bloomstate.bloomheight);CHECKGLERROR - r_refdef.stats.bloom_copypixels += r_bloomstate.bloomwidth * r_bloomstate.bloomheight; + qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_bloomstate.viewport.x, r_bloomstate.viewport.y, r_bloomstate.viewport.width, r_bloomstate.viewport.height);CHECKGLERROR + r_refdef.stats.bloom_copypixels += r_bloomstate.viewport.width * r_bloomstate.viewport.height; } range = r_bloom_blur.integer * r_bloomstate.bloomwidth / 320; @@ -3990,8 +4003,8 @@ void R_Bloom_MakeTexture(void) // copy the vertically blurred bloom view to a texture GL_ActiveTexture(0); CHECKGLERROR - qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_refdef.view.x, vid.height - (r_refdef.view.y + r_bloomstate.bloomheight), r_bloomstate.bloomwidth, r_bloomstate.bloomheight);CHECKGLERROR - r_refdef.stats.bloom_copypixels += r_bloomstate.bloomwidth * r_bloomstate.bloomheight; + qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_bloomstate.viewport.x, r_bloomstate.viewport.y, r_bloomstate.viewport.width, r_bloomstate.viewport.height);CHECKGLERROR + r_refdef.stats.bloom_copypixels += r_bloomstate.viewport.width * r_bloomstate.viewport.height; } // apply subtract last @@ -4018,8 +4031,8 @@ void R_Bloom_MakeTexture(void) R_Mesh_TexBind(0, R_GetTexture(r_bloomstate.texture_bloom)); GL_ActiveTexture(0); CHECKGLERROR - qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_refdef.view.x, vid.height - (r_refdef.view.y + r_bloomstate.bloomheight), r_bloomstate.bloomwidth, r_bloomstate.bloomheight);CHECKGLERROR - r_refdef.stats.bloom_copypixels += r_bloomstate.bloomwidth * r_bloomstate.bloomheight; + qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_bloomstate.viewport.x, r_bloomstate.viewport.y, r_bloomstate.viewport.width, r_bloomstate.viewport.height);CHECKGLERROR + r_refdef.stats.bloom_copypixels += r_bloomstate.viewport.width * r_bloomstate.viewport.height; } } @@ -4051,8 +4064,9 @@ void R_HDR_RenderBloomTexture(void) if (r_timereport_active) R_TimeReport("visibility"); + // only do secondary renders with HDR if r_hdr is 2 or higher r_waterstate.numwaterplanes = 0; - if (r_waterstate.enabled) + if (r_waterstate.enabled && r_hdr.integer >= 2) R_RenderWaterPlanes(); r_refdef.view.showdebug = true; @@ -4126,13 +4140,13 @@ static void R_BlendView(void) R_Mesh_TexBind(0, R_GetTexture(r_bloomstate.texture_screen)); R_Mesh_TexCoordPointer(0, 2, r_bloomstate.screentexcoord2f, 0, 0); R_Mesh_Draw(0, 4, 0, 2, NULL, polygonelements, 0, 0); - r_refdef.stats.bloom_drawpixels += r_refdef.view.width * r_refdef.view.height; + r_refdef.stats.bloom_drawpixels += r_refdef.view.viewport.width * r_refdef.view.viewport.height; } } // copy view into the screen texture - qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_refdef.view.x, vid.height - (r_refdef.view.y + r_refdef.view.height), r_refdef.view.width, r_refdef.view.height);CHECKGLERROR - r_refdef.stats.bloom_copypixels += r_refdef.view.width * r_refdef.view.height; + qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_refdef.view.viewport.x, r_refdef.view.viewport.y, r_refdef.view.viewport.width, r_refdef.view.viewport.height);CHECKGLERROR + r_refdef.stats.bloom_copypixels += r_refdef.view.viewport.width * r_refdef.view.viewport.height; } if (r_glsl.integer && gl_support_fragment_shader && (r_bloomstate.texture_screen || r_bloomstate.texture_bloom)) @@ -4201,7 +4215,7 @@ static void R_BlendView(void) if (r_glsl_permutation->loc_Saturation >= 0) qglUniform1fARB(r_glsl_permutation->loc_Saturation, r_glsl_saturation.value); R_Mesh_Draw(0, 4, 0, 2, NULL, polygonelements, 0, 0); - r_refdef.stats.bloom_drawpixels += r_refdef.view.width * r_refdef.view.height; + r_refdef.stats.bloom_drawpixels += r_refdef.view.viewport.width * r_refdef.view.viewport.height; return; } @@ -4221,7 +4235,7 @@ static void R_BlendView(void) R_Mesh_TexBind(0, R_GetTexture(r_bloomstate.texture_bloom)); R_Mesh_TexCoordPointer(0, 2, r_bloomstate.bloomtexcoord2f, 0, 0); R_Mesh_Draw(0, 4, 0, 2, NULL, polygonelements, 0, 0); - r_refdef.stats.bloom_drawpixels += r_refdef.view.width * r_refdef.view.height; + r_refdef.stats.bloom_drawpixels += r_refdef.view.viewport.width * r_refdef.view.viewport.height; } else if (r_bloomstate.texture_bloom) { @@ -4250,14 +4264,14 @@ static void R_BlendView(void) { R_SetupGenericShader(true); R_Mesh_Draw(0, 4, 0, 2, NULL, polygonelements, 0, 0); - r_refdef.stats.bloom_drawpixels += r_refdef.view.width * r_refdef.view.height; + r_refdef.stats.bloom_drawpixels += r_refdef.view.viewport.width * r_refdef.view.viewport.height; // now blend on the bloom texture GL_BlendFunc(GL_ONE, GL_ONE); R_Mesh_TexBind(0, R_GetTexture(r_bloomstate.texture_screen)); R_Mesh_TexCoordPointer(0, 2, r_bloomstate.screentexcoord2f, 0, 0); } R_Mesh_Draw(0, 4, 0, 2, NULL, polygonelements, 0, 0); - r_refdef.stats.bloom_drawpixels += r_refdef.view.width * r_refdef.view.height; + r_refdef.stats.bloom_drawpixels += r_refdef.view.viewport.width * r_refdef.view.viewport.height; } if (r_refdef.viewblend[3] >= (1.0f / 256.0f)) { diff --git a/r_shadow.c b/r_shadow.c index eacfb516..c14fbc85 100644 --- a/r_shadow.c +++ b/r_shadow.c @@ -1332,7 +1332,7 @@ void R_Shadow_RenderMode_Begin(void) GL_DepthTest(true); GL_DepthMask(false); GL_Color(0, 0, 0, 1); - GL_Scissor(r_refdef.view.x, vid.height - r_refdef.view.y - r_refdef.view.height, r_refdef.view.width, r_refdef.view.height); + GL_Scissor(r_refdef.view.viewport.x, r_refdef.view.viewport.y, r_refdef.view.viewport.width, r_refdef.view.viewport.height); r_shadow_rendermode = R_SHADOW_RENDERMODE_NONE; @@ -1706,7 +1706,7 @@ void R_Shadow_RenderMode_End(void) R_Shadow_RenderMode_Reset(); R_Shadow_RenderMode_ActiveLight(NULL); GL_DepthMask(true); - GL_Scissor(r_refdef.view.x, vid.height - r_refdef.view.y - r_refdef.view.height, r_refdef.view.width, r_refdef.view.height); + GL_Scissor(r_refdef.view.viewport.x, r_refdef.view.viewport.y, r_refdef.view.viewport.width, r_refdef.view.viewport.height); r_shadow_rendermode = R_SHADOW_RENDERMODE_NONE; } @@ -1743,10 +1743,10 @@ qboolean R_Shadow_ScissorForBBox(const float *mins, const float *maxs) int sign[8]; float f; - r_shadow_lightscissor[0] = r_refdef.view.x; - r_shadow_lightscissor[1] = vid.height - r_refdef.view.y - r_refdef.view.height; - r_shadow_lightscissor[2] = r_refdef.view.width; - r_shadow_lightscissor[3] = r_refdef.view.height; + r_shadow_lightscissor[0] = r_refdef.view.viewport.x; + r_shadow_lightscissor[1] = r_refdef.view.viewport.y; + r_shadow_lightscissor[2] = r_refdef.view.viewport.width; + r_shadow_lightscissor[3] = r_refdef.view.viewport.height; if (!r_shadow_scissor.integer) return false; @@ -1819,16 +1819,16 @@ qboolean R_Shadow_ScissorForBBox(const float *mins, const float *maxs) // now convert the scissor rectangle to integer screen coordinates ix1 = (int)(x1 - 1.0f); - iy1 = (int)(y1 - 1.0f); + iy1 = vid.height - (int)(y2 - 1.0f); ix2 = (int)(x2 + 1.0f); - iy2 = (int)(y2 + 1.0f); + iy2 = vid.height - (int)(y1 + 1.0f); //Con_Printf("%f %f %f %f\n", x1, y1, x2, y2); // clamp it to the screen - if (ix1 < r_refdef.view.x) ix1 = r_refdef.view.x; - if (iy1 < r_refdef.view.y) iy1 = r_refdef.view.y; - if (ix2 > r_refdef.view.x + r_refdef.view.width) ix2 = r_refdef.view.x + r_refdef.view.width; - if (iy2 > r_refdef.view.y + r_refdef.view.height) iy2 = r_refdef.view.y + r_refdef.view.height; + if (ix1 < r_refdef.view.viewport.x) ix1 = r_refdef.view.viewport.x; + if (iy1 < r_refdef.view.viewport.y) iy1 = r_refdef.view.viewport.y; + if (ix2 > r_refdef.view.viewport.x + r_refdef.view.viewport.width) ix2 = r_refdef.view.viewport.x + r_refdef.view.viewport.width; + if (iy2 > r_refdef.view.viewport.y + r_refdef.view.viewport.height) iy2 = r_refdef.view.viewport.y + r_refdef.view.viewport.height; // if it is inside out, it's not visible if (ix2 <= ix1 || iy2 <= iy1) @@ -1836,7 +1836,7 @@ qboolean R_Shadow_ScissorForBBox(const float *mins, const float *maxs) // the light area is visible, set up the scissor rectangle r_shadow_lightscissor[0] = ix1; - r_shadow_lightscissor[1] = vid.height - iy2; + r_shadow_lightscissor[1] = iy1; r_shadow_lightscissor[2] = ix2 - ix1; r_shadow_lightscissor[3] = iy2 - iy1; @@ -3849,7 +3849,10 @@ void R_ShadowVolumeLighting(qboolean visible) R_Shadow_RenderMode_End(); } +extern const float r_screenvertex3f[12]; extern void R_SetupView(qboolean allowwaterclippingplane); +extern void R_ResetViewRendering3D(void); +extern void R_ResetViewRendering2D(void); extern cvar_t r_shadows; extern cvar_t r_shadows_darken; extern cvar_t r_shadows_drawafterrtlighting; @@ -3865,36 +3868,21 @@ void R_DrawModelShadows(void) vec3_t relativelightdirection; vec3_t relativeshadowmins, relativeshadowmaxs; vec3_t tmp, shadowdir; - float vertex3f[12]; - r_viewport_t viewport; if (!r_drawentities.integer || !gl_stencil) return; CHECKGLERROR - GL_Scissor(r_refdef.view.x, vid.height - r_refdef.view.y - r_refdef.view.height, r_refdef.view.width, r_refdef.view.height); - - r_shadow_rendermode = R_SHADOW_RENDERMODE_NONE; + R_ResetViewRendering3D(); + //GL_Scissor(r_refdef.view.viewport.x, r_refdef.view.viewport.y, r_refdef.view.viewport.width, r_refdef.view.viewport.height); + //GL_Scissor(r_refdef.view.x, vid.height - r_refdef.view.height - r_refdef.view.y, r_refdef.view.width, r_refdef.view.height); + R_Shadow_RenderMode_Begin(); + R_Shadow_RenderMode_ActiveLight(NULL); r_shadow_lightscissor[0] = r_refdef.view.x; r_shadow_lightscissor[1] = vid.height - r_refdef.view.y - r_refdef.view.height; r_shadow_lightscissor[2] = r_refdef.view.width; r_shadow_lightscissor[3] = r_refdef.view.height; - - if (gl_ext_separatestencil.integer) - { - r_shadow_shadowingrendermode_zpass = R_SHADOW_RENDERMODE_ZPASS_SEPARATESTENCIL; - r_shadow_shadowingrendermode_zfail = R_SHADOW_RENDERMODE_ZFAIL_SEPARATESTENCIL; - } - else if (gl_ext_stenciltwoside.integer) - { - r_shadow_shadowingrendermode_zpass = R_SHADOW_RENDERMODE_ZPASS_STENCILTWOSIDE; - r_shadow_shadowingrendermode_zfail = R_SHADOW_RENDERMODE_ZFAIL_STENCILTWOSIDE; - } - else - { - r_shadow_shadowingrendermode_zpass = R_SHADOW_RENDERMODE_ZPASS_STENCIL; - r_shadow_shadowingrendermode_zfail = R_SHADOW_RENDERMODE_ZFAIL_STENCIL; - } + R_Shadow_RenderMode_StencilShadowVolumes(false); // get shadow dir if (r_shadows.integer == 2) @@ -3954,34 +3942,28 @@ void R_DrawModelShadows(void) } // not really the right mode, but this will disable any silly stencil features - R_Shadow_RenderMode_VisibleLighting(true, true); - - // vertex coordinates for a quad that covers the screen exactly - vertex3f[0] = 0;vertex3f[1] = 0;vertex3f[2] = 0; - vertex3f[3] = 1;vertex3f[4] = 0;vertex3f[5] = 0; - vertex3f[6] = 1;vertex3f[7] = 1;vertex3f[8] = 0; - vertex3f[9] = 0;vertex3f[10] = 1;vertex3f[11] = 0; + R_Shadow_RenderMode_End(); // set up ortho view for rendering this pass - R_Viewport_InitOrtho(&viewport, &identitymatrix, r_refdef.view.x, r_refdef.view.y, r_refdef.view.width, r_refdef.view.height, 0, 0, 1, 1, -10, 100, NULL); - R_SetViewport(&viewport); - GL_Scissor(r_refdef.view.x, vid.height - r_refdef.view.y - r_refdef.view.height, r_refdef.view.width, r_refdef.view.height); - GL_ColorMask(r_refdef.view.colormask[0], r_refdef.view.colormask[1], r_refdef.view.colormask[2], 1); - GL_ScissorTest(true); - R_Mesh_Matrix(&identitymatrix); - R_Mesh_ResetTextureState(); - R_Mesh_VertexPointer(vertex3f, 0, 0); + //GL_Scissor(r_refdef.view.x, vid.height - r_refdef.view.height - r_refdef.view.y, r_refdef.view.width, r_refdef.view.height); + //GL_ColorMask(r_refdef.view.colormask[0], r_refdef.view.colormask[1], r_refdef.view.colormask[2], 1); + //GL_ScissorTest(true); + //R_Mesh_Matrix(&identitymatrix); + //R_Mesh_ResetTextureState(); + R_ResetViewRendering2D(); + R_Mesh_VertexPointer(r_screenvertex3f, 0, 0); R_Mesh_ColorPointer(NULL, 0, 0); + R_SetupGenericShader(false); // set up a darkening blend on shadowed areas GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - GL_DepthRange(0, 1); - GL_DepthTest(false); - GL_DepthMask(false); - GL_PolygonOffset(0, 0);CHECKGLERROR + //GL_DepthRange(0, 1); + //GL_DepthTest(false); + //GL_DepthMask(false); + //GL_PolygonOffset(0, 0);CHECKGLERROR GL_Color(0, 0, 0, r_shadows_darken.value); - GL_ColorMask(r_refdef.view.colormask[0], r_refdef.view.colormask[1], r_refdef.view.colormask[2], 1); - qglDepthFunc(GL_ALWAYS);CHECKGLERROR + //GL_ColorMask(r_refdef.view.colormask[0], r_refdef.view.colormask[1], r_refdef.view.colormask[2], 1); + //qglDepthFunc(GL_ALWAYS);CHECKGLERROR qglEnable(GL_STENCIL_TEST);CHECKGLERROR qglStencilMask(~0);CHECKGLERROR qglStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);CHECKGLERROR @@ -3994,7 +3976,7 @@ void R_DrawModelShadows(void) R_SetViewport(&r_refdef.view.viewport); // restore other state to normal - R_Shadow_RenderMode_End(); + //R_Shadow_RenderMode_End(); } void R_BeginCoronaQuery(rtlight_t *rtlight, float scale, qboolean usequery) -- 2.39.2