]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rsurf.c
optimized edgedir handling to use half as many, which reduces it from
[xonotic/darkplaces.git] / gl_rsurf.c
index 867a82b22926ad7a301ff46c345c934a77b88111..ced25af4cd7e882dcf8fe4af5a9da11f6d4f4d51 100644 (file)
@@ -1064,21 +1064,24 @@ void R_Q1BSP_CompileShadowMap(entity_render_t *ent, vec3_t relativelightorigin,
        dp_model_t *model = ent->model;
        msurface_t *surface;
        int surfacelistindex;
-       int sidetotals[6] = { 0, 0, 0, 0, 0, 0 };
+       int sidetotals[6] = { 0, 0, 0, 0, 0, 0 }, sidemasks = 0;
+       int i;
        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);
+               sidemasks |= 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, surface->texture->basematerialflags & MATERIALFLAG_NOSHADOW ? NULL : 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);
+       r_shadow_compilingrtlight->static_shadowmap_receivers &= sidemasks;
+       for(i = 0;i<6;i++)
+               if(!sidetotals[i])
+                       r_shadow_compilingrtlight->static_shadowmap_casters &= ~(1 << i);
 }
 
-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)
+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 unsigned char *surfacesides, const vec3_t lightmins, const vec3_t lightmaxs)
 {
        dp_model_t *model = ent->model;
        msurface_t *surface, *batch[64];
@@ -1090,10 +1093,12 @@ void R_Q1BSP_DrawShadowMap(int side, entity_render_t *ent, const vec3_t relative
        for (modelsurfacelistindex = 0;modelsurfacelistindex < modelnumsurfaces;modelsurfacelistindex++)
        {
                surface = model->data_surfaces + modelsurfacelist[modelsurfacelistindex];
+               if (surfacesides && !(surfacesides[modelsurfacelistindex] && (1 << side)))
+                       continue;
                rsurface.texture = R_GetCurrentTexture(surface->texture);
                if (rsurface.texture->currentmaterialflags & MATERIALFLAG_NOSHADOW)
                        continue;
-               if(!BoxesOverlap(lightmins, lightmaxs, surface->mins, surface->maxs))
+               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;
@@ -1102,9 +1107,11 @@ void R_Q1BSP_DrawShadowMap(int side, entity_render_t *ent, const vec3_t relative
                while(++modelsurfacelistindex < modelnumsurfaces && batchsize < (int)(sizeof(batch)/sizeof(batch[0])))
                {
                        surface = model->data_surfaces + modelsurfacelist[modelsurfacelistindex];
-                       if(surface->texture != batch[0]->texture)
+                       if (surfacesides && !(surfacesides[modelsurfacelistindex] & (1 << side)))
+                               continue;
+                       if (surface->texture != batch[0]->texture)
                                break;
-                       if(!BoxesOverlap(lightmins, lightmaxs, surface->mins, surface->maxs))
+                       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;