+ if (BoxesOverlap(lightmins, lightmaxs, leaf->mins, leaf->maxs) && (pvs == NULL || CHECKPVSBIT(pvs, leaf->clusterindex)))
+ {
+ outmins[0] = min(outmins[0], leaf->mins[0]);
+ outmins[1] = min(outmins[1], leaf->mins[1]);
+ outmins[2] = min(outmins[2], leaf->mins[2]);
+ outmaxs[0] = max(outmaxs[0], leaf->maxs[0]);
+ outmaxs[1] = max(outmaxs[1], leaf->maxs[1]);
+ outmaxs[2] = max(outmaxs[2], leaf->maxs[2]);
+ if (outclusterpvs)
+ {
+ if (!CHECKPVSBIT(outclusterpvs, leaf->clusterindex))
+ {
+ SETPVSBIT(outclusterpvs, leaf->clusterindex);
+ outclusterlist[outnumclusters++] = leaf->clusterindex;
+ }
+ }
+ if (outsurfacepvs)
+ {
+ for (marksurfaceindex = 0;marksurfaceindex < leaf->numleaffaces;marksurfaceindex++)
+ {
+ surface = leaf->firstleafface[marksurfaceindex];
+ surfaceindex = surface - model->brushq3.data_faces;
+ if (!CHECKPVSBIT(outsurfacepvs, surfaceindex))
+ {
+ if (BoxesOverlap(lightmins, lightmaxs, surface->mins, surface->maxs) && !(surface->texture->surfaceparms & Q3SURFACEPARM_TRANS) && !(surface->texture->surfaceflags & (Q3SURFACEFLAG_SKY | Q3SURFACEFLAG_NODRAW)))
+ {
+ for (triangleindex = 0, t = surface->num_firstshadowmeshtriangle, e = model->brush.shadowmesh->element3i + t * 3;triangleindex < surface->num_triangles;triangleindex++, t++, e += 3)
+ {
+ v[0] = model->brush.shadowmesh->vertex3f + e[0] * 3;
+ v[1] = model->brush.shadowmesh->vertex3f + e[1] * 3;
+ v[2] = model->brush.shadowmesh->vertex3f + e[2] * 3;
+ if (PointInfrontOfTriangle(relativelightorigin, 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])) && lightmins[1] < max(v[0][1], max(v[1][1], v[2][1])) && lightmaxs[2] > min(v[0][2], min(v[1][2], v[2][2])) && lightmins[2] < max(v[0][2], max(v[1][2], v[2][2])))
+ {
+ SETPVSBIT(outsurfacepvs, surfaceindex);
+ outsurfacelist[outnumsurfaces++] = surfaceindex;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }