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

游戏

开发平台:

Visual C++

  1. #include "ray.h"
  2. #include "rayrt.h"
  3. #include <stddef.h>
  4. #define VB_NULL -1
  5. extern "C" vb_node_index vb_next_free_node, vb_start_node;
  6. extern "C" vb_node * bounds;
  7. inline vb_node * VB_GetFirstNode()
  8. {
  9.    return (bounds + vb_start_node);
  10. }
  11. inline void VB_InitList()
  12. {
  13.    vb_next_free_node=0; vb_start_node=0;
  14.    bounds[0].left=0;
  15.    bounds[0].right=WINDOW_WIDTH;
  16.    bounds[0].next_node=VB_NULL; bounds[0].back_node=VB_NULL;
  17. }
  18. inline vb_node_index VB_AllocateNode()
  19. {
  20.    vb_next_free_node++;
  21.    return vb_next_free_node;
  22. }
  23. inline vb_node * VB_GetNextNode(vb_node * base)
  24. {
  25.    if (base->next_node==VB_NULL) {
  26.       return NULL;
  27.    } else {
  28.       return (bounds + (base->next_node));
  29.    } /* endif */
  30. }
  31. inline vb_node * VB_DeleteNode(vb_node * delete_node)
  32. {
  33.    if (delete_node->back_node == VB_NULL) {
  34.       vb_start_node=delete_node->next_node;
  35.       if (vb_start_node == VB_NULL) 
  36.          return NULL;
  37.       else return (bounds+vb_start_node);
  38.    } else {
  39.       if (delete_node->next_node == VB_NULL) {
  40.          bounds[delete_node->back_node].next_node=VB_NULL;
  41.          return NULL;
  42.       } else {
  43.       bounds[delete_node->back_node].next_node=delete_node->next_node;
  44.       bounds[delete_node->next_node].back_node=delete_node->back_node;
  45.       return bounds+delete_node->next_node;
  46.       }
  47.    } /* endif */
  48. }
  49. inline void VB_AttachNode(vb_node * base_node, vb_node_index next_node)
  50. {
  51.    short base_node_index=(short)(base_node-bounds);
  52.    if (next_node!=NULL)
  53.       bounds[next_node].back_node=base_node_index;
  54.    base_node->next_node=next_node;
  55. }
  56. // Cut a section out of visible boundaries. Precondition: start>=end
  57. inline void VB_CoverSection(vb_node * & base_node, SHORT start, SHORT end)
  58. {
  59.    if ((start > base_node->right) || (end <= base_node->left)) 
  60.      return;
  61.    if (start <= base_node->left) {
  62.       if (end >= base_node->right) {
  63.          base_node=VB_DeleteNode(base_node);
  64.       } else {
  65.          base_node->left=end;
  66.       } /* endif */
  67.       return;
  68.    } /* endif */
  69.    if (end >= base_node->right) {
  70.       base_node->right=start; 
  71.       return;
  72.    } /* endif */
  73.    vb_node_index next_node=VB_AllocateNode();
  74.    VB_AttachNode((bounds + next_node), base_node->next_node);
  75.    VB_AttachNode(base_node, next_node);
  76.    bounds[next_node].left=end;
  77.    bounds[next_node].right=base_node->right;
  78.    base_node->right=start;
  79.    base_node=bounds+next_node;
  80. }
  81. inline BOOL VB_EmptyList()
  82. {
  83.    return ((vb_start_node == VB_NULL) ? TRUE : FALSE);
  84. }