]> de.git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
added support for VF_PERSPECTIVE = false in frustum culling
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Thu, 14 Jun 2007 06:18:50 +0000 (06:18 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Thu, 14 Jun 2007 06:18:50 +0000 (06:18 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@7422 d7cf8633-e32d-0410-b094-e92efae38249

gl_rmain.c
r_shadow.c

index f1dd2be5cbdd7ca3a2e85059653f692fea80e833..65c5b946c94f9a3b57178b169fe4f777c5ca7e8f 100644 (file)
@@ -1927,17 +1927,31 @@ static void R_View_SetFrustum(void)
 
 
 
-       slopex = 1.0 / r_view.frustum_x;
-       slopey = 1.0 / r_view.frustum_y;
-       VectorMA(r_view.forward, -slopex, r_view.left, r_view.frustum[0].normal);
-       VectorMA(r_view.forward,  slopex, r_view.left, r_view.frustum[1].normal);
-       VectorMA(r_view.forward, -slopey, r_view.up  , r_view.frustum[2].normal);
-       VectorMA(r_view.forward,  slopey, r_view.up  , r_view.frustum[3].normal);
-       VectorCopy(r_view.forward, r_view.frustum[4].normal);
-       VectorNormalize(r_view.frustum[0].normal);
-       VectorNormalize(r_view.frustum[1].normal);
-       VectorNormalize(r_view.frustum[2].normal);
-       VectorNormalize(r_view.frustum[3].normal);
+       if (r_view.useperspective)
+       {
+               slopex = 1.0 / r_view.frustum_x;
+               slopey = 1.0 / r_view.frustum_y;
+               VectorMA(r_view.forward, -slopex, r_view.left, r_view.frustum[0].normal);
+               VectorMA(r_view.forward,  slopex, r_view.left, r_view.frustum[1].normal);
+               VectorMA(r_view.forward, -slopey, r_view.up  , r_view.frustum[2].normal);
+               VectorMA(r_view.forward,  slopey, r_view.up  , r_view.frustum[3].normal);
+               VectorCopy(r_view.forward, r_view.frustum[4].normal);
+
+               // calculate frustum corners, which are used to calculate deformed frustum planes for shadow caster culling
+               VectorMAMAMAM(1, r_view.origin, 1024, r_view.forward, -1024 * slopex, r_view.left, -1024 * slopey, r_view.up, r_view.frustumcorner[0]);
+               VectorMAMAMAM(1, r_view.origin, 1024, r_view.forward,  1024 * slopex, r_view.left, -1024 * slopey, r_view.up, r_view.frustumcorner[1]);
+               VectorMAMAMAM(1, r_view.origin, 1024, r_view.forward, -1024 * slopex, r_view.left,  1024 * slopey, r_view.up, r_view.frustumcorner[2]);
+               VectorMAMAMAM(1, r_view.origin, 1024, r_view.forward,  1024 * slopex, r_view.left,  1024 * slopey, r_view.up, r_view.frustumcorner[3]);
+       }
+       else
+       {
+               VectorScale(r_view.left, -r_view.x - r_view.width, r_view.frustum[0].normal);
+               VectorScale(r_view.left,  r_view.x               , r_view.frustum[1].normal);
+               VectorScale(r_view.up, -r_view.y - r_view.height , r_view.frustum[2].normal);
+               VectorScale(r_view.up,  r_view.y                 , r_view.frustum[3].normal);
+               VectorCopy(r_view.forward, r_view.frustum[4].normal);
+       }
+
        r_view.frustum[0].dist = DotProduct (r_view.origin, r_view.frustum[0].normal);
        r_view.frustum[1].dist = DotProduct (r_view.origin, r_view.frustum[1].normal);
        r_view.frustum[2].dist = DotProduct (r_view.origin, r_view.frustum[2].normal);
@@ -1949,12 +1963,6 @@ static void R_View_SetFrustum(void)
        PlaneClassify(&r_view.frustum[3]);
        PlaneClassify(&r_view.frustum[4]);
 
-       // calculate frustum corners, which are used to calculate deformed frustum planes for shadow caster culling
-       VectorMAMAMAM(1, r_view.origin, 1024, r_view.forward, -1024 * slopex, r_view.left, -1024 * slopey, r_view.up, r_view.frustumcorner[0]);
-       VectorMAMAMAM(1, r_view.origin, 1024, r_view.forward,  1024 * slopex, r_view.left, -1024 * slopey, r_view.up, r_view.frustumcorner[1]);
-       VectorMAMAMAM(1, r_view.origin, 1024, r_view.forward, -1024 * slopex, r_view.left,  1024 * slopey, r_view.up, r_view.frustumcorner[2]);
-       VectorMAMAMAM(1, r_view.origin, 1024, r_view.forward,  1024 * slopex, r_view.left,  1024 * slopey, r_view.up, r_view.frustumcorner[3]);
-
        // LordHavoc: note to all quake engine coders, Quake had a special case
        // for 90 degrees which assumed a square view (wrong), so I removed it,
        // Quake2 has it disabled as well.
index aa67549c6ddcd8f1a333f22ac9a255f4dca5d131..ce46dc5e4c40f8d6e60682d2db49d2a06f388cf2 100644 (file)
@@ -2483,6 +2483,19 @@ void R_Shadow_ComputeShadowCasterCullingPlanes(rtlight_t *rtlight)
        // can hold
        rsurface.rtlight_numfrustumplanes = 0;
 
+       // haven't implemented a culling path for ortho rendering
+       if (!r_view.useperspective)
+       {
+               // check if the light is on screen and copy the 4 planes if it is
+               for (i = 0;i < 4;i++)
+                       if (PlaneDiff(rtlight->shadoworigin, &r_view.frustum[i]) < -0.03125)
+                               break;
+               if (i == 4)
+                       for (i = 0;i < 4;i++)
+                               rsurface.rtlight_frustumplanes[rsurface.rtlight_numfrustumplanes++] = r_view.frustum[i];
+               return;
+       }
+
 #if 1
        // generate a deformed frustum that includes the light origin, this is
        // used to cull shadow casting surfaces that can not possibly cast a