l_bsp_q1.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. /*
  2. ===========================================================================
  3. Copyright (C) 1999-2005 Id Software, Inc.
  4. This file is part of Quake III Arena source code.
  5. Quake III Arena source code is free software; you can redistribute it
  6. and/or modify it under the terms of the GNU General Public License as
  7. published by the Free Software Foundation; either version 2 of the License,
  8. or (at your option) any later version.
  9. Quake III Arena source code is distributed in the hope that it will be
  10. useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with Foobar; if not, write to the Free Software
  15. Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  16. ===========================================================================
  17. */
  18. #include "l_cmd.h"
  19. #include "l_math.h"
  20. #include "l_mem.h"
  21. #include "l_log.h"
  22. #include "../botlib/l_script.h"
  23. #include "l_bsp_q1.h"
  24. #include "l_bsp_ent.h"
  25. //=============================================================================
  26. int q1_nummodels;
  27. q1_dmodel_t *q1_dmodels;//[MAX_MAP_MODELS];
  28. int q1_visdatasize;
  29. byte *q1_dvisdata;//[MAX_MAP_VISIBILITY];
  30. int q1_lightdatasize;
  31. byte *q1_dlightdata;//[MAX_MAP_LIGHTING];
  32. int q1_texdatasize;
  33. byte *q1_dtexdata;//[MAX_MAP_MIPTEX]; // (dmiptexlump_t)
  34. int q1_entdatasize;
  35. char *q1_dentdata;//[MAX_MAP_ENTSTRING];
  36. int q1_numleafs;
  37. q1_dleaf_t *q1_dleafs;//[MAX_MAP_LEAFS];
  38. int q1_numplanes;
  39. q1_dplane_t *q1_dplanes;//[MAX_MAP_PLANES];
  40. int q1_numvertexes;
  41. q1_dvertex_t *q1_dvertexes;//[MAX_MAP_VERTS];
  42. int q1_numnodes;
  43. q1_dnode_t *q1_dnodes;//[MAX_MAP_NODES];
  44. int q1_numtexinfo;
  45. q1_texinfo_t *q1_texinfo;//[MAX_MAP_TEXINFO];
  46. int q1_numfaces;
  47. q1_dface_t *q1_dfaces;//[MAX_MAP_FACES];
  48. int q1_numclipnodes;
  49. q1_dclipnode_t *q1_dclipnodes;//[MAX_MAP_CLIPNODES];
  50. int q1_numedges;
  51. q1_dedge_t *q1_dedges;//[MAX_MAP_EDGES];
  52. int q1_nummarksurfaces;
  53. unsigned short *q1_dmarksurfaces;//[MAX_MAP_MARKSURFACES];
  54. int q1_numsurfedges;
  55. int *q1_dsurfedges;//[MAX_MAP_SURFEDGES];
  56. //=============================================================================
  57. int q1_bspallocated = false;
  58. int q1_allocatedbspmem = 0;
  59. void Q1_AllocMaxBSP(void)
  60. {
  61. //models
  62. q1_nummodels = 0;
  63. q1_dmodels = (q1_dmodel_t *) GetMemory(Q1_MAX_MAP_MODELS * sizeof(q1_dmodel_t));
  64. q1_allocatedbspmem = Q1_MAX_MAP_MODELS * sizeof(q1_dmodel_t);
  65. //visibility
  66. q1_visdatasize = 0;
  67. q1_dvisdata = (byte *) GetMemory(Q1_MAX_MAP_VISIBILITY * sizeof(byte));
  68. q1_allocatedbspmem += Q1_MAX_MAP_VISIBILITY * sizeof(byte);
  69. //light data
  70. q1_lightdatasize = 0;
  71. q1_dlightdata = (byte *) GetMemory(Q1_MAX_MAP_LIGHTING * sizeof(byte));
  72. q1_allocatedbspmem += Q1_MAX_MAP_LIGHTING * sizeof(byte);
  73. //texture data
  74. q1_texdatasize = 0;
  75. q1_dtexdata = (byte *) GetMemory(Q1_MAX_MAP_MIPTEX * sizeof(byte)); // (dmiptexlump_t)
  76. q1_allocatedbspmem += Q1_MAX_MAP_MIPTEX * sizeof(byte);
  77. //entities
  78. q1_entdatasize = 0;
  79. q1_dentdata = (char *) GetMemory(Q1_MAX_MAP_ENTSTRING * sizeof(char));
  80. q1_allocatedbspmem += Q1_MAX_MAP_ENTSTRING * sizeof(char);
  81. //leaves
  82. q1_numleafs = 0;
  83. q1_dleafs = (q1_dleaf_t *) GetMemory(Q1_MAX_MAP_LEAFS * sizeof(q1_dleaf_t));
  84. q1_allocatedbspmem += Q1_MAX_MAP_LEAFS * sizeof(q1_dleaf_t);
  85. //planes
  86. q1_numplanes = 0;
  87. q1_dplanes = (q1_dplane_t *) GetMemory(Q1_MAX_MAP_PLANES * sizeof(q1_dplane_t));
  88. q1_allocatedbspmem += Q1_MAX_MAP_PLANES * sizeof(q1_dplane_t);
  89. //vertexes
  90. q1_numvertexes = 0;
  91. q1_dvertexes = (q1_dvertex_t *) GetMemory(Q1_MAX_MAP_VERTS * sizeof(q1_dvertex_t));
  92. q1_allocatedbspmem += Q1_MAX_MAP_VERTS * sizeof(q1_dvertex_t);
  93. //nodes
  94. q1_numnodes = 0;
  95. q1_dnodes = (q1_dnode_t *) GetMemory(Q1_MAX_MAP_NODES * sizeof(q1_dnode_t));
  96. q1_allocatedbspmem += Q1_MAX_MAP_NODES * sizeof(q1_dnode_t);
  97. //texture info
  98. q1_numtexinfo = 0;
  99. q1_texinfo = (q1_texinfo_t *) GetMemory(Q1_MAX_MAP_TEXINFO * sizeof(q1_texinfo_t));
  100. q1_allocatedbspmem += Q1_MAX_MAP_TEXINFO * sizeof(q1_texinfo_t);
  101. //faces
  102. q1_numfaces = 0;
  103. q1_dfaces = (q1_dface_t *) GetMemory(Q1_MAX_MAP_FACES * sizeof(q1_dface_t));
  104. q1_allocatedbspmem += Q1_MAX_MAP_FACES * sizeof(q1_dface_t);
  105. //clip nodes
  106. q1_numclipnodes = 0;
  107. q1_dclipnodes = (q1_dclipnode_t *) GetMemory(Q1_MAX_MAP_CLIPNODES * sizeof(q1_dclipnode_t));
  108. q1_allocatedbspmem += Q1_MAX_MAP_CLIPNODES * sizeof(q1_dclipnode_t);
  109. //edges
  110. q1_numedges = 0;
  111. q1_dedges = (q1_dedge_t *) GetMemory(Q1_MAX_MAP_EDGES * sizeof(q1_dedge_t));
  112. q1_allocatedbspmem += Q1_MAX_MAP_EDGES, sizeof(q1_dedge_t);
  113. //mark surfaces
  114. q1_nummarksurfaces = 0;
  115. q1_dmarksurfaces = (unsigned short *) GetMemory(Q1_MAX_MAP_MARKSURFACES * sizeof(unsigned short));
  116. q1_allocatedbspmem += Q1_MAX_MAP_MARKSURFACES * sizeof(unsigned short);
  117. //surface edges
  118. q1_numsurfedges = 0;
  119. q1_dsurfedges = (int *) GetMemory(Q1_MAX_MAP_SURFEDGES * sizeof(int));
  120. q1_allocatedbspmem += Q1_MAX_MAP_SURFEDGES * sizeof(int);
  121. //print allocated memory
  122. Log_Print("allocated ");
  123. PrintMemorySize(q1_allocatedbspmem);
  124. Log_Print(" of BSP memory\n");
  125. } //end of the function Q1_AllocMaxBSP
  126. void Q1_FreeMaxBSP(void)
  127. {
  128. //models
  129. q1_nummodels = 0;
  130. FreeMemory(q1_dmodels);
  131. q1_dmodels = NULL;
  132. //visibility
  133. q1_visdatasize = 0;
  134. FreeMemory(q1_dvisdata);
  135. q1_dvisdata = NULL;
  136. //light data
  137. q1_lightdatasize = 0;
  138. FreeMemory(q1_dlightdata);
  139. q1_dlightdata = NULL;
  140. //texture data
  141. q1_texdatasize = 0;
  142. FreeMemory(q1_dtexdata);
  143. q1_dtexdata = NULL;
  144. //entities
  145. q1_entdatasize = 0;
  146. FreeMemory(q1_dentdata);
  147. q1_dentdata = NULL;
  148. //leaves
  149. q1_numleafs = 0;
  150. FreeMemory(q1_dleafs);
  151. q1_dleafs = NULL;
  152. //planes
  153. q1_numplanes = 0;
  154. FreeMemory(q1_dplanes);
  155. q1_dplanes = NULL;
  156. //vertexes
  157. q1_numvertexes = 0;
  158. FreeMemory(q1_dvertexes);
  159. q1_dvertexes = NULL;
  160. //nodes
  161. q1_numnodes = 0;
  162. FreeMemory(q1_dnodes);
  163. q1_dnodes = NULL;
  164. //texture info
  165. q1_numtexinfo = 0;
  166. FreeMemory(q1_texinfo);
  167. q1_texinfo = NULL;
  168. //faces
  169. q1_numfaces = 0;
  170. FreeMemory(q1_dfaces);
  171. q1_dfaces = NULL;
  172. //clip nodes
  173. q1_numclipnodes = 0;
  174. FreeMemory(q1_dclipnodes);
  175. q1_dclipnodes = NULL;
  176. //edges
  177. q1_numedges = 0;
  178. FreeMemory(q1_dedges);
  179. q1_dedges = NULL;
  180. //mark surfaces
  181. q1_nummarksurfaces = 0;
  182. FreeMemory(q1_dmarksurfaces);
  183. q1_dmarksurfaces = NULL;
  184. //surface edges
  185. q1_numsurfedges = 0;
  186. FreeMemory(q1_dsurfedges);
  187. q1_dsurfedges = NULL;
  188. //
  189. Log_Print("freed ");
  190. PrintMemorySize(q1_allocatedbspmem);
  191. Log_Print(" of BSP memory\n");
  192. q1_allocatedbspmem = 0;
  193. } //end of the function Q1_FreeMaxBSP
  194. //#endif //ME
  195. /*
  196. =============
  197. Q1_SwapBSPFile
  198. Byte swaps all data in a bsp file.
  199. =============
  200. */
  201. void Q1_SwapBSPFile (qboolean todisk)
  202. {
  203. int i, j, c;
  204. q1_dmodel_t *d;
  205. q1_dmiptexlump_t *mtl;
  206. // models
  207. for (i=0 ; i<q1_nummodels ; i++)
  208. {
  209. d = &q1_dmodels[i];
  210. for (j=0 ; j<Q1_MAX_MAP_HULLS ; j++)
  211. d->headnode[j] = LittleLong (d->headnode[j]);
  212. d->visleafs = LittleLong (d->visleafs);
  213. d->firstface = LittleLong (d->firstface);
  214. d->numfaces = LittleLong (d->numfaces);
  215. for (j=0 ; j<3 ; j++)
  216. {
  217. d->mins[j] = LittleFloat(d->mins[j]);
  218. d->maxs[j] = LittleFloat(d->maxs[j]);
  219. d->origin[j] = LittleFloat(d->origin[j]);
  220. }
  221. }
  222. //
  223. // vertexes
  224. //
  225. for (i=0 ; i<q1_numvertexes ; i++)
  226. {
  227. for (j=0 ; j<3 ; j++)
  228. q1_dvertexes[i].point[j] = LittleFloat(q1_dvertexes[i].point[j]);
  229. }
  230. //
  231. // planes
  232. //
  233. for (i=0 ; i<q1_numplanes ; i++)
  234. {
  235. for (j=0 ; j<3 ; j++)
  236. q1_dplanes[i].normal[j] = LittleFloat(q1_dplanes[i].normal[j]);
  237. q1_dplanes[i].dist = LittleFloat(q1_dplanes[i].dist);
  238. q1_dplanes[i].type = LittleLong(q1_dplanes[i].type);
  239. }
  240. //
  241. // texinfos
  242. //
  243. for (i=0 ; i<q1_numtexinfo ; i++)
  244. {
  245. for (j=0 ; j<8 ; j++)
  246. q1_texinfo[i].vecs[0][j] = LittleFloat(q1_texinfo[i].vecs[0][j]);
  247. q1_texinfo[i].miptex = LittleLong(q1_texinfo[i].miptex);
  248. q1_texinfo[i].flags = LittleLong(q1_texinfo[i].flags);
  249. }
  250. //
  251. // faces
  252. //
  253. for (i=0 ; i<q1_numfaces ; i++)
  254. {
  255. q1_dfaces[i].texinfo = LittleShort(q1_dfaces[i].texinfo);
  256. q1_dfaces[i].planenum = LittleShort(q1_dfaces[i].planenum);
  257. q1_dfaces[i].side = LittleShort(q1_dfaces[i].side);
  258. q1_dfaces[i].lightofs = LittleLong(q1_dfaces[i].lightofs);
  259. q1_dfaces[i].firstedge = LittleLong(q1_dfaces[i].firstedge);
  260. q1_dfaces[i].numedges = LittleShort(q1_dfaces[i].numedges);
  261. }
  262. //
  263. // nodes
  264. //
  265. for (i=0 ; i<q1_numnodes ; i++)
  266. {
  267. q1_dnodes[i].planenum = LittleLong(q1_dnodes[i].planenum);
  268. for (j=0 ; j<3 ; j++)
  269. {
  270. q1_dnodes[i].mins[j] = LittleShort(q1_dnodes[i].mins[j]);
  271. q1_dnodes[i].maxs[j] = LittleShort(q1_dnodes[i].maxs[j]);
  272. }
  273. q1_dnodes[i].children[0] = LittleShort(q1_dnodes[i].children[0]);
  274. q1_dnodes[i].children[1] = LittleShort(q1_dnodes[i].children[1]);
  275. q1_dnodes[i].firstface = LittleShort(q1_dnodes[i].firstface);
  276. q1_dnodes[i].numfaces = LittleShort(q1_dnodes[i].numfaces);
  277. }
  278. //
  279. // leafs
  280. //
  281. for (i=0 ; i<q1_numleafs ; i++)
  282. {
  283. q1_dleafs[i].contents = LittleLong(q1_dleafs[i].contents);
  284. for (j=0 ; j<3 ; j++)
  285. {
  286. q1_dleafs[i].mins[j] = LittleShort(q1_dleafs[i].mins[j]);
  287. q1_dleafs[i].maxs[j] = LittleShort(q1_dleafs[i].maxs[j]);
  288. }
  289. q1_dleafs[i].firstmarksurface = LittleShort(q1_dleafs[i].firstmarksurface);
  290. q1_dleafs[i].nummarksurfaces = LittleShort(q1_dleafs[i].nummarksurfaces);
  291. q1_dleafs[i].visofs = LittleLong(q1_dleafs[i].visofs);
  292. }
  293. //
  294. // clipnodes
  295. //
  296. for (i=0 ; i<q1_numclipnodes ; i++)
  297. {
  298. q1_dclipnodes[i].planenum = LittleLong(q1_dclipnodes[i].planenum);
  299. q1_dclipnodes[i].children[0] = LittleShort(q1_dclipnodes[i].children[0]);
  300. q1_dclipnodes[i].children[1] = LittleShort(q1_dclipnodes[i].children[1]);
  301. }
  302. //
  303. // miptex
  304. //
  305. if (q1_texdatasize)
  306. {
  307. mtl = (q1_dmiptexlump_t *)q1_dtexdata;
  308. if (todisk)
  309. c = mtl->nummiptex;
  310. else
  311. c = LittleLong(mtl->nummiptex);
  312. mtl->nummiptex = LittleLong (mtl->nummiptex);
  313. for (i=0 ; i<c ; i++)
  314. mtl->dataofs[i] = LittleLong(mtl->dataofs[i]);
  315. }
  316. //
  317. // marksurfaces
  318. //
  319. for (i=0 ; i<q1_nummarksurfaces ; i++)
  320. q1_dmarksurfaces[i] = LittleShort(q1_dmarksurfaces[i]);
  321. //
  322. // surfedges
  323. //
  324. for (i=0 ; i<q1_numsurfedges ; i++)
  325. q1_dsurfedges[i] = LittleLong(q1_dsurfedges[i]);
  326. //
  327. // edges
  328. //
  329. for (i=0 ; i<q1_numedges ; i++)
  330. {
  331. q1_dedges[i].v[0] = LittleShort(q1_dedges[i].v[0]);
  332. q1_dedges[i].v[1] = LittleShort(q1_dedges[i].v[1]);
  333. }
  334. }
  335. q1_dheader_t *q1_header;
  336. int q1_fileLength;
  337. int Q1_CopyLump (int lump, void *dest, int size, int maxsize)
  338. {
  339. int length, ofs;
  340. length = q1_header->lumps[lump].filelen;
  341. ofs = q1_header->lumps[lump].fileofs;
  342. if (length % size) {
  343. Error ("LoadBSPFile: odd lump size");
  344. }
  345. // somehow things got out of range
  346. if ((length/size) > maxsize) {
  347. printf("WARNING: exceeded max size for lump %d size %d > maxsize %d\n", lump, (length/size), maxsize);
  348. length = maxsize * size;
  349. }
  350. if ( ofs + length > q1_fileLength ) {
  351. printf("WARNING: exceeded file length for lump %d\n", lump);
  352. length = q1_fileLength - ofs;
  353. if ( length <= 0 ) {
  354. return 0;
  355. }
  356. }
  357. memcpy (dest, (byte *)q1_header + ofs, length);
  358. return length / size;
  359. }
  360. /*
  361. =============
  362. Q1_LoadBSPFile
  363. =============
  364. */
  365. void Q1_LoadBSPFile(char *filename, int offset, int length)
  366. {
  367. int i;
  368. //
  369. // load the file header
  370. //
  371. q1_fileLength = LoadFile(filename, (void **)&q1_header, offset, length);
  372. // swap the header
  373. for (i=0 ; i< sizeof(q1_dheader_t)/4 ; i++)
  374. ((int *)q1_header)[i] = LittleLong ( ((int *)q1_header)[i]);
  375. if (q1_header->version != Q1_BSPVERSION)
  376. Error ("%s is version %i, not %i", filename, i, Q1_BSPVERSION);
  377. q1_nummodels = Q1_CopyLump (Q1_LUMP_MODELS, q1_dmodels, sizeof(q1_dmodel_t), Q1_MAX_MAP_MODELS );
  378. q1_numvertexes = Q1_CopyLump (Q1_LUMP_VERTEXES, q1_dvertexes, sizeof(q1_dvertex_t), Q1_MAX_MAP_VERTS );
  379. q1_numplanes = Q1_CopyLump (Q1_LUMP_PLANES, q1_dplanes, sizeof(q1_dplane_t), Q1_MAX_MAP_PLANES );
  380. q1_numleafs = Q1_CopyLump (Q1_LUMP_LEAFS, q1_dleafs, sizeof(q1_dleaf_t), Q1_MAX_MAP_LEAFS );
  381. q1_numnodes = Q1_CopyLump (Q1_LUMP_NODES, q1_dnodes, sizeof(q1_dnode_t), Q1_MAX_MAP_NODES );
  382. q1_numtexinfo = Q1_CopyLump (Q1_LUMP_TEXINFO, q1_texinfo, sizeof(q1_texinfo_t), Q1_MAX_MAP_TEXINFO );
  383. q1_numclipnodes = Q1_CopyLump (Q1_LUMP_CLIPNODES, q1_dclipnodes, sizeof(q1_dclipnode_t), Q1_MAX_MAP_CLIPNODES );
  384. q1_numfaces = Q1_CopyLump (Q1_LUMP_FACES, q1_dfaces, sizeof(q1_dface_t), Q1_MAX_MAP_FACES );
  385. q1_nummarksurfaces = Q1_CopyLump (Q1_LUMP_MARKSURFACES, q1_dmarksurfaces, sizeof(q1_dmarksurfaces[0]), Q1_MAX_MAP_MARKSURFACES );
  386. q1_numsurfedges = Q1_CopyLump (Q1_LUMP_SURFEDGES, q1_dsurfedges, sizeof(q1_dsurfedges[0]), Q1_MAX_MAP_SURFEDGES );
  387. q1_numedges = Q1_CopyLump (Q1_LUMP_EDGES, q1_dedges, sizeof(q1_dedge_t), Q1_MAX_MAP_EDGES );
  388. q1_texdatasize = Q1_CopyLump (Q1_LUMP_TEXTURES, q1_dtexdata, 1, Q1_MAX_MAP_MIPTEX );
  389. q1_visdatasize = Q1_CopyLump (Q1_LUMP_VISIBILITY, q1_dvisdata, 1, Q1_MAX_MAP_VISIBILITY );
  390. q1_lightdatasize = Q1_CopyLump (Q1_LUMP_LIGHTING, q1_dlightdata, 1, Q1_MAX_MAP_LIGHTING );
  391. q1_entdatasize = Q1_CopyLump (Q1_LUMP_ENTITIES, q1_dentdata, 1, Q1_MAX_MAP_ENTSTRING );
  392. FreeMemory(q1_header); // everything has been copied out
  393. //
  394. // swap everything
  395. //
  396. Q1_SwapBSPFile (false);
  397. }
  398. //============================================================================
  399. FILE *q1_wadfile;
  400. q1_dheader_t q1_outheader;
  401. void Q1_AddLump (int lumpnum, void *data, int len)
  402. {
  403. q1_lump_t *lump;
  404. lump = &q1_header->lumps[lumpnum];
  405. lump->fileofs = LittleLong(ftell(q1_wadfile));
  406. lump->filelen = LittleLong(len);
  407. SafeWrite(q1_wadfile, data, (len+3)&~3);
  408. }
  409. /*
  410. =============
  411. Q1_WriteBSPFile
  412. Swaps the bsp file in place, so it should not be referenced again
  413. =============
  414. */
  415. void Q1_WriteBSPFile (char *filename)
  416. {
  417. q1_header = &q1_outheader;
  418. memset (q1_header, 0, sizeof(q1_dheader_t));
  419. Q1_SwapBSPFile (true);
  420. q1_header->version = LittleLong (Q1_BSPVERSION);
  421. q1_wadfile = SafeOpenWrite (filename);
  422. SafeWrite (q1_wadfile, q1_header, sizeof(q1_dheader_t)); // overwritten later
  423. Q1_AddLump (Q1_LUMP_PLANES, q1_dplanes, q1_numplanes*sizeof(q1_dplane_t));
  424. Q1_AddLump (Q1_LUMP_LEAFS, q1_dleafs, q1_numleafs*sizeof(q1_dleaf_t));
  425. Q1_AddLump (Q1_LUMP_VERTEXES, q1_dvertexes, q1_numvertexes*sizeof(q1_dvertex_t));
  426. Q1_AddLump (Q1_LUMP_NODES, q1_dnodes, q1_numnodes*sizeof(q1_dnode_t));
  427. Q1_AddLump (Q1_LUMP_TEXINFO, q1_texinfo, q1_numtexinfo*sizeof(q1_texinfo_t));
  428. Q1_AddLump (Q1_LUMP_FACES, q1_dfaces, q1_numfaces*sizeof(q1_dface_t));
  429. Q1_AddLump (Q1_LUMP_CLIPNODES, q1_dclipnodes, q1_numclipnodes*sizeof(q1_dclipnode_t));
  430. Q1_AddLump (Q1_LUMP_MARKSURFACES, q1_dmarksurfaces, q1_nummarksurfaces*sizeof(q1_dmarksurfaces[0]));
  431. Q1_AddLump (Q1_LUMP_SURFEDGES, q1_dsurfedges, q1_numsurfedges*sizeof(q1_dsurfedges[0]));
  432. Q1_AddLump (Q1_LUMP_EDGES, q1_dedges, q1_numedges*sizeof(q1_dedge_t));
  433. Q1_AddLump (Q1_LUMP_MODELS, q1_dmodels, q1_nummodels*sizeof(q1_dmodel_t));
  434. Q1_AddLump (Q1_LUMP_LIGHTING, q1_dlightdata, q1_lightdatasize);
  435. Q1_AddLump (Q1_LUMP_VISIBILITY, q1_dvisdata, q1_visdatasize);
  436. Q1_AddLump (Q1_LUMP_ENTITIES, q1_dentdata, q1_entdatasize);
  437. Q1_AddLump (Q1_LUMP_TEXTURES, q1_dtexdata, q1_texdatasize);
  438. fseek (q1_wadfile, 0, SEEK_SET);
  439. SafeWrite (q1_wadfile, q1_header, sizeof(q1_dheader_t));
  440. fclose (q1_wadfile);
  441. }
  442. //============================================================================
  443. /*
  444. =============
  445. Q1_PrintBSPFileSizes
  446. Dumps info about current file
  447. =============
  448. */
  449. void Q1_PrintBSPFileSizes (void)
  450. {
  451. printf ("%5i planes %6i\n"
  452. ,q1_numplanes, (int)(q1_numplanes*sizeof(q1_dplane_t)));
  453. printf ("%5i vertexes %6i\n"
  454. ,q1_numvertexes, (int)(q1_numvertexes*sizeof(q1_dvertex_t)));
  455. printf ("%5i nodes %6i\n"
  456. ,q1_numnodes, (int)(q1_numnodes*sizeof(q1_dnode_t)));
  457. printf ("%5i texinfo %6i\n"
  458. ,q1_numtexinfo, (int)(q1_numtexinfo*sizeof(q1_texinfo_t)));
  459. printf ("%5i faces %6i\n"
  460. ,q1_numfaces, (int)(q1_numfaces*sizeof(q1_dface_t)));
  461. printf ("%5i clipnodes %6i\n"
  462. ,q1_numclipnodes, (int)(q1_numclipnodes*sizeof(q1_dclipnode_t)));
  463. printf ("%5i leafs %6i\n"
  464. ,q1_numleafs, (int)(q1_numleafs*sizeof(q1_dleaf_t)));
  465. printf ("%5i marksurfaces %6i\n"
  466. ,q1_nummarksurfaces, (int)(q1_nummarksurfaces*sizeof(q1_dmarksurfaces[0])));
  467. printf ("%5i surfedges %6i\n"
  468. ,q1_numsurfedges, (int)(q1_numsurfedges*sizeof(q1_dmarksurfaces[0])));
  469. printf ("%5i edges %6i\n"
  470. ,q1_numedges, (int)(q1_numedges*sizeof(q1_dedge_t)));
  471. if (!q1_texdatasize)
  472. printf (" 0 textures 0\n");
  473. else
  474. printf ("%5i textures %6i\n",((q1_dmiptexlump_t*)q1_dtexdata)->nummiptex, q1_texdatasize);
  475. printf (" lightdata %6i\n", q1_lightdatasize);
  476. printf (" visdata %6i\n", q1_visdatasize);
  477. printf (" entdata %6i\n", q1_entdatasize);
  478. } //end of the function Q1_PrintBSPFileSizes
  479. /*
  480. ================
  481. Q1_ParseEntities
  482. Parses the dentdata string into entities
  483. ================
  484. */
  485. void Q1_ParseEntities (void)
  486. {
  487. script_t *script;
  488. num_entities = 0;
  489. script = LoadScriptMemory(q1_dentdata, q1_entdatasize, "*Quake1 bsp file");
  490. SetScriptFlags(script, SCFL_NOSTRINGWHITESPACES |
  491. SCFL_NOSTRINGESCAPECHARS);
  492. while(ParseEntity(script))
  493. {
  494. } //end while
  495. FreeScript(script);
  496. } //end of the function Q1_ParseEntities
  497. /*
  498. ================
  499. Q1_UnparseEntities
  500. Generates the dentdata string from all the entities
  501. ================
  502. */
  503. void Q1_UnparseEntities (void)
  504. {
  505. char *buf, *end;
  506. epair_t *ep;
  507. char line[2048];
  508. int i;
  509. buf = q1_dentdata;
  510. end = buf;
  511. *end = 0;
  512. for (i=0 ; i<num_entities ; i++)
  513. {
  514. ep = entities[i].epairs;
  515. if (!ep)
  516. continue; // ent got removed
  517. strcat (end,"{\n");
  518. end += 2;
  519. for (ep = entities[i].epairs ; ep ; ep=ep->next)
  520. {
  521. sprintf (line, "\"%s\" \"%s\"\n", ep->key, ep->value);
  522. strcat (end, line);
  523. end += strlen(line);
  524. }
  525. strcat (end,"}\n");
  526. end += 2;
  527. if (end > buf + Q1_MAX_MAP_ENTSTRING)
  528. Error ("Entity text too long");
  529. }
  530. q1_entdatasize = end - buf + 1;
  531. } //end of the function Q1_UnparseEntities