]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rmain.c
changed the meaning of VF_PERSPECTIVE false after discussion with Spike,
[xonotic/darkplaces.git] / gl_rmain.c
index 8aa50492a10cabecaa78d0b22bbfe8e6f882c90d..3b7cfd32a07edd9834eb5e13527c4e77ddd840a4 100644 (file)
@@ -1927,34 +1927,48 @@ 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);
-       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);
-       r_view.frustum[3].dist = DotProduct (r_view.origin, r_view.frustum[3].normal);
-       r_view.frustum[4].dist = DotProduct (r_view.origin, r_view.frustum[4].normal) + r_refdef.nearclip;
+       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]);
+
+               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);
+               r_view.frustum[3].dist = DotProduct (r_view.origin, r_view.frustum[3].normal);
+               r_view.frustum[4].dist = DotProduct (r_view.origin, r_view.frustum[4].normal) + r_refdef.nearclip;
+       }
+       else
+       {
+               VectorScale(r_view.left, -r_view.ortho_x, r_view.frustum[0].normal);
+               VectorScale(r_view.left,  r_view.ortho_x, r_view.frustum[1].normal);
+               VectorScale(r_view.up, -r_view.ortho_y, r_view.frustum[2].normal);
+               VectorScale(r_view.up,  r_view.ortho_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.ortho_x;
+               r_view.frustum[1].dist = DotProduct (r_view.origin, r_view.frustum[1].normal) + r_view.ortho_x;
+               r_view.frustum[2].dist = DotProduct (r_view.origin, r_view.frustum[2].normal) + r_view.ortho_y;
+               r_view.frustum[3].dist = DotProduct (r_view.origin, r_view.frustum[3].normal) + r_view.ortho_y;
+               r_view.frustum[4].dist = DotProduct (r_view.origin, r_view.frustum[4].normal) + r_refdef.nearclip;
+       }
+
        PlaneClassify(&r_view.frustum[0]);
        PlaneClassify(&r_view.frustum[1]);
        PlaneClassify(&r_view.frustum[2]);
        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.
@@ -1994,7 +2008,9 @@ void R_View_Update(void)
 
 void R_SetupView(const matrix4x4_t *matrix)
 {
-       if (r_refdef.rtworldshadows || r_refdef.rtdlightshadows)
+       if (!r_view.useperspective)
+               GL_SetupView_Mode_Ortho(-r_view.ortho_x, -r_view.ortho_y, r_view.ortho_x, r_view.ortho_y, -r_refdef.farclip, r_refdef.farclip);
+       else if (r_refdef.rtworldshadows || r_refdef.rtdlightshadows)
                GL_SetupView_Mode_PerspectiveInfiniteFarClip(r_view.frustum_x, r_view.frustum_y, r_refdef.nearclip);
        else
                GL_SetupView_Mode_Perspective(r_view.frustum_x, r_view.frustum_y, r_refdef.nearclip, r_refdef.farclip);