/* ============= CheckAreas_r ============= */ void CheckAreas_r (node_t *node) { brush_t *b; if (node->planenum != PLANENUM_LEAF) { CheckAreas_r (node->children[0]); CheckAreas_r (node->children[1]); return; } if (node->opaque) return; if (node->cluster != -1) if (node->area == -1) Sys_Printf("WARNING: cluster %d has area set to -1\n", node->cluster); if (node->areaportal) { b = node->brushlist->original; // check if the areaportal touches two areas if (b->portalareas[0] == -1 || b->portalareas[1] == -1) Sys_Printf ("WARNING: areaportal brush %i doesn't touch two areas\n", b->brushNum); } }
/* ============ CheckAreas_r ============ */ void CheckAreas_r( node_t *node ) { if( node->planenum != PLANENUM_LEAF ) { CheckAreas_r( node->children[0] ); CheckAreas_r( node->children[1] ); return; } if( !node->opaque && node->area < 0 ) { common->Error( "CheckAreas_r: area = %i", node->area ); } }
/* ============= FloodAreas Mark each leaf with an area, bounded by CONTENTS_AREAPORTAL Sets e->areas.numAreas ============= */ void FloodAreas( uEntity_t *e ) { common->Printf( "--- FloodAreas ---\n" ); // set all areas to -1 ClearAreas_r( e->tree->headnode ); // flood fill from non-opaque areas c_areas = 0; FindAreas_r( e->tree->headnode ); common->Printf( "%5i areas\n", c_areas ); e->numAreas = c_areas; // make sure we got all of them CheckAreas_r( e->tree->headnode ); // identify all portals between areas if this is the world if( e == &dmapGlobals.uEntities[0] ) { numInterAreaPortals = 0; FindInterAreaPortals_r( e->tree->headnode ); } }