mirror of
https://github.com/ioquake/ioq3.git
synced 2024-11-10 07:11:46 +00:00
#6095: OpenGL2: Use areamask and leaf cluster for PVS when VIS is missing.
This commit is contained in:
parent
67d9ecd070
commit
b099255748
3 changed files with 13 additions and 36 deletions
|
@ -600,8 +600,6 @@ static void R_LoadVisibility( lump_t *l ) {
|
||||||
byte *buf;
|
byte *buf;
|
||||||
|
|
||||||
len = ( s_worldData.numClusters + 63 ) & ~63;
|
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;
|
len = l->filelen;
|
||||||
if ( !len ) {
|
if ( !len ) {
|
||||||
|
|
|
@ -1181,8 +1181,6 @@ typedef struct {
|
||||||
int clusterBytes;
|
int clusterBytes;
|
||||||
const byte *vis; // may be passed in by CM_LoadMap to save space
|
const byte *vis; // may be passed in by CM_LoadMap to save space
|
||||||
|
|
||||||
byte *novis; // clusterBytes of 0xff
|
|
||||||
|
|
||||||
char *entityString;
|
char *entityString;
|
||||||
char *entityParsePoint;
|
char *entityParsePoint;
|
||||||
} world_t;
|
} world_t;
|
||||||
|
|
|
@ -644,7 +644,7 @@ R_ClusterPVS
|
||||||
*/
|
*/
|
||||||
static const byte *R_ClusterPVS (int cluster) {
|
static const byte *R_ClusterPVS (int cluster) {
|
||||||
if (!tr.world->vis || cluster < 0 || cluster >= tr.world->numClusters ) {
|
if (!tr.world->vis || cluster < 0 || cluster >= tr.world->numClusters ) {
|
||||||
return tr.world->novis;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return tr.world->vis + cluster * tr.world->clusterBytes;
|
return tr.world->vis + cluster * tr.world->clusterBytes;
|
||||||
|
@ -698,29 +698,21 @@ static void R_MarkLeaves (void) {
|
||||||
|
|
||||||
for(i = 0; i < MAX_VISCOUNTS; i++)
|
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;
|
tr.visClusters[i] = -2;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
else if(tr.visClusters[i] == cluster)
|
||||||
|
|
||||||
// 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)
|
|
||||||
{
|
{
|
||||||
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;
|
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]);
|
vis = R_ClusterPVS(tr.visClusters[tr.visIndex]);
|
||||||
|
|
||||||
for (i=0,leaf=tr.world->nodes ; i<tr.world->numnodes ; i++, leaf++) {
|
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
|
// check general pvs
|
||||||
if ( !(vis[cluster>>3] & (1<<(cluster&7))) ) {
|
if ( vis && !(vis[cluster>>3] & (1<<(cluster&7))) ) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue