home *** CD-ROM | disk | FTP | other *** search
/ Phenomenon / Phenomenon.iso / quake / utils / mdl / meddle16 / mdl14src / mdl_io.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1996-08-06  |  19.0 KB  |  521 lines

  1. //
  2. // this file by brian martin 1996
  3. // brian@phyast.pitt.edu
  4. //
  5. // this is part of the source for the MedDLe quake model viewer/editor
  6. //
  7. //
  8. #include "mdl.h"
  9.  
  10.  
  11. void read_mdl(FILE *in, MDL_model *model)
  12. {
  13.     int i,j,k;
  14.     int tx, ty;
  15.  
  16.     fread(&model->filetype,4,1,in);       // magic nums
  17.     fread(&model->version,4,1,in);        // version 6 now
  18.     fread(&model->xscale,4,1,in);         // scale = (max - min)/255.9
  19.     fread(&model->yscale,4,1,in);
  20.     fread(&model->zscale,4,1,in);
  21.     fread(&model->xoffset,4,1,in);        // min
  22.     fread(&model->yoffset,4,1,in);
  23.     fread(&model->zoffset,4,1,in);
  24.     fread(&model->radius,4,1,in);         // bounding radius
  25.     fread(&model->eyex,4,1,in);             // eye position
  26.     fread(&model->eyey,4,1,in);
  27.     fread(&model->eyez,4,1,in);
  28.     fread(&model->num_skins,4,1,in);      // num skins
  29.     fread(&model->skinw,4,1,in);        // skin width
  30.     fread(&model->skinh,4,1,in);        // skin height
  31.     fread(&model->num_vertices,4,1,in);
  32.     fread(&model->num_triangles,4,1,in);
  33.     fread(&model->num_frames,1,4,in);
  34.     fread(&model->sync_type,1,4,in);          // sync type, either 0 or random
  35.     fread(&model->flags,4,1,in);          // flags
  36.     fread(&model->ave_size,4,1,in);       // average size  pixels/triangle?
  37.     /// that ends the header
  38.     printf("v:%d t:%d f:%d \n",model->num_vertices,model->num_triangles,model->num_frames);
  39.  
  40.     tx=wherex();
  41.     ty=wherey();
  42.     // now the skin stuff
  43.     model->skin = new (MDL_model_skin)[model->num_skins];
  44.     for(k=0; k<model->num_skins; k++)
  45.     {
  46.         gotoxy(tx,ty);
  47.         printf("reading skin: %d \n",k );
  48.         fread(&model->skin[k].type,4,1,in);
  49.         if(model->skin[k].type==0)
  50.         {
  51.             model->skin[k].bitmap = new (unsigned char)[model->skinw*model->skinh];
  52.             for(j=0;j<model->skinh;j++)
  53.             {
  54.                 for(i=0;i<model->skinw;i++)
  55.                 {
  56.                     fread(model->skin[k].bitmap+(i+model->skinw*j),1,1,in);
  57.                 }
  58.             }
  59.  
  60.         }
  61.         else
  62.         {
  63.             printf("group skin %d : ",k );
  64.             fread(&model->skin[k].num_gskins,4,1,in);
  65.             model->skin[k].gskin_interval = new (float)[model->skin[k].num_gskins];
  66.             model->skin[k].gskin = new (MDL_group_skin)[model->skin[k].num_gskins];
  67.             for(j=0; j<model->skin[k].num_gskins; j++)
  68.             {
  69.                 fread(&model->skin[k].gskin_interval[j],4,1,in);
  70.  
  71.             }
  72.             for(j=0; j<model->skin[k].num_gskins; j++)
  73.             {
  74.  
  75.                 printf("sub skin %d\n ",j );
  76.                 for(int jj=0;jj<model->skinh;jj++)
  77.                 {
  78.                     for(int ii=0;ii<model->skinw;ii++)
  79.                     {
  80.                         fread(model->skin[k].gskin[j].bitmap+(ii+model->skinw*jj),1,1,in);
  81.                     }
  82.                 }
  83.             }
  84.  
  85.  
  86.         }
  87.  
  88.     }
  89.  
  90.     // now read the 2d vertices
  91.     model->vertex = new (unsigned)[model->num_vertices*3];
  92.  
  93.     for(i=0;i<model->num_vertices;i++)
  94.     {
  95.         fread(model->vertex+i*3,4,1,in);
  96.         fread(model->vertex+i*3+1,4,1,in);
  97.         fread(model->vertex+i*3+2,4,1,in);
  98.     }
  99.  
  100.     // now read triange definitions
  101.     model->triangle = new (unsigned)[model->num_triangles*4];
  102.  
  103.     for(i=0;i<model->num_triangles;i++)
  104.     {
  105.         fread(model->triangle+i*4,4,1,in);
  106.         fread(model->triangle+i*4+1,4,1,in);
  107.         fread(model->triangle+i*4+2,4,1,in);
  108.         fread(model->triangle+i*4+3,4,1,in);
  109.  
  110.     }
  111.  
  112.     // now read the frames
  113.     model->frame = new (struct MDL_frame)[model->num_frames];
  114.  
  115.     tx=wherex();
  116.     ty=wherey();
  117.  
  118.     for(k=0; k<model->num_frames;  k++)
  119.     {
  120.         fread(&model->frame[k].type,4,1,in);
  121.         // if single frames
  122.  
  123.         if(model->frame[k].type==0)
  124.         {
  125.             gotoxy(tx,ty);
  126.             printf("reading frame %d : ",k );
  127.             fread(&model->frame[k].sframe.bboxmin,1,4,in);
  128.             fread(&model->frame[k].sframe.bboxmax,1,4,in);
  129.             fread(model->frame[k].sframe.name,16,1,in);
  130.             printf("%s \n",model->frame[k].sframe.name );
  131.             model->frame[k].sframe.tv = new (trivertex)[model->num_vertices];
  132.  
  133.             for(i=0;i<model->num_vertices;i++)
  134.             {
  135.                 fread(model->frame[k].sframe.tv+i,1,4,in);
  136.             }
  137.         }
  138.         else
  139.         {
  140.  
  141.             gotoxy(tx,ty);
  142.             printf("reading group %d :",k );
  143.             fread(&model->frame[k].gframe.num_gsframes,1,4,in);
  144.             fread(&model->frame[k].gframe.bboxmin,1,4,in);
  145.             fread(&model->frame[k].gframe.bboxmax,1,4,in);
  146.             model->frame[k].gframe.gsframe_interval = new (float)[model->frame[k].gframe.num_gsframes];
  147.             model->frame[k].gframe.gsframe = new (MDL_model_frame)[model->frame[k].gframe.num_gsframes];
  148.             for(j=0; j<model->frame[k].gframe.num_gsframes; j++)
  149.             {
  150.                 fread(&model->frame[k].gframe.gsframe_interval[j],4,1,in);
  151.             }
  152.  
  153.             for(j=0; j<model->frame[k].gframe.num_gsframes; j++)
  154.             {
  155.                 fread(&model->frame[k].gframe.gsframe[j].bboxmin,1,4,in);
  156.                 fread(&model->frame[k].gframe.gsframe[j].bboxmax,1,4,in);
  157.                 fread(model->frame[k].gframe.gsframe[j].name,16,1,in);
  158.                 model->frame[k].gframe.gsframe[j].tv = new (trivertex)[model->num_vertices];
  159.                 printf(" sub frame %d : %s \n",j,model->frame[k].gframe.gsframe[j].name );
  160.  
  161.                 for(i=0;i<model->num_vertices;i++)
  162.                 {
  163.                     fread(model->frame[k].gframe.gsframe[j].tv+i,1,4,in);
  164.                 }
  165.  
  166.             }
  167.  
  168.  
  169.         }
  170.  
  171.  
  172.  
  173.     }
  174.     // set some initial things
  175.     model->cur_skin=0;
  176.     model->tcolor=1;
  177.     model->bcolor=6;
  178. //    getch();
  179. }
  180.  
  181.  
  182.  
  183. void write_mdl(FILE *out, MDL_model *model)
  184. {
  185.  
  186.     int i,j,k;
  187.  
  188.     fwrite(&model->filetype,4,1,out);       // magic nums
  189.     fwrite(&model->version,4,1,out);        // version 6 now
  190.     fwrite(&model->xscale,4,1,out);         // scale = (max - mout)/255.9
  191.     fwrite(&model->yscale,4,1,out);
  192.     fwrite(&model->zscale,4,1,out);
  193.     fwrite(&model->xoffset,4,1,out);        // mout
  194.     fwrite(&model->yoffset,4,1,out);
  195.     fwrite(&model->zoffset,4,1,out);
  196.     fwrite(&model->radius,4,1,out);         // boundoutg radius
  197.     fwrite(&model->eyex,4,1,out);             // eye position
  198.     fwrite(&model->eyey,4,1,out);
  199.     fwrite(&model->eyez,4,1,out);
  200.     fwrite(&model->num_skins,4,1,out);      // num skins
  201.     fwrite(&model->skinw,4,1,out);        // skin width
  202.     fwrite(&model->skinh,4,1,out);        // skin height
  203.     fwrite(&model->num_vertices,4,1,out);
  204.     fwrite(&model->num_triangles,4,1,out);
  205.     fwrite(&model->num_frames,1,4,out);
  206.     fwrite(&model->sync_type,1,4,out);          // sync type, either 0 or random
  207.     fwrite(&model->flags,4,1,out);          // flags
  208.     fwrite(&model->ave_size,4,1,out);       // average size
  209.     /// that ends the header
  210.     // now the skin stuff
  211.     for(k=0; k<model->num_skins; k++)
  212.     {
  213.         fwrite(&model->skin[k].type,4,1,out);
  214.         if(model->skin[k].type==0)
  215.         {
  216.             for(j=0;j<model->skinh;j++)
  217.             {
  218.                 for(i=0;i<model->skinw;i++)
  219.                 {
  220.                     fputc(model->skin[k].bitmap[i+model->skinw*j],out);
  221.                 }
  222.             }
  223.  
  224.         }
  225.         else
  226.         {
  227.             fwrite(&model->skin[k].num_gskins,4,1,out);
  228.             for(j=0; j<model->skin[k].num_gskins; j++)
  229.             {
  230.                 fwrite(&model->skin[k].gskin_interval[j],4,1,out);
  231.             }
  232.             for(j=0; j<model->skin[k].num_gskins; j++)
  233.             {
  234.  
  235.                 for(int jj=0;jj<model->skinh;jj++)
  236.                 {
  237.                     for(int ii=0;ii<model->skinw;ii++)
  238.                     {
  239.                         fputc(model->skin[k].gskin[j].bitmap[ii+model->skinw*jj],out);
  240.                     }
  241.                 }
  242.             }
  243.  
  244.  
  245.         }
  246.  
  247.     }
  248.  
  249.     // now the 2d vertices
  250.  
  251.     for(i=0;i<model->num_vertices;i++)
  252.     {
  253.         fwrite(model->vertex+i*3,4,1,out);
  254.         fwrite(model->vertex+i*3+1,4,1,out);
  255.         fwrite(model->vertex+i*3+2,4,1,out);
  256.     }
  257.  
  258.     // now triangle definitions
  259.  
  260.     for(i=0;i<model->num_triangles;i++)
  261.     {
  262.         fwrite(model->triangle+i*4,4,1,out);
  263.         fwrite(model->triangle+i*4+1,4,1,out);
  264.         fwrite(model->triangle+i*4+2,4,1,out);
  265.         fwrite(model->triangle+i*4+3,4,1,out);
  266.  
  267.     }
  268.  
  269.     // now the frames
  270.  
  271.     for(k=0; k<model->num_frames;  k++)
  272.     {
  273.         fwrite(&model->frame[k].type,4,1,out);
  274.         // if single frames
  275.         if(model->frame[k].type==0)
  276.         {
  277.             fwrite(&model->frame[k].sframe.bboxmin,1,4,out);
  278.             fwrite(&model->frame[k].sframe.bboxmax,1,4,out);
  279.             fwrite(model->frame[k].sframe.name,16,1,out);
  280.  
  281.             for(i=0;i<model->num_vertices;i++)
  282.             {
  283.                 fwrite(model->frame[k].sframe.tv+i,1,4,out);
  284.             }
  285.         }
  286.         else
  287.         {
  288.  
  289.             fwrite(&model->frame[k].gframe.num_gsframes,1,4,out);
  290.             fwrite(&model->frame[k].gframe.bboxmin,1,4,out);
  291.             fwrite(&model->frame[k].gframe.bboxmax,1,4,out);
  292.             for(j=0; j<model->frame[k].gframe.num_gsframes; j++)
  293.             {
  294.                 fwrite(&model->frame[k].gframe.gsframe_interval[j],4,1,out);
  295.             }
  296.  
  297.             for(j=0; j<model->frame[k].gframe.num_gsframes; j++)
  298.             {
  299.                 fwrite(&model->frame[k].gframe.gsframe[j].bboxmin,1,4,out);
  300.                 fwrite(&model->frame[k].gframe.gsframe[j].bboxmax,1,4,out);
  301.                 fwrite(model->frame[k].gframe.gsframe[j].name,16,1,out);
  302.  
  303.                 for(i=0;i<model->num_vertices;i++)
  304.                 {
  305.                     fwrite(model->frame[k].gframe.gsframe[j].tv+i,1,4,out);
  306.                 }
  307.  
  308.             }
  309.  
  310.  
  311.         }
  312.  
  313.  
  314.  
  315.     }
  316.  
  317. }
  318.  
  319. // this routine puts quake data into a format that I like for my
  320. // matrix routines
  321.  
  322. void setup_3d_data(MDL_model *model)
  323. {
  324.     int i,j,k;
  325.     BG_3pt vect1, vect2;
  326.     int maxn;
  327.  
  328.     // block is like a cube. a single object.
  329.     // since each mdl frame is a single object, it is a block
  330.  
  331.     model->blocks=0;
  332.     // get num of blocks
  333.     for(i=0; i<model->num_frames; i++)
  334.     {
  335.         if(model->frame[i].type==0) model->blocks++;
  336.         else
  337.         {
  338.             model->blocks+=model->frame[i].gframe.num_gsframes;
  339.         }
  340.  
  341.     }
  342.  
  343.     model->block= new (BG_Block)[model->blocks];
  344.     if(model->block==NULL) exit(1);
  345.  
  346.     i=0;
  347.     int f=0;
  348.  
  349.     for(f=0; f< model->num_frames; f++)
  350.     {
  351.         if(model->frame[f].type==0)
  352.         {
  353.         model->block[i].num_pts=model->num_vertices;
  354.         model->block[i].ptlist=new (BG_3pt)[model->block[i].num_pts+8];
  355.         model->block[i].nindex=new (unsigned char)[model->block[i].num_pts];
  356.         if(model->block[i].ptlist==NULL) exit(1);
  357.         maxn=0;
  358.         // read all points
  359.         for(j=0;j<model->block[i].num_pts;j++)
  360.         {
  361.             model->block[i].ptlist[j].x=model->xscale*(model->frame[f].sframe.tv[j].v[0])+model->xoffset;//+model->f1;//+model->f1)+model->xoffset;
  362.             model->block[i].ptlist[j].y=model->yscale*(model->frame[f].sframe.tv[j].v[1])+model->yoffset;//+model->f2;//+model->f2)+model->yoffset;
  363.             model->block[i].ptlist[j].z=model->zscale*(model->frame[f].sframe.tv[j].v[2])+model->zoffset;//+model->f3;//+model->f3)+model->zoffset;
  364.             model->block[i].nindex[j]=model->frame[f].sframe.tv[j].vnormal;
  365.         }
  366.         model->block[i].ptlist[model->block[i].num_pts].x= model->xscale*model->frame[f].sframe.bboxmin.v[0]+model->xoffset;
  367.         model->block[i].ptlist[model->block[i].num_pts].y= model->yscale*model->frame[f].sframe.bboxmin.v[1]+model->yoffset;
  368.         model->block[i].ptlist[model->block[i].num_pts].z= model->zscale*model->frame[f].sframe.bboxmin.v[2]+model->zoffset;
  369.  
  370.         model->block[i].ptlist[model->block[i].num_pts+1].x= model->xscale*model->frame[f].sframe.bboxmax.v[0]+model->xoffset;
  371.         model->block[i].ptlist[model->block[i].num_pts+1].y= model->yscale*model->frame[f].sframe.bboxmax.v[1]+model->yoffset;
  372.         model->block[i].ptlist[model->block[i].num_pts+1].z= model->zscale*model->frame[f].sframe.bboxmax.v[2]+model->zoffset;
  373.  
  374.         model->block[i].ptlist[model->block[i].num_pts+2].x= model->xscale*model->frame[f].sframe.bboxmin.v[0]+model->xoffset;
  375.         model->block[i].ptlist[model->block[i].num_pts+2].y= model->yscale*model->frame[f].sframe.bboxmin.v[1]+model->yoffset;
  376.         model->block[i].ptlist[model->block[i].num_pts+2].z= model->zscale*model->frame[f].sframe.bboxmax.v[2]+model->zoffset;
  377.  
  378.         model->block[i].ptlist[model->block[i].num_pts+3].x= model->xscale*model->frame[f].sframe.bboxmin.v[0]+model->xoffset;
  379.         model->block[i].ptlist[model->block[i].num_pts+3].y= model->yscale*model->frame[f].sframe.bboxmax.v[1]+model->yoffset;
  380.         model->block[i].ptlist[model->block[i].num_pts+3].z= model->zscale*model->frame[f].sframe.bboxmin.v[2]+model->zoffset;
  381.  
  382.         model->block[i].ptlist[model->block[i].num_pts+4].x= model->xscale*model->frame[f].sframe.bboxmin.v[0]+model->xoffset;
  383.         model->block[i].ptlist[model->block[i].num_pts+4].y= model->yscale*model->frame[f].sframe.bboxmax.v[1]+model->yoffset;
  384.         model->block[i].ptlist[model->block[i].num_pts+4].z= model->zscale*model->frame[f].sframe.bboxmax.v[2]+model->zoffset;
  385.  
  386.         model->block[i].ptlist[model->block[i].num_pts+5].x= model->xscale*model->frame[f].sframe.bboxmax.v[0]+model->xoffset;
  387.         model->block[i].ptlist[model->block[i].num_pts+5].y= model->yscale*model->frame[f].sframe.bboxmin.v[1]+model->yoffset;
  388.         model->block[i].ptlist[model->block[i].num_pts+5].z= model->zscale*model->frame[f].sframe.bboxmin.v[2]+model->zoffset;
  389.  
  390.         model->block[i].ptlist[model->block[i].num_pts+6].x= model->xscale*model->frame[f].sframe.bboxmax.v[0]+model->xoffset;
  391.         model->block[i].ptlist[model->block[i].num_pts+6].y= model->yscale*model->frame[f].sframe.bboxmin.v[1]+model->yoffset;
  392.         model->block[i].ptlist[model->block[i].num_pts+6].z= model->zscale*model->frame[f].sframe.bboxmax.v[2]+model->zoffset;
  393.  
  394.         model->block[i].ptlist[model->block[i].num_pts+7].x= model->xscale*model->frame[f].sframe.bboxmax.v[0]+model->xoffset;
  395.         model->block[i].ptlist[model->block[i].num_pts+7].y= model->yscale*model->frame[f].sframe.bboxmax.v[1]+model->yoffset;
  396.         model->block[i].ptlist[model->block[i].num_pts+7].z= model->zscale*model->frame[f].sframe.bboxmin.v[2]+model->zoffset;
  397.  
  398.  
  399.  
  400.         model->block[i].num_sides=model->num_triangles;
  401.         model->block[i].side=new (BG_Side)[model->block[i].num_sides];
  402.         if(model->block[i].side==NULL) exit(1);
  403.  
  404.         for(j=0;j<model->block[i].num_sides; j++)
  405.         {
  406.             model->block[i].side[j].num_pts=3;
  407.             if((model->block[i].side[j].pt=new(word)[3])==NULL) exit(1);
  408.  
  409.             model->block[i].side[j].pt[0]=model->triangle[j*4L+1L];
  410.             model->block[i].side[j].pt[1]=model->triangle[j*4L+2L];
  411.             model->block[i].side[j].pt[2]=model->triangle[j*4L+3L];
  412.             // calc surface normals
  413.             vect1=BG_SubtractPts(&(model->block[i].ptlist[model->block[i].side[j].pt[1]]),&(model->block[i].ptlist[model->block[i].side[j].pt[0]]));
  414.             vect2=BG_SubtractPts(&(model->block[i].ptlist[model->block[i].side[j].pt[2]]),&(model->block[i].ptlist[model->block[i].side[j].pt[1]]));
  415.             model->block[i].side[j].normal=BG_CrossProduct(&vect2,&vect1);
  416.             BG_Normalize(&(model->block[i].side[j].normal));
  417.         }
  418.         model->block[i].name=model->frame[f].sframe.name;
  419.         i++;
  420.         }
  421.  
  422.         // if group frame
  423.         else
  424.         {
  425.  
  426.         for(int ii=0; ii<model->frame[f].gframe.num_gsframes; ii++)
  427.         {
  428.         model->block[i].num_pts=model->num_vertices;
  429.         model->block[i].ptlist=new (BG_3pt)[model->block[i].num_pts+8];
  430.         model->block[i].nindex=new (unsigned char)[model->block[i].num_pts];
  431.         if(model->block[i].ptlist==NULL) exit(1);
  432.         maxn=0;
  433.         // read all points
  434.         for(j=0;j<model->block[i].num_pts;j++)
  435.         {
  436.             model->block[i].ptlist[j].x=model->xscale*(model->frame[f].gframe.gsframe[ii].tv[j].v[0])+model->xoffset;//+model->f1;//+model->f1)+model->xoffset;
  437.             model->block[i].ptlist[j].y=model->yscale*(model->frame[f].gframe.gsframe[ii].tv[j].v[1])+model->yoffset;//+model->f2;//+model->f2)+model->yoffset;
  438.             model->block[i].ptlist[j].z=model->zscale*(model->frame[f].gframe.gsframe[ii].tv[j].v[2])+model->zoffset;//+model->f3;//+model->f3)+model->zoffset;
  439.             model->block[i].nindex[j]=model->frame[f].gframe.gsframe[ii].tv[j].vnormal;
  440.         }
  441.         model->block[i].ptlist[model->block[i].num_pts].x= model->xscale*model->frame[f].gframe.gsframe[ii].bboxmin.v[0]+model->xoffset;
  442.         model->block[i].ptlist[model->block[i].num_pts].y= model->yscale*model->frame[f].gframe.gsframe[ii].bboxmin.v[1]+model->yoffset;
  443.         model->block[i].ptlist[model->block[i].num_pts].z= model->zscale*model->frame[f].gframe.gsframe[ii].bboxmin.v[2]+model->zoffset;
  444.  
  445.         model->block[i].ptlist[model->block[i].num_pts+1].x= model->xscale*model->frame[f].gframe.gsframe[ii].bboxmax.v[0]+model->xoffset;
  446.         model->block[i].ptlist[model->block[i].num_pts+1].y= model->yscale*model->frame[f].gframe.gsframe[ii].bboxmax.v[1]+model->yoffset;
  447.         model->block[i].ptlist[model->block[i].num_pts+1].z= model->zscale*model->frame[f].gframe.gsframe[ii].bboxmax.v[2]+model->zoffset;
  448.  
  449.         model->block[i].ptlist[model->block[i].num_pts+2].x= model->xscale*model->frame[f].gframe.gsframe[ii].bboxmin.v[0]+model->xoffset;
  450.         model->block[i].ptlist[model->block[i].num_pts+2].y= model->yscale*model->frame[f].gframe.gsframe[ii].bboxmin.v[1]+model->yoffset;
  451.         model->block[i].ptlist[model->block[i].num_pts+2].z= model->zscale*model->frame[f].gframe.gsframe[ii].bboxmax.v[2]+model->zoffset;
  452.  
  453.         model->block[i].ptlist[model->block[i].num_pts+3].x= model->xscale*model->frame[f].gframe.gsframe[ii].bboxmin.v[0]+model->xoffset;
  454.         model->block[i].ptlist[model->block[i].num_pts+3].y= model->yscale*model->frame[f].gframe.gsframe[ii].bboxmax.v[1]+model->yoffset;
  455.         model->block[i].ptlist[model->block[i].num_pts+3].z= model->zscale*model->frame[f].gframe.gsframe[ii].bboxmin.v[2]+model->zoffset;
  456.  
  457.         model->block[i].ptlist[model->block[i].num_pts+4].x= model->xscale*model->frame[f].gframe.gsframe[ii].bboxmin.v[0]+model->xoffset;
  458.         model->block[i].ptlist[model->block[i].num_pts+4].y= model->yscale*model->frame[f].gframe.gsframe[ii].bboxmax.v[1]+model->yoffset;
  459.         model->block[i].ptlist[model->block[i].num_pts+4].z= model->zscale*model->frame[f].gframe.gsframe[ii].bboxmax.v[2]+model->zoffset;
  460.  
  461.         model->block[i].ptlist[model->block[i].num_pts+5].x= model->xscale*model->frame[f].gframe.gsframe[ii].bboxmax.v[0]+model->xoffset;
  462.         model->block[i].ptlist[model->block[i].num_pts+5].y= model->yscale*model->frame[f].gframe.gsframe[ii].bboxmin.v[1]+model->yoffset;
  463.         model->block[i].ptlist[model->block[i].num_pts+5].z= model->zscale*model->frame[f].gframe.gsframe[ii].bboxmin.v[2]+model->zoffset;
  464.  
  465.         model->block[i].ptlist[model->block[i].num_pts+6].x= model->xscale*model->frame[f].gframe.gsframe[ii].bboxmax.v[0]+model->xoffset;
  466.         model->block[i].ptlist[model->block[i].num_pts+6].y= model->yscale*model->frame[f].gframe.gsframe[ii].bboxmin.v[1]+model->yoffset;
  467.         model->block[i].ptlist[model->block[i].num_pts+6].z= model->zscale*model->frame[f].gframe.gsframe[ii].bboxmax.v[2]+model->zoffset;
  468.  
  469.         model->block[i].ptlist[model->block[i].num_pts+7].x= model->xscale*model->frame[f].gframe.gsframe[ii].bboxmax.v[0]+model->xoffset;
  470.         model->block[i].ptlist[model->block[i].num_pts+7].y= model->yscale*model->frame[f].gframe.gsframe[ii].bboxmax.v[1]+model->yoffset;
  471.         model->block[i].ptlist[model->block[i].num_pts+7].z= model->zscale*model->frame[f].gframe.gsframe[ii].bboxmin.v[2]+model->zoffset;
  472.  
  473.  
  474.  
  475.         model->block[i].num_sides=model->num_triangles;
  476.         model->block[i].side=new (BG_Side)[model->block[i].num_sides];
  477.         if(model->block[i].side==NULL) exit(1);
  478.  
  479.         for(j=0;j<model->block[i].num_sides; j++)
  480.         {
  481.             model->block[i].side[j].num_pts=3;
  482.             if((model->block[i].side[j].pt=new(word)[3])==NULL) exit(1);
  483.  
  484.             model->block[i].side[j].pt[0]=model->triangle[j*4L+1L];
  485.             model->block[i].side[j].pt[1]=model->triangle[j*4L+2L];
  486.             model->block[i].side[j].pt[2]=model->triangle[j*4L+3L];
  487.             // calc surface normals
  488.             vect1=BG_SubtractPts(&(model->block[i].ptlist[model->block[i].side[j].pt[1]]),&(model->block[i].ptlist[model->block[i].side[j].pt[0]]));
  489.             vect2=BG_SubtractPts(&(model->block[i].ptlist[model->block[i].side[j].pt[2]]),&(model->block[i].ptlist[model->block[i].side[j].pt[1]]));
  490.             model->block[i].side[j].normal=BG_CrossProduct(&vect2,&vect1);
  491.             BG_Normalize(&(model->block[i].side[j].normal));
  492.         }
  493.         model->block[i].name=model->frame[f].gframe.gsframe[ii].name;
  494.         i++;
  495.         }
  496.         }
  497.     }
  498. }
  499. // clean up data
  500.  
  501. void delete_3d_data(MDL_model *mdl)
  502. {
  503. /*    int i,j,blocks;
  504.  
  505.     blocks=mdl->num_frames;
  506.  
  507.     for(i=0; i<blocks; i++)
  508.     {
  509.         delete [] block[i].ptlist;
  510.  
  511.         for(j=0;j<block[i].num_sides; j++)
  512.         {
  513.             delete [] block[i].side[j].pt;
  514.         }
  515.         delete [] block[i].side;
  516.     }
  517.  
  518.     delete [] block;
  519. */
  520. }
  521.