X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=gl_rsurf.c;h=9dd089fed970d5449ce5a277eb8e8b8ed63b01d1;hb=3f94ed2f51053a39ae771fe5b9e494602c37f9b2;hp=fbf42ebfdadbc9212bc4940415c4a8fdf9a87021;hpb=fd091d66e2673b19eb9c7d73d95160ef874de5e6;p=xonotic%2Fdarkplaces.git diff --git a/gl_rsurf.c b/gl_rsurf.c index fbf42ebf..9dd089fe 100644 --- a/gl_rsurf.c +++ b/gl_rsurf.c @@ -52,6 +52,9 @@ void R_BuildLightMap (const entity_render_t *ent, msurface_t *surface) size = smax*tmax; size3 = size*3; + r_refdef.stats.lightmapupdatepixels += size; + r_refdef.stats.lightmapupdates++; + if (cl.buildlightmapmemorysize < size*sizeof(int[3])) { cl.buildlightmapmemorysize = size*sizeof(int[3]); @@ -896,7 +899,8 @@ void R_Q1BSP_GetLightInfo(entity_render_t *ent, vec3_t relativelightorigin, floa info.pvs = info.model->brush.GetPVS(info.model, info.relativelightorigin); else info.pvs = NULL; - R_UpdateAllTextureInfo(ent); + if (ent != r_refdef.worldentity) + R_UpdateAllTextureInfo(ent); if (r_shadow_frontsidecasting.integer && r_shadow_compilingrtlight && r_shadow_realtime_world_compileportalculling.integer) { @@ -959,7 +963,8 @@ void R_Q1BSP_DrawShadowVolume(entity_render_t *ent, vec3_t relativelightorigin, // check the box in modelspace, it was already checked in worldspace if (!BoxesOverlap(model->normalmins, model->normalmaxs, lightmins, lightmaxs)) return; - R_UpdateAllTextureInfo(ent); + if (ent != r_refdef.worldentity) + R_UpdateAllTextureInfo(ent); if (ent->model->brush.submodel) GL_PolygonOffset(r_refdef.shadowpolygonfactor + r_polygonoffset_submodel_factor.value, r_refdef.shadowpolygonoffset + r_polygonoffset_submodel_offset.value); if (model->brush.shadowmesh) @@ -1032,15 +1037,20 @@ void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surface { model_t *model = ent->model; msurface_t *surface; - int i, k, l, m, mend, endsurface, batchnumsurfaces, batchnumtriangles, batchfirstvertex, batchlastvertex; + int i, k, kend, l, m, mend, endsurface, batchnumsurfaces, batchnumtriangles, batchfirstvertex, batchlastvertex, batchfirsttriangle; qboolean usebufferobject, culltriangles; const int *element3i; msurface_t *batchsurfacelist[RSURF_MAX_BATCHSURFACES]; int batchelements[BATCHSIZE*3]; texture_t *tex; CHECKGLERROR - RSurf_ActiveModelEntity(ent, true, true); - R_UpdateAllTextureInfo(ent); + if (ent == r_refdef.worldentity) + RSurf_ActiveWorldEntity(); + else + { + RSurf_ActiveModelEntity(ent, true, true); + R_UpdateAllTextureInfo(ent); + } CHECKGLERROR culltriangles = r_shadow_culltriangles.integer && !(ent->flags & RENDER_NOSELFSHADOW); element3i = rsurface.modelelement3i; @@ -1065,17 +1075,21 @@ void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surface } if (!batchnumsurfaces) continue; - for (k = 0;k < batchnumsurfaces;k = l) + for (k = 0;k < batchnumsurfaces;k = kend) { surface = batchsurfacelist[k]; tex = surface->texture; rsurface.texture = tex->currentframe; + // gather surfaces into a batch range + for (kend = k;kend < batchnumsurfaces && tex == batchsurfacelist[kend]->texture;kend++) + ; + // now figure out what to do with this particular range of surfaces if (rsurface.texture->currentmaterialflags & (MATERIALFLAG_WALL | MATERIALFLAG_WATER)) { if (rsurface.texture->currentmaterialflags & MATERIALFLAGMASK_DEPTHSORTED) { vec3_t tempcenter, center; - for (l = k;l < batchnumsurfaces && tex == batchsurfacelist[l]->texture;l++) + for (l = k;l < kend;l++) { surface = batchsurfacelist[l]; tempcenter[0] = (surface->mins[0] + surface->maxs[0]) * 0.5f; @@ -1090,66 +1104,58 @@ void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surface // use the bufferobject if all triangles are accepted usebufferobject = true; batchnumtriangles = 0; - // note: this only accepts consecutive surfaces because - // non-consecutive surfaces often have extreme vertex - // ranges (due to large numbers of surfaces omitted - // between them) - surface = batchsurfacelist[k]; - for (l = k;l < batchnumsurfaces && surface == batchsurfacelist[l] && tex == surface->texture;l++, surface++) + batchfirsttriangle = surface->num_firsttriangle; + for (l = k;l < kend;l++) { + surface = batchsurfacelist[l]; RSurf_PrepareVerticesForBatch(true, true, 1, &surface); for (m = surface->num_firsttriangle, mend = m + surface->num_triangles;m < mend;m++) { - if (culltriangles) + if (trispvs) { - if (trispvs) + if (!CHECKPVSBIT(trispvs, m)) { - if (!CHECKPVSBIT(trispvs, m)) - { - usebufferobject = false; - continue; - } + usebufferobject = false; + continue; } - else + } + else if (culltriangles) + { + if (r_shadow_frontsidecasting.integer && !PointInfrontOfTriangle(rsurface.entitylightorigin, rsurface.vertex3f + element3i[m*3+0]*3, rsurface.vertex3f + element3i[m*3+1]*3, rsurface.vertex3f + element3i[m*3+2]*3)) { - if (r_shadow_frontsidecasting.integer && !PointInfrontOfTriangle(rsurface.entitylightorigin, rsurface.vertex3f + element3i[m*3+0]*3, rsurface.vertex3f + element3i[m*3+1]*3, rsurface.vertex3f + element3i[m*3+2]*3)) - { - usebufferobject = false; - continue; - } + usebufferobject = false; + continue; } } - batchelements[batchnumtriangles*3+0] = element3i[m*3+0]; - batchelements[batchnumtriangles*3+1] = element3i[m*3+1]; - batchelements[batchnumtriangles*3+2] = element3i[m*3+2]; - batchnumtriangles++; - r_refdef.stats.lights_lighttriangles++; if (batchnumtriangles >= BATCHSIZE) { + r_refdef.stats.lights_lighttriangles += batchnumtriangles; Mod_VertexRangeFromElements(batchnumtriangles*3, batchelements, &batchfirstvertex, &batchlastvertex); - R_Shadow_RenderLighting(batchfirstvertex, batchlastvertex + 1 - batchfirstvertex, batchnumtriangles, batchelements, 0, 0); + if (usebufferobject && batchnumtriangles >= 100) + R_Shadow_RenderLighting(batchfirstvertex, batchlastvertex + 1 - batchfirstvertex, batchnumtriangles, batchelements, ent->model->surfmesh.ebo, sizeof(int[3]) * batchfirsttriangle); + else + R_Shadow_RenderLighting(batchfirstvertex, batchlastvertex + 1 - batchfirstvertex, batchnumtriangles, batchelements, 0, 0); + usebufferobject = true; batchnumtriangles = 0; - usebufferobject = false; + batchfirsttriangle = m; } + batchelements[batchnumtriangles*3+0] = element3i[m*3+0]; + batchelements[batchnumtriangles*3+1] = element3i[m*3+1]; + batchelements[batchnumtriangles*3+2] = element3i[m*3+2]; + batchnumtriangles++; } - r_refdef.stats.lights_lighttriangles += batchsurfacelist[l]->num_triangles; } if (batchnumtriangles > 0) { + r_refdef.stats.lights_lighttriangles += batchnumtriangles; Mod_VertexRangeFromElements(batchnumtriangles*3, batchelements, &batchfirstvertex, &batchlastvertex); - if (usebufferobject) - R_Shadow_RenderLighting(batchfirstvertex, batchlastvertex + 1 - batchfirstvertex, batchnumtriangles, batchelements, ent->model->surfmesh.ebo, sizeof(int[3]) * batchsurfacelist[k]->num_firsttriangle); + if (usebufferobject && batchnumtriangles >= 100) + R_Shadow_RenderLighting(batchfirstvertex, batchlastvertex + 1 - batchfirstvertex, batchnumtriangles, batchelements, ent->model->surfmesh.ebo, sizeof(int[3]) * batchfirsttriangle); else R_Shadow_RenderLighting(batchfirstvertex, batchlastvertex + 1 - batchfirstvertex, batchnumtriangles, batchelements, 0, 0); } } } - else - { - // skip ahead to the next texture - for (l = k;l < batchnumsurfaces && tex == batchsurfacelist[l]->texture;l++) - ; - } } } }