From 1c835329b08d0c8d2255465e485a1cd3cacd478b Mon Sep 17 00:00:00 2001 From: havoc Date: Thu, 14 Jun 2007 06:18:50 +0000 Subject: [PATCH] added support for VF_PERSPECTIVE = false in frustum culling git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@7422 d7cf8633-e32d-0410-b094-e92efae38249 --- gl_rmain.c | 42 +++++++++++++++++++++++++----------------- r_shadow.c | 13 +++++++++++++ 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/gl_rmain.c b/gl_rmain.c index f1dd2be5..65c5b946 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -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. diff --git a/r_shadow.c b/r_shadow.c index aa67549c..ce46dc5e 100644 --- a/r_shadow.c +++ b/r_shadow.c @@ -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 -- 2.39.2