+static void Mod_GenerateLightmaps_CreateLights_ComputeSVBSP_InsertSurfaces(const dp_model_t *model, svbsp_t *svbsp, const float *mins, const float *maxs)
+{
+ int surfaceindex;
+ int triangleindex;
+ const msurface_t *surface;
+ const float *vertex3f = model->surfmesh.data_vertex3f;
+ const int *element3i = model->surfmesh.data_element3i;
+ const int *e;
+ double v2[3][3];
+ for (surfaceindex = 0, surface = model->data_surfaces;surfaceindex < model->nummodelsurfaces;surfaceindex++, surface++)
+ {
+ if (!BoxesOverlap(surface->mins, surface->maxs, mins, maxs))
+ continue;
+ if (R_GetCurrentTexture(surface->texture)->currentmaterialflags & MATERIALFLAG_NOSHADOW)
+ continue;
+ for (triangleindex = 0, e = element3i + 3*surface->num_firsttriangle;triangleindex < surface->num_triangles;triangleindex++, e += 3)
+ {
+ VectorCopy(vertex3f + 3*e[0], v2[0]);
+ VectorCopy(vertex3f + 3*e[1], v2[1]);
+ VectorCopy(vertex3f + 3*e[2], v2[2]);
+ SVBSP_AddPolygon(svbsp, 3, v2[0], true, NULL, NULL, 0);
+ }
+ }
+}
+
+static void Mod_GenerateLightmaps_CreateLights_ComputeSVBSP(dp_model_t *model, lightmaplight_t *lightinfo)
+{
+ int maxnodes = 1<<14;
+ svbsp_node_t *nodes;
+ double origin[3];
+ float mins[3];
+ float maxs[3];
+ svbsp_t svbsp;
+ VectorSet(mins, lightinfo->origin[0] - lightinfo->radius, lightinfo->origin[1] - lightinfo->radius, lightinfo->origin[2] - lightinfo->radius);
+ VectorSet(maxs, lightinfo->origin[0] + lightinfo->radius, lightinfo->origin[1] + lightinfo->radius, lightinfo->origin[2] + lightinfo->radius);
+ VectorCopy(lightinfo->origin, origin);
+ nodes = Mem_Alloc(tempmempool, maxnodes * sizeof(*nodes));
+ for (;;)
+ {
+ SVBSP_Init(&svbsp, origin, maxnodes, nodes);
+ Mod_GenerateLightmaps_CreateLights_ComputeSVBSP_InsertSurfaces(model, &svbsp, mins, maxs);
+ if (svbsp.ranoutofnodes)
+ {
+ maxnodes *= 2;
+ if (maxnodes >= 1<<22)
+ {
+ Mem_Free(nodes);
+ return;
+ }
+ Mem_Free(nodes);
+ nodes = Mem_Alloc(tempmempool, maxnodes * sizeof(*nodes));
+ }
+ else
+ break;
+ }
+ if (svbsp.numnodes > 0)
+ {
+ svbsp.nodes = Mem_Alloc(tempmempool, svbsp.numnodes * sizeof(*nodes));
+ memcpy(svbsp.nodes, nodes, svbsp.numnodes * sizeof(*nodes));
+ lightinfo->svbsp = svbsp;
+ }
+ Mem_Free(nodes);
+}
+