bsputil: fix wad export from bsp with missing textures

We need to skip over the textures with missing data lumps in the BSP,
i.e. having data offset -1.

Signed-off-by: Kevin Shanahan <kmshanah@disenchant.net>
This commit is contained in:
Kevin Shanahan 2014-02-21 09:21:35 +10:30
parent 063880eeda
commit bdd2ac6127
1 changed files with 16 additions and 4 deletions

View File

@ -48,11 +48,18 @@ ExportWad(FILE *wadfile, bsp2_t *bsp)
lumpinfo_t lump; lumpinfo_t lump;
dtexdata_t texdata; dtexdata_t texdata;
miptex_t *miptex; miptex_t *miptex;
int i, j, size, filepos; int i, j, size, filepos, numvalid;
texdata = bsp->dtexdata; texdata = bsp->dtexdata;
/* Count up the valid lumps */
numvalid = 0;
for (i = 0; i < texdata.header->nummiptex; i++)
if (texdata.header->dataofs[i] >= 0)
numvalid++;
memcpy(&header.identification, "WAD2", 4); memcpy(&header.identification, "WAD2", 4);
header.numlumps = texdata.header->nummiptex; header.numlumps = numvalid;
header.infotableofs = sizeof(header); header.infotableofs = sizeof(header);
/* Byte-swap header and write out */ /* Byte-swap header and write out */
@ -60,9 +67,12 @@ ExportWad(FILE *wadfile, bsp2_t *bsp)
header.infotableofs = LittleLong(header.infotableofs); header.infotableofs = LittleLong(header.infotableofs);
fwrite(&header, sizeof(header), 1, wadfile); fwrite(&header, sizeof(header), 1, wadfile);
/* miptex data will follow the lump headers */ /* Miptex data will follow the lump headers */
filepos = sizeof(header) + sizeof(lump) * texdata.header->nummiptex; filepos = sizeof(header) + numvalid * sizeof(lump);
for (i = 0; i < texdata.header->nummiptex; i++) { for (i = 0; i < texdata.header->nummiptex; i++) {
if (texdata.header->dataofs[i] < 0)
continue;
miptex = (miptex_t *)(texdata.base + texdata.header->dataofs[i]); miptex = (miptex_t *)(texdata.base + texdata.header->dataofs[i]);
lump.filepos = filepos; lump.filepos = filepos;
@ -82,6 +92,8 @@ ExportWad(FILE *wadfile, bsp2_t *bsp)
fwrite(&lump, sizeof(lump), 1, wadfile); fwrite(&lump, sizeof(lump), 1, wadfile);
} }
for (i = 0; i < texdata.header->nummiptex; i++) { for (i = 0; i < texdata.header->nummiptex; i++) {
if (texdata.header->dataofs[i] < 0)
continue;
miptex = (miptex_t *)(texdata.base + texdata.header->dataofs[i]); miptex = (miptex_t *)(texdata.base + texdata.header->dataofs[i]);
size = sizeof(*miptex) + miptex->width * miptex->height / 64 * 85; size = sizeof(*miptex) + miptex->width * miptex->height / 64 * 85;