/* ================= WriteFaceFile_r ================= */ void WriteFaceFile_r (node_t *node) { int i, s; portal_t *p; winding_t *w; // decision node if (node->planenum != PLANENUM_LEAF) { WriteFaceFile_r (node->children[0]); WriteFaceFile_r (node->children[1]); return; } if (node->opaque) { return; } for (p = node->portals ; p ; p=p->next[s]) { w = p->winding; s = (p->nodes[1] == node); if (w) { if (PortalPassable(p)) continue; if(p->nodes[0]->cluster == p->nodes[1]->cluster) continue; // write out to the file if (p->nodes[0] == node) { fprintf (pf,"%i %i ",w->numpoints, p->nodes[0]->cluster); for (i=0 ; i<w->numpoints ; i++) { fprintf (pf,"("); WriteFloat (pf, w->p[i][0]); WriteFloat (pf, w->p[i][1]); WriteFloat (pf, w->p[i][2]); fprintf (pf,") "); } fprintf (pf,"\n"); } else { fprintf (pf,"%i %i ",w->numpoints, p->nodes[1]->cluster); for (i = w->numpoints-1; i >= 0; i--) { fprintf (pf,"("); WriteFloat (pf, w->p[i][0]); WriteFloat (pf, w->p[i][1]); WriteFloat (pf, w->p[i][2]); fprintf (pf,") "); } fprintf (pf,"\n"); } } } }
/* ================ WritePortalFile ================ */ void WritePortalFile (tree_t *tree) { char filename[1024]; Sys_FPrintf (SYS_VRB,"--- WritePortalFile ---\n"); // write the file sprintf (filename, "%s.prt", source); Sys_Printf ("writing %s\n", filename); pf = fopen (filename, "w"); if (!pf) Error ("Error opening %s", filename); fprintf (pf, "%s\n", PORTALFILE); fprintf (pf, "%i\n", num_visclusters); fprintf (pf, "%i\n", num_visportals); fprintf (pf, "%i\n", num_solidfaces); WritePortalFile_r(tree->headnode); WriteFaceFile_r(tree->headnode); fclose (pf); }