xmlNodePtr polyline, leaknode;
char level[ 2 ], shader[ 1024 ];
const char *value;
+ int leakStatus;
/* sets integer blockSize from worldspawn "_blocksize" key if it exists */
value = ValueForKey( &entities[ 0 ], "_blocksize" );
FilterStructuralBrushesIntoTree( e, tree );
/* see if the bsp is completely enclosed */
- if( FloodEntities( tree ) || ignoreLeaks )
- {
- /* rebuild a better bsp tree using only the sides that are visible from the inside */
- FillOutside( tree->headnode );
+ leakStatus = FloodEntities(tree);
+ if (ignoreLeaks)
+ if(leakStatus == FLOODENTITIES_LEAKED)
+ leakStatus = FLOODENTITIES_GOOD;
- /* chop the sides to the convex hull of their visible fragments, giving us the smallest polygons */
- ClipSidesIntoTree( e, tree );
-
- /* build a visible face tree */
- faces = MakeVisibleBSPFaceList( entities[ 0 ].brushes );
- FreeTree( tree );
- tree = FaceBSP( faces );
- MakeTreePortals( tree );
- FilterStructuralBrushesIntoTree( e, tree );
+ if ( leakStatus == FLOODENTITIES_GOOD )
+ {
leaked = qfalse;
-
- /* ydnar: flood again for skybox */
- if( skyboxPresent )
- FloodEntities( tree );
}
else
{
+ leaked = qtrue;
+
Sys_FPrintf( SYS_NOXML, "**********************\n" );
Sys_FPrintf( SYS_NOXML, "******* leaked *******\n" );
Sys_FPrintf( SYS_NOXML, "**********************\n" );
Sys_Printf ("--- MAP LEAKED, ABORTING LEAKTEST ---\n");
exit( 0 );
}
- leaked = qtrue;
-
+ }
+
+ if(leakStatus != FLOODENTITIES_EMPTY) /* if no entities exist, this would accidentally the whole map, and that IS bad */
+ {
+ /* rebuild a better bsp tree using only the sides that are visible from the inside */
+ FillOutside( tree->headnode );
+
/* chop the sides to the convex hull of their visible fragments, giving us the smallest polygons */
ClipSidesIntoTree( e, tree );
+
+ /* build a visible face tree (same thing as the initial bsp tree but after reducing the faces) */
+ faces = MakeVisibleBSPFaceList( entities[ 0 ].brushes );
+ FreeTree( tree );
+ tree = FaceBSP( faces );
+ MakeTreePortals( tree );
+ FilterStructuralBrushesIntoTree( e, tree );
+
+ /* ydnar: flood again for skybox */
+ if( skyboxPresent )
+ FloodEntities( tree );
}
/* save out information for visibility processing */
=============
*/
-qboolean FloodEntities( tree_t *tree )
+int FloodEntities( tree_t *tree )
{
int i, s;
vec3_t origin, offset, scale, angles;
Sys_FPrintf( SYS_VRB, "%9d flooded leafs\n", c_floodedleafs );
if( !inside )
+ {
Sys_FPrintf( SYS_VRB, "no entities in open -- no filling\n" );
- else if( tree->outside_node.occupied )
- Sys_FPrintf( SYS_VRB, "entity reached from outside -- no filling\n" );
+ return FLOODENTITIES_EMPTY;
+ }
+ if( tree->outside_node.occupied )
+ {
+ Sys_FPrintf( SYS_VRB, "entity reached from outside -- leak detected\n" );
+ return FLOODENTITIES_LEAKED;
+ }
- return (qboolean) (inside && !tree->outside_node.occupied);
+ return FLOODENTITIES_GOOD;
}
/*
qboolean PortalPassable( portal_t *p );
-qboolean FloodEntities( tree_t *tree );
+#define FLOODENTITIES_LEAKED 1
+#define FLOODENTITIES_GOOD 0
+#define FLOODENTITIES_EMPTY -1
+int FloodEntities( tree_t *tree );
void FillOutside( node_t *headnode);
void FloodAreas( tree_t *tree);
face_t *VisibleFaces( entity_t *e, tree_t *tree );