#6095: OpenGL2: Use areamask and leaf cluster for PVS when VIS is missing.

This commit is contained in:
SmileTheory 2014-03-19 17:59:07 -07:00
parent 67d9ecd070
commit b099255748
3 changed files with 13 additions and 36 deletions

View file

@ -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 ) {

View file

@ -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;

View file

@ -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 ; 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++) {
@ -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;
}