]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - tools/quake3/q3map2/prtfile.c
new options:
[xonotic/netradiant.git] / tools / quake3 / q3map2 / prtfile.c
index 6f36f7582cb554000541e5b6b4579199df6d86d9..7108c58973046080aa8a2815e42ebc4638ff1522 100644 (file)
@@ -63,6 +63,40 @@ void WriteFloat (FILE *f, vec_t v)
                fprintf (f,"%f ",v);
 }
 
+void CountVisportals_r(node_t *node)
+{
+       int                     i, s;   
+       portal_t        *p;
+       winding_t       *w;
+       vec3_t          normal;
+       vec_t           dist;
+
+       // decision node
+       if (node->planenum != PLANENUM_LEAF) {
+               CountVisportals_r (node->children[0]);
+               CountVisportals_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 && p->nodes[0] == node)
+               {
+                       if (!PortalPassable(p))
+                               continue;
+                       if(p->nodes[0]->cluster == p->nodes[1]->cluster)
+                               continue;
+                       ++num_visportals;
+               }
+       }
+}
+
 /*
 =================
 WritePortalFile_r
@@ -95,6 +129,9 @@ void WritePortalFile_r (node_t *node)
                {
                        if (!PortalPassable(p))
                                continue;
+                       if(p->nodes[0]->cluster == p->nodes[1]->cluster)
+                               continue;
+                       --num_visportals;
                        // write out to the file
                        
                        // sometimes planes get turned around when they are very near
@@ -102,6 +139,7 @@ void WritePortalFile_r (node_t *node)
                        // plane the same way vis will, and flip the side orders if needed
                        // FIXME: is this still relevent?
                        WindingPlane (w, normal, &dist);
+
                        if ( DotProduct (p->plane.normal, normal) < 0.99 )
                        {       // backwards...
                                fprintf (pf,"%i %i %i ",w->numpoints, p->nodes[1]->cluster, p->nodes[0]->cluster);
@@ -130,6 +168,40 @@ void WritePortalFile_r (node_t *node)
 
 }
 
+void CountSolidFaces_r (node_t *node)
+{
+       int                     i, s;   
+       portal_t        *p;
+       winding_t       *w;
+
+       // decision node
+       if (node->planenum != PLANENUM_LEAF) {
+               CountSolidFaces_r (node->children[0]);
+               CountSolidFaces_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
+
+                       ++num_solidfaces;
+               }
+       }
+}
+
 /*
 =================
 WriteFaceFile_r
@@ -160,6 +232,8 @@ void WriteFaceFile_r (node_t *node)
                {
                        if (PortalPassable(p))
                                continue;
+                       if(p->nodes[0]->cluster == p->nodes[1]->cluster)
+                               continue;
                        // write out to the file
 
                        if (p->nodes[0] == node)
@@ -197,15 +271,30 @@ void WriteFaceFile_r (node_t *node)
 NumberLeafs_r
 ================
 */
-void NumberLeafs_r (node_t *node)
+void NumberLeafs_r (node_t *node, int c)
 {
        portal_t        *p;
 
        if ( node->planenum != PLANENUM_LEAF ) {
                // decision node
                node->cluster = -99;
-               NumberLeafs_r (node->children[0]);
-               NumberLeafs_r (node->children[1]);
+
+               if(node->has_structural_children)
+               {
+#if 0
+                       if(c >= 0)
+                               Sys_FPrintf (SYS_ERR,"THIS CANNOT HAPPEN\n");
+#endif
+                       NumberLeafs_r (node->children[0], c);
+                       NumberLeafs_r (node->children[1], c);
+               }
+               else
+               {
+                       if(c < 0)
+                               c = num_visclusters++;
+                       NumberLeafs_r (node->children[0], c);
+                       NumberLeafs_r (node->children[1], c);
+               }
                return;
        }
        
@@ -217,9 +306,12 @@ void NumberLeafs_r (node_t *node)
                return;
        }
 
-       node->cluster = num_visclusters;
-       num_visclusters++;
+       if(c < 0)
+               c = num_visclusters++;
+       
+       node->cluster = c;
 
+#if 0
        // count the portals
        for (p = node->portals ; p ; )
        {
@@ -238,6 +330,7 @@ void NumberLeafs_r (node_t *node)
                        p = p->next[1];         
                }
        }
+#endif
 }
 
 
@@ -254,7 +347,9 @@ void NumberClusters(tree_t *tree) {
        Sys_FPrintf (SYS_VRB,"--- NumberClusters ---\n");
        
        // set the cluster field in every leaf and count the total number of portals
-       NumberLeafs_r (tree->headnode);
+       NumberLeafs_r (tree->headnode, -1);
+       CountVisportals_r (tree->headnode);
+       CountSolidFaces_r (tree->headnode);
 
        Sys_FPrintf( SYS_VRB, "%9d visclusters\n", num_visclusters );
        Sys_FPrintf( SYS_VRB, "%9d visportals\n", num_visportals );