static void R_View_WorldVisibility_CullSurfaces(void)
{
int surfaceindex;
- int surfaceindexstart;
- int surfaceindexend;
unsigned char *surfacevisible;
msurface_t *surfaces;
model_t *model = r_refdef.scene.worldmodel;
return;
if (r_usesurfaceculling.integer < 1)
return;
- surfaceindexstart = model->firstmodelsurface;
- surfaceindexend = surfaceindexstart + model->nummodelsurfaces;
surfaces = model->data_surfaces;
surfacevisible = r_refdef.viewcache.world_surfacevisible;
- for (surfaceindex = surfaceindexstart; surfaceindex < surfaceindexend; surfaceindex++)
+ for (surfaceindex = model->submodelsurfaces_start; surfaceindex < model->submodelsurfaces_end; surfaceindex++)
{
if (surfacevisible[surfaceindex])
{
if (!model)
return;
- if (r_refdef.view.usecustompvs)
- {
- // clear the visible surface and leaf flags arrays
- memset(r_refdef.viewcache.world_surfacevisible, 0, model->num_surfaces);
+ if (r_lockvisibility.integer)
+ return;
+
+ // clear the visible surface and leaf flags arrays
+ memset(r_refdef.viewcache.world_surfacevisible, 0, model->num_surfaces);
+ if(!r_lockpvs.integer)
memset(r_refdef.viewcache.world_leafvisible, 0, model->brush.num_leafs);
- r_refdef.viewcache.world_novis = false;
+ r_refdef.viewcache.world_novis = false;
+
+ if (r_refdef.view.usecustompvs)
+ {
// simply cull each marked leaf to the frustum (view pyramid)
for (j = 0, leaf = model->brush.data_leafs;j < model->brush.num_leafs;j++, leaf++)
{
r_refdef.viewcache.world_surfacevisible[*mark] = true;
}
}
- R_View_WorldVisibility_CullSurfaces();
- return;
}
-
- // if possible find the leaf the view origin is in
- viewleaf = model->brush.PointInLeaf ? model->brush.PointInLeaf(model, r_refdef.view.origin) : NULL;
- // if possible fetch the visible cluster bits
- if (!r_lockpvs.integer && model->brush.FatPVS)
- model->brush.FatPVS(model, r_refdef.view.origin, 2, r_refdef.viewcache.world_pvsbits, (r_refdef.viewcache.world_numclusters+7)>>3, false);
-
- if (!r_lockvisibility.integer)
+ else
{
- // clear the visible surface and leaf flags arrays
- memset(r_refdef.viewcache.world_surfacevisible, 0, model->num_surfaces);
- memset(r_refdef.viewcache.world_leafvisible, 0, model->brush.num_leafs);
-
- r_refdef.viewcache.world_novis = false;
+ // if possible find the leaf the view origin is in
+ viewleaf = model->brush.PointInLeaf ? model->brush.PointInLeaf(model, r_refdef.view.origin) : NULL;
+ // if possible fetch the visible cluster bits
+ if (!r_lockpvs.integer && model->brush.FatPVS)
+ model->brush.FatPVS(model, r_refdef.view.origin, 2, r_refdef.viewcache.world_pvsbits, (r_refdef.viewcache.world_numclusters+7)>>3, false);
// if floating around in the void (no pvs data available, and no
// portals available), simply use all on-screen leafs.
}
}
}
- R_View_WorldVisibility_CullSurfaces();
}
+
+ // Cull the rest
+ R_View_WorldVisibility_CullSurfaces();
}
void R_Mod_DrawSky(entity_render_t *ent)
void R_Mod_DrawAddWaterPlanes(entity_render_t *ent)
{
- int i, j, n, flagsmask;
+ int i, n, flagsmask;
model_t *model = ent->model;
msurface_t *surfaces;
if (model == NULL)
// add visible surfaces to draw list
if (ent == r_refdef.scene.worldentity)
{
- for (i = 0;i < model->nummodelsurfaces;i++)
- {
- j = model->sortedmodelsurfaces[i];
- if (r_refdef.viewcache.world_surfacevisible[j])
- if (surfaces[j].texture->basematerialflags & flagsmask)
- R_Water_AddWaterPlane(surfaces + j, 0);
- }
+ for (i = model->submodelsurfaces_start;i < model->submodelsurfaces_end;i++)
+ if (r_refdef.viewcache.world_surfacevisible[i])
+ if (surfaces[i].texture->basematerialflags & flagsmask)
+ R_Water_AddWaterPlane(surfaces + i, 0);
}
else
{
n = ent->entitynumber;
else
n = 0;
- for (i = 0;i < model->nummodelsurfaces;i++)
- {
- j = model->sortedmodelsurfaces[i];
- if (surfaces[j].texture->basematerialflags & flagsmask)
- R_Water_AddWaterPlane(surfaces + j, n);
- }
+ for (i = model->submodelsurfaces_start;i < model->submodelsurfaces_end;i++)
+ if (surfaces[i].texture->basematerialflags & flagsmask)
+ R_Water_AddWaterPlane(surfaces + i, n);
}
rsurface.entity = NULL; // used only by R_GetCurrentTexture and RSurf_ActiveModelEntity
}
info->outnumleafs = 0;
info->outnumsurfaces = 0;
memset(info->outleafpvs, 0, (info->model->brush.num_leafs + 7) >> 3);
- memset(info->outsurfacepvs, 0, (info->model->nummodelsurfaces + 7) >> 3);
+ memset(info->outsurfacepvs, 0, (info->model->num_surfaces + 7) >> 3);
memset(info->outshadowtrispvs, 0, (info->model->surfmesh.num_triangles + 7) >> 3);
memset(info->outlighttrispvs, 0, (info->model->surfmesh.num_triangles + 7) >> 3);
}
VectorCopy(info.relativelightorigin, info.outmaxs);
memset(visitingleafpvs, 0, (info.model->brush.num_leafs + 7) >> 3);
memset(outleafpvs, 0, (info.model->brush.num_leafs + 7) >> 3);
- memset(outsurfacepvs, 0, (info.model->nummodelsurfaces + 7) >> 3);
+ memset(outsurfacepvs, 0, (info.model->num_surfaces + 7) >> 3);
memset(outshadowtrispvs, 0, (info.model->surfmesh.num_triangles + 7) >> 3);
memset(outlighttrispvs, 0, (info.model->surfmesh.num_triangles + 7) >> 3);
if (info.model->brush.GetPVS && !info.noocclusion)