/* ================== ClearOutFaces ================== */ void ClearOutFaces (node_t *node) { face_t **fp; if (node->planenum != -1) { ClearOutFaces (node->children[0]); ClearOutFaces (node->children[1]); return; } if (node->contents != CONTENTS_SOLID) return; for (fp=node->markfaces ; *fp ; fp++) { // mark all the original faces that are removed (*fp)->numpoints = 0; } node->faces = NULL; }
/* ================== ClearOutFaces ================== */ void ClearOutFaces (node_t *node) { face_t **fp; if (node->planenum != PLANENUM_LEAF) { ClearOutFaces (node->children[0]); ClearOutFaces (node->children[1]); return; } if (node->contents != CONTENTS_SOLID) return; for( fp = node->markfaces; *fp; fp++ ) { // mark all the original faces that are removed FreeWinding( (*fp)->winding ); (*fp)->winding = NULL; } node->faces = NULL; }
/* =========== FillOutside =========== */ qboolean FillOutside (node_t *node) { int s; vec_t *v; int i; qboolean inside; qprintf ("----- FillOutside ----\n"); if (nofill) { printf ("skipped\n"); return false; } inside = false; for (i=1 ; i<num_entities ; i++) { if (!VectorCompare(entities[i].origin, vec3_origin)) { if (PlaceOccupant (i, entities[i].origin, node)) inside = true; } } if (!inside) { printf ("Hullnum %i: No entities in empty space -- no filling performed\n", hullnum); return false; } s = !(outside_node.portals->nodes[1] == &outside_node); // first check to see if an occupied leaf is hit outleafs = 0; valid++; prevleaknode = NULL; if (!hullnum) { leakfile = fopen (pointfilename, "w"); if (!leakfile) Error ("Couldn't open %s\n", pointfilename); } if (RecursiveFillOutside (outside_node.portals->nodes[s], false)) { v = entities[hit_occupied].origin; qprintf ("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); qprintf ("reached occupant at: (%4.0f,%4.0f,%4.0f)\n" , v[0], v[1], v[2]); qprintf ("no filling performed\n"); if (!hullnum) fclose (leakfile); qprintf ("leak file written to %s\n", pointfilename); qprintf ("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); return false; } if (!hullnum) fclose (leakfile); // now go back and fill things in valid++; RecursiveFillOutside (outside_node.portals->nodes[s], true); // remove faces from filled in leafs ClearOutFaces (node); qprintf ("%4i outleafs\n", outleafs); return true; }
/* =========== FillOutside =========== */ qboolean FillOutside (tree_t *tree, int hullnum) { int i; int s; qboolean inside; vec3_t origin; qprintf ("----- FillOutside ----\n"); if (nofill) { printf ("skipped\n"); return false; } inside = false; for (i=1 ; i<num_entities ; i++) { GetVectorForKey (&entities[i], "origin", origin); if (DotProduct (origin, origin) >= 0.1) { if (PlaceOccupant (i, origin, tree->headnode)) inside = true; } } if (!inside) { printf ("Hullnum %i: No entities in empty space -- no filling performed\n", hullnum); return false; } s = !(outside_node.portals->nodes[1] == &outside_node); // first check to see if an occupied leaf is hit outleafs = 0; valid++; prevleaknode = NULL; if (RecursiveFillOutside (outside_node.portals->nodes[s], hullnum, false)) { if (leakfile) fclose(leakfile); leakfile = NULL; if (!hullnum) { GetVectorForKey (&entities[hit_occupied], "origin", origin); qprintf ("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); qprintf ("reached occupant at: (%4.0f,%4.0f,%4.0f)\n", origin[0], origin[1], origin[2]); qprintf ("no filling performed\n"); qprintf ("leak file written to %s\n", filename_pts); qprintf ("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); } // remove faces from filled in leafs ClearOutFaces (tree->headnode); return false; } // now go back and fill things in valid++; RecursiveFillOutside (outside_node.portals->nodes[s], hullnum, true); // remove faces from filled in leafs ClearOutFaces (tree->headnode); qprintf ("%4i outleafs\n", outleafs); return true; }