home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 23 / IOPROG_23.ISO / SOFT / RAYCAST.ZIP / BSPBLOCK.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-19  |  3.3 KB  |  131 lines

  1. #include "ray.h"
  2. #include "globals.h"
  3. #include "rayfile.h"
  4. #include "bspmove.h"
  5. #include "blockbsp.h"
  6. #include "maxmins.h"
  7.  
  8. typedef struct BSP_BLOCK {
  9.    long base_x, base_y, size_x, size_y;
  10.    USHORT x_block_count, y_block_count;
  11.    PLONG * blocks;
  12.    } bsp_block;
  13.  
  14. BOOL block_bsp_loaded=FALSE;
  15. bsp_block block_bsp;
  16.  
  17. /*
  18.    Generate_BSP_Block
  19.    Calculates the block_bsp data structure, used to speed up sprite calculations
  20.    Notes: Requires that a world is loaded to run
  21. */
  22.  
  23. void Generate_BSP_Block()
  24. {
  25.    // Tell rest of program we do now have a bsp block
  26.  
  27.    block_bsp_loaded = TRUE;
  28.  
  29.    long min_x, min_y, max_x, max_y, range_x, range_y;
  30.  
  31.    Get_Map_Max_Mins(min_x, min_y, max_x, max_y);
  32.  
  33.    // Get block range
  34.  
  35.    range_x=max_x-min_x;
  36.    range_y=max_y-min_y;
  37.  
  38.    // Save info on block table
  39.  
  40.    block_bsp.base_x=min_x;
  41.    block_bsp.base_y=min_y;
  42.  
  43.    block_bsp.size_x=range_x;
  44.    block_bsp.size_y=range_y;
  45.  
  46.    block_bsp.x_block_count=range_x >> BLOCK_BSP_SHIFT;
  47.    block_bsp.y_block_count=range_y >> BLOCK_BSP_SHIFT;
  48.  
  49.    // loop through blocks in block table, saving smallest node in each block
  50.  
  51.    short cur_block_x, cur_block_y, x1, x2, y1, y2;
  52.    PLONG cur_run;
  53.  
  54.    block_bsp.blocks=(PLONG *)NewPtr(sizeof(PLONG) * block_bsp.x_block_count);
  55.    for (cur_block_x=0; cur_block_x<block_bsp.x_block_count; cur_block_x++) {
  56.       x1=block_bsp.base_x+(cur_block_x<<BLOCK_BSP_SHIFT);
  57.       x2=x1+BLOCK_BSP_SIZE;
  58.       block_bsp.blocks[cur_block_x]=(PLONG)NewPtr(sizeof(LONG) * block_bsp.y_block_count);
  59.       cur_run=block_bsp.blocks[cur_block_x];
  60.       for (cur_block_y=0; cur_block_y< block_bsp.y_block_count; cur_block_y++) {
  61.          y1=block_bsp.base_y+(cur_block_y<<BLOCK_BSP_SHIFT);
  62.          y2=y1+BLOCK_BSP_SIZE;
  63.          cur_run[cur_block_y]=Box_Smallest_Node(x1,x2,y1,y2);
  64.       } /* endfor */
  65.    } /* endfor */
  66.  
  67. }
  68.  
  69. void Clear_BSP_Block()
  70. {
  71.    if (!block_bsp_loaded) {
  72.       return;
  73.    } /* endif */
  74.    for (short cur_block_x=0; cur_block_x< block_bsp.x_block_count; cur_block_x++) {
  75.       DelPtr( block_bsp.blocks[cur_block_x]);
  76.    } /* endfor */
  77.    DelPtr( block_bsp.blocks);
  78.    block_bsp_loaded=FALSE;
  79. }
  80.  
  81. BOOL Block_BSP_Is_Loaded() {
  82.    return block_bsp_loaded;
  83. }
  84.  
  85. long Block_BSP_X_Start() {
  86.    return block_bsp.base_x;
  87. }
  88.  
  89. long Block_BSP_Y_Start() {
  90.    return block_bsp.base_y;
  91. }
  92.  
  93. USHORT Block_BSP_Max_X() {
  94.    return block_bsp.x_block_count;
  95. }
  96.  
  97. USHORT Block_BSP_Max_Y() {
  98.    return block_bsp.y_block_count;
  99. }
  100.  
  101. long Get_Block_Node(USHORT block_x, USHORT block_y)
  102. {
  103.    PLONG cur_run=block_bsp.blocks[block_x];
  104.    return cur_run[block_y];
  105. }
  106.  
  107. long Get_Closest_Node(long x, long y) {
  108.  
  109. long starting_node_index;
  110.  
  111. if (Block_BSP_Is_Loaded()) {
  112.  
  113.    long block_bsp_x, block_bsp_y;
  114.  
  115.    block_bsp_x=((x>>SHIFT) - Block_BSP_X_Start()) >> BLOCK_BSP_SHIFT;
  116.    block_bsp_y=((y>>SHIFT) - Block_BSP_Y_Start()) >> BLOCK_BSP_SHIFT;
  117.  
  118.    // Is the sprite in a block for which we have a starting index?
  119.  
  120.    if ( (block_bsp_x>=0) && (block_bsp_x<Block_BSP_Max_X())
  121.       && (block_bsp_y>=0) && (block_bsp_y<Block_BSP_Max_Y()) )
  122.  
  123.       starting_node_index=Get_Block_Node(block_bsp_x, block_bsp_y);
  124.  
  125.    else starting_node_index=bsp_start_node;
  126.  
  127. } else starting_node_index=bsp_start_node;
  128.  
  129. return starting_node_index;
  130. }
  131.