]> git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
added r_shadow_frontsidecasting cvar (default 1), this allows switching to back-side...
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Sat, 3 Feb 2007 08:49:02 +0000 (08:49 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Sat, 3 Feb 2007 08:49:02 +0000 (08:49 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@6779 d7cf8633-e32d-0410-b094-e92efae38249

gl_rsurf.c
r_shadow.c
r_shadow.h

index 229458d5dabe02bdea592e1612f07cbf52a0f0e3..f1a9097495fd52a5ff96182a9c4ccac79f6a0eef 100644 (file)
@@ -586,7 +586,7 @@ void R_Q1BSP_RecursiveGetLightInfo(r_q1bsp_getlightinfo_t *info, mnode_t *node)
        }
        else
        {
-               if (info->pvs != NULL && !CHECKPVSBIT(info->pvs, leaf->clusterindex))
+               if (r_shadow_frontsidecasting.integer && info->pvs != NULL && !CHECKPVSBIT(info->pvs, leaf->clusterindex))
                        return;
        }
        // inserting occluders does not alter the leaf info
@@ -631,7 +631,7 @@ void R_Q1BSP_RecursiveGetLightInfo(r_q1bsp_getlightinfo_t *info, mnode_t *node)
                                                v[0] = info->model->brush.shadowmesh->vertex3f + e[0] * 3;
                                                v[1] = info->model->brush.shadowmesh->vertex3f + e[1] * 3;
                                                v[2] = info->model->brush.shadowmesh->vertex3f + e[2] * 3;
-                                               if (PointInfrontOfTriangle(info->relativelightorigin, v[0], v[1], v[2])
+                                               if ((!r_shadow_frontsidecasting.integer || PointInfrontOfTriangle(info->relativelightorigin, v[0], v[1], v[2]))
                                                 && info->lightmaxs[0] > min(v[0][0], min(v[1][0], v[2][0]))
                                                 && info->lightmins[0] < max(v[0][0], max(v[1][0], v[2][0]))
                                                 && info->lightmaxs[1] > min(v[0][1], min(v[1][1], v[2][1]))
@@ -764,7 +764,7 @@ void R_Q1BSP_GetLightInfo(entity_render_t *ent, vec3_t relativelightorigin, floa
        VectorCopy(info.relativelightorigin, info.outmaxs);
        memset(outleafpvs, 0, (info.model->brush.num_leafs + 7) >> 3);
        memset(outsurfacepvs, 0, (info.model->nummodelsurfaces + 7) >> 3);
-       if (info.model->brush.GetPVS)
+       if (info.model->brush.GetPVS && r_shadow_frontsidecasting.integer)
                info.pvs = info.model->brush.GetPVS(info.model, info.relativelightorigin);
        else
                info.pvs = NULL;
index a4308a88e3954385637d1487e4a9877efb89ca01..3f570a5d0b3da8d4f543cb457450eeebe3ede192 100644 (file)
@@ -211,6 +211,7 @@ cvar_t r_shadow_lightattenuationscale = {0, "r_shadow_lightattenuationscale", "1
 cvar_t r_shadow_lightintensityscale = {0, "r_shadow_lightintensityscale", "1", "renders all world lights brighter or darker"};
 cvar_t r_shadow_portallight = {0, "r_shadow_portallight", "1", "use portal culling to exactly determine lit triangles when compiling world lights"};
 cvar_t r_shadow_projectdistance = {0, "r_shadow_projectdistance", "1000000", "how far to cast shadows"};
+cvar_t r_shadow_frontsidecasting = {0, "r_shadow_frontsidecasting", "1", "whether to cast shadows from illuminated triangles (front side of model) or unlit triangles (back side of model)"};
 cvar_t r_shadow_realtime_dlight = {CVAR_SAVE, "r_shadow_realtime_dlight", "1", "enables rendering of dynamic lights such as explosions and rocket light"};
 cvar_t r_shadow_realtime_dlight_shadows = {CVAR_SAVE, "r_shadow_realtime_dlight_shadows", "1", "enables rendering of shadows from dynamic lights"};
 cvar_t r_shadow_realtime_dlight_svbspculling = {0, "r_shadow_realtime_dlight_svbspculling", "0", "enables svbsp optimization on dynamic lights (very slow!)"};
@@ -398,6 +399,7 @@ void R_Shadow_Init(void)
        Cvar_RegisterVariable(&r_shadow_lightintensityscale);
        Cvar_RegisterVariable(&r_shadow_portallight);
        Cvar_RegisterVariable(&r_shadow_projectdistance);
+       Cvar_RegisterVariable(&r_shadow_frontsidecasting);
        Cvar_RegisterVariable(&r_shadow_realtime_dlight);
        Cvar_RegisterVariable(&r_shadow_realtime_dlight_shadows);
        Cvar_RegisterVariable(&r_shadow_realtime_dlight_svbspculling);
@@ -616,67 +618,136 @@ int R_Shadow_ConstructShadowVolume(int innumvertices, int innumtris, const int *
                }
        }
 
-       for (i = 0;i < numshadowmarktris;i++)
+       if (r_shadow_frontsidecasting.integer)
        {
-               int remappedelement[3];
-               int markindex;
-               const int *neighbortriangle;
-
-               markindex = shadowmarktris[i] * 3;
-               element = inelement3i + markindex;
-               neighbortriangle = inneighbor3i + markindex;
-               // output the front and back triangles
-               outelement3i[0] = vertexremap[element[0]];
-               outelement3i[1] = vertexremap[element[1]];
-               outelement3i[2] = vertexremap[element[2]];
-               outelement3i[3] = vertexremap[element[2]] + 1;
-               outelement3i[4] = vertexremap[element[1]] + 1;
-               outelement3i[5] = vertexremap[element[0]] + 1;
-
-               outelement3i += 6;
-               outtriangles += 2;
-               // output the sides (facing outward from this triangle)
-               if (shadowmark[neighbortriangle[0]] != shadowmarkcount)
-               {
-                       remappedelement[0] = vertexremap[element[0]];
-                       remappedelement[1] = vertexremap[element[1]];
-                       outelement3i[0] = remappedelement[1];
-                       outelement3i[1] = remappedelement[0];
-                       outelement3i[2] = remappedelement[0] + 1;
-                       outelement3i[3] = remappedelement[1];
-                       outelement3i[4] = remappedelement[0] + 1;
-                       outelement3i[5] = remappedelement[1] + 1;
-
-                       outelement3i += 6;
-                       outtriangles += 2;
-               }
-               if (shadowmark[neighbortriangle[1]] != shadowmarkcount)
+               for (i = 0;i < numshadowmarktris;i++)
                {
-                       remappedelement[1] = vertexremap[element[1]];
-                       remappedelement[2] = vertexremap[element[2]];
-                       outelement3i[0] = remappedelement[2];
-                       outelement3i[1] = remappedelement[1];
-                       outelement3i[2] = remappedelement[1] + 1;
-                       outelement3i[3] = remappedelement[2];
-                       outelement3i[4] = remappedelement[1] + 1;
-                       outelement3i[5] = remappedelement[2] + 1;
+                       int remappedelement[3];
+                       int markindex;
+                       const int *neighbortriangle;
+
+                       markindex = shadowmarktris[i] * 3;
+                       element = inelement3i + markindex;
+                       neighbortriangle = inneighbor3i + markindex;
+                       // output the front and back triangles
+                       outelement3i[0] = vertexremap[element[0]];
+                       outelement3i[1] = vertexremap[element[1]];
+                       outelement3i[2] = vertexremap[element[2]];
+                       outelement3i[3] = vertexremap[element[2]] + 1;
+                       outelement3i[4] = vertexremap[element[1]] + 1;
+                       outelement3i[5] = vertexremap[element[0]] + 1;
 
                        outelement3i += 6;
                        outtriangles += 2;
+                       // output the sides (facing outward from this triangle)
+                       if (shadowmark[neighbortriangle[0]] != shadowmarkcount)
+                       {
+                               remappedelement[0] = vertexremap[element[0]];
+                               remappedelement[1] = vertexremap[element[1]];
+                               outelement3i[0] = remappedelement[1];
+                               outelement3i[1] = remappedelement[0];
+                               outelement3i[2] = remappedelement[0] + 1;
+                               outelement3i[3] = remappedelement[1];
+                               outelement3i[4] = remappedelement[0] + 1;
+                               outelement3i[5] = remappedelement[1] + 1;
+
+                               outelement3i += 6;
+                               outtriangles += 2;
+                       }
+                       if (shadowmark[neighbortriangle[1]] != shadowmarkcount)
+                       {
+                               remappedelement[1] = vertexremap[element[1]];
+                               remappedelement[2] = vertexremap[element[2]];
+                               outelement3i[0] = remappedelement[2];
+                               outelement3i[1] = remappedelement[1];
+                               outelement3i[2] = remappedelement[1] + 1;
+                               outelement3i[3] = remappedelement[2];
+                               outelement3i[4] = remappedelement[1] + 1;
+                               outelement3i[5] = remappedelement[2] + 1;
+
+                               outelement3i += 6;
+                               outtriangles += 2;
+                       }
+                       if (shadowmark[neighbortriangle[2]] != shadowmarkcount)
+                       {
+                               remappedelement[0] = vertexremap[element[0]];
+                               remappedelement[2] = vertexremap[element[2]];
+                               outelement3i[0] = remappedelement[0];
+                               outelement3i[1] = remappedelement[2];
+                               outelement3i[2] = remappedelement[2] + 1;
+                               outelement3i[3] = remappedelement[0];
+                               outelement3i[4] = remappedelement[2] + 1;
+                               outelement3i[5] = remappedelement[0] + 1;
+
+                               outelement3i += 6;
+                               outtriangles += 2;
+                       }
                }
-               if (shadowmark[neighbortriangle[2]] != shadowmarkcount)
+       }
+       else
+       {
+               for (i = 0;i < numshadowmarktris;i++)
                {
-                       remappedelement[0] = vertexremap[element[0]];
-                       remappedelement[2] = vertexremap[element[2]];
-                       outelement3i[0] = remappedelement[0];
-                       outelement3i[1] = remappedelement[2];
-                       outelement3i[2] = remappedelement[2] + 1;
-                       outelement3i[3] = remappedelement[0];
-                       outelement3i[4] = remappedelement[2] + 1;
-                       outelement3i[5] = remappedelement[0] + 1;
+                       int remappedelement[3];
+                       int markindex;
+                       const int *neighbortriangle;
+
+                       markindex = shadowmarktris[i] * 3;
+                       element = inelement3i + markindex;
+                       neighbortriangle = inneighbor3i + markindex;
+                       // output the front and back triangles
+                       outelement3i[0] = vertexremap[element[2]];
+                       outelement3i[1] = vertexremap[element[1]];
+                       outelement3i[2] = vertexremap[element[0]];
+                       outelement3i[3] = vertexremap[element[0]] + 1;
+                       outelement3i[4] = vertexremap[element[1]] + 1;
+                       outelement3i[5] = vertexremap[element[2]] + 1;
 
                        outelement3i += 6;
                        outtriangles += 2;
+                       // output the sides (facing outward from this triangle)
+                       if (shadowmark[neighbortriangle[0]] != shadowmarkcount)
+                       {
+                               remappedelement[0] = vertexremap[element[0]];
+                               remappedelement[1] = vertexremap[element[1]];
+                               outelement3i[0] = remappedelement[0];
+                               outelement3i[1] = remappedelement[1];
+                               outelement3i[2] = remappedelement[1] + 1;
+                               outelement3i[3] = remappedelement[0];
+                               outelement3i[4] = remappedelement[1] + 1;
+                               outelement3i[5] = remappedelement[0] + 1;
+
+                               outelement3i += 6;
+                               outtriangles += 2;
+                       }
+                       if (shadowmark[neighbortriangle[1]] != shadowmarkcount)
+                       {
+                               remappedelement[1] = vertexremap[element[1]];
+                               remappedelement[2] = vertexremap[element[2]];
+                               outelement3i[0] = remappedelement[1];
+                               outelement3i[1] = remappedelement[2];
+                               outelement3i[2] = remappedelement[2] + 1;
+                               outelement3i[3] = remappedelement[1];
+                               outelement3i[4] = remappedelement[2] + 1;
+                               outelement3i[5] = remappedelement[1] + 1;
+
+                               outelement3i += 6;
+                               outtriangles += 2;
+                       }
+                       if (shadowmark[neighbortriangle[2]] != shadowmarkcount)
+                       {
+                               remappedelement[0] = vertexremap[element[0]];
+                               remappedelement[2] = vertexremap[element[2]];
+                               outelement3i[0] = remappedelement[2];
+                               outelement3i[1] = remappedelement[0];
+                               outelement3i[2] = remappedelement[0] + 1;
+                               outelement3i[3] = remappedelement[2];
+                               outelement3i[4] = remappedelement[0] + 1;
+                               outelement3i[5] = remappedelement[2] + 1;
+
+                               outelement3i += 6;
+                               outtriangles += 2;
+                       }
                }
        }
        if (outnumvertices)
@@ -721,14 +792,14 @@ void R_Shadow_MarkVolumeFromBox(int firsttriangle, int numtris, const float *inv
                        for (t = firsttriangle, e = elements + t * 3;t < tend;t++, e += 3)
                        {
                                TriangleNormal(invertex3f + e[0] * 3, invertex3f + e[1] * 3, invertex3f + e[2] * 3, normal);
-                               if (DotProduct(normal, projectdirection) < 0)
+                               if (r_shadow_frontsidecasting.integer == (DotProduct(normal, projectdirection) < 0))
                                        shadowmarklist[numshadowmark++] = t;
                        }
                }
                else
                {
                        for (t = firsttriangle, e = elements + t * 3;t < tend;t++, e += 3)
-                               if (PointInfrontOfTriangle(projectorigin, invertex3f + e[0] * 3, invertex3f + e[1] * 3, invertex3f + e[2] * 3))
+                               if (r_shadow_frontsidecasting.integer == PointInfrontOfTriangle(projectorigin, invertex3f + e[0] * 3, invertex3f + e[1] * 3, invertex3f + e[2] * 3))
                                        shadowmarklist[numshadowmark++] = t;
                }
        }
@@ -743,7 +814,7 @@ void R_Shadow_MarkVolumeFromBox(int firsttriangle, int numtris, const float *inv
                                v[1] = invertex3f + e[1] * 3;
                                v[2] = invertex3f + e[2] * 3;
                                TriangleNormal(v[0], v[1], v[2], normal);
-                               if (DotProduct(normal, projectdirection) < 0
+                               if (r_shadow_frontsidecasting.integer == (DotProduct(normal, projectdirection) < 0)
                                 && lightmaxs[0] > min(v[0][0], min(v[1][0], v[2][0]))
                                 && lightmins[0] < max(v[0][0], max(v[1][0], v[2][0]))
                                 && lightmaxs[1] > min(v[0][1], min(v[1][1], v[2][1]))
@@ -760,7 +831,7 @@ void R_Shadow_MarkVolumeFromBox(int firsttriangle, int numtris, const float *inv
                                v[0] = invertex3f + e[0] * 3;
                                v[1] = invertex3f + e[1] * 3;
                                v[2] = invertex3f + e[2] * 3;
-                               if (PointInfrontOfTriangle(projectorigin, v[0], v[1], v[2])
+                               if (r_shadow_frontsidecasting.integer == PointInfrontOfTriangle(projectorigin, v[0], v[1], v[2])
                                 && lightmaxs[0] > min(v[0][0], min(v[1][0], v[2][0]))
                                 && lightmins[0] < max(v[0][0], max(v[1][0], v[2][0]))
                                 && lightmaxs[1] > min(v[0][1], min(v[1][1], v[2][1]))
index c434b5145cddb5b7f7329e3c5806e960cdd353cc..5d59009bf7eb64fa5f1a2f1c86dcda41cad933cf 100644 (file)
@@ -14,6 +14,7 @@ extern cvar_t r_shadow_lightattenuationscale;
 extern cvar_t r_shadow_lightintensityscale;
 extern cvar_t r_shadow_portallight;
 extern cvar_t r_shadow_projectdistance;
+extern cvar_t r_shadow_frontsidecasting;
 extern cvar_t r_shadow_realtime_dlight;
 extern cvar_t r_shadow_realtime_dlight_shadows;
 extern cvar_t r_shadow_realtime_dlight_svbspculling;