=============
*/
int PComp( const void *a, const void *b ){
- if ( ( *(vportal_t **)a )->nummightsee == ( *(vportal_t **)b )->nummightsee ) {
+ if ( ( *(const vportal_t *const *)a )->nummightsee == ( *(const vportal_t *const *)b )->nummightsee ) {
return 0;
}
- if ( ( *(vportal_t **)a )->nummightsee < ( *(vportal_t **)b )->nummightsee ) {
+ if ( ( *(const vportal_t *const *)a )->nummightsee < ( *(const vportal_t *const *)b )->nummightsee ) {
return -1;
}
return 1;
Merges the portal visibility for a leaf
===============
*/
+static int clustersizehistogram[MAX_MAP_LEAFS] = {0};
void ClusterMerge( int leafnum ){
leaf_t *leaf;
byte portalvector[MAX_PORTALS / 8];
numvis++; // count the leaf itself
- totalvis += numvis;
-
- Sys_FPrintf( SYS_VRB,"cluster %4i : %4i visible\n", leafnum, numvis );
+ //Sys_FPrintf (SYS_VRB,"cluster %4i : %4i visible\n", leafnum, numvis);
+ ++clustersizehistogram[numvis];
memcpy( bspVisBytes + VIS_HEADER_SIZE + leafnum * leafbytes, uncompressed, leafbytes );
}
==================
*/
void CalcVis( void ){
- int i;
+ int i, minvis, maxvis;
const char *value;
+ double mu, sigma, totalvis, totalvis2;
/* ydnar: rr2do2's farplane code */
for ( i = 0 ; i < portalclusters ; i++ )
ClusterMerge( i );
- Sys_Printf( "Total visible clusters: %i\n", totalvis );
- Sys_Printf( "Average clusters visible: %i\n", totalvis / portalclusters );
+ totalvis = 0;
+ totalvis2 = 0;
+ minvis = -1;
+ maxvis = -1;
+ for ( i = 0; i < MAX_MAP_LEAFS; ++i )
+ if ( clustersizehistogram[i] ) {
+ if ( debugCluster ) {
+ Sys_FPrintf( SYS_VRB, "%4i clusters have exactly %4i visible clusters\n", clustersizehistogram[i], i );
+ }
+ /* cast is to prevent integer overflow */
+ totalvis += ( (double) i ) * ( (double) clustersizehistogram[i] );
+ totalvis2 += ( (double) i ) * ( (double) i ) * ( (double) clustersizehistogram[i] );
+
+ if ( minvis < 0 ) {
+ minvis = i;
+ }
+ maxvis = i;
+ }
+
+ mu = totalvis / portalclusters;
+ sigma = sqrt( totalvis2 / portalclusters - mu * mu );
+
+ Sys_Printf( "Total clusters: %i\n", portalclusters );
+ Sys_Printf( "Total visible clusters: %.0f\n", totalvis );
+ Sys_Printf( "Average clusters visible: %.2f (%.3f%%/total)\n", mu, mu / portalclusters * 100.0 );
+ Sys_Printf( " Standard deviation: %.2f (%.3f%%/total, %.3f%%/avg)\n", sigma, sigma / portalclusters * 100.0, sigma / mu * 100.0 );
+ Sys_Printf( " Minimum: %i (%.3f%%/total, %.3f%%/avg)\n", minvis, minvis / (double) portalclusters * 100.0, minvis / mu * 100.0 );
+ Sys_Printf( " Maximum: %i (%.3f%%/total, %.3f%%/avg)\n", maxvis, maxvis / (double) portalclusters * 100.0, maxvis / mu * 100.0 );
}
/*
============
*/
void LoadPortals( char *name ){
- int i, j, hint;
+ int i, j, flags;
vportal_t *p;
leaf_t *l;
char magic[80];
Sys_Printf( "%6i numportals\n", numportals );
Sys_Printf( "%6i numfaces\n", numfaces );
+ if ( numportals > MAX_PORTALS ) {
+ Error( "MAX_PORTALS" );
+ }
+
// these counts should take advantage of 64 bit systems automatically
leafbytes = ( ( portalclusters + 63 ) & ~63 ) >> 3;
leaflongs = leafbytes / sizeof( long );
if ( numpoints > MAX_POINTS_ON_WINDING ) {
Error( "LoadPortals: portal %i has too many points", i );
}
- if ( (unsigned)leafnums[0] > portalclusters
- || (unsigned)leafnums[1] > portalclusters ) {
+ if ( leafnums[0] > portalclusters
+ || leafnums[1] > portalclusters ) {
Error( "LoadPortals: reading portal %i", i );
}
- if ( fscanf( f, "%i ", &hint ) != 1 ) {
- Error( "LoadPortals: reading hint state" );
+ if ( fscanf( f, "%i ", &flags ) != 1 ) {
+ Error( "LoadPortals: reading flags" );
}
w = p->winding = NewFixedWinding( numpoints );
for ( k = 0 ; k < 3 ; k++ )
w->points[j][k] = v[k];
}
- fscanf( f, "\n" );
+ if ( fscanf( f, "\n" ) != 0 ) {
+ // silence gcc warning
+ }
// calc plane
PlaneFromWinding( w, &plane );
l->numportals++;
p->num = i + 1;
- p->hint = hint;
+ p->hint = ((flags & 1) != 0);
+ p->sky = ((flags & 2) != 0);
p->winding = w;
VectorSubtract( vec3_origin, plane.normal, p->plane.normal );
p->plane.dist = -plane.dist;
for ( k = 0 ; k < 3 ; k++ )
w->points[j][k] = v[k];
}
- fscanf( f, "\n" );
+ if ( fscanf( f, "\n" ) != 0 ) {
+ // silence gcc warning
+ }
// calc plane
PlaneFromWinding( w, &plane );
Sys_Printf( "merge = true\n" );
mergevis = qtrue;
}
+ else if ( !strcmp( argv[i], "-mergeportals" ) ) {
+ Sys_Printf( "mergeportals = true\n" );
+ mergevisportals = qtrue;
+ }
else if ( !strcmp( argv[i], "-nopassage" ) ) {
Sys_Printf( "nopassage = true\n" );
noPassageVis = qtrue;
Sys_Printf( "saveprt = true\n" );
saveprt = qtrue;
}
+ else if ( !strcmp( argv[ i ], "-v" ) ) {
+ debugCluster = qtrue;
+ Sys_Printf( "Extra verbous mode enabled\n" );
+ }
else if ( !strcmp( argv[i],"-tmpin" ) ) {
strcpy( inbase, "/tmp" );
}
mergevis = qtrue;
}
- else{
+ else
+ {
Sys_Printf( "WARNING: Unknown option \"%s\"\n", argv[ i ] );
}
}
/* ydnar: for getting far plane */
ParseEntities();
+ /* inject command line parameters */
+ InjectCommandLine( argv, 0, argc - 1 );
+ UnparseEntities();
+
if ( mergevis ) {
MergeLeaves();
+ }
+
+ if ( mergevis || mergevisportals ) {
MergeLeafPortals();
}