+ for (leafsurfaceindex = 0;leafsurfaceindex < numleafsurfaces;leafsurfaceindex++)
+ {
+ surfaceindex = leafsurfaceindices[leafsurfaceindex];
+ if (CHECKPVSBIT(info->outsurfacepvs, surfaceindex))
+ continue;
+ SETPVSBIT(info->outsurfacepvs, surfaceindex);
+ surface = surfaces + surfaceindex;
+ if (!BoxesOverlap(info->lightmins, info->lightmaxs, surface->mins, surface->maxs))
+ continue;
+ addedtris = false;
+ currentmaterialflags = R_GetCurrentTexture(surface->texture)->currentmaterialflags;
+ castshadow = !(currentmaterialflags & MATERIALFLAG_NOSHADOW);
+ insidebox = BoxInsideBox(surface->mins, surface->maxs, info->lightmins, info->lightmaxs);
+ for (triangleindex = 0, t = surface->num_firsttriangle, e = info->model->surfmesh.data_element3i + t * 3;triangleindex < surface->num_triangles;triangleindex++, t++, e += 3)
+ {
+ v[0] = info->model->surfmesh.data_vertex3f + e[0] * 3;
+ v[1] = info->model->surfmesh.data_vertex3f + e[1] * 3;
+ v[2] = info->model->surfmesh.data_vertex3f + e[2] * 3;
+ VectorCopy(v[0], v2[0]);
+ VectorCopy(v[1], v2[1]);
+ VectorCopy(v[2], v2[2]);
+ if (!insidebox && !TriangleBBoxOverlapsBox(v2[0], v2[1], v2[2], info->lightmins, info->lightmaxs))
+ continue;
+ if (svbspactive && !(SVBSP_AddPolygon(&r_svbsp, 3, v2[0], false, NULL, NULL, 0) & 2))
+ continue;
+ // we don't omit triangles from lighting even if they are
+ // backfacing, because when using shadowmapping they are often
+ // not fully occluded on the horizon of an edge
+ SETPVSBIT(info->outlighttrispvs, t);
+ addedtris = true;
+ if (castshadow)
+ {
+ if (noocclusion || (currentmaterialflags & MATERIALFLAG_NOCULLFACE))
+ {
+ // if the material is double sided we
+ // can't cull by direction
+ SETPVSBIT(info->outshadowtrispvs, t);
+ }
+ else if (frontsidecasting)
+ {
+ // front side casting occludes backfaces,
+ // so they are completely useless as both
+ // casters and lit polygons
+ if (PointInfrontOfTriangle(info->relativelightorigin, v2[0], v2[1], v2[2]))
+ SETPVSBIT(info->outshadowtrispvs, t);
+ }
+ else
+ {
+ // back side casting does not occlude
+ // anything so we can't cull lit polygons
+ if (!PointInfrontOfTriangle(info->relativelightorigin, v2[0], v2[1], v2[2]))
+ SETPVSBIT(info->outshadowtrispvs, t);
+ }
+ }
+ }
+ if (addedtris)
+ info->outsurfacelist[info->outnumsurfaces++] = surfaceindex;
+ }