home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1996 December / PCWKCD1296.iso / sharewar / quake106 / utils / common / bspfile.c next >
Encoding:
C/C++ Source or Header  |  1996-09-12  |  9.3 KB  |  376 lines

  1.  
  2. #include "cmdlib.h"
  3. #include "mathlib.h"
  4. #include "bspfile.h"
  5.  
  6. //=============================================================================
  7.  
  8. int            nummodels;
  9. dmodel_t    dmodels[MAX_MAP_MODELS];
  10.  
  11. int            visdatasize;
  12. byte        dvisdata[MAX_MAP_VISIBILITY];
  13.  
  14. int            lightdatasize;
  15. byte        dlightdata[MAX_MAP_LIGHTING];
  16.  
  17. int            texdatasize;
  18. byte        dtexdata[MAX_MAP_MIPTEX]; // (dmiptexlump_t)
  19.  
  20. int            entdatasize;
  21. char        dentdata[MAX_MAP_ENTSTRING];
  22.  
  23. int            numleafs;
  24. dleaf_t        dleafs[MAX_MAP_LEAFS];
  25.  
  26. int            numplanes;
  27. dplane_t    dplanes[MAX_MAP_PLANES];
  28.  
  29. int            numvertexes;
  30. dvertex_t    dvertexes[MAX_MAP_VERTS];
  31.  
  32. int            numnodes;
  33. dnode_t        dnodes[MAX_MAP_NODES];
  34.  
  35. int            numtexinfo;
  36. texinfo_t    texinfo[MAX_MAP_TEXINFO];
  37.  
  38. int            numfaces;
  39. dface_t        dfaces[MAX_MAP_FACES];
  40.  
  41. int            numclipnodes;
  42. dclipnode_t    dclipnodes[MAX_MAP_CLIPNODES];
  43.  
  44. int            numedges;
  45. dedge_t        dedges[MAX_MAP_EDGES];
  46.  
  47. int            nummarksurfaces;
  48. unsigned short        dmarksurfaces[MAX_MAP_MARKSURFACES];
  49.  
  50. int            numsurfedges;
  51. int            dsurfedges[MAX_MAP_SURFEDGES];
  52.  
  53. //=============================================================================
  54.  
  55. /*
  56. =============
  57. SwapBSPFile
  58.  
  59. Byte swaps all data in a bsp file.
  60. =============
  61. */
  62. void SwapBSPFile (qboolean todisk)
  63. {
  64.     int                i, j, c;
  65.     dmodel_t        *d;
  66.     dmiptexlump_t    *mtl;
  67.  
  68.     
  69. // models    
  70.     for (i=0 ; i<nummodels ; i++)
  71.     {
  72.         d = &dmodels[i];
  73.  
  74.         for (j=0 ; j<MAX_MAP_HULLS ; j++)
  75.             d->headnode[j] = LittleLong (d->headnode[j]);
  76.  
  77.         d->visleafs = LittleLong (d->visleafs);
  78.         d->firstface = LittleLong (d->firstface);
  79.         d->numfaces = LittleLong (d->numfaces);
  80.         
  81.         for (j=0 ; j<3 ; j++)
  82.         {
  83.             d->mins[j] = LittleFloat(d->mins[j]);
  84.             d->maxs[j] = LittleFloat(d->maxs[j]);
  85.             d->origin[j] = LittleFloat(d->origin[j]);
  86.         }
  87.     }
  88.  
  89. //
  90. // vertexes
  91. //
  92.     for (i=0 ; i<numvertexes ; i++)
  93.     {
  94.         for (j=0 ; j<3 ; j++)
  95.             dvertexes[i].point[j] = LittleFloat (dvertexes[i].point[j]);
  96.     }
  97.         
  98. //
  99. // planes
  100. //    
  101.     for (i=0 ; i<numplanes ; i++)
  102.     {
  103.         for (j=0 ; j<3 ; j++)
  104.             dplanes[i].normal[j] = LittleFloat (dplanes[i].normal[j]);
  105.         dplanes[i].dist = LittleFloat (dplanes[i].dist);
  106.         dplanes[i].type = LittleLong (dplanes[i].type);
  107.     }
  108.     
  109. //
  110. // texinfos
  111. //    
  112.     for (i=0 ; i<numtexinfo ; i++)
  113.     {
  114.         for (j=0 ; j<8 ; j++)
  115.             texinfo[i].vecs[0][j] = LittleFloat (texinfo[i].vecs[0][j]);
  116.         texinfo[i].miptex = LittleLong (texinfo[i].miptex);
  117.         texinfo[i].flags = LittleLong (texinfo[i].flags);
  118.     }
  119.     
  120. //
  121. // faces
  122. //
  123.     for (i=0 ; i<numfaces ; i++)
  124.     {
  125.         dfaces[i].texinfo = LittleShort (dfaces[i].texinfo);
  126.         dfaces[i].planenum = LittleShort (dfaces[i].planenum);
  127.         dfaces[i].side = LittleShort (dfaces[i].side);
  128.         dfaces[i].lightofs = LittleLong (dfaces[i].lightofs);
  129.         dfaces[i].firstedge = LittleLong (dfaces[i].firstedge);
  130.         dfaces[i].numedges = LittleShort (dfaces[i].numedges);
  131.     }
  132.  
  133. //
  134. // nodes
  135. //
  136.     for (i=0 ; i<numnodes ; i++)
  137.     {
  138.         dnodes[i].planenum = LittleLong (dnodes[i].planenum);
  139.         for (j=0 ; j<3 ; j++)
  140.         {
  141.             dnodes[i].mins[j] = LittleShort (dnodes[i].mins[j]);
  142.             dnodes[i].maxs[j] = LittleShort (dnodes[i].maxs[j]);
  143.         }
  144.         dnodes[i].children[0] = LittleShort (dnodes[i].children[0]);
  145.         dnodes[i].children[1] = LittleShort (dnodes[i].children[1]);
  146.         dnodes[i].firstface = LittleShort (dnodes[i].firstface);
  147.         dnodes[i].numfaces = LittleShort (dnodes[i].numfaces);
  148.     }
  149.  
  150. //
  151. // leafs
  152. //
  153.     for (i=0 ; i<numleafs ; i++)
  154.     {
  155.         dleafs[i].contents = LittleLong (dleafs[i].contents);
  156.         for (j=0 ; j<3 ; j++)
  157.         {
  158.             dleafs[i].mins[j] = LittleShort (dleafs[i].mins[j]);
  159.             dleafs[i].maxs[j] = LittleShort (dleafs[i].maxs[j]);
  160.         }
  161.  
  162.         dleafs[i].firstmarksurface = LittleShort (dleafs[i].firstmarksurface);
  163.         dleafs[i].nummarksurfaces = LittleShort (dleafs[i].nummarksurfaces);
  164.         dleafs[i].visofs = LittleLong (dleafs[i].visofs);
  165.     }
  166.  
  167. //
  168. // clipnodes
  169. //
  170.     for (i=0 ; i<numclipnodes ; i++)
  171.     {
  172.         dclipnodes[i].planenum = LittleLong (dclipnodes[i].planenum);
  173.         dclipnodes[i].children[0] = LittleShort (dclipnodes[i].children[0]);
  174.         dclipnodes[i].children[1] = LittleShort (dclipnodes[i].children[1]);
  175.     }
  176.  
  177. //
  178. // miptex
  179. //
  180.     if (texdatasize)
  181.     {
  182.         mtl = (dmiptexlump_t *)dtexdata;
  183.         if (todisk)
  184.             c = mtl->nummiptex;
  185.         else
  186.             c = LittleLong(mtl->nummiptex);
  187.         mtl->nummiptex = LittleLong (mtl->nummiptex);
  188.         for (i=0 ; i<c ; i++)
  189.             mtl->dataofs[i] = LittleLong(mtl->dataofs[i]);
  190.     }
  191.     
  192. //
  193. // marksurfaces
  194. //
  195.     for (i=0 ; i<nummarksurfaces ; i++)
  196.         dmarksurfaces[i] = LittleShort (dmarksurfaces[i]);
  197.  
  198. //
  199. // surfedges
  200. //
  201.     for (i=0 ; i<numsurfedges ; i++)
  202.         dsurfedges[i] = LittleLong (dsurfedges[i]);
  203.  
  204. //
  205. // edges
  206. //
  207.     for (i=0 ; i<numedges ; i++)
  208.     {
  209.         dedges[i].v[0] = LittleShort (dedges[i].v[0]);
  210.         dedges[i].v[1] = LittleShort (dedges[i].v[1]);
  211.     }
  212. }
  213.  
  214.  
  215. dheader_t    *header;
  216.  
  217. int CopyLump (int lump, void *dest, int size)
  218. {
  219.     int        length, ofs;
  220.  
  221.     length = header->lumps[lump].filelen;
  222.     ofs = header->lumps[lump].fileofs;
  223.     
  224.     if (length % size)
  225.         Error ("LoadBSPFile: odd lump size");
  226.     
  227.     memcpy (dest, (byte *)header + ofs, length);
  228.  
  229.     return length / size;
  230. }
  231.  
  232. /*
  233. =============
  234. LoadBSPFile
  235. =============
  236. */
  237. void    LoadBSPFile (char *filename)
  238. {
  239.     int            i;
  240.     
  241. //
  242. // load the file header
  243. //
  244.     LoadFile (filename, (void **)&header);
  245.  
  246. // swap the header
  247.     for (i=0 ; i< sizeof(dheader_t)/4 ; i++)
  248.         ((int *)header)[i] = LittleLong ( ((int *)header)[i]);
  249.  
  250.     if (header->version != BSPVERSION)
  251.         Error ("%s is version %i, not %i", filename, i, BSPVERSION);
  252.  
  253.     nummodels = CopyLump (LUMP_MODELS, dmodels, sizeof(dmodel_t));
  254.     numvertexes = CopyLump (LUMP_VERTEXES, dvertexes, sizeof(dvertex_t));
  255.     numplanes = CopyLump (LUMP_PLANES, dplanes, sizeof(dplane_t));
  256.     numleafs = CopyLump (LUMP_LEAFS, dleafs, sizeof(dleaf_t));
  257.     numnodes = CopyLump (LUMP_NODES, dnodes, sizeof(dnode_t));
  258.     numtexinfo = CopyLump (LUMP_TEXINFO, texinfo, sizeof(texinfo_t));
  259.     numclipnodes = CopyLump (LUMP_CLIPNODES, dclipnodes, sizeof(dclipnode_t));
  260.     numfaces = CopyLump (LUMP_FACES, dfaces, sizeof(dface_t));
  261.     nummarksurfaces = CopyLump (LUMP_MARKSURFACES, dmarksurfaces, sizeof(dmarksurfaces[0]));
  262.     numsurfedges = CopyLump (LUMP_SURFEDGES, dsurfedges, sizeof(dsurfedges[0]));
  263.     numedges = CopyLump (LUMP_EDGES, dedges, sizeof(dedge_t));
  264.  
  265.     texdatasize = CopyLump (LUMP_TEXTURES, dtexdata, 1);
  266.     visdatasize = CopyLump (LUMP_VISIBILITY, dvisdata, 1);
  267.     lightdatasize = CopyLump (LUMP_LIGHTING, dlightdata, 1);
  268.     entdatasize = CopyLump (LUMP_ENTITIES, dentdata, 1);
  269.  
  270.     free (header);        // everything has been copied out
  271.         
  272. //
  273. // swap everything
  274. //    
  275.     SwapBSPFile (false);
  276. }
  277.  
  278. //============================================================================
  279.  
  280. FILE        *wadfile;
  281. dheader_t    outheader;
  282.  
  283. void AddLump (int lumpnum, void *data, int len)
  284. {
  285.     lump_t *lump;
  286.  
  287.     lump = &header->lumps[lumpnum];
  288.     
  289.     lump->fileofs = LittleLong( ftell(wadfile) );
  290.     lump->filelen = LittleLong(len);
  291.     SafeWrite (wadfile, data, (len+3)&~3);
  292. }
  293.  
  294. /*
  295. =============
  296. WriteBSPFile
  297.  
  298. Swaps the bsp file in place, so it should not be referenced again
  299. =============
  300. */
  301. void    WriteBSPFile (char *filename)
  302. {        
  303.     header = &outheader;
  304.     memset (header, 0, sizeof(dheader_t));
  305.     
  306.     SwapBSPFile (true);
  307.  
  308.     header->version = LittleLong (BSPVERSION);
  309.     
  310.     wadfile = SafeOpenWrite (filename);
  311.     SafeWrite (wadfile, header, sizeof(dheader_t));    // overwritten later
  312.  
  313.     AddLump (LUMP_PLANES, dplanes, numplanes*sizeof(dplane_t));
  314.     AddLump (LUMP_LEAFS, dleafs, numleafs*sizeof(dleaf_t));
  315.     AddLump (LUMP_VERTEXES, dvertexes, numvertexes*sizeof(dvertex_t));
  316.     AddLump (LUMP_NODES, dnodes, numnodes*sizeof(dnode_t));
  317.     AddLump (LUMP_TEXINFO, texinfo, numtexinfo*sizeof(texinfo_t));
  318.     AddLump (LUMP_FACES, dfaces, numfaces*sizeof(dface_t));
  319.     AddLump (LUMP_CLIPNODES, dclipnodes, numclipnodes*sizeof(dclipnode_t));
  320.     AddLump (LUMP_MARKSURFACES, dmarksurfaces, nummarksurfaces*sizeof(dmarksurfaces[0]));
  321.     AddLump (LUMP_SURFEDGES, dsurfedges, numsurfedges*sizeof(dsurfedges[0]));
  322.     AddLump (LUMP_EDGES, dedges, numedges*sizeof(dedge_t));
  323.     AddLump (LUMP_MODELS, dmodels, nummodels*sizeof(dmodel_t));
  324.  
  325.     AddLump (LUMP_LIGHTING, dlightdata, lightdatasize);
  326.     AddLump (LUMP_VISIBILITY, dvisdata, visdatasize);
  327.     AddLump (LUMP_ENTITIES, dentdata, entdatasize);
  328.     AddLump (LUMP_TEXTURES, dtexdata, texdatasize);
  329.     
  330.     fseek (wadfile, 0, SEEK_SET);
  331.     SafeWrite (wadfile, header, sizeof(dheader_t));
  332.     fclose (wadfile);    
  333. }
  334.  
  335. //============================================================================
  336.  
  337. /*
  338. =============
  339. PrintBSPFileSizes
  340.  
  341. Dumps info about current file
  342. =============
  343. */
  344. void PrintBSPFileSizes (void)
  345. {
  346.     printf ("%5i planes       %6i\n"
  347.         ,numplanes, (int)(numplanes*sizeof(dplane_t)));
  348.     printf ("%5i vertexes     %6i\n"
  349.         ,numvertexes, (int)(numvertexes*sizeof(dvertex_t)));
  350.     printf ("%5i nodes        %6i\n"
  351.         ,numnodes, (int)(numnodes*sizeof(dnode_t)));
  352.     printf ("%5i texinfo      %6i\n"
  353.         ,numtexinfo, (int)(numtexinfo*sizeof(texinfo_t)));
  354.     printf ("%5i faces        %6i\n"
  355.         ,numfaces, (int)(numfaces*sizeof(dface_t)));
  356.     printf ("%5i clipnodes    %6i\n"
  357.         ,numclipnodes, (int)(numclipnodes*sizeof(dclipnode_t)));
  358.     printf ("%5i leafs        %6i\n"
  359.         ,numleafs, (int)(numleafs*sizeof(dleaf_t)));
  360.     printf ("%5i marksurfaces %6i\n"
  361.         ,nummarksurfaces, (int)(nummarksurfaces*sizeof(dmarksurfaces[0])));
  362.     printf ("%5i surfedges    %6i\n"
  363.         ,numsurfedges, (int)(numsurfedges*sizeof(dmarksurfaces[0])));
  364.     printf ("%5i edges        %6i\n"
  365.         ,numedges, (int)(numedges*sizeof(dedge_t)));
  366.     if (!texdatasize)
  367.         printf ("    0 textures          0\n");
  368.     else
  369.         printf ("%5i textures     %6i\n",((dmiptexlump_t*)dtexdata)->nummiptex, texdatasize);
  370.     printf ("      lightdata    %6i\n", lightdatasize);
  371.     printf ("      visdata      %6i\n", visdatasize);
  372.     printf ("      entdata      %6i\n", entdatasize);
  373. }
  374.  
  375.  
  376.