亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? blockmap.cpp

?? quake 游戲原代碼
?? CPP
字號(hào):
#include "ray.h"
#include "globals.h"
#include "blockmap.h"
#include "error.h"

pdata N_PTR=NULL;

typedef struct BLOCK_MAP {           
  long x_base, y_base, x_range, y_range;
  short x_count, y_count;
  pline_list * blocks;
  pobject_node ** objects;
  } block_map;

typedef struct LINE_LINK * pline_link;
typedef struct LINE_LINK {
  plinedef data;
  pline_link next;
  } line_link;
  
BOOL block_map_loaded=FALSE;
block_map the_block_map;

plinedef Ll_Get_Data(pline_link node) {
  return node->data;
  }

pline_link Ll_Make_Link(plinedef line_pointed_to) {
  pline_link new_link;
  new_link=(pline_link)NewPtr(sizeof(line_link));
  new_link->data=line_pointed_to;
  new_link->next=NULL;
  return new_link;
  }

void Ll_Push_Link(pline_link & base_link, pline_link push_link) {
  if (push_link==NULL)
    return;
  push_link->next=base_link;
  base_link=push_link;
  }

void Ll_Make_And_Push_Link(pline_link & base_link, plinedef line_pointed_to) {
  pline_link the_link;
  the_link=Ll_Make_Link(line_pointed_to);
  Ll_Push_Link(base_link, the_link);
  }

pline_link Ll_Get_Next_Link(pline_link cur_link) {
  if (cur_link==NULL)
    return NULL;
  return cur_link->next;
  }

BOOL Ll_Empty_Link(pline_link the_link) {
  return ((the_link == NULL) ? TRUE : FALSE); 
}

void Ll_Make_Empty(pline_link & the_link) {
  the_link=NULL;
}

void Ll_Clear_Links(pline_link & base_link)
{
pline_link cur_link, next_link;
cur_link=base_link;
while (!Ll_Empty_Link(cur_link)) {
  next_link=Ll_Get_Next_Link(cur_link);
  DelPtr(cur_link);
  cur_link=next_link;
  }
Ll_Make_Empty(base_link);
}

void Ll_Push_In_Array(pline_link ** & the_array, short x_pos, short y_pos,
   plinedef data) {

if ((x_pos>=0) && (x_pos<the_block_map.x_count) &&
    (y_pos>=0) && (y_pos<the_block_map.y_count)) {
      Ll_Make_And_Push_Link((the_array[x_pos])[y_pos],
        data);
      }

}

line_list * Get_Block_Line_List(USHORT block_x, USHORT block_y) {
if (!block_map_loaded)
  return NULL;
  
// range check
if ((block_x>=0) && (block_x<the_block_map.x_count) &&
    (block_y>=0) && (block_y<the_block_map.y_count) ) {
  line_list * base_list=the_block_map.blocks[block_x];
  return base_list+block_y;
  } else {
  return NULL;
  }
}

pobject_node * Get_Block_Obj_List(USHORT block_x, USHORT block_y) {
if (!block_map_loaded)
  return NULL;
  
// range check
if ((block_x>=0) && (block_x<the_block_map.x_count) &&
    (block_y>=0) && (block_y<the_block_map.y_count) ) {
  pobject_node * base_list=the_block_map.objects[block_x];
  return base_list+block_y;
  } else {
  return (pobject_node *)&N_PTR;
  }
}

line_list * Get_Line_List(long x, long y) {
if (!block_map_loaded)
  return NULL;
long block_x, block_y;
block_x=x-the_block_map.x_base;
block_y=y-the_block_map.y_base;
block_x>>=BLOCK_MAP_X_SHIFT;
block_y>>=BLOCK_MAP_Y_SHIFT;

// range check
if ((block_x>=0) && (block_x<the_block_map.x_count) &&
    (block_y>=0) && (block_y<the_block_map.y_count) ) {
  line_list * base_list=the_block_map.blocks[block_x];
  return base_list+block_y;
  } else {
  return NULL;
  }
}

void Generate_Block_Map() {
   block_map_loaded = TRUE;

   long min_x, min_y, max_x, max_y, range_x, range_y;
   pvector2 cur_vec;
   short counter;

   // Get min and max points of world be looping through vectors

   min_x=max_x=Vector_List[0].x;
   min_y=max_y=Vector_List[0].y;

   for (counter=1; counter < Number_Of_Vectors; counter++) {
      cur_vec=Vector_List+counter;
      if (cur_vec->x < min_x)
         min_x=cur_vec->x;
      if (cur_vec->y < min_y)
         min_y=cur_vec->y;
      if (cur_vec->x > max_x)
         max_x=cur_vec->x;
      if (cur_vec->y > max_y)
         max_y=cur_vec->y;
   }

   // Get block range

   range_x=max_x-min_x;
   range_y=max_y-min_y;

   // Save info on block table

   the_block_map.x_base=min_x;
   the_block_map.y_base=min_y;

   the_block_map.x_range=range_x;
   the_block_map.y_range=range_y;

   the_block_map.x_count=(range_x+(BLOCK_MAP_X_SIZE-1)) >> BLOCK_MAP_X_SHIFT;
   the_block_map.y_count=(range_y+(BLOCK_MAP_Y_SIZE-1)) >> BLOCK_MAP_Y_SHIFT;

   pline_link ** block_temps;
   pline_link * cur_block_line;
   short cur_x, cur_y;

   block_temps=(pline_link **)NewPtr(the_block_map.x_count * sizeof(pline_link *));

   for (cur_x=0; cur_x<the_block_map.x_count; cur_x++) {
      block_temps[cur_x]=(pline_link *)NewPtr(the_block_map.y_count *
        sizeof(pline_link));
      cur_block_line=block_temps[cur_x];
      for (cur_y=0; cur_y<the_block_map.y_count; cur_y++) {
        Ll_Make_Empty(cur_block_line[cur_y]);
      }
   }

   plinedef cur_line;
   long x1, y1, x2, y2, x_diff, y_diff, error_term, 
        x_unit, y_unit, cur_abs_x, cur_abs_y;
   short new_x, new_y;

   for (USHORT l_index=0; l_index<Number_Of_Linedefs; l_index++) {
      cur_line=Ld_List+l_index;

      // Get block map positions of start and end

      x1=(Vector_List[cur_line->v[0]].x-the_block_map.x_base);
      y1=(Vector_List[cur_line->v[0]].y-the_block_map.y_base);
      x2=(Vector_List[cur_line->v[1]].x-the_block_map.x_base);
      y2=(Vector_List[cur_line->v[1]].y-the_block_map.y_base);
      
      // setup line for bresnham's algorithym      
      
      cur_abs_x=x1;
      cur_abs_y=y1;
      cur_x=cur_abs_x>>BLOCK_MAP_X_SHIFT;
      cur_y=cur_abs_y>>BLOCK_MAP_Y_SHIFT;
      Ll_Push_In_Array(block_temps, cur_x, cur_y, cur_line);
      error_term=0;
      
      x_diff=x2-x1;
      if (x_diff<0) {
        x_diff=-x_diff;
        x_unit=-1;
      } else x_unit=1;

      y_diff=y2-y1;
      if (y_diff<0) {
        y_diff=-y_diff;
        y_unit=-1;
      } else y_unit=1;

      if (x_diff>y_diff) {

        for (short position=0; position<=x_diff; position++) {
          new_x=cur_abs_x>>BLOCK_MAP_X_SHIFT;
          new_y=cur_abs_y>>BLOCK_MAP_Y_SHIFT;
          if ((new_x!=cur_x)||(new_y!=cur_y)) {
             cur_x=new_x;
             cur_y=new_y;
             Ll_Push_In_Array(block_temps, cur_x, cur_y, cur_line);
             }
          cur_abs_x+=x_unit;
          error_term+=y_diff;
          if (error_term>=x_diff) {
            error_term-=x_diff;
            cur_abs_y+=y_unit;
            }  
          }

      } else {

        for (short position=0; position<=y_diff; position++) {
          new_x=cur_abs_x>>BLOCK_MAP_X_SHIFT;
          new_y=cur_abs_y>>BLOCK_MAP_Y_SHIFT;
          if ((new_x!=cur_x)||(new_y!=cur_y)) {
             cur_x=new_x;
             cur_y=new_y;
             Ll_Push_In_Array(block_temps, cur_x, cur_y, cur_line);
             }
          cur_abs_y+=y_unit;
          error_term+=x_diff;
          if (error_term>=y_diff) {
            error_term-=y_diff;
            cur_abs_x+=x_unit;
            } /* end if */
          } /* end for */
      } /* end if (x_diff>y_diff) */
   } /* end loop through lines */
      
pline_list cur_list_column;
pline_list cur_line_list;
pline_link cur_link;
short line_count;

the_block_map.blocks=(pline_list *)NewPtr(the_block_map.x_count*sizeof(pline_list));
for (cur_x=0; cur_x<the_block_map.x_count; cur_x++) {
  the_block_map.blocks[cur_x]=(pline_list)NewPtr(the_block_map.y_count*sizeof(line_list));
  cur_list_column=the_block_map.blocks[cur_x];
  cur_block_line=block_temps[cur_x];
  for (cur_y=0; cur_y<the_block_map.y_count; cur_y++) {
    cur_link=cur_block_line[cur_y];
    line_count=0;
    while (!Ll_Empty_Link(cur_link)) {
      cur_link=Ll_Get_Next_Link(cur_link);
      line_count++;
      }
    cur_line_list=cur_list_column+cur_y;
    cur_line_list->line_count=line_count;
    if (line_count > 0) {
      cur_line_list->lines=(plinedef *)NewPtr(line_count * sizeof(plinedef));
      cur_link=cur_block_line[cur_y];
      short cur_line=0;
      while (!Ll_Empty_Link(cur_link)) {
        cur_line_list->lines[cur_line]=Ll_Get_Data(cur_link);
        cur_link=Ll_Get_Next_Link(cur_link);
        cur_line++;
        }
    } else {
      cur_line_list->lines=NULL;
    }
    cur_link=cur_block_line[cur_y];
    Ll_Clear_Links(cur_link);
  }
  DelPtr(cur_block_line);
}
DelPtr(block_temps);

pobject_node * cur_object_list;
the_block_map.objects=(pobject_node **)NewPtr(the_block_map.x_count * sizeof(pobject_node *));
for (cur_x=0; cur_x<the_block_map.x_count; cur_x++) {
   the_block_map.objects[cur_x]=(pobject_node *)NewPtr(the_block_map.y_count * sizeof(pobject_node));
   cur_object_list=the_block_map.objects[cur_x];
   for (cur_y=0; cur_y<the_block_map.y_count; cur_y++) {
      cur_object_list[cur_y]=NULL;
   }
}

}

void Clear_Block_Map() {
if (!block_map_loaded)
  return;
short cur_x, cur_y;
pline_list cur_list_column;
for (cur_x=0; cur_x<the_block_map.x_count; cur_x++) {
  cur_list_column=the_block_map.blocks[cur_x]; 
  for (cur_y=0; cur_y<the_block_map.y_count; cur_y++) {
    if (cur_list_column[cur_y].lines!=NULL)
      DelPtr(cur_list_column[cur_y].lines);
    }
  if (the_block_map.objects[cur_x]!=NULL)
    DelPtr(the_block_map.objects[cur_x]);
  DelPtr(cur_list_column);
  }
DelPtr(the_block_map.objects);
DelPtr(the_block_map.blocks);
}

short Block_X(long real_x) {
   if (block_map_loaded)
      return ((real_x-(the_block_map.x_base<<SHIFT))>>(SHIFT+BLOCK_MAP_X_SHIFT));
   Error("Invalid call to Block_X");
   return 0;
}

short Block_Y(long real_y) {
   if (block_map_loaded)
      return ((real_y-(the_block_map.y_base<<SHIFT))>>(SHIFT+BLOCK_MAP_Y_SHIFT));
   Error("Invalid call to Block_Y");
   return 0;
}

long Block_Left_Line(long base_x) {
   if (block_map_loaded) 
      return (((((base_x-(the_block_map.x_base<<SHIFT))>>SHIFT)&BLOCK_MAP_X_AND)
         +the_block_map.x_base)<<SHIFT);
   Error("Invalid call to Block_Left_Line");
   return 0;
}

long Block_Right_Line(long base_x) {
   if (block_map_loaded) 
      return (((((base_x-(the_block_map.x_base<<SHIFT))>>SHIFT)&BLOCK_MAP_X_AND)+the_block_map.x_base+
         BLOCK_MAP_X_SIZE)<<SHIFT);
   Error("Invalid call to Block_Right_Line");
   return 0;
}

long Block_Bottom_Line(long base_y) {
   if (block_map_loaded) 
      return (((((base_y-(the_block_map.y_base<<SHIFT))>>SHIFT)&BLOCK_MAP_Y_AND)+
        the_block_map.y_base)<<SHIFT);
   Error("Invalid call to Block_Bottom_Line");
   return 0;
}

long Block_Top_Line(long base_y) {
   if (block_map_loaded) 
      return (((((base_y-(the_block_map.y_base<<SHIFT))>>SHIFT)&BLOCK_MAP_Y_AND)+the_block_map.y_base+
         BLOCK_MAP_Y_SIZE)<<SHIFT);
   Error("Invalid call to Block_Top_Line");
   return 0;
}

BOOL In_Block_X(long real_x, short block_x) {
   if (block_map_loaded)
      return ( (Block_X(real_x)==block_x) ? TRUE : FALSE);
   Error("Invalid call to In_Block_X");
   return FALSE;
}

BOOL In_Block_Y(long real_y, short block_y) {
   if (block_map_loaded)
      return ( (Block_Y(real_y)==block_y) ? TRUE : FALSE);
   Error("Invalid call to In_Block_Y");
   return FALSE;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线精品亚洲一区二区不卡| 欧美日韩另类一区| 国产91对白在线观看九色| 久久精品国产99久久6| 秋霞午夜av一区二区三区| 日韩专区在线视频| 日本午夜一本久久久综合| 五月天一区二区三区| 天天综合天天综合色| 日韩—二三区免费观看av| 天天影视色香欲综合网老头| 日欧美一区二区| 麻豆精品视频在线观看免费| 激情另类小说区图片区视频区| 久久草av在线| 国产69精品久久久久777| 粉嫩高潮美女一区二区三区| 99久久精品99国产精品| 一本大道av伊人久久综合| 欧美少妇bbb| 欧美一区二区三区免费大片| 精品国产一区二区三区忘忧草| 2024国产精品| 国产精品久久久久久久久免费相片 | 欧美激情资源网| 国产欧美一区二区在线观看| 国产精品理论片在线观看| 樱桃视频在线观看一区| 午夜欧美2019年伦理| 久久国产麻豆精品| 成av人片一区二区| 欧美影院一区二区三区| 日韩欧美aaaaaa| 欧美国产一区二区| 一区二区三区视频在线看| 日韩国产在线观看一区| 国产激情精品久久久第一区二区| 成人精品免费视频| 欧美在线观看视频一区二区三区| 日韩一区二区视频在线观看| 久久你懂得1024| 亚洲精品第一国产综合野| 蜜桃视频一区二区三区| 国产成人精品免费网站| 欧美性色黄大片| 精品粉嫩超白一线天av| 樱花草国产18久久久久| 男女激情视频一区| 91玉足脚交白嫩脚丫在线播放| 欧美日韩视频不卡| 国产日韩v精品一区二区| 亚洲制服欧美中文字幕中文字幕| 久久er99精品| 欧美午夜不卡在线观看免费| 久久久国产午夜精品| 亚洲国产一二三| 国产麻豆91精品| 欧美久久久久免费| 最新热久久免费视频| 美日韩一区二区三区| 一本一道综合狠狠老| 精品粉嫩aⅴ一区二区三区四区| 亚洲综合一区二区三区| 成人性视频免费网站| 51精品秘密在线观看| 亚洲人xxxx| 国产很黄免费观看久久| 欧美理论片在线| 亚洲人亚洲人成电影网站色| 国产一区欧美二区| 不卡的看片网站| 91网址在线看| 久久精品无码一区二区三区| 国产高清在线观看免费不卡| 26uuuu精品一区二区| 亚洲一区二区三区精品在线| 国产一区二区在线观看视频| 欧美日韩大陆在线| 亚洲精品一卡二卡| 成人综合婷婷国产精品久久蜜臀 | 国产白丝网站精品污在线入口| 欧美伊人久久久久久午夜久久久久| 国产日韩v精品一区二区| 久久精品噜噜噜成人av农村| 欧美日韩三级一区| 亚洲国产视频一区二区| 91免费观看视频| 中文字幕人成不卡一区| 国产激情偷乱视频一区二区三区| 日韩免费电影一区| 午夜免费欧美电影| 在线视频一区二区免费| 夜夜操天天操亚洲| 91久久线看在观草草青青| 国产精品素人一区二区| 国产成人av影院| 91网页版在线| 欧美精品一区二区三区久久久| 午夜精品久久久| 欧美亚洲一区二区三区四区| 亚洲男女一区二区三区| 成人爱爱电影网址| 国产精品女主播av| 91亚洲精华国产精华精华液| 国产精品久久毛片a| 99久久久免费精品国产一区二区| 久久中文字幕电影| 国产乱码字幕精品高清av| 久久―日本道色综合久久| 国产中文字幕精品| 国产欧美精品国产国产专区| jizz一区二区| 亚洲视频你懂的| 在线观看www91| 五月天丁香久久| 欧美一级二级三级乱码| 久久超碰97人人做人人爱| 国产色一区二区| av不卡免费在线观看| 亚洲精品成人在线| 51精品秘密在线观看| 精品一区二区精品| 国产欧美日韩卡一| 色婷婷久久久亚洲一区二区三区 | 97se狠狠狠综合亚洲狠狠| 亚洲猫色日本管| 欧美性大战久久| 美国三级日本三级久久99| 久久久久久久久久久久久夜| 成人avav影音| 亚洲国产一区二区三区青草影视| 欧美一区二区三区白人| 国产成人亚洲综合a∨婷婷| 国产精品福利一区| 欧美日韩在线播放三区四区| 久久99精品久久久久| 国产精品久久午夜| 欧美综合欧美视频| 国模一区二区三区白浆| 国产精品美女久久久久久久久| 色综合久久天天| 日本免费新一区视频| 日本一区二区高清| 欧美喷水一区二区| 国产99久久久国产精品| 一区二区三区在线影院| 欧美电影免费观看高清完整版在线观看 | 欧美本精品男人aⅴ天堂| 成人一区二区视频| 午夜不卡av免费| 国产婷婷色一区二区三区四区 | 一区二区在线观看视频| 日韩一级大片在线观看| 97久久精品人人爽人人爽蜜臀| 免费看黄色91| 日韩一区欧美一区| 26uuu色噜噜精品一区二区| 色婷婷精品久久二区二区蜜臂av| 另类成人小视频在线| 亚洲黄色小视频| 2017欧美狠狠色| 欧美色图一区二区三区| 国产大陆亚洲精品国产| 视频一区二区中文字幕| 中文字幕中文乱码欧美一区二区| 51精品视频一区二区三区| 色综合天天天天做夜夜夜夜做| 激情六月婷婷久久| 婷婷丁香久久五月婷婷| 亚洲欧洲美洲综合色网| 国产香蕉久久精品综合网| 欧美日韩亚州综合| 99久久免费视频.com| 国产剧情一区在线| 另类小说图片综合网| 午夜一区二区三区视频| 最新中文字幕一区二区三区 | 午夜国产不卡在线观看视频| 国产精品国模大尺度视频| 精品国产第一区二区三区观看体验| 欧美亚洲尤物久久| 色综合网站在线| 国产成人精品免费| 国产曰批免费观看久久久| 日韩电影在线免费| 亚洲国产精品麻豆| 亚洲欧美日韩国产综合| 国产精品入口麻豆九色| 久久九九全国免费| 精品福利av导航| 精品久久久网站| 欧美一区二区成人| 欧美精品 日韩| 欧美日韩高清一区二区| 欧美少妇bbb| 欧美三级视频在线| 欧美艳星brazzers| 欧美这里有精品| 欧美在线制服丝袜| 在线精品视频一区二区三四|