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

游戏

开发平台:

Visual C++

  1. #include "ray.h"
  2. #include "globals.h"
  3. #include "rgobject.h"
  4. #include "rayfile.h"
  5. #include "texconst.h"
  6. #include "utils.h"
  7. void FlipBMP(Ptr data, unsigned short width, unsigned short height);
  8. void Flip_Vert_BMP(PUCHAR source_image, USHORT width, USHORT height);    
  9. void F_Get_Wall_Textures()
  10. {
  11.    if (wall_tex_loaded)
  12.       F_Clear_WT();
  13.    wall_tex_loaded=TRUE;
  14.    short dir_index=F_Find_Dir("WALLTEXS");
  15.    if (dir_index==-1)
  16.       return;
  17.    F_Seek(directory[dir_index].start);
  18.    short num_straight_tex;
  19.    F_Get_Short(num_straight_tex);
  20.    char filename[13];       
  21.    RCastGobject texturetemp(num_straight_tex);
  22.    texturetemp.Hold();
  23.    short next_image_num;
  24.    short counter, counter2;
  25.    // in order that we can use animated maps, we first
  26.    // read the textures linearly, into one resource.
  27.    // we then read a list of animation arrangments
  28.    // so that multiple animations can be arranged from the same textures
  29.    Number_Of_Textures=directory[dir_index].length+1;
  30.    wall=(wall_entry *)NewPtr((Number_Of_Textures) * sizeof(wall_entry));
  31.    wall[0].num_image=num_straight_tex;
  32.    wall[0].images=(Byte **)NewPtr(num_straight_tex * sizeof(Byte *));
  33.    wall[0].width=0;
  34.    wall[0].height=0;
  35.    wall[0].shift=0;
  36.    for (counter=0; counter < num_straight_tex; counter++) {
  37.       F_Get_String_NT(filename, F_NAME_LENGTH);
  38.       texturetemp.assigninfile(filename);
  39.       texturetemp.load(counter);
  40.       FlipBMP(texturetemp.Image(counter), texturetemp.Width(), texturetemp.Height());
  41.       wall[0].images[counter]=texturetemp.Image(counter);
  42.    } /* endfor */
  43.    for (counter=1; counter < Number_Of_Textures; counter++) {
  44.       wall[counter].cur_image=0;
  45.       wall[counter].anim_sum=0;
  46.       F_Get_Short(wall[counter].num_image);
  47.       F_Get_Long(wall[counter].anim_speed);
  48.       F_Get_Short(wall[counter].width);
  49.       F_Get_Short(wall[counter].height);
  50.       wall[counter].shift=Check2Shift(wall[counter].height);
  51.       wall[counter].images=(Byte **)NewPtr(wall[counter].num_image * sizeof(Byte *));
  52.       for (counter2=0; counter2 < wall[counter].num_image; counter2++) {
  53.          F_Get_Short(next_image_num);
  54.          wall[counter].images[counter2]=wall[0].images[next_image_num];
  55.       } /* endfor */
  56.    } /* endfor */
  57. }
  58. void FlipBMP(Ptr data, unsigned short width, unsigned short height)
  59. {
  60. Ptr tempptr=NewPtr(sizeof(char)*width*height);
  61. for (int i=0; i<height; i++) {
  62.    for (int j=0; j<width; j++) {
  63.       tempptr[j*height+i]=data[i*width+j];
  64.    } /* endfor */
  65. }
  66. memcpy(data,tempptr,(sizeof(char)*width*height));
  67. DelPtr( tempptr);
  68. }
  69. void F_Clear_WT()
  70. {
  71.    short counter1;
  72.    for (counter1=0; counter1 < wall[0].num_image; counter1++) {
  73.       delete wall[0].images[counter1];
  74.    }
  75.    for (counter1=0; counter1 < Number_Of_Textures; counter1++) {
  76.       if (wall[counter1].images!=NULL)
  77.         DelPtr( wall[counter1].images);
  78.    } /* endfor */
  79.    DelPtr( wall);
  80. }
  81.     
  82. void F_Get_Floor_Textures()
  83. {
  84.    if (floor_tex_loaded)
  85.       F_Clear_FT();
  86.    floor_tex_loaded=TRUE;
  87.    short dir_index=F_Find_Dir("FLOORTEX");
  88.    if (dir_index==-1)
  89.       return;
  90.    F_Seek(directory[dir_index].start);
  91.    short num_straight_tex;
  92.    F_Get_Short(num_straight_tex);
  93.    char filename[13];       
  94.    RCastGobject texturetemp(num_straight_tex);
  95.    texturetemp.Hold();
  96.    short next_image_num;
  97.    short counter, counter2;
  98.    short tex_list_num;
  99.    // in order that we can use animated maps, we first
  100.    // read the textures linearly, into one resource.
  101.    // we then read a list of animation arrangments
  102.    // so that multiple animations can be arranged from the same textures
  103.    Number_Of_FTs=directory[dir_index].length+2;
  104.    tex_list_num=Number_Of_FTs-1;
  105.    floortex=(wall_entry *)NewPtr((Number_Of_FTs) * sizeof(wall_entry));
  106.    floortex[tex_list_num].num_image=num_straight_tex;
  107.    floortex[tex_list_num].images=(Byte **)NewPtr(num_straight_tex * sizeof(Byte *));
  108.    for (counter=0; counter < num_straight_tex; counter++) {
  109.       F_Get_String_NT(filename, 13);
  110.       texturetemp.assigninfile(filename);
  111.       texturetemp.load(counter);
  112.       Flip_Vert_BMP(texturetemp.Image(counter), texturetemp.Width(), texturetemp.Height());
  113.       floortex[tex_list_num].images[counter]=texturetemp.Image(counter);
  114.    } /* endfor */
  115.    for (counter=0; counter < (Number_Of_FTs-2); counter++) {
  116.       floortex[counter].cur_image=0;
  117.       floortex[counter].anim_sum=0;
  118.       F_Get_Short(floortex[counter].num_image);
  119.       F_Get_Long(floortex[counter].anim_speed);
  120.       floortex[counter].width=FLOOR_WIDTH;
  121.       floortex[counter].height=FLOOR_HEIGHT;
  122.       floortex[counter].shift=FLOOR_SHIFT;
  123.       floortex[counter].images=(Byte **)NewPtr(floortex[counter].num_image * sizeof(Byte *));
  124.       for (counter2=0; counter2 < floortex[counter].num_image; counter2++) {
  125.          F_Get_Short(next_image_num);
  126.          floortex[counter].images[counter2]=floortex[tex_list_num].images[next_image_num];
  127.       } /* endfor */
  128.    } /* endfor */
  129.    F_Get_Sky();
  130. }
  131. void Flip_Vert_BMP(PUCHAR source_image, USHORT width, USHORT height)
  132. {
  133. USHORT rev_y, norm_y, x;
  134. PUCHAR dest_image;
  135. if ((dest_image=NewPtr(width*height*sizeof(UCHAR)))==NULL)
  136.   return;
  137. rev_y=height-1;
  138. for (norm_y=0; norm_y<height; norm_y++) {
  139.   for (x=0; x<width; x++) {
  140.     dest_image[norm_y*width+x]=source_image[rev_y*width+x];
  141.   }
  142.   rev_y--;
  143. }
  144. memcpy(source_image, dest_image, width * height * sizeof(UCHAR));
  145. DelPtr( dest_image);
  146. }
  147. void F_Clear_FT()
  148. {
  149.    short counter1;
  150.    for (counter1=0; counter1 < floortex[Number_Of_FTs-1].num_image; counter1++) {
  151.       delete floortex[Number_Of_FTs-1].images[counter1];
  152.    }
  153.    F_Clear_Sky();
  154.    for (counter1=0; counter1< (Number_Of_FTs); counter1++) {
  155.       if (floortex[counter1].images!=NULL)
  156.       DelPtr( floortex[counter1].images);
  157.    } /* endfor */
  158.    DelPtr( floortex);
  159. }
  160. void F_Get_Sky()
  161. {
  162.    short dir_index=F_Find_Dir("SKYTEX  ");
  163.    if (dir_index==-1)
  164.       return;
  165.    F_Seek(directory[dir_index].start);
  166.    sky_texture=&floortex[Number_Of_FTs-2];
  167.    sky_texture->cur_image=0;
  168.    sky_texture->anim_sum=0;
  169.  
  170.    F_Get_Short(sky_texture->num_image);
  171.    F_Get_Long(sky_texture->anim_speed);
  172.    sky_texture->width=SKY_WIDTH;
  173.    sky_texture->height=SKY_HEIGHT;
  174.    sky_texture->shift=SKY_SHIFT;
  175.    char filename[13];
  176.    RCastGobject sky_temp(sky_texture->num_image);
  177.    sky_temp.Hold();
  178.    sky_texture->images=(Byte **)NewPtr(sky_texture->num_image * sizeof(Byte *));
  179.    for (short cur_tex=0; cur_tex<sky_texture->num_image; cur_tex++) {
  180.       F_Get_String_NT(filename, 13);
  181.       sky_temp.assigninfile(filename);
  182.       sky_temp.load(cur_tex);
  183.       FlipBMP(sky_temp.Image(cur_tex), sky_temp.Width(), sky_temp.Height());
  184.       sky_texture->images[cur_tex]=sky_temp.Image(cur_tex);
  185.    }
  186. }
  187. void F_Clear_Sky()
  188. {
  189.    for (short cur_tex=0; cur_tex<sky_texture->num_image; cur_tex++)
  190.       delete sky_texture->images[cur_tex];
  191. }