]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rsurf.c
compile separate index lists for each cubemap shadowmap side
[xonotic/darkplaces.git] / gl_rsurf.c
index 787b280f556f3f8649cf5ab9ac4a19e9ac71941d..867a82b22926ad7a301ff46c345c934a77b88111 100644 (file)
@@ -1059,6 +1059,65 @@ void R_Q1BSP_DrawShadowVolume(entity_render_t *ent, const vec3_t relativelightor
                GL_PolygonOffset(r_refdef.shadowpolygonfactor, r_refdef.shadowpolygonoffset);
 }
 
+void R_Q1BSP_CompileShadowMap(entity_render_t *ent, vec3_t relativelightorigin, vec3_t relativelightdirection, float lightradius, int numsurfaces, const int *surfacelist)
+{
+       dp_model_t *model = ent->model;
+       msurface_t *surface;
+       int surfacelistindex;
+       int sidetotals[6] = { 0, 0, 0, 0, 0, 0 };
+       r_shadow_compilingrtlight->static_meshchain_shadow_shadowmap = Mod_ShadowMesh_Begin(r_main_mempool, 32768, 32768, NULL, NULL, NULL, false, false, true);
+       R_Shadow_PrepareShadowSides(model->brush.shadowmesh->numtriangles);
+       for (surfacelistindex = 0;surfacelistindex < numsurfaces;surfacelistindex++)
+       {
+               surface = model->data_surfaces + surfacelist[surfacelistindex];
+               if (surface->texture->basematerialflags & MATERIALFLAG_NOSHADOW)
+                       continue;
+               R_Shadow_ChooseSidesFromBox(surface->num_firstshadowmeshtriangle, surface->num_triangles, model->brush.shadowmesh->vertex3f, model->brush.shadowmesh->element3i, &r_shadow_compilingrtlight->matrix_worldtolight, relativelightorigin, relativelightdirection, r_shadow_compilingrtlight->cullmins, r_shadow_compilingrtlight->cullmaxs, surface->mins, surface->maxs, sidetotals);
+       }
+       R_Shadow_ShadowMapFromList(model->brush.shadowmesh->numverts, model->brush.shadowmesh->numtriangles, model->brush.shadowmesh->vertex3f, model->brush.shadowmesh->element3i, numshadowsides, sidetotals, shadowsides, shadowsideslist);
+       r_shadow_compilingrtlight->static_meshchain_shadow_shadowmap = Mod_ShadowMesh_Finish(r_main_mempool, r_shadow_compilingrtlight->static_meshchain_shadow_shadowmap, false, false, true);
+}
+
+void R_Q1BSP_DrawShadowMap(int side, entity_render_t *ent, const vec3_t relativelightorigin, const vec3_t relativelightdirection, float lightradius, int modelnumsurfaces, const int *modelsurfacelist, const vec3_t lightmins, const vec3_t lightmaxs)
+{
+       dp_model_t *model = ent->model;
+       msurface_t *surface, *batch[64];
+       int modelsurfacelistindex, batchsize;
+       // check the box in modelspace, it was already checked in worldspace
+       if (!BoxesOverlap(model->normalmins, model->normalmaxs, lightmins, lightmaxs))
+               return;
+       // identify lit faces within the bounding box
+       for (modelsurfacelistindex = 0;modelsurfacelistindex < modelnumsurfaces;modelsurfacelistindex++)
+       {
+               surface = model->data_surfaces + modelsurfacelist[modelsurfacelistindex];
+               rsurface.texture = R_GetCurrentTexture(surface->texture);
+               if (rsurface.texture->currentmaterialflags & MATERIALFLAG_NOSHADOW)
+                       continue;
+               if(!BoxesOverlap(lightmins, lightmaxs, surface->mins, surface->maxs))
+                       continue;
+               r_refdef.stats.lights_dynamicshadowtriangles += surface->num_triangles;
+               r_refdef.stats.lights_shadowtriangles += surface->num_triangles;
+               batch[0] = surface;
+        batchsize = 1;
+               while(++modelsurfacelistindex < modelnumsurfaces && batchsize < (int)(sizeof(batch)/sizeof(batch[0])))
+               {
+                       surface = model->data_surfaces + modelsurfacelist[modelsurfacelistindex];
+                       if(surface->texture != batch[0]->texture)
+                               break;
+                       if(!BoxesOverlap(lightmins, lightmaxs, surface->mins, surface->maxs))
+                               continue;
+                       r_refdef.stats.lights_dynamicshadowtriangles += surface->num_triangles;
+                       r_refdef.stats.lights_shadowtriangles += surface->num_triangles;
+                       batch[batchsize++] = surface;
+               }
+               --modelsurfacelistindex;
+               GL_CullFace(rsurface.texture->currentmaterialflags & MATERIALFLAG_NOCULLFACE ? GL_NONE : r_refdef.view.cullface_back);
+               RSurf_PrepareVerticesForBatch(false, false, batchsize, batch);
+               RSurf_DrawBatch_Simple(batchsize, batch);
+               GL_LockArrays(0, 0);
+       }
+}
+
 #define BATCHSIZE 1024
 
 static void R_Q1BSP_DrawLight_TransparentCallback(const entity_render_t *ent, const rtlight_t *rtlight, int numsurfaces, int *surfacelist)
@@ -1069,7 +1128,7 @@ static void R_Q1BSP_DrawLight_TransparentCallback(const entity_render_t *ent, co
        // note: in practice this never actually receives batches), oh well
        R_Shadow_RenderMode_Begin();
        R_Shadow_RenderMode_ActiveLight(rtlight);
-       R_Shadow_RenderMode_Lighting(false, true);
+       R_Shadow_RenderMode_Lighting(false, true, false);
        R_Shadow_SetupEntityLight(ent);
        for (i = 0;i < numsurfaces;i = j)
        {