From 2f49f9f4f30b97e7362425da52e562617de561ad Mon Sep 17 00:00:00 2001 From: divverent Date: Tue, 3 Mar 2009 07:42:03 +0000 Subject: [PATCH] corona query: move the "all pixels" query to the center of the screen, so coronas fade out nicely when they leave the visible screen area git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8772 d7cf8633-e32d-0410-b094-e92efae38249 --- gl_rmain.c | 8 -------- r_shadow.c | 19 ++++++++++++------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/gl_rmain.c b/gl_rmain.c index 3a3416bf..9bb63787 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -4368,14 +4368,6 @@ void R_DrawSprite(int blendfunc1, int blendfunc2, rtexture_t *texture, rtexture_ R_Mesh_Matrix(&identitymatrix); GL_BlendFunc(blendfunc1, blendfunc2); - if(v_flipped_state) - { - scalex1 = -scalex1; - scalex2 = -scalex2; - GL_CullFace(r_refdef.view.cullface_front); - } - else - GL_CullFace(r_refdef.view.cullface_back); GL_CullFace(GL_NONE); GL_DepthMask(false); diff --git a/r_shadow.c b/r_shadow.c index 5b98bd1e..c8b01158 100644 --- a/r_shadow.c +++ b/r_shadow.c @@ -3510,20 +3510,25 @@ void R_DrawModelShadows(void) void R_BeginCoronaQuery(rtlight_t *rtlight, float scale, qboolean usequery) { + float zdist; + vec3_t centerorigin; // if it's too close, skip it if (VectorLength(rtlight->color) < (1.0f / 256.0f)) return; - if (VectorDistance2(rtlight->shadoworigin, r_refdef.view.origin) < 32.0f * 32.0f) - return; + zdist = (DotProduct(rtlight->shadoworigin, r_refdef.view.forward) - DotProduct(r_refdef.view.origin, r_refdef.view.forward)); + if (zdist < 32) + return; if (usequery && r_numqueries + 2 <= r_maxqueries) { rtlight->corona_queryindex_allpixels = r_queries[r_numqueries++]; rtlight->corona_queryindex_visiblepixels = r_queries[r_numqueries++]; + VectorMA(r_refdef.view.origin, zdist, r_refdef.view.forward, centerorigin); + CHECKGLERROR // NOTE: we can't disable depth testing using R_DrawSprite's depthdisable argument, which calls GL_DepthTest, as that's broken in the ATI drivers qglBeginQueryARB(GL_SAMPLES_PASSED_ARB, rtlight->corona_queryindex_allpixels); qglDepthFunc(GL_ALWAYS); - R_DrawSprite(GL_ONE, GL_ZERO, r_shadow_lightcorona, NULL, false, false, rtlight->shadoworigin, r_refdef.view.right, r_refdef.view.up, scale, -scale, -scale, scale, 1, 1, 1, 1); + R_DrawSprite(GL_ONE, GL_ZERO, r_shadow_lightcorona, NULL, false, false, centerorigin, r_refdef.view.right, r_refdef.view.up, scale, -scale, -scale, scale, 1, 1, 1, 1); qglEndQueryARB(GL_SAMPLES_PASSED_ARB); qglDepthFunc(GL_LEQUAL); qglBeginQueryARB(GL_SAMPLES_PASSED_ARB, rtlight->corona_queryindex_visiblepixels); @@ -3531,7 +3536,7 @@ void R_BeginCoronaQuery(rtlight_t *rtlight, float scale, qboolean usequery) qglEndQueryARB(GL_SAMPLES_PASSED_ARB); CHECKGLERROR } - rtlight->corona_visibility = 1; + rtlight->corona_visibility = bound(0, (zdist - 32) / 32, 1); } void R_DrawCorona(rtlight_t *rtlight, float cscale, float scale) @@ -3548,7 +3553,7 @@ void R_DrawCorona(rtlight_t *rtlight, float cscale, float scale) //Con_Printf("%i of %i pixels\n", (int)visiblepixels, (int)allpixels); if (visiblepixels < 1 || allpixels < 1) return; - rtlight->corona_visibility *= (float)visiblepixels / (float)allpixels; + rtlight->corona_visibility *= bound(0, (float)visiblepixels / (float)allpixels, 1); cscale *= rtlight->corona_visibility; } else @@ -3587,11 +3592,11 @@ void R_DrawCoronas(void) if (usequery) { GL_ColorMask(0,0,0,0); - if (r_maxqueries < range + r_refdef.scene.numlights) + if (r_maxqueries < (range + r_refdef.scene.numlights) * 2) if (r_maxqueries < R_MAX_OCCLUSION_QUERIES) { i = r_maxqueries; - r_maxqueries = (range + r_refdef.scene.numlights) * 2; + r_maxqueries = (range + r_refdef.scene.numlights) * 4; r_maxqueries = min(r_maxqueries, R_MAX_OCCLUSION_QUERIES); CHECKGLERROR qglGenQueriesARB(r_maxqueries - i, r_queries + i); -- 2.39.2