Skip to content

Commit

Permalink
#6095: OpenGL2: Use areamask and leaf cluster for PVS when VIS is mis…
Browse files Browse the repository at this point in the history
…sing.
  • Loading branch information
SmileTheory committed Mar 20, 2014
1 parent 67d9ecd commit b099255
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 36 deletions.
2 changes: 0 additions & 2 deletions code/renderergl2/tr_bsp.c
Expand Up @@ -600,8 +600,6 @@ static void R_LoadVisibility( lump_t *l ) {
byte *buf;

len = ( s_worldData.numClusters + 63 ) & ~63;
s_worldData.novis = ri.Hunk_Alloc( len, h_low );
Com_Memset( s_worldData.novis, 0xff, len );

len = l->filelen;
if ( !len ) {
Expand Down
2 changes: 0 additions & 2 deletions code/renderergl2/tr_local.h
Expand Up @@ -1181,8 +1181,6 @@ typedef struct {
int clusterBytes;
const byte *vis; // may be passed in by CM_LoadMap to save space

byte *novis; // clusterBytes of 0xff

char *entityString;
char *entityParsePoint;
} world_t;
Expand Down
45 changes: 13 additions & 32 deletions code/renderergl2/tr_world.c
Expand Up @@ -644,7 +644,7 @@ R_ClusterPVS
*/
static const byte *R_ClusterPVS (int cluster) {
if (!tr.world->vis || cluster < 0 || cluster >= tr.world->numClusters ) {
return tr.world->novis;
return NULL;
}

return tr.world->vis + cluster * tr.world->clusterBytes;
Expand Down Expand Up @@ -698,29 +698,21 @@ static void R_MarkLeaves (void) {

for(i = 0; i < MAX_VISCOUNTS; i++)
{
if(tr.visClusters[i] == cluster)
// if the areamask or r_showcluster was modified, invalidate all visclusters
// this caused doors to open into undrawn areas
if (tr.refdef.areamaskModified || r_showcluster->modified)
{
//tr.visIndex = i;
break;
tr.visClusters[i] = -2;
}
}

// if r_showcluster was just turned on, remark everything
if(i != MAX_VISCOUNTS && !tr.refdef.areamaskModified && !r_showcluster->modified)// && !r_dynamicBspOcclusionCulling->modified)
{
if(tr.visClusters[i] != tr.visClusters[tr.visIndex] && r_showcluster->integer)
else if(tr.visClusters[i] == cluster)
{
ri.Printf(PRINT_ALL, "found cluster:%i area:%i index:%i\n", cluster, leaf->area, i);
if(tr.visClusters[i] != tr.visClusters[tr.visIndex] && r_showcluster->integer)
{
ri.Printf(PRINT_ALL, "found cluster:%i area:%i index:%i\n", cluster, leaf->area, i);
}
tr.visIndex = i;
return;
}
tr.visIndex = i;
return;
}

// if the areamask was modified, invalidate all visclusters
// this caused doors to open into undrawn areas
if (tr.refdef.areamaskModified)
{
memset(tr.visClusters, -2, sizeof(tr.visClusters));
}

tr.visIndex = (tr.visIndex + 1) % MAX_VISCOUNTS;
Expand All @@ -734,17 +726,6 @@ static void R_MarkLeaves (void) {
}
}

// set all nodes to visible if there is no vis
// this caused some levels to simply not render
if (r_novis->integer || !tr.world->vis || tr.visClusters[tr.visIndex] == -1) {
for (i=0 ; i<tr.world->numnodes ; i++) {
if (tr.world->nodes[i].contents != CONTENTS_SOLID) {
tr.world->nodes[i].visCounts[tr.visIndex] = tr.visCounts[tr.visIndex];
}
}
return;
}

vis = R_ClusterPVS(tr.visClusters[tr.visIndex]);

for (i=0,leaf=tr.world->nodes ; i<tr.world->numnodes ; i++, leaf++) {
Expand All @@ -754,7 +735,7 @@ static void R_MarkLeaves (void) {
}

// check general pvs
if ( !(vis[cluster>>3] & (1<<(cluster&7))) ) {
if ( vis && !(vis[cluster>>3] & (1<<(cluster&7))) ) {
continue;
}

Expand Down

0 comments on commit b099255

Please sign in to comment.