From b099255748edaec547242e7f165c4016a8bad69b Mon Sep 17 00:00:00 2001 From: SmileTheory Date: Wed, 19 Mar 2014 17:59:07 -0700 Subject: [PATCH] #6095: OpenGL2: Use areamask and leaf cluster for PVS when VIS is missing. --- code/renderergl2/tr_bsp.c | 2 -- code/renderergl2/tr_local.h | 2 -- code/renderergl2/tr_world.c | 45 +++++++++++-------------------------- 3 files changed, 13 insertions(+), 36 deletions(-) diff --git a/code/renderergl2/tr_bsp.c b/code/renderergl2/tr_bsp.c index 2198646e..63824284 100644 --- a/code/renderergl2/tr_bsp.c +++ b/code/renderergl2/tr_bsp.c @@ -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 ) { diff --git a/code/renderergl2/tr_local.h b/code/renderergl2/tr_local.h index 2e4b3e5e..d5ebe544 100644 --- a/code/renderergl2/tr_local.h +++ b/code/renderergl2/tr_local.h @@ -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; diff --git a/code/renderergl2/tr_world.c b/code/renderergl2/tr_world.c index dba15c45..f4edbb03 100644 --- a/code/renderergl2/tr_world.c +++ b/code/renderergl2/tr_world.c @@ -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; @@ -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; @@ -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 ; inumnodes ; 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 ; inumnodes ; i++, leaf++) { @@ -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; }