home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 5 / MA_Cover_5.iso / ppc / qmapwos / src / bsp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-06-09  |  2.5 KB  |  99 lines

  1. /* QMAP: Quake level viewer
  2.  *
  3.  *    bsp.c   Copyright 1997 Sean Barrett
  4.  *
  5.  *    routines that recurse through bsp tree
  6.  */
  7.  
  8. #include "bspfile.h"
  9. #include "3d.h"
  10. #include "bsp.h"
  11. #include "render.h"
  12.  
  13. int point_plane_test(vector *loc, dplane_t *plane)
  14. {
  15.    return plane->normal[0] * loc->x + plane->normal[1] * loc->y
  16.         + plane->normal[2]*loc->z < plane->dist;
  17. }
  18.  
  19. int find_leaf(vector *loc)
  20. {
  21.    int n = dmodels[0].headnode[0];
  22.    while (n >= 0) {
  23.       dnode_t *node = &dnodes[n];
  24.       n = node->children[point_plane_test(loc, &dplanes[node->planenum])];
  25.    }   
  26.    return ~n;
  27. }
  28.  
  29. char vis_node[MAX_MAP_NODES];
  30. extern char vis_leaf[];
  31.  
  32. static dplane_t *planes;
  33. static vector *loc;
  34.  
  35. void bsp_render_node(int node)
  36. {
  37.     if (node >= 0 && vis_node[node]) {
  38.        if (point_plane_test(loc, &dplanes[dnodes[node].planenum])) {
  39.           bsp_render_node(dnodes[node].children[0]);
  40.           render_node_faces(node, 1);
  41.           bsp_render_node(dnodes[node].children[1]);
  42.        } else {
  43.           bsp_render_node(dnodes[node].children[1]);
  44.           render_node_faces(node, 0);
  45.           bsp_render_node(dnodes[node].children[0]);
  46.        }
  47.    }
  48. }
  49.  
  50. void bsp_render_world(vector *cam_loc, dplane_t *pl)
  51. {
  52.    planes = pl;
  53.    loc = cam_loc;
  54.    bsp_render_node((int) dmodels[0].headnode[0]);
  55. }
  56.  
  57. // recursively determine which nodes need exploring (so we
  58. // don't look for polygons on _every_ node in the level)
  59. int bsp_find_visible_nodes(int node)
  60. {
  61.    if (node >= 0) {
  62.       vis_node[node] = !!(bsp_find_visible_nodes(dnodes[node].children[0])
  63.                        | bsp_find_visible_nodes(dnodes[node].children[1]));
  64.       return vis_node[node];
  65.    }
  66.    else {
  67.       node = ~node;
  68.       return (vis_leaf[node >> 3] & (1 << (node & 7)));
  69.    }
  70. }
  71.  
  72. void bsp_explore_node(int node)
  73. {
  74.    if (node < 0) {
  75.       node = ~node;
  76.       if (vis_leaf[node >> 3] & (1 << (node & 7)))
  77.          if (leaf_in_frustrum(&dleafs[node], planes))
  78.             mark_leaf_faces(node);
  79.       return;
  80.    }
  81.  
  82.    if (vis_node[node]) {
  83.       if (!node_in_frustrum(&dnodes[node], planes))
  84.          vis_node[node] = 0;
  85.       else {
  86.          bsp_explore_node(dnodes[node].children[0]);
  87.          bsp_explore_node(dnodes[node].children[1]);
  88.       }
  89.    }
  90. }
  91.  
  92. void bsp_visit_visible_leaves(vector *cam_loc, dplane_t *pl)
  93. {
  94.    planes = pl;
  95.    loc = cam_loc;
  96.    bsp_find_visible_nodes((int) dmodels[0].headnode[0]);
  97.    bsp_explore_node((int) dmodels[0].headnode[0]);
  98. }
  99.