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
{
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
// 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);
}
+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
{
if (PortalPassable(p))
continue;
+ if(p->nodes[0]->cluster == p->nodes[1]->cluster)
+ continue;
// write out to the file
if (p->nodes[0] == 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;
}
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 ; )
{
p = p->next[1];
}
}
+#endif
}
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 );