common: WriteBSPFile: q2 support
This commit is contained in:
parent
7e429c560c
commit
63011ba5a2
|
|
@ -2438,19 +2438,22 @@ LoadBSPFile(char *filename, bspdata_t *bspdata)
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
dheader_t header;
|
int version;
|
||||||
|
|
||||||
|
// which one is used depends on version
|
||||||
|
dheader_t q1header;
|
||||||
|
q2_dheader_t q2header;
|
||||||
|
|
||||||
FILE *file;
|
FILE *file;
|
||||||
} bspfile_t;
|
} bspfile_t;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
AddLump(bspfile_t *bspfile, int lumpnum, const void *data, int count)
|
AddLump(bspfile_t *bspfile, int lumpnum, const void *data, int count)
|
||||||
{
|
{
|
||||||
lump_t *lump = &bspfile->header.lumps[lumpnum];
|
bool q2 = false;
|
||||||
byte pad[4] = {0};
|
|
||||||
size_t size;
|
size_t size;
|
||||||
|
|
||||||
/* FIXME - bad API, needing to byte swap back and forth... */
|
switch (bspfile->version) {
|
||||||
switch (LittleLong(bspfile->header.version)) {
|
|
||||||
case BSPVERSION:
|
case BSPVERSION:
|
||||||
size = lumpspec_bsp29[lumpnum].size * count;
|
size = lumpspec_bsp29[lumpnum].size * count;
|
||||||
break;
|
break;
|
||||||
|
|
@ -2460,11 +2463,22 @@ AddLump(bspfile_t *bspfile, int lumpnum, const void *data, int count)
|
||||||
case BSP2VERSION:
|
case BSP2VERSION:
|
||||||
size = lumpspec_bsp2[lumpnum].size * count;
|
size = lumpspec_bsp2[lumpnum].size * count;
|
||||||
break;
|
break;
|
||||||
|
case Q2_BSPVERSION:
|
||||||
|
size = lumpspec_q2bsp[lumpnum].size * count;
|
||||||
|
q2 = true;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
Error("Unsupported BSP version: %d",
|
Error("Unsupported BSP version: %d",
|
||||||
LittleLong(bspfile->header.version));
|
LittleLong(bspfile->version));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
byte pad[4] = {0};
|
||||||
|
lump_t *lump;
|
||||||
|
if (q2)
|
||||||
|
lump = &bspfile->q2header.lumps[lumpnum];
|
||||||
|
else
|
||||||
|
lump = &bspfile->q1header.lumps[lumpnum];
|
||||||
|
|
||||||
lump->fileofs = LittleLong(ftell(bspfile->file));
|
lump->fileofs = LittleLong(ftell(bspfile->file));
|
||||||
lump->filelen = LittleLong(size);
|
lump->filelen = LittleLong(size);
|
||||||
SafeWrite(bspfile->file, data, size);
|
SafeWrite(bspfile->file, data, size);
|
||||||
|
|
@ -2477,7 +2491,7 @@ AddModelsLump(bspfile_t *bspfile, bspdata_t *bspdata, const void *data, int coun
|
||||||
{
|
{
|
||||||
if (bspdata->hullcount == MAX_MAP_HULLS_Q1)
|
if (bspdata->hullcount == MAX_MAP_HULLS_Q1)
|
||||||
{ /*convert in-place. no need to care about endian here.*/
|
{ /*convert in-place. no need to care about endian here.*/
|
||||||
lump_t *lump = &bspfile->header.lumps[LUMP_MODELS];
|
lump_t *lump = &bspfile->q1header.lumps[LUMP_MODELS];
|
||||||
const dmodel_t *in = static_cast<const dmodel_t *>(data);
|
const dmodel_t *in = static_cast<const dmodel_t *>(data);
|
||||||
dmodelq1_t *out = static_cast<dmodelq1_t *>(malloc(count * sizeof(dmodelq1_t)));
|
dmodelq1_t *out = static_cast<dmodelq1_t *>(malloc(count * sizeof(dmodelq1_t)));
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
@ -2515,17 +2529,27 @@ void
|
||||||
WriteBSPFile(const char *filename, bspdata_t *bspdata)
|
WriteBSPFile(const char *filename, bspdata_t *bspdata)
|
||||||
{
|
{
|
||||||
bspfile_t bspfile;
|
bspfile_t bspfile;
|
||||||
|
memset(&bspfile, 0, sizeof(bspfile));
|
||||||
memset(&bspfile.header, 0, sizeof(bspfile.header));
|
|
||||||
|
|
||||||
SwapBSPFile(bspdata, TO_DISK);
|
SwapBSPFile(bspdata, TO_DISK);
|
||||||
|
|
||||||
bspfile.header.version = LittleLong(bspdata->version);
|
bspfile.version = bspdata->version;
|
||||||
|
if (bspfile.version == Q2_BSPVERSION) {
|
||||||
|
bspfile.q2header.ident = LittleLong(Q2_BSPIDENT);
|
||||||
|
bspfile.q2header.version = LittleLong(Q2_BSPVERSION);
|
||||||
|
} else {
|
||||||
|
bspfile.q1header.version = LittleLong(bspfile.version);
|
||||||
|
}
|
||||||
|
|
||||||
logprint("Writing %s as BSP version %s\n", filename, BSPVersionString(bspdata->version));
|
logprint("Writing %s as BSP version %s\n", filename, BSPVersionString(bspdata->version));
|
||||||
bspfile.file = SafeOpenWrite(filename);
|
bspfile.file = SafeOpenWrite(filename);
|
||||||
|
|
||||||
/* Save header space, updated after adding the lumps */
|
/* Save header space, updated after adding the lumps */
|
||||||
SafeWrite(bspfile.file, &bspfile.header, sizeof(bspfile.header));
|
if (bspfile.version == Q2_BSPVERSION) {
|
||||||
|
SafeWrite(bspfile.file, &bspfile.q2header, sizeof(bspfile.q2header));
|
||||||
|
} else {
|
||||||
|
SafeWrite(bspfile.file, &bspfile.q1header, sizeof(bspfile.q1header));
|
||||||
|
}
|
||||||
|
|
||||||
if (bspdata->version == BSPVERSION) {
|
if (bspdata->version == BSPVERSION) {
|
||||||
bsp29_t *bsp = &bspdata->data.bsp29;
|
bsp29_t *bsp = &bspdata->data.bsp29;
|
||||||
|
|
@ -2546,9 +2570,7 @@ WriteBSPFile(const char *filename, bspdata_t *bspdata)
|
||||||
AddLump(&bspfile, LUMP_VISIBILITY, bsp->dvisdata, bsp->visdatasize);
|
AddLump(&bspfile, LUMP_VISIBILITY, bsp->dvisdata, bsp->visdatasize);
|
||||||
AddLump(&bspfile, LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize);
|
AddLump(&bspfile, LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize);
|
||||||
AddLump(&bspfile, LUMP_TEXTURES, bsp->dtexdata, bsp->texdatasize);
|
AddLump(&bspfile, LUMP_TEXTURES, bsp->dtexdata, bsp->texdatasize);
|
||||||
}
|
} else if (bspdata->version == BSP2RMQVERSION) {
|
||||||
|
|
||||||
if (bspdata->version == BSP2RMQVERSION) {
|
|
||||||
bsp2rmq_t *bsp = &bspdata->data.bsp2rmq;
|
bsp2rmq_t *bsp = &bspdata->data.bsp2rmq;
|
||||||
|
|
||||||
AddLump(&bspfile, LUMP_PLANES, bsp->dplanes, bsp->numplanes);
|
AddLump(&bspfile, LUMP_PLANES, bsp->dplanes, bsp->numplanes);
|
||||||
|
|
@ -2567,9 +2589,7 @@ WriteBSPFile(const char *filename, bspdata_t *bspdata)
|
||||||
AddLump(&bspfile, LUMP_VISIBILITY, bsp->dvisdata, bsp->visdatasize);
|
AddLump(&bspfile, LUMP_VISIBILITY, bsp->dvisdata, bsp->visdatasize);
|
||||||
AddLump(&bspfile, LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize);
|
AddLump(&bspfile, LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize);
|
||||||
AddLump(&bspfile, LUMP_TEXTURES, bsp->dtexdata, bsp->texdatasize);
|
AddLump(&bspfile, LUMP_TEXTURES, bsp->dtexdata, bsp->texdatasize);
|
||||||
}
|
} else if (bspdata->version == BSP2VERSION) {
|
||||||
|
|
||||||
if (bspdata->version == BSP2VERSION) {
|
|
||||||
bsp2_t *bsp = &bspdata->data.bsp2;
|
bsp2_t *bsp = &bspdata->data.bsp2;
|
||||||
|
|
||||||
AddLump(&bspfile, LUMP_PLANES, bsp->dplanes, bsp->numplanes);
|
AddLump(&bspfile, LUMP_PLANES, bsp->dplanes, bsp->numplanes);
|
||||||
|
|
@ -2588,6 +2608,31 @@ WriteBSPFile(const char *filename, bspdata_t *bspdata)
|
||||||
AddLump(&bspfile, LUMP_VISIBILITY, bsp->dvisdata, bsp->visdatasize);
|
AddLump(&bspfile, LUMP_VISIBILITY, bsp->dvisdata, bsp->visdatasize);
|
||||||
AddLump(&bspfile, LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize);
|
AddLump(&bspfile, LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize);
|
||||||
AddLump(&bspfile, LUMP_TEXTURES, bsp->dtexdata, bsp->texdatasize);
|
AddLump(&bspfile, LUMP_TEXTURES, bsp->dtexdata, bsp->texdatasize);
|
||||||
|
} else if (bspdata->version == Q2_BSPVERSION) {
|
||||||
|
q2bsp_t *bsp = &bspdata->data.q2bsp;
|
||||||
|
|
||||||
|
AddLump(&bspfile, Q2_LUMP_MODELS, bsp->dmodels, bsp->nummodels);
|
||||||
|
AddLump(&bspfile, Q2_LUMP_VERTEXES, bsp->dvertexes, bsp->numvertexes);
|
||||||
|
AddLump(&bspfile, Q2_LUMP_PLANES, bsp->dplanes, bsp->numplanes);
|
||||||
|
AddLump(&bspfile, Q2_LUMP_LEAFS, bsp->dleafs, bsp->numleafs);
|
||||||
|
AddLump(&bspfile, Q2_LUMP_NODES, bsp->dnodes, bsp->numnodes);
|
||||||
|
AddLump(&bspfile, Q2_LUMP_TEXINFO, bsp->texinfo, bsp->numtexinfo);
|
||||||
|
AddLump(&bspfile, Q2_LUMP_FACES, bsp->dfaces, bsp->numfaces);
|
||||||
|
AddLump(&bspfile, Q2_LUMP_LEAFFACES, bsp->dleaffaces, bsp->numleaffaces);
|
||||||
|
AddLump(&bspfile, Q2_LUMP_LEAFBRUSHES, bsp->dleafbrushes, bsp->numleafbrushes);
|
||||||
|
AddLump(&bspfile, Q2_LUMP_SURFEDGES, bsp->dsurfedges, bsp->numsurfedges);
|
||||||
|
AddLump(&bspfile, Q2_LUMP_EDGES, bsp->dedges, bsp->numedges);
|
||||||
|
AddLump(&bspfile, Q2_LUMP_BRUSHES, bsp->dbrushes, bsp->numbrushes);
|
||||||
|
AddLump(&bspfile, Q2_LUMP_BRUSHSIDES, bsp->dbrushsides, bsp->numbrushsides);
|
||||||
|
AddLump(&bspfile, Q2_LUMP_AREAS, bsp->dareas, bsp->numareas);
|
||||||
|
AddLump(&bspfile, Q2_LUMP_AREAPORTALS, bsp->dareaportals, bsp->numareaportals);
|
||||||
|
|
||||||
|
AddLump(&bspfile, Q2_LUMP_VISIBILITY, bsp->dvis, bsp->visdatasize);
|
||||||
|
AddLump(&bspfile, Q2_LUMP_LIGHTING, bsp->dlightdata, bsp->lightdatasize);
|
||||||
|
AddLump(&bspfile, Q2_LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize);
|
||||||
|
AddLump(&bspfile, Q2_LUMP_POP, bsp->dpop, sizeof(bsp->dpop));
|
||||||
|
} else {
|
||||||
|
Error("Unknown format");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*BSPX lumps are at a 4-byte alignment after the last of any official lump*/
|
/*BSPX lumps are at a 4-byte alignment after the last of any official lump*/
|
||||||
|
|
@ -2631,7 +2676,13 @@ WriteBSPFile(const char *filename, bspdata_t *bspdata)
|
||||||
}
|
}
|
||||||
|
|
||||||
fseek(bspfile.file, 0, SEEK_SET);
|
fseek(bspfile.file, 0, SEEK_SET);
|
||||||
SafeWrite(bspfile.file, &bspfile.header, sizeof(bspfile.header));
|
|
||||||
|
// write the real header
|
||||||
|
if (bspfile.version == Q2_BSPVERSION) {
|
||||||
|
SafeWrite(bspfile.file, &bspfile.q2header, sizeof(bspfile.q2header));
|
||||||
|
} else {
|
||||||
|
SafeWrite(bspfile.file, &bspfile.q1header, sizeof(bspfile.q1header));
|
||||||
|
}
|
||||||
|
|
||||||
fclose(bspfile.file);
|
fclose(bspfile.file);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue