// cut the portal into two portals, one on each side of the cut plane
//
ClipWindingEpsilon (p->winding, plane->normal, plane->dist,
- SPLIT_WINDING_EPSILON, &frontwinding, &backwinding);
+ SPLIT_WINDING_EPSILON, &frontwinding, &backwinding); /* not strict, we want to always keep one of them even if coplanar */
if (frontwinding && WindingIsTiny(frontwinding))
{
if( skybox )
node->skybox = skybox;
-
- if( node->occupied || node->opaque )
+
+ if( node->opaque)
+ return;
+
+ if( node->occupied )
+ {
+ if( node->occupied > dist )
+ {
+ /* reduce distance! */
+ /* for better leak line */
+ /* note: node->occupied will also be true for all further nodes, then */
+ node->occupied = dist;
+ for( p = node->portals; p; p = p->next[ s ] )
+ {
+ s = (p->nodes[ 1 ] == node);
+ FloodPortals_r( p->nodes[ !s ], dist + 1, skybox );
+ }
+ }
return;
+ }
c_floodedleafs++;
node->occupied = dist;
=============
*/
-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;
}
/*