SPRVOX.CPP
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:2k
源码类别:

游戏

开发平台:

Visual C++

  1. #include "ray.h"
  2. #include "asm.h"
  3. #include "rayrend.h"
  4. #include "globals.h"
  5. #include "rayspr.h"
  6. #include "sprrend.h"
  7. #include "mymem.h"
  8. #include "prevarr.h"
  9. #include "rayvb.h"
  10. #include "voxel.h"
  11. #include "mem.h"
  12. #define NO_ENTRIES_IN_TABLE     0
  13. #define VOX_SPRITES_PER_Y       5
  14. pobject_node next_drawable_node;
  15. pobject**       vox_sprite_table;
  16. Byte*            vox_sprite_count;
  17. void    Init_Vox_Sprite_Table() {
  18.    short x;
  19.  
  20.    vox_sprite_table=(pobject**)NewPtr(DIST_MAX*DIST_SCALER*sizeof(pobject*));
  21.    for(x=0;x!=(DIST_MAX*DIST_SCALER);x++) {
  22.       vox_sprite_table[x]=(pobject*)NewPtr(VOX_SPRITES_PER_Y*sizeof(pobject));
  23.       }
  24.    vox_sprite_count=(Byte *)NewPtr(DIST_MAX*DIST_SCALER*sizeof(Byte));
  25. }
  26. void Setup_Vox_Sprite_Rend(pobject_node object_list, short start_line, short end_line) {
  27.    pobject_node cur_object_node=object_list;
  28.    long sprite_y;
  29.    BOOL found_valid_y;
  30.    Translate_Object_Vectors(object_list);
  31.    
  32.    memset(vox_sprite_count, NO_ENTRIES_IN_TABLE ,
  33.         (end_line) * DIST_SCALER * sizeof(Byte));
  34.    while(!OL_Empty_Node(cur_object_node)) {
  35.      sprite_y=Sprite_Y(cur_object_node)>>SHIFT;
  36.      if (cur_object_node->data->type->Render_Func==Draw_Flat_Sprite) {
  37.         sprite_y=1;
  38.      }
  39.      if (sprite_y>0) {
  40.         found_valid_y=FALSE;
  41.         while (sprite_y<(end_line*DIST_SCALER)) {
  42.            if (vox_sprite_count[sprite_y]<VOX_SPRITES_PER_Y) {
  43.               found_valid_y=TRUE;
  44.               break;
  45.            } /* endif */
  46.            sprite_y++;
  47.         }
  48.         if (found_valid_y)
  49.            vox_sprite_table[sprite_y][vox_sprite_count[sprite_y]++]=cur_object_node->data;
  50.      }
  51.      cur_object_node=OL_Next_Node(cur_object_node);
  52.      }              
  53. }
  54. void Do_Vox_Sprite_Line(long y) {
  55.    short absolute_y;
  56.    short cur_object;
  57.    for(absolute_y=y; absolute_y!=(y+DIST_SCALER);absolute_y++) {
  58.       for(cur_object=0;cur_object!=vox_sprite_count[absolute_y];cur_object++) {
  59.          (*vox_sprite_table[absolute_y][cur_object]->type->Render_Func)(vox_sprite_table[absolute_y][cur_object]);
  60.          }
  61.       }
  62. }
  63. void Render_Vox_Sprites() {
  64.   if (wall_run_count>0) {
  65.      Render_Sliver_asm();
  66.   } /* endif */
  67. }