/openquartz/utils/dputils/hmap/bspfile.c

https://github.com/atphalix/eviltoys · C · 363 lines · 225 code · 67 blank · 71 comment · 26 complexity · 75a443e5b565cc70e3d8edfe1da1a1b9 MD5 · raw file

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