home *** CD-ROM | disk | FTP | other *** search
/ PC PowerPlay 58 / pcpp58a.iso / extras / quake 3 source / Q3A_ToolSource.exe / Main / tree.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-01-02  |  2.2 KB  |  126 lines

  1. #include "qbsp.h"
  2.  
  3.  
  4. extern    int    c_nodes;
  5.  
  6. void RemovePortalFromNode (portal_t *portal, node_t *l);
  7.  
  8. node_t *NodeForPoint (node_t *node, vec3_t origin)
  9. {
  10.     plane_t    *plane;
  11.     vec_t    d;
  12.  
  13.     while (node->planenum != PLANENUM_LEAF)
  14.     {
  15.         plane = &mapplanes[node->planenum];
  16.         d = DotProduct (origin, plane->normal) - plane->dist;
  17.         if (d >= 0)
  18.             node = node->children[0];
  19.         else
  20.             node = node->children[1];
  21.     }
  22.  
  23.     return node;
  24. }
  25.  
  26.  
  27.  
  28. /*
  29. =============
  30. FreeTreePortals_r
  31. =============
  32. */
  33. void FreeTreePortals_r (node_t *node)
  34. {
  35.     portal_t    *p, *nextp;
  36.     int            s;
  37.  
  38.     // free children
  39.     if (node->planenum != PLANENUM_LEAF)
  40.     {
  41.         FreeTreePortals_r (node->children[0]);
  42.         FreeTreePortals_r (node->children[1]);
  43.     }
  44.  
  45.     // free portals
  46.     for (p=node->portals ; p ; p=nextp)
  47.     {
  48.         s = (p->nodes[1] == node);
  49.         nextp = p->next[s];
  50.  
  51.         RemovePortalFromNode (p, p->nodes[!s]);
  52.         FreePortal (p);
  53.     }
  54.     node->portals = NULL;
  55. }
  56.  
  57. /*
  58. =============
  59. FreeTree_r
  60. =============
  61. */
  62. void FreeTree_r (node_t *node)
  63. {
  64.     // free children
  65.     if (node->planenum != PLANENUM_LEAF)
  66.     {
  67.         FreeTree_r (node->children[0]);
  68.         FreeTree_r (node->children[1]);
  69.     }
  70.  
  71.     // free bspbrushes
  72.     FreeBrushList (node->brushlist);
  73.  
  74.     // free the node
  75.     if (node->volume)
  76.         FreeBrush (node->volume);
  77.  
  78.     if (numthreads == 1)
  79.         c_nodes--;
  80.     free (node);
  81. }
  82.  
  83.  
  84. /*
  85. =============
  86. FreeTree
  87. =============
  88. */
  89. void FreeTree (tree_t *tree)
  90. {
  91.     FreeTreePortals_r (tree->headnode);
  92.     FreeTree_r (tree->headnode);
  93.     free (tree);
  94. }
  95.  
  96. //===============================================================
  97.  
  98. void PrintTree_r (node_t *node, int depth)
  99. {
  100.     int        i;
  101.     plane_t    *plane;
  102.     bspbrush_t    *bb;
  103.  
  104.     for (i=0 ; i<depth ; i++)
  105.         _printf ("  ");
  106.     if (node->planenum == PLANENUM_LEAF)
  107.     {
  108.         if (!node->brushlist)
  109.             _printf ("NULL\n");
  110.         else
  111.         {
  112.             for (bb=node->brushlist ; bb ; bb=bb->next)
  113.                 _printf ("%i ", bb->original->brushnum);
  114.             _printf ("\n");
  115.         }
  116.         return;
  117.     }
  118.  
  119.     plane = &mapplanes[node->planenum];
  120.     _printf ("#%i (%5.2f %5.2f %5.2f):%5.2f\n", node->planenum,
  121.         plane->normal[0], plane->normal[1], plane->normal[2],
  122.         plane->dist);
  123.     PrintTree_r (node->children[0], depth+1);
  124.     PrintTree_r (node->children[1], depth+1);
  125. }
  126.