]> de.git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
corona query: move the "all pixels" query to the center of the screen, so coronas...
authordivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Tue, 3 Mar 2009 07:42:03 +0000 (07:42 +0000)
committerdivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Tue, 3 Mar 2009 07:42:03 +0000 (07:42 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8772 d7cf8633-e32d-0410-b094-e92efae38249

gl_rmain.c
r_shadow.c

index 3a3416bf91f452bbd07ee5f4922426acfd15ac55..9bb63787e997b35bc59fb29d0842751b3f407ace 100644 (file)
@@ -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);
index 5b98bd1ef7f05f987a48c96d7af64893c49bd9e8..c8b011588e83f4b03766e11fe31afa46dd8d02da 100644 (file)
@@ -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);