From 17606fde4ba5fffa2c03e15e6f250442f4c4acab Mon Sep 17 00:00:00 2001 From: Jonathan Date: Thu, 16 Sep 2021 11:52:37 -0400 Subject: [PATCH] Use variant instead of having all BSP types allocated at once (even though they are smol) Move ownership of pointers to the bsp structures themselves for now. --- bspinfo/bspinfo.cc | 2 +- bsputil/bsputil.cc | 39 +- common/bspfile.cc | 1940 ++++++++++++++++--------------------- include/common/bspfile.hh | 162 +++- light/light.cc | 88 +- qbsp/writebsp.cc | 50 +- vis/vis.cc | 17 +- 7 files changed, 1108 insertions(+), 1190 deletions(-) diff --git a/bspinfo/bspinfo.cc b/bspinfo/bspinfo.cc index a99350e1..ee0b729b 100644 --- a/bspinfo/bspinfo.cc +++ b/bspinfo/bspinfo.cc @@ -160,7 +160,7 @@ int main(int argc, char **argv) strcat(source, ".json"); ConvertBSPFormat(&bsp, &bspver_generic); - serialize_bsp(bsp.data.mbsp, source); + serialize_bsp(std::get(bsp.bsp), source); printf("---------------------\n"); } diff --git a/bsputil/bsputil.cc b/bsputil/bsputil.cc index 05c446d8..78ea1f6f 100644 --- a/bsputil/bsputil.cc +++ b/bsputil/bsputil.cc @@ -436,27 +436,27 @@ static void CheckBSPFile(const mbsp_t *bsp) bsp->dmodels[0].mins[2], bsp->dmodels[0].maxs[0], bsp->dmodels[0].maxs[1], bsp->dmodels[0].maxs[2]); } -static void CompareBSPFiles(const mbsp_t *refBsp, const mbsp_t *bsp) +static void CompareBSPFiles(const mbsp_t &refBsp, const mbsp_t &bsp) { - printf("comparing %d with %d faces\n", refBsp->numfaces, bsp->numfaces); + printf("comparing %d with %d faces\n", refBsp.numfaces, bsp.numfaces); - const dmodel_t *world = BSP_GetWorldModel(bsp); - const dmodel_t *refWorld = BSP_GetWorldModel(refBsp); + const dmodel_t *world = BSP_GetWorldModel(&bsp); + const dmodel_t *refWorld = BSP_GetWorldModel(&refBsp); // iterate through the refBsp world faces for (int i = 0; i < refWorld->numfaces; i++) { - auto *refFace = BSP_GetFace(refBsp, refWorld->firstface + i); - qvec3f refFaceCentroid = Face_Centroid(refBsp, refFace); + auto *refFace = BSP_GetFace(&refBsp, refWorld->firstface + i); + qvec3f refFaceCentroid = Face_Centroid(&refBsp, refFace); // FIXME: vec3_t wantedPoint; VectorCopy(refFaceCentroid, wantedPoint); vec3_t wantedNormal; - Face_Normal(refBsp, refFace, wantedNormal); + Face_Normal(&refBsp, refFace, wantedNormal); // Search for a face in bsp touching refFaceCentroid. - auto *matchedFace = BSP_FindFaceAtPoint(bsp, world, wantedPoint, wantedNormal); + auto *matchedFace = BSP_FindFaceAtPoint(&bsp, world, wantedPoint, wantedNormal); if (matchedFace == nullptr) { printf("couldn't find a face at %f %f %f normal %f %f %f\n", wantedPoint[0], wantedPoint[1], wantedPoint[2], wantedNormal[0], wantedNormal[1], wantedNormal[2]); @@ -490,7 +490,8 @@ static void FindFaces(const mbsp_t *bsp, const vec3_t &pos, const vec3_t &normal int main(int argc, char **argv) { bspdata_t bspdata; - mbsp_t *const bsp = &bspdata.data.mbsp; + mbsp_t &bsp = bspdata.bsp.emplace(); + char source[1024]; FILE *f; int i, err; @@ -530,7 +531,7 @@ int main(int argc, char **argv) printf("comparing reference bsp %s with test bsp %s\n", refbspname, source); - CompareBSPFiles(&refbspdata.data.mbsp, &bspdata.data.mbsp); + CompareBSPFiles(std::get(refbspdata.bsp), bsp); break; } else if (!strcmp(argv[i], "--convert")) { @@ -570,8 +571,8 @@ int main(int argc, char **argv) if (!f) Error("couldn't open %s for writing\n", source); - err = fwrite(bsp->dentdata, sizeof(char), bsp->entdatasize - 1, f); - if (err != bsp->entdatasize - 1) + err = fwrite(bsp.dentdata, sizeof(char), bsp.entdatasize - 1, f); + if (err != bsp.entdatasize - 1) Error("%s", strerror(errno)); err = fclose(f); @@ -588,7 +589,7 @@ int main(int argc, char **argv) if (!f) Error("couldn't open %s for writing\n", source); - ExportWad(f, bsp); + ExportWad(f, &bsp); err = fclose(f); if (err) @@ -597,11 +598,11 @@ int main(int argc, char **argv) printf("done.\n"); } else if (!strcmp(argv[i], "--check")) { printf("Beginning BSP data check...\n"); - CheckBSPFile(bsp); - CheckBSPFacesPlanar(bsp); + CheckBSPFile(&bsp); + CheckBSPFacesPlanar(&bsp); printf("Done.\n"); } else if (!strcmp(argv[i], "--modelinfo")) { - PrintModelInfo(bsp); + PrintModelInfo(&bsp); } else if (!strcmp(argv[i], "--findfaces")) { // (i + 1) ... (i + 6) = x y z nx ny nz // i + 7 = bsp file @@ -613,7 +614,7 @@ int main(int argc, char **argv) try { const vec3_t pos = {std::stof(argv[i + 1]), std::stof(argv[i + 2]), std::stof(argv[i + 3])}; const vec3_t normal = {std::stof(argv[i + 4]), std::stof(argv[i + 5]), std::stof(argv[i + 6])}; - FindFaces(bsp, pos, normal); + FindFaces(&bsp, pos, normal); } catch (const std::exception &) { printf("Error reading position/normal\n"); @@ -630,7 +631,7 @@ int main(int argc, char **argv) const int fnum = std::stoi(argv[i + 1]); const int texinfonum = std::stoi(argv[i + 2]); - bsp2_dface_t *face = BSP_GetFace(bsp, fnum); + bsp2_dface_t *face = BSP_GetFace(&bsp, fnum); face->texinfo = texinfonum; ConvertBSPFormat(&bspdata, bspdata.loadversion); @@ -653,7 +654,7 @@ int main(int argc, char **argv) decomp_options options; options.geometryOnly = geomOnly; - DecompileBSP(bsp, options, f); + DecompileBSP(&bsp, options, f); fclose(f); printf("done.\n"); diff --git a/common/bspfile.cc b/common/bspfile.cc index 1aaaa044..9bb9e4bd 100644 --- a/common/bspfile.cc +++ b/common/bspfile.cc @@ -256,6 +256,7 @@ struct gamedef_q2_t : public gamedef_t { return !(contents.native & ((Q2_LAST_VISIBLE_CONTENTS << 1) - 1)); } + bool contents_are_solid(const contentflags_t &contents) const { return contents.native & Q2_CONTENTS_SOLID; } bool contents_are_sky(const contentflags_t &contents) const { return false; } @@ -743,14 +744,14 @@ Q2_SwapBSPFile Byte swaps all data in a bsp file. ============= */ -void Q2_SwapBSPFile(q2bsp_t *bsp, qboolean todisk) +void Q2_SwapBSPFile(q2bsp_t &bsp, qboolean todisk) { int i, j; q2_dmodel_t *d; // models - for (i = 0; i < bsp->nummodels; i++) { - d = &bsp->dmodels[i]; + for (i = 0; i < bsp.nummodels; i++) { + d = &bsp.dmodels[i]; d->firstface = LittleLong(d->firstface); d->numfaces = LittleLong(d->numfaces); @@ -766,150 +767,150 @@ void Q2_SwapBSPFile(q2bsp_t *bsp, qboolean todisk) // // vertexes // - for (i = 0; i < bsp->numvertexes; i++) { + for (i = 0; i < bsp.numvertexes; i++) { for (j = 0; j < 3; j++) - bsp->dvertexes[i].point[j] = LittleFloat(bsp->dvertexes[i].point[j]); + bsp.dvertexes[i].point[j] = LittleFloat(bsp.dvertexes[i].point[j]); } // // planes // - for (i = 0; i < bsp->numplanes; i++) { + for (i = 0; i < bsp.numplanes; i++) { for (j = 0; j < 3; j++) - bsp->dplanes[i].normal[j] = LittleFloat(bsp->dplanes[i].normal[j]); - bsp->dplanes[i].dist = LittleFloat(bsp->dplanes[i].dist); - bsp->dplanes[i].type = LittleLong(bsp->dplanes[i].type); + bsp.dplanes[i].normal[j] = LittleFloat(bsp.dplanes[i].normal[j]); + bsp.dplanes[i].dist = LittleFloat(bsp.dplanes[i].dist); + bsp.dplanes[i].type = LittleLong(bsp.dplanes[i].type); } // // texinfos // - for (i = 0; i < bsp->numtexinfo; i++) { + for (i = 0; i < bsp.numtexinfo; i++) { for (j = 0; j < 4; j++) { - bsp->texinfo[i].vecs[0][j] = LittleFloat(bsp->texinfo[i].vecs[0][j]); - bsp->texinfo[i].vecs[1][j] = LittleFloat(bsp->texinfo[i].vecs[1][j]); + bsp.texinfo[i].vecs[0][j] = LittleFloat(bsp.texinfo[i].vecs[0][j]); + bsp.texinfo[i].vecs[1][j] = LittleFloat(bsp.texinfo[i].vecs[1][j]); } - bsp->texinfo[i].flags = LittleLong(bsp->texinfo[i].flags); - bsp->texinfo[i].value = LittleLong(bsp->texinfo[i].value); - bsp->texinfo[i].nexttexinfo = LittleLong(bsp->texinfo[i].nexttexinfo); + bsp.texinfo[i].flags = LittleLong(bsp.texinfo[i].flags); + bsp.texinfo[i].value = LittleLong(bsp.texinfo[i].value); + bsp.texinfo[i].nexttexinfo = LittleLong(bsp.texinfo[i].nexttexinfo); } // // faces // - for (i = 0; i < bsp->numfaces; i++) { - bsp->dfaces[i].texinfo = LittleShort(bsp->dfaces[i].texinfo); - bsp->dfaces[i].planenum = LittleShort(bsp->dfaces[i].planenum); - bsp->dfaces[i].side = LittleShort(bsp->dfaces[i].side); - bsp->dfaces[i].lightofs = LittleLong(bsp->dfaces[i].lightofs); - bsp->dfaces[i].firstedge = LittleLong(bsp->dfaces[i].firstedge); - bsp->dfaces[i].numedges = LittleShort(bsp->dfaces[i].numedges); + for (i = 0; i < bsp.numfaces; i++) { + bsp.dfaces[i].texinfo = LittleShort(bsp.dfaces[i].texinfo); + bsp.dfaces[i].planenum = LittleShort(bsp.dfaces[i].planenum); + bsp.dfaces[i].side = LittleShort(bsp.dfaces[i].side); + bsp.dfaces[i].lightofs = LittleLong(bsp.dfaces[i].lightofs); + bsp.dfaces[i].firstedge = LittleLong(bsp.dfaces[i].firstedge); + bsp.dfaces[i].numedges = LittleShort(bsp.dfaces[i].numedges); } // // nodes // - for (i = 0; i < bsp->numnodes; i++) { - bsp->dnodes[i].planenum = LittleLong(bsp->dnodes[i].planenum); + for (i = 0; i < bsp.numnodes; i++) { + bsp.dnodes[i].planenum = LittleLong(bsp.dnodes[i].planenum); for (j = 0; j < 3; j++) { - bsp->dnodes[i].mins[j] = LittleShort(bsp->dnodes[i].mins[j]); - bsp->dnodes[i].maxs[j] = LittleShort(bsp->dnodes[i].maxs[j]); + bsp.dnodes[i].mins[j] = LittleShort(bsp.dnodes[i].mins[j]); + bsp.dnodes[i].maxs[j] = LittleShort(bsp.dnodes[i].maxs[j]); } - bsp->dnodes[i].children[0] = LittleLong(bsp->dnodes[i].children[0]); - bsp->dnodes[i].children[1] = LittleLong(bsp->dnodes[i].children[1]); - bsp->dnodes[i].firstface = LittleShort(bsp->dnodes[i].firstface); - bsp->dnodes[i].numfaces = LittleShort(bsp->dnodes[i].numfaces); + bsp.dnodes[i].children[0] = LittleLong(bsp.dnodes[i].children[0]); + bsp.dnodes[i].children[1] = LittleLong(bsp.dnodes[i].children[1]); + bsp.dnodes[i].firstface = LittleShort(bsp.dnodes[i].firstface); + bsp.dnodes[i].numfaces = LittleShort(bsp.dnodes[i].numfaces); } // // leafs // - for (i = 0; i < bsp->numleafs; i++) { - bsp->dleafs[i].contents = LittleLong(bsp->dleafs[i].contents); - bsp->dleafs[i].cluster = LittleShort(bsp->dleafs[i].cluster); - bsp->dleafs[i].area = LittleShort(bsp->dleafs[i].area); + for (i = 0; i < bsp.numleafs; i++) { + bsp.dleafs[i].contents = LittleLong(bsp.dleafs[i].contents); + bsp.dleafs[i].cluster = LittleShort(bsp.dleafs[i].cluster); + bsp.dleafs[i].area = LittleShort(bsp.dleafs[i].area); for (j = 0; j < 3; j++) { - bsp->dleafs[i].mins[j] = LittleShort(bsp->dleafs[i].mins[j]); - bsp->dleafs[i].maxs[j] = LittleShort(bsp->dleafs[i].maxs[j]); + bsp.dleafs[i].mins[j] = LittleShort(bsp.dleafs[i].mins[j]); + bsp.dleafs[i].maxs[j] = LittleShort(bsp.dleafs[i].maxs[j]); } - bsp->dleafs[i].firstleafface = LittleShort(bsp->dleafs[i].firstleafface); - bsp->dleafs[i].numleaffaces = LittleShort(bsp->dleafs[i].numleaffaces); - bsp->dleafs[i].firstleafbrush = LittleShort(bsp->dleafs[i].firstleafbrush); - bsp->dleafs[i].numleafbrushes = LittleShort(bsp->dleafs[i].numleafbrushes); + bsp.dleafs[i].firstleafface = LittleShort(bsp.dleafs[i].firstleafface); + bsp.dleafs[i].numleaffaces = LittleShort(bsp.dleafs[i].numleaffaces); + bsp.dleafs[i].firstleafbrush = LittleShort(bsp.dleafs[i].firstleafbrush); + bsp.dleafs[i].numleafbrushes = LittleShort(bsp.dleafs[i].numleafbrushes); } // // leaffaces // - for (i = 0; i < bsp->numleaffaces; i++) - bsp->dleaffaces[i] = LittleShort(bsp->dleaffaces[i]); + for (i = 0; i < bsp.numleaffaces; i++) + bsp.dleaffaces[i] = LittleShort(bsp.dleaffaces[i]); // // leafbrushes // - for (i = 0; i < bsp->numleafbrushes; i++) - bsp->dleafbrushes[i] = LittleShort(bsp->dleafbrushes[i]); + for (i = 0; i < bsp.numleafbrushes; i++) + bsp.dleafbrushes[i] = LittleShort(bsp.dleafbrushes[i]); // // surfedges // - for (i = 0; i < bsp->numsurfedges; i++) - bsp->dsurfedges[i] = LittleLong(bsp->dsurfedges[i]); + for (i = 0; i < bsp.numsurfedges; i++) + bsp.dsurfedges[i] = LittleLong(bsp.dsurfedges[i]); // // edges // - for (i = 0; i < bsp->numedges; i++) { - bsp->dedges[i].v[0] = LittleShort(bsp->dedges[i].v[0]); - bsp->dedges[i].v[1] = LittleShort(bsp->dedges[i].v[1]); + for (i = 0; i < bsp.numedges; i++) { + bsp.dedges[i].v[0] = LittleShort(bsp.dedges[i].v[0]); + bsp.dedges[i].v[1] = LittleShort(bsp.dedges[i].v[1]); } // // brushes // - for (i = 0; i < bsp->numbrushes; i++) { - bsp->dbrushes[i].firstside = LittleLong(bsp->dbrushes[i].firstside); - bsp->dbrushes[i].numsides = LittleLong(bsp->dbrushes[i].numsides); - bsp->dbrushes[i].contents = LittleLong(bsp->dbrushes[i].contents); + for (i = 0; i < bsp.numbrushes; i++) { + bsp.dbrushes[i].firstside = LittleLong(bsp.dbrushes[i].firstside); + bsp.dbrushes[i].numsides = LittleLong(bsp.dbrushes[i].numsides); + bsp.dbrushes[i].contents = LittleLong(bsp.dbrushes[i].contents); } // // areas // - for (i = 0; i < bsp->numareas; i++) { - bsp->dareas[i].numareaportals = LittleLong(bsp->dareas[i].numareaportals); - bsp->dareas[i].firstareaportal = LittleLong(bsp->dareas[i].firstareaportal); + for (i = 0; i < bsp.numareas; i++) { + bsp.dareas[i].numareaportals = LittleLong(bsp.dareas[i].numareaportals); + bsp.dareas[i].firstareaportal = LittleLong(bsp.dareas[i].firstareaportal); } // // areasportals // - for (i = 0; i < bsp->numareaportals; i++) { - bsp->dareaportals[i].portalnum = LittleLong(bsp->dareaportals[i].portalnum); - bsp->dareaportals[i].otherarea = LittleLong(bsp->dareaportals[i].otherarea); + for (i = 0; i < bsp.numareaportals; i++) { + bsp.dareaportals[i].portalnum = LittleLong(bsp.dareaportals[i].portalnum); + bsp.dareaportals[i].otherarea = LittleLong(bsp.dareaportals[i].otherarea); } // // brushsides // - for (i = 0; i < bsp->numbrushsides; i++) { - bsp->dbrushsides[i].planenum = LittleShort(bsp->dbrushsides[i].planenum); - bsp->dbrushsides[i].texinfo = LittleShort(bsp->dbrushsides[i].texinfo); + for (i = 0; i < bsp.numbrushsides; i++) { + bsp.dbrushsides[i].planenum = LittleShort(bsp.dbrushsides[i].planenum); + bsp.dbrushsides[i].texinfo = LittleShort(bsp.dbrushsides[i].texinfo); } // // visibility // - if (bsp->dvis) { + if (bsp.dvis) { if (todisk) - j = bsp->dvis->numclusters; + j = bsp.dvis->numclusters; else - j = LittleLong(bsp->dvis->numclusters); - bsp->dvis->numclusters = LittleLong(bsp->dvis->numclusters); + j = LittleLong(bsp.dvis->numclusters); + bsp.dvis->numclusters = LittleLong(bsp.dvis->numclusters); for (i = 0; i < j; i++) { - bsp->dvis->bitofs[i][0] = LittleLong(bsp->dvis->bitofs[i][0]); - bsp->dvis->bitofs[i][1] = LittleLong(bsp->dvis->bitofs[i][1]); + bsp.dvis->bitofs[i][0] = LittleLong(bsp.dvis->bitofs[i][0]); + bsp.dvis->bitofs[i][1] = LittleLong(bsp.dvis->bitofs[i][1]); } } } @@ -921,14 +922,14 @@ Q2_Qbism_SwapBSPFile Byte swaps all data in a bsp file. ============= */ -void Q2_Qbism_SwapBSPFile(q2bsp_qbism_t *bsp, qboolean todisk) +void Q2_Qbism_SwapBSPFile(q2bsp_qbism_t &bsp, qboolean todisk) { int i, j; q2_dmodel_t *d; // models - for (i = 0; i < bsp->nummodels; i++) { - d = &bsp->dmodels[i]; + for (i = 0; i < bsp.nummodels; i++) { + d = &bsp.dmodels[i]; d->firstface = LittleLong(d->firstface); d->numfaces = LittleLong(d->numfaces); @@ -944,150 +945,150 @@ void Q2_Qbism_SwapBSPFile(q2bsp_qbism_t *bsp, qboolean todisk) // // vertexes // - for (i = 0; i < bsp->numvertexes; i++) { + for (i = 0; i < bsp.numvertexes; i++) { for (j = 0; j < 3; j++) - bsp->dvertexes[i].point[j] = LittleFloat(bsp->dvertexes[i].point[j]); + bsp.dvertexes[i].point[j] = LittleFloat(bsp.dvertexes[i].point[j]); } // // planes // - for (i = 0; i < bsp->numplanes; i++) { + for (i = 0; i < bsp.numplanes; i++) { for (j = 0; j < 3; j++) - bsp->dplanes[i].normal[j] = LittleFloat(bsp->dplanes[i].normal[j]); - bsp->dplanes[i].dist = LittleFloat(bsp->dplanes[i].dist); - bsp->dplanes[i].type = LittleLong(bsp->dplanes[i].type); + bsp.dplanes[i].normal[j] = LittleFloat(bsp.dplanes[i].normal[j]); + bsp.dplanes[i].dist = LittleFloat(bsp.dplanes[i].dist); + bsp.dplanes[i].type = LittleLong(bsp.dplanes[i].type); } // // texinfos // - for (i = 0; i < bsp->numtexinfo; i++) { + for (i = 0; i < bsp.numtexinfo; i++) { for (j = 0; j < 4; j++) { - bsp->texinfo[i].vecs[0][j] = LittleFloat(bsp->texinfo[i].vecs[0][j]); - bsp->texinfo[i].vecs[1][j] = LittleFloat(bsp->texinfo[i].vecs[1][j]); + bsp.texinfo[i].vecs[0][j] = LittleFloat(bsp.texinfo[i].vecs[0][j]); + bsp.texinfo[i].vecs[1][j] = LittleFloat(bsp.texinfo[i].vecs[1][j]); } - bsp->texinfo[i].flags = LittleLong(bsp->texinfo[i].flags); - bsp->texinfo[i].value = LittleLong(bsp->texinfo[i].value); - bsp->texinfo[i].nexttexinfo = LittleLong(bsp->texinfo[i].nexttexinfo); + bsp.texinfo[i].flags = LittleLong(bsp.texinfo[i].flags); + bsp.texinfo[i].value = LittleLong(bsp.texinfo[i].value); + bsp.texinfo[i].nexttexinfo = LittleLong(bsp.texinfo[i].nexttexinfo); } // // faces // - for (i = 0; i < bsp->numfaces; i++) { - bsp->dfaces[i].texinfo = LittleLong(bsp->dfaces[i].texinfo); - bsp->dfaces[i].planenum = LittleLong(bsp->dfaces[i].planenum); - bsp->dfaces[i].side = LittleLong(bsp->dfaces[i].side); - bsp->dfaces[i].lightofs = LittleLong(bsp->dfaces[i].lightofs); - bsp->dfaces[i].firstedge = LittleLong(bsp->dfaces[i].firstedge); - bsp->dfaces[i].numedges = LittleLong(bsp->dfaces[i].numedges); + for (i = 0; i < bsp.numfaces; i++) { + bsp.dfaces[i].texinfo = LittleLong(bsp.dfaces[i].texinfo); + bsp.dfaces[i].planenum = LittleLong(bsp.dfaces[i].planenum); + bsp.dfaces[i].side = LittleLong(bsp.dfaces[i].side); + bsp.dfaces[i].lightofs = LittleLong(bsp.dfaces[i].lightofs); + bsp.dfaces[i].firstedge = LittleLong(bsp.dfaces[i].firstedge); + bsp.dfaces[i].numedges = LittleLong(bsp.dfaces[i].numedges); } // // nodes // - for (i = 0; i < bsp->numnodes; i++) { - bsp->dnodes[i].planenum = LittleLong(bsp->dnodes[i].planenum); + for (i = 0; i < bsp.numnodes; i++) { + bsp.dnodes[i].planenum = LittleLong(bsp.dnodes[i].planenum); for (j = 0; j < 3; j++) { - bsp->dnodes[i].mins[j] = LittleFloat(bsp->dnodes[i].mins[j]); - bsp->dnodes[i].maxs[j] = LittleFloat(bsp->dnodes[i].maxs[j]); + bsp.dnodes[i].mins[j] = LittleFloat(bsp.dnodes[i].mins[j]); + bsp.dnodes[i].maxs[j] = LittleFloat(bsp.dnodes[i].maxs[j]); } - bsp->dnodes[i].children[0] = LittleLong(bsp->dnodes[i].children[0]); - bsp->dnodes[i].children[1] = LittleLong(bsp->dnodes[i].children[1]); - bsp->dnodes[i].firstface = LittleLong(bsp->dnodes[i].firstface); - bsp->dnodes[i].numfaces = LittleLong(bsp->dnodes[i].numfaces); + bsp.dnodes[i].children[0] = LittleLong(bsp.dnodes[i].children[0]); + bsp.dnodes[i].children[1] = LittleLong(bsp.dnodes[i].children[1]); + bsp.dnodes[i].firstface = LittleLong(bsp.dnodes[i].firstface); + bsp.dnodes[i].numfaces = LittleLong(bsp.dnodes[i].numfaces); } // // leafs // - for (i = 0; i < bsp->numleafs; i++) { - bsp->dleafs[i].contents = LittleLong(bsp->dleafs[i].contents); - bsp->dleafs[i].cluster = LittleLong(bsp->dleafs[i].cluster); - bsp->dleafs[i].area = LittleLong(bsp->dleafs[i].area); + for (i = 0; i < bsp.numleafs; i++) { + bsp.dleafs[i].contents = LittleLong(bsp.dleafs[i].contents); + bsp.dleafs[i].cluster = LittleLong(bsp.dleafs[i].cluster); + bsp.dleafs[i].area = LittleLong(bsp.dleafs[i].area); for (j = 0; j < 3; j++) { - bsp->dleafs[i].mins[j] = LittleFloat(bsp->dleafs[i].mins[j]); - bsp->dleafs[i].maxs[j] = LittleFloat(bsp->dleafs[i].maxs[j]); + bsp.dleafs[i].mins[j] = LittleFloat(bsp.dleafs[i].mins[j]); + bsp.dleafs[i].maxs[j] = LittleFloat(bsp.dleafs[i].maxs[j]); } - bsp->dleafs[i].firstleafface = LittleLong(bsp->dleafs[i].firstleafface); - bsp->dleafs[i].numleaffaces = LittleLong(bsp->dleafs[i].numleaffaces); - bsp->dleafs[i].firstleafbrush = LittleLong(bsp->dleafs[i].firstleafbrush); - bsp->dleafs[i].numleafbrushes = LittleLong(bsp->dleafs[i].numleafbrushes); + bsp.dleafs[i].firstleafface = LittleLong(bsp.dleafs[i].firstleafface); + bsp.dleafs[i].numleaffaces = LittleLong(bsp.dleafs[i].numleaffaces); + bsp.dleafs[i].firstleafbrush = LittleLong(bsp.dleafs[i].firstleafbrush); + bsp.dleafs[i].numleafbrushes = LittleLong(bsp.dleafs[i].numleafbrushes); } // // leaffaces // - for (i = 0; i < bsp->numleaffaces; i++) - bsp->dleaffaces[i] = LittleLong(bsp->dleaffaces[i]); + for (i = 0; i < bsp.numleaffaces; i++) + bsp.dleaffaces[i] = LittleLong(bsp.dleaffaces[i]); // // leafbrushes // - for (i = 0; i < bsp->numleafbrushes; i++) - bsp->dleafbrushes[i] = LittleLong(bsp->dleafbrushes[i]); + for (i = 0; i < bsp.numleafbrushes; i++) + bsp.dleafbrushes[i] = LittleLong(bsp.dleafbrushes[i]); // // surfedges // - for (i = 0; i < bsp->numsurfedges; i++) - bsp->dsurfedges[i] = LittleLong(bsp->dsurfedges[i]); + for (i = 0; i < bsp.numsurfedges; i++) + bsp.dsurfedges[i] = LittleLong(bsp.dsurfedges[i]); // // edges // - for (i = 0; i < bsp->numedges; i++) { - bsp->dedges[i].v[0] = LittleLong(bsp->dedges[i].v[0]); - bsp->dedges[i].v[1] = LittleLong(bsp->dedges[i].v[1]); + for (i = 0; i < bsp.numedges; i++) { + bsp.dedges[i].v[0] = LittleLong(bsp.dedges[i].v[0]); + bsp.dedges[i].v[1] = LittleLong(bsp.dedges[i].v[1]); } // // brushes // - for (i = 0; i < bsp->numbrushes; i++) { - bsp->dbrushes[i].firstside = LittleLong(bsp->dbrushes[i].firstside); - bsp->dbrushes[i].numsides = LittleLong(bsp->dbrushes[i].numsides); - bsp->dbrushes[i].contents = LittleLong(bsp->dbrushes[i].contents); + for (i = 0; i < bsp.numbrushes; i++) { + bsp.dbrushes[i].firstside = LittleLong(bsp.dbrushes[i].firstside); + bsp.dbrushes[i].numsides = LittleLong(bsp.dbrushes[i].numsides); + bsp.dbrushes[i].contents = LittleLong(bsp.dbrushes[i].contents); } // // areas // - for (i = 0; i < bsp->numareas; i++) { - bsp->dareas[i].numareaportals = LittleLong(bsp->dareas[i].numareaportals); - bsp->dareas[i].firstareaportal = LittleLong(bsp->dareas[i].firstareaportal); + for (i = 0; i < bsp.numareas; i++) { + bsp.dareas[i].numareaportals = LittleLong(bsp.dareas[i].numareaportals); + bsp.dareas[i].firstareaportal = LittleLong(bsp.dareas[i].firstareaportal); } // // areasportals // - for (i = 0; i < bsp->numareaportals; i++) { - bsp->dareaportals[i].portalnum = LittleLong(bsp->dareaportals[i].portalnum); - bsp->dareaportals[i].otherarea = LittleLong(bsp->dareaportals[i].otherarea); + for (i = 0; i < bsp.numareaportals; i++) { + bsp.dareaportals[i].portalnum = LittleLong(bsp.dareaportals[i].portalnum); + bsp.dareaportals[i].otherarea = LittleLong(bsp.dareaportals[i].otherarea); } // // brushsides // - for (i = 0; i < bsp->numbrushsides; i++) { - bsp->dbrushsides[i].planenum = LittleLong(bsp->dbrushsides[i].planenum); - bsp->dbrushsides[i].texinfo = LittleLong(bsp->dbrushsides[i].texinfo); + for (i = 0; i < bsp.numbrushsides; i++) { + bsp.dbrushsides[i].planenum = LittleLong(bsp.dbrushsides[i].planenum); + bsp.dbrushsides[i].texinfo = LittleLong(bsp.dbrushsides[i].texinfo); } // // visibility // - if (bsp->dvis) { + if (bsp.dvis) { if (todisk) - j = bsp->dvis->numclusters; + j = bsp.dvis->numclusters; else - j = LittleLong(bsp->dvis->numclusters); - bsp->dvis->numclusters = LittleLong(bsp->dvis->numclusters); + j = LittleLong(bsp.dvis->numclusters); + bsp.dvis->numclusters = LittleLong(bsp.dvis->numclusters); for (i = 0; i < j; i++) { - bsp->dvis->bitofs[i][0] = LittleLong(bsp->dvis->bitofs[i][0]); - bsp->dvis->bitofs[i][1] = LittleLong(bsp->dvis->bitofs[i][1]); + bsp.dvis->bitofs[i][0] = LittleLong(bsp.dvis->bitofs[i][0]); + bsp.dvis->bitofs[i][1] = LittleLong(bsp.dvis->bitofs[i][1]); } } } @@ -1101,79 +1102,77 @@ void Q2_Qbism_SwapBSPFile(q2bsp_qbism_t *bsp, qboolean todisk) static void SwapBSPFile(bspdata_t *bspdata, swaptype_t swap) { if (bspdata->version == &bspver_q2) { - q2bsp_t *bsp = &bspdata->data.q2bsp; - Q2_SwapBSPFile(bsp, swap == TO_DISK); + Q2_SwapBSPFile(std::get(bspdata->bsp), swap == TO_DISK); return; } else if (bspdata->version == &bspver_qbism) { - q2bsp_qbism_t *bsp = &bspdata->data.q2bsp_qbism; - Q2_Qbism_SwapBSPFile(bsp, swap == TO_DISK); + Q2_Qbism_SwapBSPFile(std::get(bspdata->bsp), swap == TO_DISK); return; } if (bspdata->version == &bspver_q1 || bspdata->version == &bspver_h2 || bspdata->version == &bspver_hl) { - bsp29_t *bsp = &bspdata->data.bsp29; + bsp29_t &bsp = std::get(bspdata->bsp); - SwapBSPVertexes(bsp->numvertexes, bsp->dvertexes); - SwapBSPPlanes(bsp->numplanes, bsp->dplanes); - SwapBSPTexinfo(bsp->numtexinfo, bsp->texinfo); - SwapBSP29Faces(bsp->numfaces, bsp->dfaces); - SwapBSP29Nodes(bsp->numnodes, bsp->dnodes); - SwapBSP29Leafs(bsp->numleafs, bsp->dleafs); - SwapBSP29Clipnodes(bsp->numclipnodes, bsp->dclipnodes); - SwapBSPMiptex(bsp->texdatasize, bsp->dtexdata, swap); - SwapBSP29Marksurfaces(bsp->nummarksurfaces, bsp->dmarksurfaces); - SwapBSPSurfedges(bsp->numsurfedges, bsp->dsurfedges); - SwapBSP29Edges(bsp->numedges, bsp->dedges); + SwapBSPVertexes(bsp.numvertexes, bsp.dvertexes); + SwapBSPPlanes(bsp.numplanes, bsp.dplanes); + SwapBSPTexinfo(bsp.numtexinfo, bsp.texinfo); + SwapBSP29Faces(bsp.numfaces, bsp.dfaces); + SwapBSP29Nodes(bsp.numnodes, bsp.dnodes); + SwapBSP29Leafs(bsp.numleafs, bsp.dleafs); + SwapBSP29Clipnodes(bsp.numclipnodes, bsp.dclipnodes); + SwapBSPMiptex(bsp.texdatasize, bsp.dtexdata, swap); + SwapBSP29Marksurfaces(bsp.nummarksurfaces, bsp.dmarksurfaces); + SwapBSPSurfedges(bsp.numsurfedges, bsp.dsurfedges); + SwapBSP29Edges(bsp.numedges, bsp.dedges); if (bspdata->version == &bspver_h2) { - SwapBSPModels(bsp->nummodels, bsp->dmodels_h2); + SwapBSPModels(bsp.nummodels, bsp.dmodels_h2); } else { - SwapBSPModels(bsp->nummodels, bsp->dmodels_q); + SwapBSPModels(bsp.nummodels, bsp.dmodels_q); } return; } if (bspdata->version == &bspver_bsp2rmq || bspdata->version == &bspver_h2bsp2rmq) { - bsp2rmq_t *bsp = &bspdata->data.bsp2rmq; + bsp2rmq_t &bsp = std::get(bspdata->bsp); - SwapBSPVertexes(bsp->numvertexes, bsp->dvertexes); - SwapBSPPlanes(bsp->numplanes, bsp->dplanes); - SwapBSPTexinfo(bsp->numtexinfo, bsp->texinfo); - SwapBSP2Faces(bsp->numfaces, bsp->dfaces); - SwapBSP2rmqNodes(bsp->numnodes, bsp->dnodes); - SwapBSP2rmqLeafs(bsp->numleafs, bsp->dleafs); - SwapBSP2Clipnodes(bsp->numclipnodes, bsp->dclipnodes); - SwapBSPMiptex(bsp->texdatasize, bsp->dtexdata, swap); - SwapBSP2Marksurfaces(bsp->nummarksurfaces, bsp->dmarksurfaces); - SwapBSPSurfedges(bsp->numsurfedges, bsp->dsurfedges); - SwapBSP2Edges(bsp->numedges, bsp->dedges); + SwapBSPVertexes(bsp.numvertexes, bsp.dvertexes); + SwapBSPPlanes(bsp.numplanes, bsp.dplanes); + SwapBSPTexinfo(bsp.numtexinfo, bsp.texinfo); + SwapBSP2Faces(bsp.numfaces, bsp.dfaces); + SwapBSP2rmqNodes(bsp.numnodes, bsp.dnodes); + SwapBSP2rmqLeafs(bsp.numleafs, bsp.dleafs); + SwapBSP2Clipnodes(bsp.numclipnodes, bsp.dclipnodes); + SwapBSPMiptex(bsp.texdatasize, bsp.dtexdata, swap); + SwapBSP2Marksurfaces(bsp.nummarksurfaces, bsp.dmarksurfaces); + SwapBSPSurfedges(bsp.numsurfedges, bsp.dsurfedges); + SwapBSP2Edges(bsp.numedges, bsp.dedges); if (bspdata->version == &bspver_h2bsp2rmq) { - SwapBSPModels(bsp->nummodels, bsp->dmodels_h2); + SwapBSPModels(bsp.nummodels, bsp.dmodels_h2); } else { - SwapBSPModels(bsp->nummodels, bsp->dmodels_q); + SwapBSPModels(bsp.nummodels, bsp.dmodels_q); } return; } if (bspdata->version == &bspver_bsp2 || bspdata->version == &bspver_h2bsp2) { - bsp2_t *bsp = &bspdata->data.bsp2; + bsp2_t &bsp = std::get(bspdata->bsp); - SwapBSPVertexes(bsp->numvertexes, bsp->dvertexes); - SwapBSPPlanes(bsp->numplanes, bsp->dplanes); - SwapBSPTexinfo(bsp->numtexinfo, bsp->texinfo); - SwapBSP2Faces(bsp->numfaces, bsp->dfaces); - SwapBSP2Nodes(bsp->numnodes, bsp->dnodes); - SwapBSP2Leafs(bsp->numleafs, bsp->dleafs); - SwapBSP2Clipnodes(bsp->numclipnodes, bsp->dclipnodes); - SwapBSPMiptex(bsp->texdatasize, bsp->dtexdata, swap); - SwapBSP2Marksurfaces(bsp->nummarksurfaces, bsp->dmarksurfaces); - SwapBSPSurfedges(bsp->numsurfedges, bsp->dsurfedges); - SwapBSP2Edges(bsp->numedges, bsp->dedges); + SwapBSPVertexes(bsp.numvertexes, bsp.dvertexes); + SwapBSPPlanes(bsp.numplanes, bsp.dplanes); + SwapBSPTexinfo(bsp.numtexinfo, bsp.texinfo); + SwapBSP2Faces(bsp.numfaces, bsp.dfaces); + SwapBSP2Nodes(bsp.numnodes, bsp.dnodes); + SwapBSP2Leafs(bsp.numleafs, bsp.dleafs); + SwapBSP2Clipnodes(bsp.numclipnodes, bsp.dclipnodes); + SwapBSPMiptex(bsp.texdatasize, bsp.dtexdata, swap); + SwapBSP2Marksurfaces(bsp.nummarksurfaces, bsp.dmarksurfaces); + SwapBSPSurfedges(bsp.numsurfedges, bsp.dsurfedges); + SwapBSP2Edges(bsp.numedges, bsp.dedges); if (bspdata->version == &bspver_h2bsp2) { - SwapBSPModels(bsp->nummodels, bsp->dmodels_h2); + SwapBSPModels(bsp.nummodels, bsp.dmodels_h2); } else { - SwapBSPModels(bsp->nummodels, bsp->dmodels_q); + SwapBSPModels(bsp.nummodels, bsp.dmodels_q); } return; @@ -2475,154 +2474,6 @@ static dbrushside_t *MBSPtoQ2_CopyBrushSides(const q2_dbrushside_qbism_t *dbrush return newdata; } -/* - * ========================================================================= - * Freeing BSP structs - * ========================================================================= - */ - -static void FreeBSP29(bsp29_t *bsp) -{ - delete[] bsp->dmodels_q; - delete[] bsp->dmodels_h2; - delete[] bsp->dvisdata; - delete[] bsp->dlightdata; - delete[] bsp->dtexdata; - delete[] bsp->dentdata; - delete[] bsp->dleafs; - delete[] bsp->dplanes; - delete[] bsp->dvertexes; - delete[] bsp->dnodes; - delete[] bsp->texinfo; - delete[] bsp->dfaces; - delete[] bsp->dclipnodes; - delete[] bsp->dedges; - delete[] bsp->dmarksurfaces; - delete[] bsp->dsurfedges; - memset(bsp, 0, sizeof(*bsp)); -} - -static void FreeBSP2RMQ(bsp2rmq_t *bsp) -{ - delete[] bsp->dmodels_q; - delete[] bsp->dmodels_h2; - delete[] bsp->dvisdata; - delete[] bsp->dlightdata; - delete[] bsp->dtexdata; - delete[] bsp->dentdata; - delete[] bsp->dleafs; - delete[] bsp->dplanes; - delete[] bsp->dvertexes; - delete[] bsp->dnodes; - delete[] bsp->texinfo; - delete[] bsp->dfaces; - delete[] bsp->dclipnodes; - delete[] bsp->dedges; - delete[] bsp->dmarksurfaces; - delete[] bsp->dsurfedges; - memset(bsp, 0, sizeof(*bsp)); -} - -static void FreeBSP2(bsp2_t *bsp) -{ - delete[] bsp->dmodels_q; - delete[] bsp->dmodels_h2; - delete[] bsp->dvisdata; - delete[] bsp->dlightdata; - delete[] bsp->dtexdata; - delete[] bsp->dentdata; - delete[] bsp->dleafs; - delete[] bsp->dplanes; - delete[] bsp->dvertexes; - delete[] bsp->dnodes; - delete[] bsp->texinfo; - delete[] bsp->dfaces; - delete[] bsp->dclipnodes; - delete[] bsp->dedges; - delete[] bsp->dmarksurfaces; - delete[] bsp->dsurfedges; - memset(bsp, 0, sizeof(*bsp)); -} - -static void FreeQ2BSP(q2bsp_t *bsp) -{ - delete[] bsp->dmodels; - delete[] bsp->dvis; - delete[] bsp->dlightdata; - delete[] bsp->dentdata; - delete[] bsp->dleafs; - delete[] bsp->dplanes; - delete[] bsp->dvertexes; - delete[] bsp->dnodes; - delete[] bsp->texinfo; - delete[] bsp->dfaces; - delete[] bsp->dedges; - delete[] bsp->dleaffaces; - delete[] bsp->dleafbrushes; - delete[] bsp->dsurfedges; - delete[] bsp->dareas; - delete[] bsp->dareaportals; - delete[] bsp->dbrushes; - delete[] bsp->dbrushsides; - memset(bsp, 0, sizeof(*bsp)); -} - -static void FreeQ2BSP_QBSP(q2bsp_qbism_t *bsp) -{ - delete[] bsp->dmodels; - delete[] bsp->dvis; - delete[] bsp->dlightdata; - delete[] bsp->dentdata; - delete[] bsp->dleafs; - delete[] bsp->dplanes; - delete[] bsp->dvertexes; - delete[] bsp->dnodes; - delete[] bsp->texinfo; - delete[] bsp->dfaces; - delete[] bsp->dedges; - delete[] bsp->dleaffaces; - delete[] bsp->dleafbrushes; - delete[] bsp->dsurfedges; - delete[] bsp->dareas; - delete[] bsp->dareaportals; - delete[] bsp->dbrushes; - delete[] bsp->dbrushsides; - memset(bsp, 0, sizeof(*bsp)); -} - -static void FreeMBSP(mbsp_t *bsp) -{ - delete[] bsp->dmodels; - delete[] bsp->dvisdata; - delete[] bsp->dlightdata; - delete[] bsp->dtexdata; - delete[] bsp->drgbatexdata; // mxd - delete[] bsp->dentdata; - delete[] bsp->dleafs; - delete[] bsp->dplanes; - delete[] bsp->dvertexes; - delete[] bsp->dnodes; - delete[] bsp->texinfo; - delete[] bsp->dfaces; - delete[] bsp->dclipnodes; - delete[] bsp->dedges; - delete[] bsp->dleaffaces; - delete[] bsp->dleafbrushes; - delete[] bsp->dsurfedges; - delete[] bsp->dareas; - delete[] bsp->dareaportals; - delete[] bsp->dbrushes; - delete[] bsp->dbrushsides; - memset(bsp, 0, sizeof(*bsp)); -} - -inline void ConvertBSPToMFormatComplete( - const bspversion_t **mbsp_loadversion, const bspversion_t *version, bspdata_t *bspdata) -{ - bspdata->loadversion = *mbsp_loadversion = bspdata->version; - bspdata->version = version; -} - /* * ========================================================================= * ConvertBSPFormat @@ -2638,580 +2489,499 @@ bool ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version) if (to_version == &bspver_generic) { // Conversions to bspver_generic // NOTE: these always succeed + mbsp_t mbsp { }; - if (bspdata->version == &bspver_q1 || bspdata->version == &bspver_h2 || bspdata->version == &bspver_hl) { + if (std::holds_alternative(bspdata->bsp)) { // bspver_q1, bspver_h2, bspver_hl -> bspver_generic - - bsp29_t *bsp29 = &bspdata->data.bsp29; - mbsp_t *mbsp = &bspdata->data.mbsp; - - memset(mbsp, 0, sizeof(*mbsp)); + const bsp29_t &bsp29 = std::get(bspdata->bsp); // copy counts - mbsp->nummodels = bsp29->nummodels; - mbsp->visdatasize = bsp29->visdatasize; - mbsp->lightdatasize = bsp29->lightdatasize; - mbsp->texdatasize = bsp29->texdatasize; - mbsp->entdatasize = bsp29->entdatasize; - mbsp->numleafs = bsp29->numleafs; - mbsp->numplanes = bsp29->numplanes; - mbsp->numvertexes = bsp29->numvertexes; - mbsp->numnodes = bsp29->numnodes; - mbsp->numtexinfo = bsp29->numtexinfo; - mbsp->numfaces = bsp29->numfaces; - mbsp->numclipnodes = bsp29->numclipnodes; - mbsp->numedges = bsp29->numedges; - mbsp->numleaffaces = bsp29->nummarksurfaces; - mbsp->numsurfedges = bsp29->numsurfedges; + mbsp.nummodels = bsp29.nummodels; + mbsp.visdatasize = bsp29.visdatasize; + mbsp.lightdatasize = bsp29.lightdatasize; + mbsp.texdatasize = bsp29.texdatasize; + mbsp.entdatasize = bsp29.entdatasize; + mbsp.numleafs = bsp29.numleafs; + mbsp.numplanes = bsp29.numplanes; + mbsp.numvertexes = bsp29.numvertexes; + mbsp.numnodes = bsp29.numnodes; + mbsp.numtexinfo = bsp29.numtexinfo; + mbsp.numfaces = bsp29.numfaces; + mbsp.numclipnodes = bsp29.numclipnodes; + mbsp.numedges = bsp29.numedges; + mbsp.numleaffaces = bsp29.nummarksurfaces; + mbsp.numsurfedges = bsp29.numsurfedges; // copy or convert data if (bspdata->version == &bspver_h2) { - mbsp->dmodels = H2_CopyModels(bsp29->dmodels_h2, bsp29->nummodels); + mbsp.dmodels = H2_CopyModels(bsp29.dmodels_h2, bsp29.nummodels); } else { - mbsp->dmodels = BSPQ1toH2_Models(bsp29->dmodels_q, bsp29->nummodels); + mbsp.dmodels = BSPQ1toH2_Models(bsp29.dmodels_q, bsp29.nummodels); } - mbsp->dvisdata = BSP29_CopyVisData(bsp29->dvisdata, bsp29->visdatasize); - mbsp->dlightdata = BSP29_CopyLightData(bsp29->dlightdata, bsp29->lightdatasize); - mbsp->dtexdata = BSP29_CopyTexData(bsp29->dtexdata, bsp29->texdatasize); - mbsp->dentdata = BSP29_CopyEntData(bsp29->dentdata, bsp29->entdatasize); - mbsp->dleafs = BSP29toM_Leafs(bsp29->dleafs, bsp29->numleafs); - mbsp->dplanes = BSP29_CopyPlanes(bsp29->dplanes, bsp29->numplanes); - mbsp->dvertexes = BSP29_CopyVertexes(bsp29->dvertexes, bsp29->numvertexes); - mbsp->dnodes = BSP29to2_Nodes(bsp29->dnodes, bsp29->numnodes); - mbsp->texinfo = BSP29toM_Texinfo(bsp29->texinfo, bsp29->numtexinfo); - mbsp->dfaces = BSP29to2_Faces(bsp29->dfaces, bsp29->numfaces); - mbsp->dclipnodes = BSP29to2_Clipnodes(bsp29->dclipnodes, bsp29->numclipnodes); - mbsp->dedges = BSP29to2_Edges(bsp29->dedges, bsp29->numedges); - mbsp->dleaffaces = BSP29to2_Marksurfaces(bsp29->dmarksurfaces, bsp29->nummarksurfaces); - mbsp->dsurfedges = BSP29_CopySurfedges(bsp29->dsurfedges, bsp29->numsurfedges); - - /* Free old data */ - FreeBSP29(bsp29); - - /* Conversion complete! */ - ConvertBSPToMFormatComplete(&mbsp->loadversion, to_version, bspdata); - - return true; - } else if (bspdata->version == &bspver_q2) { + mbsp.dvisdata = BSP29_CopyVisData(bsp29.dvisdata, bsp29.visdatasize); + mbsp.dlightdata = BSP29_CopyLightData(bsp29.dlightdata, bsp29.lightdatasize); + mbsp.dtexdata = BSP29_CopyTexData(bsp29.dtexdata, bsp29.texdatasize); + mbsp.dentdata = BSP29_CopyEntData(bsp29.dentdata, bsp29.entdatasize); + mbsp.dleafs = BSP29toM_Leafs(bsp29.dleafs, bsp29.numleafs); + mbsp.dplanes = BSP29_CopyPlanes(bsp29.dplanes, bsp29.numplanes); + mbsp.dvertexes = BSP29_CopyVertexes(bsp29.dvertexes, bsp29.numvertexes); + mbsp.dnodes = BSP29to2_Nodes(bsp29.dnodes, bsp29.numnodes); + mbsp.texinfo = BSP29toM_Texinfo(bsp29.texinfo, bsp29.numtexinfo); + mbsp.dfaces = BSP29to2_Faces(bsp29.dfaces, bsp29.numfaces); + mbsp.dclipnodes = BSP29to2_Clipnodes(bsp29.dclipnodes, bsp29.numclipnodes); + mbsp.dedges = BSP29to2_Edges(bsp29.dedges, bsp29.numedges); + mbsp.dleaffaces = BSP29to2_Marksurfaces(bsp29.dmarksurfaces, bsp29.nummarksurfaces); + mbsp.dsurfedges = BSP29_CopySurfedges(bsp29.dsurfedges, bsp29.numsurfedges); + } else if (std::holds_alternative(bspdata->bsp)) { // bspver_q2 -> bspver_generic - - q2bsp_t *q2bsp = &bspdata->data.q2bsp; - mbsp_t *mbsp = &bspdata->data.mbsp; - - memset(mbsp, 0, sizeof(*mbsp)); + const q2bsp_t &q2bsp = std::get(bspdata->bsp); // copy counts - mbsp->nummodels = q2bsp->nummodels; - mbsp->visdatasize = q2bsp->visdatasize; - mbsp->lightdatasize = q2bsp->lightdatasize; - mbsp->entdatasize = q2bsp->entdatasize; - mbsp->numleafs = q2bsp->numleafs; - mbsp->numplanes = q2bsp->numplanes; - mbsp->numvertexes = q2bsp->numvertexes; - mbsp->numnodes = q2bsp->numnodes; - mbsp->numtexinfo = q2bsp->numtexinfo; - mbsp->numfaces = q2bsp->numfaces; - mbsp->numedges = q2bsp->numedges; - mbsp->numleaffaces = q2bsp->numleaffaces; - mbsp->numleafbrushes = q2bsp->numleafbrushes; - mbsp->numsurfedges = q2bsp->numsurfedges; - mbsp->numareas = q2bsp->numareas; - mbsp->numareaportals = q2bsp->numareaportals; - mbsp->numbrushes = q2bsp->numbrushes; - mbsp->numbrushsides = q2bsp->numbrushsides; + mbsp.nummodels = q2bsp.nummodels; + mbsp.visdatasize = q2bsp.visdatasize; + mbsp.lightdatasize = q2bsp.lightdatasize; + mbsp.entdatasize = q2bsp.entdatasize; + mbsp.numleafs = q2bsp.numleafs; + mbsp.numplanes = q2bsp.numplanes; + mbsp.numvertexes = q2bsp.numvertexes; + mbsp.numnodes = q2bsp.numnodes; + mbsp.numtexinfo = q2bsp.numtexinfo; + mbsp.numfaces = q2bsp.numfaces; + mbsp.numedges = q2bsp.numedges; + mbsp.numleaffaces = q2bsp.numleaffaces; + mbsp.numleafbrushes = q2bsp.numleafbrushes; + mbsp.numsurfedges = q2bsp.numsurfedges; + mbsp.numareas = q2bsp.numareas; + mbsp.numareaportals = q2bsp.numareaportals; + mbsp.numbrushes = q2bsp.numbrushes; + mbsp.numbrushsides = q2bsp.numbrushsides; // copy or convert data - mbsp->dmodels = Q2BSPtoM_Models(q2bsp->dmodels, q2bsp->nummodels); - mbsp->dlightdata = BSP29_CopyLightData(q2bsp->dlightdata, q2bsp->lightdatasize); - mbsp->dentdata = BSP29_CopyEntData(q2bsp->dentdata, q2bsp->entdatasize); - mbsp->dleafs = Q2BSPtoM_Leafs(q2bsp->dleafs, q2bsp->numleafs); - mbsp->dplanes = BSP29_CopyPlanes(q2bsp->dplanes, q2bsp->numplanes); - mbsp->dvertexes = BSP29_CopyVertexes(q2bsp->dvertexes, q2bsp->numvertexes); - mbsp->dnodes = Q2BSPto2_Nodes(q2bsp->dnodes, q2bsp->numnodes); - mbsp->texinfo = Q2BSPtoM_Texinfo(q2bsp->texinfo, q2bsp->numtexinfo); - mbsp->dfaces = Q2BSPto2_Faces(q2bsp->dfaces, q2bsp->numfaces); - mbsp->dedges = BSP29to2_Edges(q2bsp->dedges, q2bsp->numedges); - mbsp->dleaffaces = BSP29to2_Marksurfaces(q2bsp->dleaffaces, q2bsp->numleaffaces); - mbsp->dleafbrushes = Q2BSPtoM_CopyLeafBrushes(q2bsp->dleafbrushes, q2bsp->numleafbrushes); - mbsp->dsurfedges = BSP29_CopySurfedges(q2bsp->dsurfedges, q2bsp->numsurfedges); + mbsp.dmodels = Q2BSPtoM_Models(q2bsp.dmodels, q2bsp.nummodels); + mbsp.dlightdata = BSP29_CopyLightData(q2bsp.dlightdata, q2bsp.lightdatasize); + mbsp.dentdata = BSP29_CopyEntData(q2bsp.dentdata, q2bsp.entdatasize); + mbsp.dleafs = Q2BSPtoM_Leafs(q2bsp.dleafs, q2bsp.numleafs); + mbsp.dplanes = BSP29_CopyPlanes(q2bsp.dplanes, q2bsp.numplanes); + mbsp.dvertexes = BSP29_CopyVertexes(q2bsp.dvertexes, q2bsp.numvertexes); + mbsp.dnodes = Q2BSPto2_Nodes(q2bsp.dnodes, q2bsp.numnodes); + mbsp.texinfo = Q2BSPtoM_Texinfo(q2bsp.texinfo, q2bsp.numtexinfo); + mbsp.dfaces = Q2BSPto2_Faces(q2bsp.dfaces, q2bsp.numfaces); + mbsp.dedges = BSP29to2_Edges(q2bsp.dedges, q2bsp.numedges); + mbsp.dleaffaces = BSP29to2_Marksurfaces(q2bsp.dleaffaces, q2bsp.numleaffaces); + mbsp.dleafbrushes = Q2BSPtoM_CopyLeafBrushes(q2bsp.dleafbrushes, q2bsp.numleafbrushes); + mbsp.dsurfedges = BSP29_CopySurfedges(q2bsp.dsurfedges, q2bsp.numsurfedges); - mbsp->dvisdata = - Q2BSPtoM_CopyVisData(q2bsp->dvis, q2bsp->visdatasize, &mbsp->visdatasize, mbsp->dleafs, mbsp->numleafs); + mbsp.dvisdata = + Q2BSPtoM_CopyVisData(q2bsp.dvis, q2bsp.visdatasize, &mbsp.visdatasize, mbsp.dleafs, mbsp.numleafs); - mbsp->dareas = Q2BSP_CopyAreas(q2bsp->dareas, q2bsp->numareas); - mbsp->dareaportals = Q2BSP_CopyAreaPortals(q2bsp->dareaportals, q2bsp->numareaportals); + mbsp.dareas = Q2BSP_CopyAreas(q2bsp.dareas, q2bsp.numareas); + mbsp.dareaportals = Q2BSP_CopyAreaPortals(q2bsp.dareaportals, q2bsp.numareaportals); - mbsp->dbrushes = Q2BSP_CopyBrushes(q2bsp->dbrushes, q2bsp->numbrushes); - mbsp->dbrushsides = Q2BSPtoM_CopyBrushSides(q2bsp->dbrushsides, q2bsp->numbrushsides); - - /* Free old data */ - FreeQ2BSP(q2bsp); - - /* Conversion complete! */ - ConvertBSPToMFormatComplete(&mbsp->loadversion, to_version, bspdata); - - return true; - } else if (bspdata->version == &bspver_qbism) { + mbsp.dbrushes = Q2BSP_CopyBrushes(q2bsp.dbrushes, q2bsp.numbrushes); + mbsp.dbrushsides = Q2BSPtoM_CopyBrushSides(q2bsp.dbrushsides, q2bsp.numbrushsides); + } else if (std::holds_alternative(bspdata->bsp)) { // bspver_qbism -> bspver_generic - - q2bsp_qbism_t *q2bsp = &bspdata->data.q2bsp_qbism; - mbsp_t *mbsp = &bspdata->data.mbsp; - - memset(mbsp, 0, sizeof(*mbsp)); + const q2bsp_qbism_t &q2bsp = std::get(bspdata->bsp); // copy counts - mbsp->nummodels = q2bsp->nummodels; - mbsp->visdatasize = q2bsp->visdatasize; - mbsp->lightdatasize = q2bsp->lightdatasize; - mbsp->entdatasize = q2bsp->entdatasize; - mbsp->numleafs = q2bsp->numleafs; - mbsp->numplanes = q2bsp->numplanes; - mbsp->numvertexes = q2bsp->numvertexes; - mbsp->numnodes = q2bsp->numnodes; - mbsp->numtexinfo = q2bsp->numtexinfo; - mbsp->numfaces = q2bsp->numfaces; - mbsp->numedges = q2bsp->numedges; - mbsp->numleaffaces = q2bsp->numleaffaces; - mbsp->numleafbrushes = q2bsp->numleafbrushes; - mbsp->numsurfedges = q2bsp->numsurfedges; - mbsp->numareas = q2bsp->numareas; - mbsp->numareaportals = q2bsp->numareaportals; - mbsp->numbrushes = q2bsp->numbrushes; - mbsp->numbrushsides = q2bsp->numbrushsides; + mbsp.nummodels = q2bsp.nummodels; + mbsp.visdatasize = q2bsp.visdatasize; + mbsp.lightdatasize = q2bsp.lightdatasize; + mbsp.entdatasize = q2bsp.entdatasize; + mbsp.numleafs = q2bsp.numleafs; + mbsp.numplanes = q2bsp.numplanes; + mbsp.numvertexes = q2bsp.numvertexes; + mbsp.numnodes = q2bsp.numnodes; + mbsp.numtexinfo = q2bsp.numtexinfo; + mbsp.numfaces = q2bsp.numfaces; + mbsp.numedges = q2bsp.numedges; + mbsp.numleaffaces = q2bsp.numleaffaces; + mbsp.numleafbrushes = q2bsp.numleafbrushes; + mbsp.numsurfedges = q2bsp.numsurfedges; + mbsp.numareas = q2bsp.numareas; + mbsp.numareaportals = q2bsp.numareaportals; + mbsp.numbrushes = q2bsp.numbrushes; + mbsp.numbrushsides = q2bsp.numbrushsides; // copy or convert data - mbsp->dmodels = Q2BSPtoM_Models(q2bsp->dmodels, q2bsp->nummodels); - mbsp->dlightdata = BSP29_CopyLightData(q2bsp->dlightdata, q2bsp->lightdatasize); - mbsp->dentdata = BSP29_CopyEntData(q2bsp->dentdata, q2bsp->entdatasize); - mbsp->dleafs = Q2BSP_QBSPtoM_Leafs(q2bsp->dleafs, q2bsp->numleafs); - mbsp->dplanes = BSP29_CopyPlanes(q2bsp->dplanes, q2bsp->numplanes); - mbsp->dvertexes = BSP29_CopyVertexes(q2bsp->dvertexes, q2bsp->numvertexes); - mbsp->dnodes = BSP2_CopyNodes(q2bsp->dnodes, q2bsp->numnodes); - mbsp->texinfo = Q2BSPtoM_Texinfo(q2bsp->texinfo, q2bsp->numtexinfo); - mbsp->dfaces = Q2BSP_QBSPto2_Faces(q2bsp->dfaces, q2bsp->numfaces); - mbsp->dedges = BSP2_CopyEdges(q2bsp->dedges, q2bsp->numedges); - mbsp->dleaffaces = BSP2_CopyMarksurfaces(q2bsp->dleaffaces, q2bsp->numleaffaces); - mbsp->dleafbrushes = Q2BSP_Qbism_CopyLeafBrushes(q2bsp->dleafbrushes, q2bsp->numleafbrushes); - mbsp->dsurfedges = BSP29_CopySurfedges(q2bsp->dsurfedges, q2bsp->numsurfedges); + mbsp.dmodels = Q2BSPtoM_Models(q2bsp.dmodels, q2bsp.nummodels); + mbsp.dlightdata = BSP29_CopyLightData(q2bsp.dlightdata, q2bsp.lightdatasize); + mbsp.dentdata = BSP29_CopyEntData(q2bsp.dentdata, q2bsp.entdatasize); + mbsp.dleafs = Q2BSP_QBSPtoM_Leafs(q2bsp.dleafs, q2bsp.numleafs); + mbsp.dplanes = BSP29_CopyPlanes(q2bsp.dplanes, q2bsp.numplanes); + mbsp.dvertexes = BSP29_CopyVertexes(q2bsp.dvertexes, q2bsp.numvertexes); + mbsp.dnodes = BSP2_CopyNodes(q2bsp.dnodes, q2bsp.numnodes); + mbsp.texinfo = Q2BSPtoM_Texinfo(q2bsp.texinfo, q2bsp.numtexinfo); + mbsp.dfaces = Q2BSP_QBSPto2_Faces(q2bsp.dfaces, q2bsp.numfaces); + mbsp.dedges = BSP2_CopyEdges(q2bsp.dedges, q2bsp.numedges); + mbsp.dleaffaces = BSP2_CopyMarksurfaces(q2bsp.dleaffaces, q2bsp.numleaffaces); + mbsp.dleafbrushes = Q2BSP_Qbism_CopyLeafBrushes(q2bsp.dleafbrushes, q2bsp.numleafbrushes); + mbsp.dsurfedges = BSP29_CopySurfedges(q2bsp.dsurfedges, q2bsp.numsurfedges); - mbsp->dvisdata = - Q2BSPtoM_CopyVisData(q2bsp->dvis, q2bsp->visdatasize, &mbsp->visdatasize, mbsp->dleafs, mbsp->numleafs); + mbsp.dvisdata = + Q2BSPtoM_CopyVisData(q2bsp.dvis, q2bsp.visdatasize, &mbsp.visdatasize, mbsp.dleafs, mbsp.numleafs); - mbsp->dareas = Q2BSP_CopyAreas(q2bsp->dareas, q2bsp->numareas); - mbsp->dareaportals = Q2BSP_CopyAreaPortals(q2bsp->dareaportals, q2bsp->numareaportals); + mbsp.dareas = Q2BSP_CopyAreas(q2bsp.dareas, q2bsp.numareas); + mbsp.dareaportals = Q2BSP_CopyAreaPortals(q2bsp.dareaportals, q2bsp.numareaportals); - mbsp->dbrushes = Q2BSP_CopyBrushes(q2bsp->dbrushes, q2bsp->numbrushes); - mbsp->dbrushsides = Q2BSP_Qbism_CopyBrushSides(q2bsp->dbrushsides, q2bsp->numbrushsides); - - /* Free old data */ - FreeQ2BSP_QBSP(q2bsp); - - /* Conversion complete! */ - ConvertBSPToMFormatComplete(&mbsp->loadversion, to_version, bspdata); - - return true; - } else if (bspdata->version == &bspver_bsp2rmq || bspdata->version == &bspver_h2bsp2rmq) { + mbsp.dbrushes = Q2BSP_CopyBrushes(q2bsp.dbrushes, q2bsp.numbrushes); + mbsp.dbrushsides = Q2BSP_Qbism_CopyBrushSides(q2bsp.dbrushsides, q2bsp.numbrushsides); + } else if (std::holds_alternative(bspdata->bsp)) { // bspver_bsp2rmq, bspver_h2bsp2rmq -> bspver_generic - - bsp2rmq_t *bsp2rmq = &bspdata->data.bsp2rmq; - mbsp_t *mbsp = &bspdata->data.mbsp; - - memset(mbsp, 0, sizeof(*mbsp)); + const bsp2rmq_t &bsp2rmq = std::get(bspdata->bsp); // copy counts - mbsp->nummodels = bsp2rmq->nummodels; - mbsp->visdatasize = bsp2rmq->visdatasize; - mbsp->lightdatasize = bsp2rmq->lightdatasize; - mbsp->texdatasize = bsp2rmq->texdatasize; - mbsp->entdatasize = bsp2rmq->entdatasize; - mbsp->numleafs = bsp2rmq->numleafs; - mbsp->numplanes = bsp2rmq->numplanes; - mbsp->numvertexes = bsp2rmq->numvertexes; - mbsp->numnodes = bsp2rmq->numnodes; - mbsp->numtexinfo = bsp2rmq->numtexinfo; - mbsp->numfaces = bsp2rmq->numfaces; - mbsp->numclipnodes = bsp2rmq->numclipnodes; - mbsp->numedges = bsp2rmq->numedges; - mbsp->numleaffaces = bsp2rmq->nummarksurfaces; - mbsp->numsurfedges = bsp2rmq->numsurfedges; + mbsp.nummodels = bsp2rmq.nummodels; + mbsp.visdatasize = bsp2rmq.visdatasize; + mbsp.lightdatasize = bsp2rmq.lightdatasize; + mbsp.texdatasize = bsp2rmq.texdatasize; + mbsp.entdatasize = bsp2rmq.entdatasize; + mbsp.numleafs = bsp2rmq.numleafs; + mbsp.numplanes = bsp2rmq.numplanes; + mbsp.numvertexes = bsp2rmq.numvertexes; + mbsp.numnodes = bsp2rmq.numnodes; + mbsp.numtexinfo = bsp2rmq.numtexinfo; + mbsp.numfaces = bsp2rmq.numfaces; + mbsp.numclipnodes = bsp2rmq.numclipnodes; + mbsp.numedges = bsp2rmq.numedges; + mbsp.numleaffaces = bsp2rmq.nummarksurfaces; + mbsp.numsurfedges = bsp2rmq.numsurfedges; // copy or convert data if (bspdata->version == &bspver_h2bsp2rmq) { - mbsp->dmodels = H2_CopyModels(bsp2rmq->dmodels_h2, bsp2rmq->nummodels); + mbsp.dmodels = H2_CopyModels(bsp2rmq.dmodels_h2, bsp2rmq.nummodels); } else { - mbsp->dmodels = BSPQ1toH2_Models(bsp2rmq->dmodels_q, bsp2rmq->nummodels); + mbsp.dmodels = BSPQ1toH2_Models(bsp2rmq.dmodels_q, bsp2rmq.nummodels); } - mbsp->dvisdata = BSP29_CopyVisData(bsp2rmq->dvisdata, bsp2rmq->visdatasize); - mbsp->dlightdata = BSP29_CopyLightData(bsp2rmq->dlightdata, bsp2rmq->lightdatasize); - mbsp->dtexdata = BSP29_CopyTexData(bsp2rmq->dtexdata, bsp2rmq->texdatasize); - mbsp->dentdata = BSP29_CopyEntData(bsp2rmq->dentdata, bsp2rmq->entdatasize); - mbsp->dleafs = BSP2rmqtoM_Leafs(bsp2rmq->dleafs, bsp2rmq->numleafs); - mbsp->dplanes = BSP29_CopyPlanes(bsp2rmq->dplanes, bsp2rmq->numplanes); - mbsp->dvertexes = BSP29_CopyVertexes(bsp2rmq->dvertexes, bsp2rmq->numvertexes); - mbsp->dnodes = BSP2rmqto2_Nodes(bsp2rmq->dnodes, bsp2rmq->numnodes); - mbsp->texinfo = BSP29toM_Texinfo(bsp2rmq->texinfo, bsp2rmq->numtexinfo); - mbsp->dfaces = BSP2_CopyFaces(bsp2rmq->dfaces, bsp2rmq->numfaces); - mbsp->dclipnodes = BSP2_CopyClipnodes(bsp2rmq->dclipnodes, bsp2rmq->numclipnodes); - mbsp->dedges = BSP2_CopyEdges(bsp2rmq->dedges, bsp2rmq->numedges); - mbsp->dleaffaces = BSP2_CopyMarksurfaces(bsp2rmq->dmarksurfaces, bsp2rmq->nummarksurfaces); - mbsp->dsurfedges = BSP29_CopySurfedges(bsp2rmq->dsurfedges, bsp2rmq->numsurfedges); - - /* Free old data */ - FreeBSP2RMQ(bsp2rmq); - - /* Conversion complete! */ - ConvertBSPToMFormatComplete(&mbsp->loadversion, to_version, bspdata); - - return true; - } else if (bspdata->version == &bspver_bsp2 || bspdata->version == &bspver_h2bsp2) { + mbsp.dvisdata = BSP29_CopyVisData(bsp2rmq.dvisdata, bsp2rmq.visdatasize); + mbsp.dlightdata = BSP29_CopyLightData(bsp2rmq.dlightdata, bsp2rmq.lightdatasize); + mbsp.dtexdata = BSP29_CopyTexData(bsp2rmq.dtexdata, bsp2rmq.texdatasize); + mbsp.dentdata = BSP29_CopyEntData(bsp2rmq.dentdata, bsp2rmq.entdatasize); + mbsp.dleafs = BSP2rmqtoM_Leafs(bsp2rmq.dleafs, bsp2rmq.numleafs); + mbsp.dplanes = BSP29_CopyPlanes(bsp2rmq.dplanes, bsp2rmq.numplanes); + mbsp.dvertexes = BSP29_CopyVertexes(bsp2rmq.dvertexes, bsp2rmq.numvertexes); + mbsp.dnodes = BSP2rmqto2_Nodes(bsp2rmq.dnodes, bsp2rmq.numnodes); + mbsp.texinfo = BSP29toM_Texinfo(bsp2rmq.texinfo, bsp2rmq.numtexinfo); + mbsp.dfaces = BSP2_CopyFaces(bsp2rmq.dfaces, bsp2rmq.numfaces); + mbsp.dclipnodes = BSP2_CopyClipnodes(bsp2rmq.dclipnodes, bsp2rmq.numclipnodes); + mbsp.dedges = BSP2_CopyEdges(bsp2rmq.dedges, bsp2rmq.numedges); + mbsp.dleaffaces = BSP2_CopyMarksurfaces(bsp2rmq.dmarksurfaces, bsp2rmq.nummarksurfaces); + mbsp.dsurfedges = BSP29_CopySurfedges(bsp2rmq.dsurfedges, bsp2rmq.numsurfedges); + } else if (std::holds_alternative(bspdata->bsp)) { // bspver_bsp2, bspver_h2bsp2 -> bspver_generic - - bsp2_t *bsp2 = &bspdata->data.bsp2; - mbsp_t *mbsp = &bspdata->data.mbsp; - - memset(mbsp, 0, sizeof(*mbsp)); + const bsp2_t &bsp2 = std::get(bspdata->bsp); // copy counts - mbsp->nummodels = bsp2->nummodels; - mbsp->visdatasize = bsp2->visdatasize; - mbsp->lightdatasize = bsp2->lightdatasize; - mbsp->texdatasize = bsp2->texdatasize; - mbsp->entdatasize = bsp2->entdatasize; - mbsp->numleafs = bsp2->numleafs; - mbsp->numplanes = bsp2->numplanes; - mbsp->numvertexes = bsp2->numvertexes; - mbsp->numnodes = bsp2->numnodes; - mbsp->numtexinfo = bsp2->numtexinfo; - mbsp->numfaces = bsp2->numfaces; - mbsp->numclipnodes = bsp2->numclipnodes; - mbsp->numedges = bsp2->numedges; - mbsp->numleaffaces = bsp2->nummarksurfaces; - mbsp->numsurfedges = bsp2->numsurfedges; + mbsp.nummodels = bsp2.nummodels; + mbsp.visdatasize = bsp2.visdatasize; + mbsp.lightdatasize = bsp2.lightdatasize; + mbsp.texdatasize = bsp2.texdatasize; + mbsp.entdatasize = bsp2.entdatasize; + mbsp.numleafs = bsp2.numleafs; + mbsp.numplanes = bsp2.numplanes; + mbsp.numvertexes = bsp2.numvertexes; + mbsp.numnodes = bsp2.numnodes; + mbsp.numtexinfo = bsp2.numtexinfo; + mbsp.numfaces = bsp2.numfaces; + mbsp.numclipnodes = bsp2.numclipnodes; + mbsp.numedges = bsp2.numedges; + mbsp.numleaffaces = bsp2.nummarksurfaces; + mbsp.numsurfedges = bsp2.numsurfedges; // copy or convert data if (bspdata->version == &bspver_h2bsp2) { - mbsp->dmodels = H2_CopyModels(bsp2->dmodels_h2, bsp2->nummodels); + mbsp.dmodels = H2_CopyModels(bsp2.dmodels_h2, bsp2.nummodels); } else { - mbsp->dmodels = BSPQ1toH2_Models(bsp2->dmodels_q, bsp2->nummodels); + mbsp.dmodels = BSPQ1toH2_Models(bsp2.dmodels_q, bsp2.nummodels); } - mbsp->dvisdata = BSP29_CopyVisData(bsp2->dvisdata, bsp2->visdatasize); - mbsp->dlightdata = BSP29_CopyLightData(bsp2->dlightdata, bsp2->lightdatasize); - mbsp->dtexdata = BSP29_CopyTexData(bsp2->dtexdata, bsp2->texdatasize); - mbsp->dentdata = BSP29_CopyEntData(bsp2->dentdata, bsp2->entdatasize); - mbsp->dleafs = BSP2toM_Leafs(bsp2->dleafs, bsp2->numleafs); - mbsp->dplanes = BSP29_CopyPlanes(bsp2->dplanes, bsp2->numplanes); - mbsp->dvertexes = BSP29_CopyVertexes(bsp2->dvertexes, bsp2->numvertexes); - mbsp->dnodes = BSP2_CopyNodes(bsp2->dnodes, bsp2->numnodes); - mbsp->texinfo = BSP29toM_Texinfo(bsp2->texinfo, bsp2->numtexinfo); - mbsp->dfaces = BSP2_CopyFaces(bsp2->dfaces, bsp2->numfaces); - mbsp->dclipnodes = BSP2_CopyClipnodes(bsp2->dclipnodes, bsp2->numclipnodes); - mbsp->dedges = BSP2_CopyEdges(bsp2->dedges, bsp2->numedges); - mbsp->dleaffaces = BSP2_CopyMarksurfaces(bsp2->dmarksurfaces, bsp2->nummarksurfaces); - mbsp->dsurfedges = BSP29_CopySurfedges(bsp2->dsurfedges, bsp2->numsurfedges); - - /* Free old data */ - FreeBSP2(bsp2); - - /* Conversion complete! */ - ConvertBSPToMFormatComplete(&mbsp->loadversion, to_version, bspdata); - - return true; + mbsp.dvisdata = BSP29_CopyVisData(bsp2.dvisdata, bsp2.visdatasize); + mbsp.dlightdata = BSP29_CopyLightData(bsp2.dlightdata, bsp2.lightdatasize); + mbsp.dtexdata = BSP29_CopyTexData(bsp2.dtexdata, bsp2.texdatasize); + mbsp.dentdata = BSP29_CopyEntData(bsp2.dentdata, bsp2.entdatasize); + mbsp.dleafs = BSP2toM_Leafs(bsp2.dleafs, bsp2.numleafs); + mbsp.dplanes = BSP29_CopyPlanes(bsp2.dplanes, bsp2.numplanes); + mbsp.dvertexes = BSP29_CopyVertexes(bsp2.dvertexes, bsp2.numvertexes); + mbsp.dnodes = BSP2_CopyNodes(bsp2.dnodes, bsp2.numnodes); + mbsp.texinfo = BSP29toM_Texinfo(bsp2.texinfo, bsp2.numtexinfo); + mbsp.dfaces = BSP2_CopyFaces(bsp2.dfaces, bsp2.numfaces); + mbsp.dclipnodes = BSP2_CopyClipnodes(bsp2.dclipnodes, bsp2.numclipnodes); + mbsp.dedges = BSP2_CopyEdges(bsp2.dedges, bsp2.numedges); + mbsp.dleaffaces = BSP2_CopyMarksurfaces(bsp2.dmarksurfaces, bsp2.nummarksurfaces); + mbsp.dsurfedges = BSP29_CopySurfedges(bsp2.dsurfedges, bsp2.numsurfedges); + } else { + return false; } + + bspdata->loadversion = mbsp.loadversion = bspdata->version; + bspdata->version = to_version; + + bspdata->bsp = std::move(mbsp); + return true; } else if (bspdata->version == &bspver_generic) { // Conversions from bspver_generic + const mbsp_t &mbsp = std::get(bspdata->bsp); if (to_version == &bspver_q1 || to_version == &bspver_h2 || to_version == &bspver_hl) { // bspver_generic -> bspver_q1, bspver_h2, bspver_hl - - bsp29_t *bsp29 = &bspdata->data.bsp29; - mbsp_t *mbsp = &bspdata->data.mbsp; + bsp29_t bsp29 { }; // validate that the conversion is possible - if (!MBSPto29_Leafs_Validate(mbsp->dleafs, mbsp->numleafs)) { + if (!MBSPto29_Leafs_Validate(mbsp.dleafs, mbsp.numleafs)) { return false; } - if (!BSP2to29_Nodes_Validate(mbsp->dnodes, mbsp->numnodes)) { + if (!BSP2to29_Nodes_Validate(mbsp.dnodes, mbsp.numnodes)) { return false; } - if (!BSP2to29_Faces_Validate(mbsp->dfaces, mbsp->numfaces)) { + if (!BSP2to29_Faces_Validate(mbsp.dfaces, mbsp.numfaces)) { return false; } - if (!BSP2to29_Clipnodes_Validate(mbsp->dclipnodes, mbsp->numclipnodes)) { + if (!BSP2to29_Clipnodes_Validate(mbsp.dclipnodes, mbsp.numclipnodes)) { return false; } - if (!BSP2to29_Edges_Validate(mbsp->dedges, mbsp->numedges)) { + if (!BSP2to29_Edges_Validate(mbsp.dedges, mbsp.numedges)) { return false; } - if (!BSP2to29_Marksurfaces_Validate(mbsp->dleaffaces, mbsp->numleaffaces)) { + if (!BSP2to29_Marksurfaces_Validate(mbsp.dleaffaces, mbsp.numleaffaces)) { return false; } - // zero destination struct - memset(bsp29, 0, sizeof(*bsp29)); - // copy counts - bsp29->nummodels = mbsp->nummodels; - bsp29->visdatasize = mbsp->visdatasize; - bsp29->lightdatasize = mbsp->lightdatasize; - bsp29->texdatasize = mbsp->texdatasize; - bsp29->entdatasize = mbsp->entdatasize; - bsp29->numleafs = mbsp->numleafs; - bsp29->numplanes = mbsp->numplanes; - bsp29->numvertexes = mbsp->numvertexes; - bsp29->numnodes = mbsp->numnodes; - bsp29->numtexinfo = mbsp->numtexinfo; - bsp29->numfaces = mbsp->numfaces; - bsp29->numclipnodes = mbsp->numclipnodes; - bsp29->numedges = mbsp->numedges; - bsp29->nummarksurfaces = mbsp->numleaffaces; - bsp29->numsurfedges = mbsp->numsurfedges; + bsp29.nummodels = mbsp.nummodels; + bsp29.visdatasize = mbsp.visdatasize; + bsp29.lightdatasize = mbsp.lightdatasize; + bsp29.texdatasize = mbsp.texdatasize; + bsp29.entdatasize = mbsp.entdatasize; + bsp29.numleafs = mbsp.numleafs; + bsp29.numplanes = mbsp.numplanes; + bsp29.numvertexes = mbsp.numvertexes; + bsp29.numnodes = mbsp.numnodes; + bsp29.numtexinfo = mbsp.numtexinfo; + bsp29.numfaces = mbsp.numfaces; + bsp29.numclipnodes = mbsp.numclipnodes; + bsp29.numedges = mbsp.numedges; + bsp29.nummarksurfaces = mbsp.numleaffaces; + bsp29.numsurfedges = mbsp.numsurfedges; // copy or convert data if (to_version == &bspver_h2) { - bsp29->dmodels_h2 = H2_CopyModels(mbsp->dmodels, mbsp->nummodels); + bsp29.dmodels_h2 = H2_CopyModels(mbsp.dmodels, mbsp.nummodels); } else { - bsp29->dmodels_q = BSPH2toQ1_Models(mbsp->dmodels, mbsp->nummodels); + bsp29.dmodels_q = BSPH2toQ1_Models(mbsp.dmodels, mbsp.nummodels); } - bsp29->dvisdata = BSP29_CopyVisData(mbsp->dvisdata, mbsp->visdatasize); - bsp29->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); - bsp29->dtexdata = BSP29_CopyTexData(mbsp->dtexdata, mbsp->texdatasize); - bsp29->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); - bsp29->dleafs = MBSPto29_Leafs(mbsp->dleafs, mbsp->numleafs); - bsp29->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); - bsp29->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); - bsp29->dnodes = BSP2to29_Nodes(mbsp->dnodes, mbsp->numnodes); - bsp29->texinfo = MBSPto29_Texinfo(mbsp->texinfo, mbsp->numtexinfo); - bsp29->dfaces = BSP2to29_Faces(mbsp->dfaces, mbsp->numfaces); - bsp29->dclipnodes = BSP2to29_Clipnodes(mbsp->dclipnodes, mbsp->numclipnodes); - bsp29->dedges = BSP2to29_Edges(mbsp->dedges, mbsp->numedges); - bsp29->dmarksurfaces = BSP2to29_Marksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); - bsp29->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); - - /* Free old data */ - FreeMBSP(mbsp); + bsp29.dvisdata = BSP29_CopyVisData(mbsp.dvisdata, mbsp.visdatasize); + bsp29.dlightdata = BSP29_CopyLightData(mbsp.dlightdata, mbsp.lightdatasize); + bsp29.dtexdata = BSP29_CopyTexData(mbsp.dtexdata, mbsp.texdatasize); + bsp29.dentdata = BSP29_CopyEntData(mbsp.dentdata, mbsp.entdatasize); + bsp29.dleafs = MBSPto29_Leafs(mbsp.dleafs, mbsp.numleafs); + bsp29.dplanes = BSP29_CopyPlanes(mbsp.dplanes, mbsp.numplanes); + bsp29.dvertexes = BSP29_CopyVertexes(mbsp.dvertexes, mbsp.numvertexes); + bsp29.dnodes = BSP2to29_Nodes(mbsp.dnodes, mbsp.numnodes); + bsp29.texinfo = MBSPto29_Texinfo(mbsp.texinfo, mbsp.numtexinfo); + bsp29.dfaces = BSP2to29_Faces(mbsp.dfaces, mbsp.numfaces); + bsp29.dclipnodes = BSP2to29_Clipnodes(mbsp.dclipnodes, mbsp.numclipnodes); + bsp29.dedges = BSP2to29_Edges(mbsp.dedges, mbsp.numedges); + bsp29.dmarksurfaces = BSP2to29_Marksurfaces(mbsp.dleaffaces, mbsp.numleaffaces); + bsp29.dsurfedges = BSP29_CopySurfedges(mbsp.dsurfedges, mbsp.numsurfedges); /* Conversion complete! */ bspdata->version = to_version; + bspdata->bsp = std::move(bsp29); return true; } else if (to_version == &bspver_q2) { // bspver_generic -> bspver_q2 - - mbsp_t *mbsp = &bspdata->data.mbsp; - q2bsp_t *q2bsp = &bspdata->data.q2bsp; - - memset(q2bsp, 0, sizeof(*q2bsp)); + q2bsp_t q2bsp { }; // copy counts - q2bsp->nummodels = mbsp->nummodels; - q2bsp->visdatasize = mbsp->visdatasize; - q2bsp->lightdatasize = mbsp->lightdatasize; - q2bsp->entdatasize = mbsp->entdatasize; - q2bsp->numleafs = mbsp->numleafs; - q2bsp->numplanes = mbsp->numplanes; - q2bsp->numvertexes = mbsp->numvertexes; - q2bsp->numnodes = mbsp->numnodes; - q2bsp->numtexinfo = mbsp->numtexinfo; - q2bsp->numfaces = mbsp->numfaces; - q2bsp->numedges = mbsp->numedges; - q2bsp->numleaffaces = mbsp->numleaffaces; - q2bsp->numleafbrushes = mbsp->numleafbrushes; - q2bsp->numsurfedges = mbsp->numsurfedges; - q2bsp->numareas = mbsp->numareas; - q2bsp->numareaportals = mbsp->numareaportals; - q2bsp->numbrushes = mbsp->numbrushes; - q2bsp->numbrushsides = mbsp->numbrushsides; + q2bsp.nummodels = mbsp.nummodels; + q2bsp.visdatasize = mbsp.visdatasize; + q2bsp.lightdatasize = mbsp.lightdatasize; + q2bsp.entdatasize = mbsp.entdatasize; + q2bsp.numleafs = mbsp.numleafs; + q2bsp.numplanes = mbsp.numplanes; + q2bsp.numvertexes = mbsp.numvertexes; + q2bsp.numnodes = mbsp.numnodes; + q2bsp.numtexinfo = mbsp.numtexinfo; + q2bsp.numfaces = mbsp.numfaces; + q2bsp.numedges = mbsp.numedges; + q2bsp.numleaffaces = mbsp.numleaffaces; + q2bsp.numleafbrushes = mbsp.numleafbrushes; + q2bsp.numsurfedges = mbsp.numsurfedges; + q2bsp.numareas = mbsp.numareas; + q2bsp.numareaportals = mbsp.numareaportals; + q2bsp.numbrushes = mbsp.numbrushes; + q2bsp.numbrushsides = mbsp.numbrushsides; // copy or convert data - q2bsp->dmodels = MBSPtoQ2_Models(mbsp->dmodels, mbsp->nummodels); - q2bsp->dvis = MBSPtoQ2_CopyVisData(mbsp->dvisdata, &q2bsp->visdatasize, mbsp->numleafs, mbsp->dleafs); - q2bsp->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); - q2bsp->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); - q2bsp->dleafs = MBSPtoQ2_Leafs(mbsp->dleafs, mbsp->numleafs); - q2bsp->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); - q2bsp->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); - q2bsp->dnodes = BSP2toQ2_Nodes(mbsp->dnodes, mbsp->numnodes); - q2bsp->texinfo = MBSPtoQ2_Texinfo(mbsp->texinfo, mbsp->numtexinfo); - q2bsp->dfaces = BSP2toQ2_Faces(mbsp->dfaces, mbsp->numfaces); - q2bsp->dedges = BSP2to29_Edges(mbsp->dedges, mbsp->numedges); - q2bsp->dleaffaces = BSP2to29_Marksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); - q2bsp->dleafbrushes = MBSPtoQ2_CopyLeafBrushes(mbsp->dleafbrushes, mbsp->numleafbrushes); - q2bsp->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); + q2bsp.dmodels = MBSPtoQ2_Models(mbsp.dmodels, mbsp.nummodels); + q2bsp.dvis = MBSPtoQ2_CopyVisData(mbsp.dvisdata, &q2bsp.visdatasize, mbsp.numleafs, mbsp.dleafs); + q2bsp.dlightdata = BSP29_CopyLightData(mbsp.dlightdata, mbsp.lightdatasize); + q2bsp.dentdata = BSP29_CopyEntData(mbsp.dentdata, mbsp.entdatasize); + q2bsp.dleafs = MBSPtoQ2_Leafs(mbsp.dleafs, mbsp.numleafs); + q2bsp.dplanes = BSP29_CopyPlanes(mbsp.dplanes, mbsp.numplanes); + q2bsp.dvertexes = BSP29_CopyVertexes(mbsp.dvertexes, mbsp.numvertexes); + q2bsp.dnodes = BSP2toQ2_Nodes(mbsp.dnodes, mbsp.numnodes); + q2bsp.texinfo = MBSPtoQ2_Texinfo(mbsp.texinfo, mbsp.numtexinfo); + q2bsp.dfaces = BSP2toQ2_Faces(mbsp.dfaces, mbsp.numfaces); + q2bsp.dedges = BSP2to29_Edges(mbsp.dedges, mbsp.numedges); + q2bsp.dleaffaces = BSP2to29_Marksurfaces(mbsp.dleaffaces, mbsp.numleaffaces); + q2bsp.dleafbrushes = MBSPtoQ2_CopyLeafBrushes(mbsp.dleafbrushes, mbsp.numleafbrushes); + q2bsp.dsurfedges = BSP29_CopySurfedges(mbsp.dsurfedges, mbsp.numsurfedges); - q2bsp->dareas = Q2BSP_CopyAreas(mbsp->dareas, mbsp->numareas); - q2bsp->dareaportals = Q2BSP_CopyAreaPortals(mbsp->dareaportals, mbsp->numareaportals); + q2bsp.dareas = Q2BSP_CopyAreas(mbsp.dareas, mbsp.numareas); + q2bsp.dareaportals = Q2BSP_CopyAreaPortals(mbsp.dareaportals, mbsp.numareaportals); - q2bsp->dbrushes = Q2BSP_CopyBrushes(mbsp->dbrushes, mbsp->numbrushes); - q2bsp->dbrushsides = MBSPtoQ2_CopyBrushSides(mbsp->dbrushsides, mbsp->numbrushsides); - - /* Free old data */ - FreeMBSP(mbsp); + q2bsp.dbrushes = Q2BSP_CopyBrushes(mbsp.dbrushes, mbsp.numbrushes); + q2bsp.dbrushsides = MBSPtoQ2_CopyBrushSides(mbsp.dbrushsides, mbsp.numbrushsides); /* Conversion complete! */ bspdata->version = to_version; + bspdata->bsp = std::move(q2bsp); return true; } else if (to_version == &bspver_qbism) { // bspver_generic -> bspver_qbism - - mbsp_t *mbsp = &bspdata->data.mbsp; - q2bsp_qbism_t *q2bsp = &bspdata->data.q2bsp_qbism; - - memset(q2bsp, 0, sizeof(*q2bsp)); + q2bsp_qbism_t q2bsp { }; // copy counts - q2bsp->nummodels = mbsp->nummodels; - q2bsp->visdatasize = mbsp->visdatasize; - q2bsp->lightdatasize = mbsp->lightdatasize; - q2bsp->entdatasize = mbsp->entdatasize; - q2bsp->numleafs = mbsp->numleafs; - q2bsp->numplanes = mbsp->numplanes; - q2bsp->numvertexes = mbsp->numvertexes; - q2bsp->numnodes = mbsp->numnodes; - q2bsp->numtexinfo = mbsp->numtexinfo; - q2bsp->numfaces = mbsp->numfaces; - q2bsp->numedges = mbsp->numedges; - q2bsp->numleaffaces = mbsp->numleaffaces; - q2bsp->numleafbrushes = mbsp->numleafbrushes; - q2bsp->numsurfedges = mbsp->numsurfedges; - q2bsp->numareas = mbsp->numareas; - q2bsp->numareaportals = mbsp->numareaportals; - q2bsp->numbrushes = mbsp->numbrushes; - q2bsp->numbrushsides = mbsp->numbrushsides; + q2bsp.nummodels = mbsp.nummodels; + q2bsp.visdatasize = mbsp.visdatasize; + q2bsp.lightdatasize = mbsp.lightdatasize; + q2bsp.entdatasize = mbsp.entdatasize; + q2bsp.numleafs = mbsp.numleafs; + q2bsp.numplanes = mbsp.numplanes; + q2bsp.numvertexes = mbsp.numvertexes; + q2bsp.numnodes = mbsp.numnodes; + q2bsp.numtexinfo = mbsp.numtexinfo; + q2bsp.numfaces = mbsp.numfaces; + q2bsp.numedges = mbsp.numedges; + q2bsp.numleaffaces = mbsp.numleaffaces; + q2bsp.numleafbrushes = mbsp.numleafbrushes; + q2bsp.numsurfedges = mbsp.numsurfedges; + q2bsp.numareas = mbsp.numareas; + q2bsp.numareaportals = mbsp.numareaportals; + q2bsp.numbrushes = mbsp.numbrushes; + q2bsp.numbrushsides = mbsp.numbrushsides; // copy or convert data - q2bsp->dmodels = MBSPtoQ2_Models(mbsp->dmodels, mbsp->nummodels); - q2bsp->dvis = MBSPtoQ2_CopyVisData(mbsp->dvisdata, &q2bsp->visdatasize, mbsp->numleafs, mbsp->dleafs); - q2bsp->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); - q2bsp->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); - q2bsp->dleafs = MBSPtoQ2_Qbism_Leafs(mbsp->dleafs, mbsp->numleafs); - q2bsp->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); - q2bsp->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); - q2bsp->dnodes = BSP2_CopyNodes(mbsp->dnodes, mbsp->numnodes); - q2bsp->texinfo = MBSPtoQ2_Texinfo(mbsp->texinfo, mbsp->numtexinfo); - q2bsp->dfaces = BSP2toQ2_Qbism_Faces(mbsp->dfaces, mbsp->numfaces); - q2bsp->dedges = BSP2_CopyEdges(mbsp->dedges, mbsp->numedges); - q2bsp->dleaffaces = BSP2_CopyMarksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); - q2bsp->dleafbrushes = Q2BSP_Qbism_CopyLeafBrushes(mbsp->dleafbrushes, mbsp->numleafbrushes); - q2bsp->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); + q2bsp.dmodels = MBSPtoQ2_Models(mbsp.dmodels, mbsp.nummodels); + q2bsp.dvis = MBSPtoQ2_CopyVisData(mbsp.dvisdata, &q2bsp.visdatasize, mbsp.numleafs, mbsp.dleafs); + q2bsp.dlightdata = BSP29_CopyLightData(mbsp.dlightdata, mbsp.lightdatasize); + q2bsp.dentdata = BSP29_CopyEntData(mbsp.dentdata, mbsp.entdatasize); + q2bsp.dleafs = MBSPtoQ2_Qbism_Leafs(mbsp.dleafs, mbsp.numleafs); + q2bsp.dplanes = BSP29_CopyPlanes(mbsp.dplanes, mbsp.numplanes); + q2bsp.dvertexes = BSP29_CopyVertexes(mbsp.dvertexes, mbsp.numvertexes); + q2bsp.dnodes = BSP2_CopyNodes(mbsp.dnodes, mbsp.numnodes); + q2bsp.texinfo = MBSPtoQ2_Texinfo(mbsp.texinfo, mbsp.numtexinfo); + q2bsp.dfaces = BSP2toQ2_Qbism_Faces(mbsp.dfaces, mbsp.numfaces); + q2bsp.dedges = BSP2_CopyEdges(mbsp.dedges, mbsp.numedges); + q2bsp.dleaffaces = BSP2_CopyMarksurfaces(mbsp.dleaffaces, mbsp.numleaffaces); + q2bsp.dleafbrushes = Q2BSP_Qbism_CopyLeafBrushes(mbsp.dleafbrushes, mbsp.numleafbrushes); + q2bsp.dsurfedges = BSP29_CopySurfedges(mbsp.dsurfedges, mbsp.numsurfedges); - q2bsp->dareas = Q2BSP_CopyAreas(mbsp->dareas, mbsp->numareas); - q2bsp->dareaportals = Q2BSP_CopyAreaPortals(mbsp->dareaportals, mbsp->numareaportals); + q2bsp.dareas = Q2BSP_CopyAreas(mbsp.dareas, mbsp.numareas); + q2bsp.dareaportals = Q2BSP_CopyAreaPortals(mbsp.dareaportals, mbsp.numareaportals); - q2bsp->dbrushes = Q2BSP_CopyBrushes(mbsp->dbrushes, mbsp->numbrushes); - q2bsp->dbrushsides = Q2BSP_Qbism_CopyBrushSides(mbsp->dbrushsides, mbsp->numbrushsides); - - /* Free old data */ - FreeMBSP(mbsp); + q2bsp.dbrushes = Q2BSP_CopyBrushes(mbsp.dbrushes, mbsp.numbrushes); + q2bsp.dbrushsides = Q2BSP_Qbism_CopyBrushSides(mbsp.dbrushsides, mbsp.numbrushsides); /* Conversion complete! */ bspdata->version = to_version; + bspdata->bsp = std::move(q2bsp); return true; } else if (to_version == &bspver_bsp2rmq || to_version == &bspver_h2bsp2rmq) { // bspver_generic -> bspver_bsp2rmq, bspver_h2bsp2rmq - - bsp2rmq_t *bsp2rmq = &bspdata->data.bsp2rmq; - mbsp_t *mbsp = &bspdata->data.mbsp; - - memset(bsp2rmq, 0, sizeof(*bsp2rmq)); + bsp2rmq_t bsp2rmq { }; // copy counts - bsp2rmq->nummodels = mbsp->nummodels; - bsp2rmq->visdatasize = mbsp->visdatasize; - bsp2rmq->lightdatasize = mbsp->lightdatasize; - bsp2rmq->texdatasize = mbsp->texdatasize; - bsp2rmq->entdatasize = mbsp->entdatasize; - bsp2rmq->numleafs = mbsp->numleafs; - bsp2rmq->numplanes = mbsp->numplanes; - bsp2rmq->numvertexes = mbsp->numvertexes; - bsp2rmq->numnodes = mbsp->numnodes; - bsp2rmq->numtexinfo = mbsp->numtexinfo; - bsp2rmq->numfaces = mbsp->numfaces; - bsp2rmq->numclipnodes = mbsp->numclipnodes; - bsp2rmq->numedges = mbsp->numedges; - bsp2rmq->nummarksurfaces = mbsp->numleaffaces; - bsp2rmq->numsurfedges = mbsp->numsurfedges; + bsp2rmq.nummodels = mbsp.nummodels; + bsp2rmq.visdatasize = mbsp.visdatasize; + bsp2rmq.lightdatasize = mbsp.lightdatasize; + bsp2rmq.texdatasize = mbsp.texdatasize; + bsp2rmq.entdatasize = mbsp.entdatasize; + bsp2rmq.numleafs = mbsp.numleafs; + bsp2rmq.numplanes = mbsp.numplanes; + bsp2rmq.numvertexes = mbsp.numvertexes; + bsp2rmq.numnodes = mbsp.numnodes; + bsp2rmq.numtexinfo = mbsp.numtexinfo; + bsp2rmq.numfaces = mbsp.numfaces; + bsp2rmq.numclipnodes = mbsp.numclipnodes; + bsp2rmq.numedges = mbsp.numedges; + bsp2rmq.nummarksurfaces = mbsp.numleaffaces; + bsp2rmq.numsurfedges = mbsp.numsurfedges; // copy or convert data if (to_version == &bspver_h2bsp2rmq) { - bsp2rmq->dmodels_h2 = H2_CopyModels(mbsp->dmodels, mbsp->nummodels); + bsp2rmq.dmodels_h2 = H2_CopyModels(mbsp.dmodels, mbsp.nummodels); } else { - bsp2rmq->dmodels_q = BSPH2toQ1_Models(mbsp->dmodels, mbsp->nummodels); + bsp2rmq.dmodels_q = BSPH2toQ1_Models(mbsp.dmodels, mbsp.nummodels); } - bsp2rmq->dvisdata = BSP29_CopyVisData(mbsp->dvisdata, mbsp->visdatasize); - bsp2rmq->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); - bsp2rmq->dtexdata = BSP29_CopyTexData(mbsp->dtexdata, mbsp->texdatasize); - bsp2rmq->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); - bsp2rmq->dleafs = MBSPto2rmq_Leafs(mbsp->dleafs, mbsp->numleafs); - bsp2rmq->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); - bsp2rmq->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); - bsp2rmq->dnodes = BSP2to2rmq_Nodes(mbsp->dnodes, mbsp->numnodes); - bsp2rmq->texinfo = MBSPto29_Texinfo(mbsp->texinfo, mbsp->numtexinfo); - bsp2rmq->dfaces = BSP2_CopyFaces(mbsp->dfaces, mbsp->numfaces); - bsp2rmq->dclipnodes = BSP2_CopyClipnodes(mbsp->dclipnodes, mbsp->numclipnodes); - bsp2rmq->dedges = BSP2_CopyEdges(mbsp->dedges, mbsp->numedges); - bsp2rmq->dmarksurfaces = BSP2_CopyMarksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); - bsp2rmq->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); - - /* Free old data */ - FreeMBSP(mbsp); + bsp2rmq.dvisdata = BSP29_CopyVisData(mbsp.dvisdata, mbsp.visdatasize); + bsp2rmq.dlightdata = BSP29_CopyLightData(mbsp.dlightdata, mbsp.lightdatasize); + bsp2rmq.dtexdata = BSP29_CopyTexData(mbsp.dtexdata, mbsp.texdatasize); + bsp2rmq.dentdata = BSP29_CopyEntData(mbsp.dentdata, mbsp.entdatasize); + bsp2rmq.dleafs = MBSPto2rmq_Leafs(mbsp.dleafs, mbsp.numleafs); + bsp2rmq.dplanes = BSP29_CopyPlanes(mbsp.dplanes, mbsp.numplanes); + bsp2rmq.dvertexes = BSP29_CopyVertexes(mbsp.dvertexes, mbsp.numvertexes); + bsp2rmq.dnodes = BSP2to2rmq_Nodes(mbsp.dnodes, mbsp.numnodes); + bsp2rmq.texinfo = MBSPto29_Texinfo(mbsp.texinfo, mbsp.numtexinfo); + bsp2rmq.dfaces = BSP2_CopyFaces(mbsp.dfaces, mbsp.numfaces); + bsp2rmq.dclipnodes = BSP2_CopyClipnodes(mbsp.dclipnodes, mbsp.numclipnodes); + bsp2rmq.dedges = BSP2_CopyEdges(mbsp.dedges, mbsp.numedges); + bsp2rmq.dmarksurfaces = BSP2_CopyMarksurfaces(mbsp.dleaffaces, mbsp.numleaffaces); + bsp2rmq.dsurfedges = BSP29_CopySurfedges(mbsp.dsurfedges, mbsp.numsurfedges); /* Conversion complete! */ bspdata->version = to_version; + bspdata->bsp = std::move(bsp2rmq); return true; } else if (to_version == &bspver_bsp2 || to_version == &bspver_h2bsp2) { // bspver_generic -> bspver_bsp2, bspver_h2bsp2 - - bsp2_t *bsp2 = &bspdata->data.bsp2; - mbsp_t *mbsp = &bspdata->data.mbsp; - - memset(bsp2, 0, sizeof(*bsp2)); + bsp2_t bsp2 { }; // copy counts - bsp2->nummodels = mbsp->nummodels; - bsp2->visdatasize = mbsp->visdatasize; - bsp2->lightdatasize = mbsp->lightdatasize; - bsp2->texdatasize = mbsp->texdatasize; - bsp2->entdatasize = mbsp->entdatasize; - bsp2->numleafs = mbsp->numleafs; - bsp2->numplanes = mbsp->numplanes; - bsp2->numvertexes = mbsp->numvertexes; - bsp2->numnodes = mbsp->numnodes; - bsp2->numtexinfo = mbsp->numtexinfo; - bsp2->numfaces = mbsp->numfaces; - bsp2->numclipnodes = mbsp->numclipnodes; - bsp2->numedges = mbsp->numedges; - bsp2->nummarksurfaces = mbsp->numleaffaces; - bsp2->numsurfedges = mbsp->numsurfedges; + bsp2.nummodels = mbsp.nummodels; + bsp2.visdatasize = mbsp.visdatasize; + bsp2.lightdatasize = mbsp.lightdatasize; + bsp2.texdatasize = mbsp.texdatasize; + bsp2.entdatasize = mbsp.entdatasize; + bsp2.numleafs = mbsp.numleafs; + bsp2.numplanes = mbsp.numplanes; + bsp2.numvertexes = mbsp.numvertexes; + bsp2.numnodes = mbsp.numnodes; + bsp2.numtexinfo = mbsp.numtexinfo; + bsp2.numfaces = mbsp.numfaces; + bsp2.numclipnodes = mbsp.numclipnodes; + bsp2.numedges = mbsp.numedges; + bsp2.nummarksurfaces = mbsp.numleaffaces; + bsp2.numsurfedges = mbsp.numsurfedges; // copy or convert data if (to_version == &bspver_h2bsp2) { - bsp2->dmodels_h2 = H2_CopyModels(mbsp->dmodels, mbsp->nummodels); + bsp2.dmodels_h2 = H2_CopyModels(mbsp.dmodels, mbsp.nummodels); } else { - bsp2->dmodels_q = BSPH2toQ1_Models(mbsp->dmodels, mbsp->nummodels); + bsp2.dmodels_q = BSPH2toQ1_Models(mbsp.dmodels, mbsp.nummodels); } - bsp2->dvisdata = BSP29_CopyVisData(mbsp->dvisdata, mbsp->visdatasize); - bsp2->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); - bsp2->dtexdata = BSP29_CopyTexData(mbsp->dtexdata, mbsp->texdatasize); - bsp2->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); - bsp2->dleafs = MBSPto2_Leafs(mbsp->dleafs, mbsp->numleafs); - bsp2->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); - bsp2->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); - bsp2->dnodes = BSP2_CopyNodes(mbsp->dnodes, mbsp->numnodes); - bsp2->texinfo = MBSPto29_Texinfo(mbsp->texinfo, mbsp->numtexinfo); - bsp2->dfaces = BSP2_CopyFaces(mbsp->dfaces, mbsp->numfaces); - bsp2->dclipnodes = BSP2_CopyClipnodes(mbsp->dclipnodes, mbsp->numclipnodes); - bsp2->dedges = BSP2_CopyEdges(mbsp->dedges, mbsp->numedges); - bsp2->dmarksurfaces = BSP2_CopyMarksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); - bsp2->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); - - /* Free old data */ - FreeMBSP(mbsp); + bsp2.dvisdata = BSP29_CopyVisData(mbsp.dvisdata, mbsp.visdatasize); + bsp2.dlightdata = BSP29_CopyLightData(mbsp.dlightdata, mbsp.lightdatasize); + bsp2.dtexdata = BSP29_CopyTexData(mbsp.dtexdata, mbsp.texdatasize); + bsp2.dentdata = BSP29_CopyEntData(mbsp.dentdata, mbsp.entdatasize); + bsp2.dleafs = MBSPto2_Leafs(mbsp.dleafs, mbsp.numleafs); + bsp2.dplanes = BSP29_CopyPlanes(mbsp.dplanes, mbsp.numplanes); + bsp2.dvertexes = BSP29_CopyVertexes(mbsp.dvertexes, mbsp.numvertexes); + bsp2.dnodes = BSP2_CopyNodes(mbsp.dnodes, mbsp.numnodes); + bsp2.texinfo = MBSPto29_Texinfo(mbsp.texinfo, mbsp.numtexinfo); + bsp2.dfaces = BSP2_CopyFaces(mbsp.dfaces, mbsp.numfaces); + bsp2.dclipnodes = BSP2_CopyClipnodes(mbsp.dclipnodes, mbsp.numclipnodes); + bsp2.dedges = BSP2_CopyEdges(mbsp.dedges, mbsp.numedges); + bsp2.dmarksurfaces = BSP2_CopyMarksurfaces(mbsp.dleaffaces, mbsp.numleaffaces); + bsp2.dsurfedges = BSP29_CopySurfedges(mbsp.dsurfedges, mbsp.numsurfedges); /* Conversion complete! */ bspdata->version = to_version; + bspdata->bsp = std::move(bsp2); return true; } @@ -3572,143 +3342,139 @@ void LoadBSPFile(char *filename, bspdata_t *bspdata) /* copy the data */ if (bspdata->version == &bspver_q2) { q2_dheader_t *header = (q2_dheader_t *)file_data; - q2bsp_t *bsp = &bspdata->data.q2bsp; + q2bsp_t bsp { }; - memset(bsp, 0, sizeof(*bsp)); + bsp.nummodels = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_MODELS, &bsp.dmodels); + bsp.numvertexes = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_VERTEXES, &bsp.dvertexes); + bsp.numplanes = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_PLANES, &bsp.dplanes); + bsp.numleafs = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_LEAFS, &bsp.dleafs); + bsp.numnodes = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_NODES, &bsp.dnodes); + bsp.numtexinfo = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_TEXINFO, &bsp.texinfo); + bsp.numfaces = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_FACES, &bsp.dfaces); + bsp.numleaffaces = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_LEAFFACES, &bsp.dleaffaces); + bsp.numleafbrushes = + CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_LEAFBRUSHES, &bsp.dleafbrushes); + bsp.numsurfedges = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_SURFEDGES, &bsp.dsurfedges); + bsp.numedges = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_EDGES, &bsp.dedges); + bsp.numbrushes = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_BRUSHES, &bsp.dbrushes); + bsp.numbrushsides = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_BRUSHSIDES, &bsp.dbrushsides); + bsp.numareas = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_AREAS, &bsp.dareas); + bsp.numareaportals = + CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_AREAPORTALS, &bsp.dareaportals); - bsp->nummodels = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_MODELS, &bsp->dmodels); - bsp->numvertexes = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_VERTEXES, &bsp->dvertexes); - bsp->numplanes = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_PLANES, &bsp->dplanes); - bsp->numleafs = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_LEAFS, &bsp->dleafs); - bsp->numnodes = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_NODES, &bsp->dnodes); - bsp->numtexinfo = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_TEXINFO, &bsp->texinfo); - bsp->numfaces = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_FACES, &bsp->dfaces); - bsp->numleaffaces = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_LEAFFACES, &bsp->dleaffaces); - bsp->numleafbrushes = - CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_LEAFBRUSHES, &bsp->dleafbrushes); - bsp->numsurfedges = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_SURFEDGES, &bsp->dsurfedges); - bsp->numedges = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_EDGES, &bsp->dedges); - bsp->numbrushes = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_BRUSHES, &bsp->dbrushes); - bsp->numbrushsides = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_BRUSHSIDES, &bsp->dbrushsides); - bsp->numareas = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_AREAS, &bsp->dareas); - bsp->numareaportals = - CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_AREAPORTALS, &bsp->dareaportals); + bsp.visdatasize = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_VISIBILITY, &bsp.dvisdata); + bsp.lightdatasize = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_LIGHTING, &bsp.dlightdata); + bsp.entdatasize = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_ENTITIES, &bsp.dentdata); - bsp->visdatasize = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_VISIBILITY, &bsp->dvisdata); - bsp->lightdatasize = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_LIGHTING, &bsp->dlightdata); - bsp->entdatasize = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_ENTITIES, &bsp->dentdata); - - //CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_POP, &bsp->dpop); + bspdata->bsp = std::move(bsp); } else if (bspdata->version == &bspver_qbism) { q2_dheader_t *header = (q2_dheader_t *)file_data; - q2bsp_qbism_t *bsp = &bspdata->data.q2bsp_qbism; + q2bsp_qbism_t bsp { }; - memset(bsp, 0, sizeof(*bsp)); + bsp.nummodels = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_MODELS, &bsp.dmodels); + bsp.numvertexes = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_VERTEXES, &bsp.dvertexes); + bsp.numplanes = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_PLANES, &bsp.dplanes); + bsp.numleafs = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_LEAFS, &bsp.dleafs); + bsp.numnodes = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_NODES, &bsp.dnodes); + bsp.numtexinfo = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_TEXINFO, &bsp.texinfo); + bsp.numfaces = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_FACES, &bsp.dfaces); + bsp.numleaffaces = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_LEAFFACES, &bsp.dleaffaces); + bsp.numleafbrushes = + CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_LEAFBRUSHES, &bsp.dleafbrushes); + bsp.numsurfedges = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_SURFEDGES, &bsp.dsurfedges); + bsp.numedges = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_EDGES, &bsp.dedges); + bsp.numbrushes = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_BRUSHES, &bsp.dbrushes); + bsp.numbrushsides = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_BRUSHSIDES, &bsp.dbrushsides); + bsp.numareas = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_AREAS, &bsp.dareas); + bsp.numareaportals = + CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_AREAPORTALS, &bsp.dareaportals); - bsp->nummodels = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_MODELS, &bsp->dmodels); - bsp->numvertexes = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_VERTEXES, &bsp->dvertexes); - bsp->numplanes = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_PLANES, &bsp->dplanes); - bsp->numleafs = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_LEAFS, &bsp->dleafs); - bsp->numnodes = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_NODES, &bsp->dnodes); - bsp->numtexinfo = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_TEXINFO, &bsp->texinfo); - bsp->numfaces = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_FACES, &bsp->dfaces); - bsp->numleaffaces = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_LEAFFACES, &bsp->dleaffaces); - bsp->numleafbrushes = - CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_LEAFBRUSHES, &bsp->dleafbrushes); - bsp->numsurfedges = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_SURFEDGES, &bsp->dsurfedges); - bsp->numedges = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_EDGES, &bsp->dedges); - bsp->numbrushes = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_BRUSHES, &bsp->dbrushes); - bsp->numbrushsides = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_BRUSHSIDES, &bsp->dbrushsides); - bsp->numareas = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_AREAS, &bsp->dareas); - bsp->numareaportals = - CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_AREAPORTALS, &bsp->dareaportals); + bsp.visdatasize = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_VISIBILITY, &bsp.dvisdata); + bsp.lightdatasize = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_LIGHTING, &bsp.dlightdata); + bsp.entdatasize = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_ENTITIES, &bsp.dentdata); - bsp->visdatasize = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_VISIBILITY, &bsp->dvisdata); - bsp->lightdatasize = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_LIGHTING, &bsp->dlightdata); - bsp->entdatasize = CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_ENTITIES, &bsp->dentdata); - - //CopyLump(header, bspdata->version, header->lumps, Q2_LUMP_POP, &bsp->dpop); + bspdata->bsp = std::move(bsp); } else if (bspdata->version == &bspver_q1 || bspdata->version == &bspver_h2 || bspdata->version == &bspver_hl) { dheader_t *header = (dheader_t *)file_data; - bsp29_t *bsp = &bspdata->data.bsp29; - - memset(bsp, 0, sizeof(*bsp)); + bsp29_t bsp { }; if (bspdata->version == &bspver_h2) { - bsp->nummodels = CopyLump(header, bspdata->version, header->lumps, LUMP_MODELS, &bsp->dmodels_h2); + bsp.nummodels = CopyLump(header, bspdata->version, header->lumps, LUMP_MODELS, &bsp.dmodels_h2); } else { - bsp->nummodels = CopyLump(header, bspdata->version, header->lumps, LUMP_MODELS, &bsp->dmodels_q); + bsp.nummodels = CopyLump(header, bspdata->version, header->lumps, LUMP_MODELS, &bsp.dmodels_q); } - bsp->numvertexes = CopyLump(header, bspdata->version, header->lumps, LUMP_VERTEXES, &bsp->dvertexes); - bsp->numplanes = CopyLump(header, bspdata->version, header->lumps, LUMP_PLANES, &bsp->dplanes); - bsp->numleafs = CopyLump(header, bspdata->version, header->lumps, LUMP_LEAFS, &bsp->dleafs); - bsp->numnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_NODES, &bsp->dnodes); - bsp->numtexinfo = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXINFO, &bsp->texinfo); - bsp->numclipnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_CLIPNODES, &bsp->dclipnodes); - bsp->numfaces = CopyLump(header, bspdata->version, header->lumps, LUMP_FACES, &bsp->dfaces); - bsp->nummarksurfaces = - CopyLump(header, bspdata->version, header->lumps, LUMP_MARKSURFACES, &bsp->dmarksurfaces); - bsp->numsurfedges = CopyLump(header, bspdata->version, header->lumps, LUMP_SURFEDGES, &bsp->dsurfedges); - bsp->numedges = CopyLump(header, bspdata->version, header->lumps, LUMP_EDGES, &bsp->dedges); + bsp.numvertexes = CopyLump(header, bspdata->version, header->lumps, LUMP_VERTEXES, &bsp.dvertexes); + bsp.numplanes = CopyLump(header, bspdata->version, header->lumps, LUMP_PLANES, &bsp.dplanes); + bsp.numleafs = CopyLump(header, bspdata->version, header->lumps, LUMP_LEAFS, &bsp.dleafs); + bsp.numnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_NODES, &bsp.dnodes); + bsp.numtexinfo = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXINFO, &bsp.texinfo); + bsp.numclipnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_CLIPNODES, &bsp.dclipnodes); + bsp.numfaces = CopyLump(header, bspdata->version, header->lumps, LUMP_FACES, &bsp.dfaces); + bsp.nummarksurfaces = + CopyLump(header, bspdata->version, header->lumps, LUMP_MARKSURFACES, &bsp.dmarksurfaces); + bsp.numsurfedges = CopyLump(header, bspdata->version, header->lumps, LUMP_SURFEDGES, &bsp.dsurfedges); + bsp.numedges = CopyLump(header, bspdata->version, header->lumps, LUMP_EDGES, &bsp.dedges); - bsp->texdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXTURES, &bsp->dtexdata); - bsp->visdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_VISIBILITY, &bsp->dvisdata); - bsp->lightdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_LIGHTING, &bsp->dlightdata); - bsp->entdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_ENTITIES, &bsp->dentdata); + bsp.texdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXTURES, &bsp.dtexdata); + bsp.visdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_VISIBILITY, &bsp.dvisdata); + bsp.lightdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_LIGHTING, &bsp.dlightdata); + bsp.entdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_ENTITIES, &bsp.dentdata); + + bspdata->bsp = std::move(bsp); } else if (bspdata->version == &bspver_bsp2rmq || bspdata->version == &bspver_h2bsp2rmq) { dheader_t *header = (dheader_t *)file_data; - bsp2rmq_t *bsp = &bspdata->data.bsp2rmq; - - memset(bsp, 0, sizeof(*bsp)); + bsp2rmq_t bsp { }; if (bspdata->version == &bspver_h2bsp2rmq) { - bsp->nummodels = CopyLump(header, bspdata->version, header->lumps, LUMP_MODELS, &bsp->dmodels_h2); + bsp.nummodels = CopyLump(header, bspdata->version, header->lumps, LUMP_MODELS, &bsp.dmodels_h2); } else { - bsp->nummodels = CopyLump(header, bspdata->version, header->lumps, LUMP_MODELS, &bsp->dmodels_q); + bsp.nummodels = CopyLump(header, bspdata->version, header->lumps, LUMP_MODELS, &bsp.dmodels_q); } - bsp->numvertexes = CopyLump(header, bspdata->version, header->lumps, LUMP_VERTEXES, &bsp->dvertexes); - bsp->numplanes = CopyLump(header, bspdata->version, header->lumps, LUMP_PLANES, &bsp->dplanes); - bsp->numleafs = CopyLump(header, bspdata->version, header->lumps, LUMP_LEAFS, &bsp->dleafs); - bsp->numnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_NODES, &bsp->dnodes); - bsp->numtexinfo = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXINFO, &bsp->texinfo); - bsp->numclipnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_CLIPNODES, &bsp->dclipnodes); - bsp->numfaces = CopyLump(header, bspdata->version, header->lumps, LUMP_FACES, &bsp->dfaces); - bsp->nummarksurfaces = - CopyLump(header, bspdata->version, header->lumps, LUMP_MARKSURFACES, &bsp->dmarksurfaces); - bsp->numsurfedges = CopyLump(header, bspdata->version, header->lumps, LUMP_SURFEDGES, &bsp->dsurfedges); - bsp->numedges = CopyLump(header, bspdata->version, header->lumps, LUMP_EDGES, &bsp->dedges); + bsp.numvertexes = CopyLump(header, bspdata->version, header->lumps, LUMP_VERTEXES, &bsp.dvertexes); + bsp.numplanes = CopyLump(header, bspdata->version, header->lumps, LUMP_PLANES, &bsp.dplanes); + bsp.numleafs = CopyLump(header, bspdata->version, header->lumps, LUMP_LEAFS, &bsp.dleafs); + bsp.numnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_NODES, &bsp.dnodes); + bsp.numtexinfo = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXINFO, &bsp.texinfo); + bsp.numclipnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_CLIPNODES, &bsp.dclipnodes); + bsp.numfaces = CopyLump(header, bspdata->version, header->lumps, LUMP_FACES, &bsp.dfaces); + bsp.nummarksurfaces = + CopyLump(header, bspdata->version, header->lumps, LUMP_MARKSURFACES, &bsp.dmarksurfaces); + bsp.numsurfedges = CopyLump(header, bspdata->version, header->lumps, LUMP_SURFEDGES, &bsp.dsurfedges); + bsp.numedges = CopyLump(header, bspdata->version, header->lumps, LUMP_EDGES, &bsp.dedges); - bsp->texdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXTURES, &bsp->dtexdata); - bsp->visdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_VISIBILITY, &bsp->dvisdata); - bsp->lightdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_LIGHTING, &bsp->dlightdata); - bsp->entdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_ENTITIES, &bsp->dentdata); + bsp.texdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXTURES, &bsp.dtexdata); + bsp.visdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_VISIBILITY, &bsp.dvisdata); + bsp.lightdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_LIGHTING, &bsp.dlightdata); + bsp.entdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_ENTITIES, &bsp.dentdata); + + bspdata->bsp = std::move(bsp); } else if (bspdata->version == &bspver_bsp2 || bspdata->version == &bspver_h2bsp2) { dheader_t *header = (dheader_t *)file_data; - bsp2_t *bsp = &bspdata->data.bsp2; - - memset(bsp, 0, sizeof(*bsp)); + bsp2_t bsp { }; if (bspdata->version == &bspver_h2bsp2) { - bsp->nummodels = CopyLump(header, bspdata->version, header->lumps, LUMP_MODELS, &bsp->dmodels_h2); + bsp.nummodels = CopyLump(header, bspdata->version, header->lumps, LUMP_MODELS, &bsp.dmodels_h2); } else { - bsp->nummodels = CopyLump(header, bspdata->version, header->lumps, LUMP_MODELS, &bsp->dmodels_q); + bsp.nummodels = CopyLump(header, bspdata->version, header->lumps, LUMP_MODELS, &bsp.dmodels_q); } - bsp->numvertexes = CopyLump(header, bspdata->version, header->lumps, LUMP_VERTEXES, &bsp->dvertexes); - bsp->numplanes = CopyLump(header, bspdata->version, header->lumps, LUMP_PLANES, &bsp->dplanes); - bsp->numleafs = CopyLump(header, bspdata->version, header->lumps, LUMP_LEAFS, &bsp->dleafs); - bsp->numnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_NODES, &bsp->dnodes); - bsp->numtexinfo = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXINFO, &bsp->texinfo); - bsp->numclipnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_CLIPNODES, &bsp->dclipnodes); - bsp->numfaces = CopyLump(header, bspdata->version, header->lumps, LUMP_FACES, &bsp->dfaces); - bsp->nummarksurfaces = - CopyLump(header, bspdata->version, header->lumps, LUMP_MARKSURFACES, &bsp->dmarksurfaces); - bsp->numsurfedges = CopyLump(header, bspdata->version, header->lumps, LUMP_SURFEDGES, &bsp->dsurfedges); - bsp->numedges = CopyLump(header, bspdata->version, header->lumps, LUMP_EDGES, &bsp->dedges); + bsp.numvertexes = CopyLump(header, bspdata->version, header->lumps, LUMP_VERTEXES, &bsp.dvertexes); + bsp.numplanes = CopyLump(header, bspdata->version, header->lumps, LUMP_PLANES, &bsp.dplanes); + bsp.numleafs = CopyLump(header, bspdata->version, header->lumps, LUMP_LEAFS, &bsp.dleafs); + bsp.numnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_NODES, &bsp.dnodes); + bsp.numtexinfo = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXINFO, &bsp.texinfo); + bsp.numclipnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_CLIPNODES, &bsp.dclipnodes); + bsp.numfaces = CopyLump(header, bspdata->version, header->lumps, LUMP_FACES, &bsp.dfaces); + bsp.nummarksurfaces = + CopyLump(header, bspdata->version, header->lumps, LUMP_MARKSURFACES, &bsp.dmarksurfaces); + bsp.numsurfedges = CopyLump(header, bspdata->version, header->lumps, LUMP_SURFEDGES, &bsp.dsurfedges); + bsp.numedges = CopyLump(header, bspdata->version, header->lumps, LUMP_EDGES, &bsp.dedges); - bsp->texdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXTURES, &bsp->dtexdata); - bsp->visdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_VISIBILITY, &bsp->dvisdata); - bsp->lightdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_LIGHTING, &bsp->dlightdata); - bsp->entdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_ENTITIES, &bsp->dentdata); + bsp.texdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXTURES, &bsp.dtexdata); + bsp.visdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_VISIBILITY, &bsp.dvisdata); + bsp.lightdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_LIGHTING, &bsp.dlightdata); + bsp.entdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_ENTITIES, &bsp.dentdata); + + bspdata->bsp = std::move(bsp); } else { Error("Unknown format"); } @@ -3826,121 +3592,121 @@ void WriteBSPFile(const char *filename, bspdata_t *bspdata) SafeWrite(bspfile.file, &bspfile.q1header, sizeof(bspfile.q1header)); } - if (bspdata->version == &bspver_q1 || bspdata->version == &bspver_h2 || bspdata->version == &bspver_hl) { - const bsp29_t *bsp = &bspdata->data.bsp29; + if (std::holds_alternative(bspdata->bsp)) { + const bsp29_t &bsp = std::get(bspdata->bsp); - AddLump(&bspfile, LUMP_PLANES, bsp->dplanes, bsp->numplanes); - AddLump(&bspfile, LUMP_LEAFS, bsp->dleafs, bsp->numleafs); - AddLump(&bspfile, LUMP_VERTEXES, bsp->dvertexes, bsp->numvertexes); - AddLump(&bspfile, LUMP_NODES, bsp->dnodes, bsp->numnodes); - AddLump(&bspfile, LUMP_TEXINFO, bsp->texinfo, bsp->numtexinfo); - AddLump(&bspfile, LUMP_FACES, bsp->dfaces, bsp->numfaces); - AddLump(&bspfile, LUMP_CLIPNODES, bsp->dclipnodes, bsp->numclipnodes); - AddLump(&bspfile, LUMP_MARKSURFACES, bsp->dmarksurfaces, bsp->nummarksurfaces); - AddLump(&bspfile, LUMP_SURFEDGES, bsp->dsurfedges, bsp->numsurfedges); - AddLump(&bspfile, LUMP_EDGES, bsp->dedges, bsp->numedges); + AddLump(&bspfile, LUMP_PLANES, bsp.dplanes, bsp.numplanes); + AddLump(&bspfile, LUMP_LEAFS, bsp.dleafs, bsp.numleafs); + AddLump(&bspfile, LUMP_VERTEXES, bsp.dvertexes, bsp.numvertexes); + AddLump(&bspfile, LUMP_NODES, bsp.dnodes, bsp.numnodes); + AddLump(&bspfile, LUMP_TEXINFO, bsp.texinfo, bsp.numtexinfo); + AddLump(&bspfile, LUMP_FACES, bsp.dfaces, bsp.numfaces); + AddLump(&bspfile, LUMP_CLIPNODES, bsp.dclipnodes, bsp.numclipnodes); + AddLump(&bspfile, LUMP_MARKSURFACES, bsp.dmarksurfaces, bsp.nummarksurfaces); + AddLump(&bspfile, LUMP_SURFEDGES, bsp.dsurfedges, bsp.numsurfedges); + AddLump(&bspfile, LUMP_EDGES, bsp.dedges, bsp.numedges); if (bspdata->version == &bspver_h2) { - AddLump(&bspfile, LUMP_MODELS, bsp->dmodels_h2, bsp->nummodels); + AddLump(&bspfile, LUMP_MODELS, bsp.dmodels_h2, bsp.nummodels); } else { - AddLump(&bspfile, LUMP_MODELS, bsp->dmodels_q, bsp->nummodels); + AddLump(&bspfile, LUMP_MODELS, bsp.dmodels_q, bsp.nummodels); } - AddLump(&bspfile, LUMP_LIGHTING, bsp->dlightdata, bsp->lightdatasize); - AddLump(&bspfile, LUMP_VISIBILITY, bsp->dvisdata, bsp->visdatasize); - AddLump(&bspfile, LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize); - AddLump(&bspfile, LUMP_TEXTURES, bsp->dtexdata, bsp->texdatasize); - } else if (bspdata->version == &bspver_bsp2rmq || bspdata->version == &bspver_h2bsp2rmq) { - const bsp2rmq_t *bsp = &bspdata->data.bsp2rmq; + AddLump(&bspfile, LUMP_LIGHTING, bsp.dlightdata, bsp.lightdatasize); + AddLump(&bspfile, LUMP_VISIBILITY, bsp.dvisdata, bsp.visdatasize); + AddLump(&bspfile, LUMP_ENTITIES, bsp.dentdata, bsp.entdatasize); + AddLump(&bspfile, LUMP_TEXTURES, bsp.dtexdata, bsp.texdatasize); + } else if (std::holds_alternative(bspdata->bsp)) { + const bsp2rmq_t &bsp = std::get(bspdata->bsp); - AddLump(&bspfile, LUMP_PLANES, bsp->dplanes, bsp->numplanes); - AddLump(&bspfile, LUMP_LEAFS, bsp->dleafs, bsp->numleafs); - AddLump(&bspfile, LUMP_VERTEXES, bsp->dvertexes, bsp->numvertexes); - AddLump(&bspfile, LUMP_NODES, bsp->dnodes, bsp->numnodes); - AddLump(&bspfile, LUMP_TEXINFO, bsp->texinfo, bsp->numtexinfo); - AddLump(&bspfile, LUMP_FACES, bsp->dfaces, bsp->numfaces); - AddLump(&bspfile, LUMP_CLIPNODES, bsp->dclipnodes, bsp->numclipnodes); - AddLump(&bspfile, LUMP_MARKSURFACES, bsp->dmarksurfaces, bsp->nummarksurfaces); - AddLump(&bspfile, LUMP_SURFEDGES, bsp->dsurfedges, bsp->numsurfedges); - AddLump(&bspfile, LUMP_EDGES, bsp->dedges, bsp->numedges); + AddLump(&bspfile, LUMP_PLANES, bsp.dplanes, bsp.numplanes); + AddLump(&bspfile, LUMP_LEAFS, bsp.dleafs, bsp.numleafs); + AddLump(&bspfile, LUMP_VERTEXES, bsp.dvertexes, bsp.numvertexes); + AddLump(&bspfile, LUMP_NODES, bsp.dnodes, bsp.numnodes); + AddLump(&bspfile, LUMP_TEXINFO, bsp.texinfo, bsp.numtexinfo); + AddLump(&bspfile, LUMP_FACES, bsp.dfaces, bsp.numfaces); + AddLump(&bspfile, LUMP_CLIPNODES, bsp.dclipnodes, bsp.numclipnodes); + AddLump(&bspfile, LUMP_MARKSURFACES, bsp.dmarksurfaces, bsp.nummarksurfaces); + AddLump(&bspfile, LUMP_SURFEDGES, bsp.dsurfedges, bsp.numsurfedges); + AddLump(&bspfile, LUMP_EDGES, bsp.dedges, bsp.numedges); if (bspdata->version == &bspver_h2bsp2rmq) { - AddLump(&bspfile, LUMP_MODELS, bsp->dmodels_h2, bsp->nummodels); + AddLump(&bspfile, LUMP_MODELS, bsp.dmodels_h2, bsp.nummodels); } else { - AddLump(&bspfile, LUMP_MODELS, bsp->dmodels_q, bsp->nummodels); + AddLump(&bspfile, LUMP_MODELS, bsp.dmodels_q, bsp.nummodels); } - AddLump(&bspfile, LUMP_LIGHTING, bsp->dlightdata, bsp->lightdatasize); - AddLump(&bspfile, LUMP_VISIBILITY, bsp->dvisdata, bsp->visdatasize); - AddLump(&bspfile, LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize); - AddLump(&bspfile, LUMP_TEXTURES, bsp->dtexdata, bsp->texdatasize); - } else if (bspdata->version == &bspver_bsp2 || bspdata->version == &bspver_h2bsp2) { - const bsp2_t *bsp = &bspdata->data.bsp2; + AddLump(&bspfile, LUMP_LIGHTING, bsp.dlightdata, bsp.lightdatasize); + AddLump(&bspfile, LUMP_VISIBILITY, bsp.dvisdata, bsp.visdatasize); + AddLump(&bspfile, LUMP_ENTITIES, bsp.dentdata, bsp.entdatasize); + AddLump(&bspfile, LUMP_TEXTURES, bsp.dtexdata, bsp.texdatasize); + } else if (std::holds_alternative(bspdata->bsp)) { + const bsp2_t &bsp = std::get(bspdata->bsp); - AddLump(&bspfile, LUMP_PLANES, bsp->dplanes, bsp->numplanes); - AddLump(&bspfile, LUMP_LEAFS, bsp->dleafs, bsp->numleafs); - AddLump(&bspfile, LUMP_VERTEXES, bsp->dvertexes, bsp->numvertexes); - AddLump(&bspfile, LUMP_NODES, bsp->dnodes, bsp->numnodes); - AddLump(&bspfile, LUMP_TEXINFO, bsp->texinfo, bsp->numtexinfo); - AddLump(&bspfile, LUMP_FACES, bsp->dfaces, bsp->numfaces); - AddLump(&bspfile, LUMP_CLIPNODES, bsp->dclipnodes, bsp->numclipnodes); - AddLump(&bspfile, LUMP_MARKSURFACES, bsp->dmarksurfaces, bsp->nummarksurfaces); - AddLump(&bspfile, LUMP_SURFEDGES, bsp->dsurfedges, bsp->numsurfedges); - AddLump(&bspfile, LUMP_EDGES, bsp->dedges, bsp->numedges); + AddLump(&bspfile, LUMP_PLANES, bsp.dplanes, bsp.numplanes); + AddLump(&bspfile, LUMP_LEAFS, bsp.dleafs, bsp.numleafs); + AddLump(&bspfile, LUMP_VERTEXES, bsp.dvertexes, bsp.numvertexes); + AddLump(&bspfile, LUMP_NODES, bsp.dnodes, bsp.numnodes); + AddLump(&bspfile, LUMP_TEXINFO, bsp.texinfo, bsp.numtexinfo); + AddLump(&bspfile, LUMP_FACES, bsp.dfaces, bsp.numfaces); + AddLump(&bspfile, LUMP_CLIPNODES, bsp.dclipnodes, bsp.numclipnodes); + AddLump(&bspfile, LUMP_MARKSURFACES, bsp.dmarksurfaces, bsp.nummarksurfaces); + AddLump(&bspfile, LUMP_SURFEDGES, bsp.dsurfedges, bsp.numsurfedges); + AddLump(&bspfile, LUMP_EDGES, bsp.dedges, bsp.numedges); if (bspdata->version == &bspver_h2bsp2) { - AddLump(&bspfile, LUMP_MODELS, bsp->dmodels_h2, bsp->nummodels); + AddLump(&bspfile, LUMP_MODELS, bsp.dmodels_h2, bsp.nummodels); } else { - AddLump(&bspfile, LUMP_MODELS, bsp->dmodels_q, bsp->nummodels); + AddLump(&bspfile, LUMP_MODELS, bsp.dmodels_q, bsp.nummodels); } - AddLump(&bspfile, LUMP_LIGHTING, bsp->dlightdata, bsp->lightdatasize); - AddLump(&bspfile, LUMP_VISIBILITY, bsp->dvisdata, bsp->visdatasize); - AddLump(&bspfile, LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize); - AddLump(&bspfile, LUMP_TEXTURES, bsp->dtexdata, bsp->texdatasize); - } else if (bspdata->version == &bspver_q2) { - const q2bsp_t *bsp = &bspdata->data.q2bsp; + AddLump(&bspfile, LUMP_LIGHTING, bsp.dlightdata, bsp.lightdatasize); + AddLump(&bspfile, LUMP_VISIBILITY, bsp.dvisdata, bsp.visdatasize); + AddLump(&bspfile, LUMP_ENTITIES, bsp.dentdata, bsp.entdatasize); + AddLump(&bspfile, LUMP_TEXTURES, bsp.dtexdata, bsp.texdatasize); + } else if (std::holds_alternative(bspdata->bsp)) { + const q2bsp_t &bsp = std::get(bspdata->bsp); - 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_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 if (bspdata->version == &bspver_qbism) { - const q2bsp_qbism_t *bsp = &bspdata->data.q2bsp_qbism; + 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 if (std::holds_alternative(bspdata->bsp)) { + const q2bsp_qbism_t &bsp = std::get(bspdata->bsp); - 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_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)); + 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"); } @@ -4014,131 +3780,131 @@ void PrintBSPFileSizes(const bspdata_t *bspdata) int numtextures = 0; const lumpspec_t *lumpspec = LumpspecsForVersion(bspdata->version); - if (bspdata->version == &bspver_q2) { - const q2bsp_t *bsp = &bspdata->data.q2bsp; + if (std::holds_alternative(bspdata->bsp)) { + const q2bsp_t &bsp = std::get(bspdata->bsp); - logprint("%7i %-12s\n", bsp->nummodels, "models"); + logprint("%7i %-12s\n", bsp.nummodels, "models"); - PrintLumpSize(lumpspec, Q2_LUMP_PLANES, bsp->numplanes); - PrintLumpSize(lumpspec, Q2_LUMP_VERTEXES, bsp->numvertexes); - PrintLumpSize(lumpspec, Q2_LUMP_NODES, bsp->numnodes); - PrintLumpSize(lumpspec, Q2_LUMP_TEXINFO, bsp->numtexinfo); - PrintLumpSize(lumpspec, Q2_LUMP_FACES, bsp->numfaces); - PrintLumpSize(lumpspec, Q2_LUMP_LEAFS, bsp->numleafs); - PrintLumpSize(lumpspec, Q2_LUMP_LEAFFACES, bsp->numleaffaces); - PrintLumpSize(lumpspec, Q2_LUMP_LEAFBRUSHES, bsp->numleafbrushes); - PrintLumpSize(lumpspec, Q2_LUMP_EDGES, bsp->numedges); - PrintLumpSize(lumpspec, Q2_LUMP_SURFEDGES, bsp->numsurfedges); - PrintLumpSize(lumpspec, Q2_LUMP_BRUSHES, bsp->numbrushes); - PrintLumpSize(lumpspec, Q2_LUMP_BRUSHSIDES, bsp->numbrushsides); - PrintLumpSize(lumpspec, Q2_LUMP_AREAS, bsp->numareas); - PrintLumpSize(lumpspec, Q2_LUMP_AREAPORTALS, bsp->numareaportals); + PrintLumpSize(lumpspec, Q2_LUMP_PLANES, bsp.numplanes); + PrintLumpSize(lumpspec, Q2_LUMP_VERTEXES, bsp.numvertexes); + PrintLumpSize(lumpspec, Q2_LUMP_NODES, bsp.numnodes); + PrintLumpSize(lumpspec, Q2_LUMP_TEXINFO, bsp.numtexinfo); + PrintLumpSize(lumpspec, Q2_LUMP_FACES, bsp.numfaces); + PrintLumpSize(lumpspec, Q2_LUMP_LEAFS, bsp.numleafs); + PrintLumpSize(lumpspec, Q2_LUMP_LEAFFACES, bsp.numleaffaces); + PrintLumpSize(lumpspec, Q2_LUMP_LEAFBRUSHES, bsp.numleafbrushes); + PrintLumpSize(lumpspec, Q2_LUMP_EDGES, bsp.numedges); + PrintLumpSize(lumpspec, Q2_LUMP_SURFEDGES, bsp.numsurfedges); + PrintLumpSize(lumpspec, Q2_LUMP_BRUSHES, bsp.numbrushes); + PrintLumpSize(lumpspec, Q2_LUMP_BRUSHSIDES, bsp.numbrushsides); + PrintLumpSize(lumpspec, Q2_LUMP_AREAS, bsp.numareas); + PrintLumpSize(lumpspec, Q2_LUMP_AREAPORTALS, bsp.numareaportals); - logprint("%7s %-12s %10i\n", "", "lightdata", bsp->lightdatasize); - logprint("%7s %-12s %10i\n", "", "visdata", bsp->visdatasize); - logprint("%7s %-12s %10i\n", "", "entdata", bsp->entdatasize); - } else if (bspdata->version == &bspver_qbism) { - const q2bsp_qbism_t *bsp = &bspdata->data.q2bsp_qbism; + logprint("%7s %-12s %10i\n", "", "lightdata", bsp.lightdatasize); + logprint("%7s %-12s %10i\n", "", "visdata", bsp.visdatasize); + logprint("%7s %-12s %10i\n", "", "entdata", bsp.entdatasize); + } else if (std::holds_alternative(bspdata->bsp)) { + const q2bsp_qbism_t &bsp = std::get(bspdata->bsp); - logprint("%7i %-12s\n", bsp->nummodels, "models"); + logprint("%7i %-12s\n", bsp.nummodels, "models"); - PrintLumpSize(lumpspec, Q2_LUMP_PLANES, bsp->numplanes); - PrintLumpSize(lumpspec, Q2_LUMP_VERTEXES, bsp->numvertexes); - PrintLumpSize(lumpspec, Q2_LUMP_NODES, bsp->numnodes); - PrintLumpSize(lumpspec, Q2_LUMP_TEXINFO, bsp->numtexinfo); - PrintLumpSize(lumpspec, Q2_LUMP_FACES, bsp->numfaces); - PrintLumpSize(lumpspec, Q2_LUMP_LEAFS, bsp->numleafs); - PrintLumpSize(lumpspec, Q2_LUMP_LEAFFACES, bsp->numleaffaces); - PrintLumpSize(lumpspec, Q2_LUMP_LEAFBRUSHES, bsp->numleafbrushes); - PrintLumpSize(lumpspec, Q2_LUMP_EDGES, bsp->numedges); - PrintLumpSize(lumpspec, Q2_LUMP_SURFEDGES, bsp->numsurfedges); - PrintLumpSize(lumpspec, Q2_LUMP_BRUSHES, bsp->numbrushes); - PrintLumpSize(lumpspec, Q2_LUMP_BRUSHSIDES, bsp->numbrushsides); - PrintLumpSize(lumpspec, Q2_LUMP_AREAS, bsp->numareas); - PrintLumpSize(lumpspec, Q2_LUMP_AREAPORTALS, bsp->numareaportals); + PrintLumpSize(lumpspec, Q2_LUMP_PLANES, bsp.numplanes); + PrintLumpSize(lumpspec, Q2_LUMP_VERTEXES, bsp.numvertexes); + PrintLumpSize(lumpspec, Q2_LUMP_NODES, bsp.numnodes); + PrintLumpSize(lumpspec, Q2_LUMP_TEXINFO, bsp.numtexinfo); + PrintLumpSize(lumpspec, Q2_LUMP_FACES, bsp.numfaces); + PrintLumpSize(lumpspec, Q2_LUMP_LEAFS, bsp.numleafs); + PrintLumpSize(lumpspec, Q2_LUMP_LEAFFACES, bsp.numleaffaces); + PrintLumpSize(lumpspec, Q2_LUMP_LEAFBRUSHES, bsp.numleafbrushes); + PrintLumpSize(lumpspec, Q2_LUMP_EDGES, bsp.numedges); + PrintLumpSize(lumpspec, Q2_LUMP_SURFEDGES, bsp.numsurfedges); + PrintLumpSize(lumpspec, Q2_LUMP_BRUSHES, bsp.numbrushes); + PrintLumpSize(lumpspec, Q2_LUMP_BRUSHSIDES, bsp.numbrushsides); + PrintLumpSize(lumpspec, Q2_LUMP_AREAS, bsp.numareas); + PrintLumpSize(lumpspec, Q2_LUMP_AREAPORTALS, bsp.numareaportals); - logprint("%7s %-12s %10i\n", "", "lightdata", bsp->lightdatasize); - logprint("%7s %-12s %10i\n", "", "visdata", bsp->visdatasize); - logprint("%7s %-12s %10i\n", "", "entdata", bsp->entdatasize); - } else if (bspdata->version == &bspver_q1 || bspdata->version == &bspver_h2 || bspdata->version == &bspver_hl) { - const bsp29_t *bsp = &bspdata->data.bsp29; + logprint("%7s %-12s %10i\n", "", "lightdata", bsp.lightdatasize); + logprint("%7s %-12s %10i\n", "", "visdata", bsp.visdatasize); + logprint("%7s %-12s %10i\n", "", "entdata", bsp.entdatasize); + } else if (std::holds_alternative(bspdata->bsp)) { + const bsp29_t &bsp = std::get(bspdata->bsp); - if (bsp->texdatasize) - numtextures = bsp->dtexdata->nummiptex; + if (bsp.texdatasize) + numtextures = bsp.dtexdata->nummiptex; - logprint("%7i %-12s\n", bsp->nummodels, "models"); + logprint("%7i %-12s\n", bsp.nummodels, "models"); - PrintLumpSize(lumpspec, LUMP_PLANES, bsp->numplanes); - PrintLumpSize(lumpspec, LUMP_VERTEXES, bsp->numvertexes); - PrintLumpSize(lumpspec, LUMP_NODES, bsp->numnodes); - PrintLumpSize(lumpspec, LUMP_TEXINFO, bsp->numtexinfo); - PrintLumpSize(lumpspec, LUMP_FACES, bsp->numfaces); - PrintLumpSize(lumpspec, LUMP_CLIPNODES, bsp->numclipnodes); - PrintLumpSize(lumpspec, LUMP_LEAFS, bsp->numleafs); - PrintLumpSize(lumpspec, LUMP_MARKSURFACES, bsp->nummarksurfaces); - PrintLumpSize(lumpspec, LUMP_EDGES, bsp->numedges); - PrintLumpSize(lumpspec, LUMP_SURFEDGES, bsp->numsurfedges); + PrintLumpSize(lumpspec, LUMP_PLANES, bsp.numplanes); + PrintLumpSize(lumpspec, LUMP_VERTEXES, bsp.numvertexes); + PrintLumpSize(lumpspec, LUMP_NODES, bsp.numnodes); + PrintLumpSize(lumpspec, LUMP_TEXINFO, bsp.numtexinfo); + PrintLumpSize(lumpspec, LUMP_FACES, bsp.numfaces); + PrintLumpSize(lumpspec, LUMP_CLIPNODES, bsp.numclipnodes); + PrintLumpSize(lumpspec, LUMP_LEAFS, bsp.numleafs); + PrintLumpSize(lumpspec, LUMP_MARKSURFACES, bsp.nummarksurfaces); + PrintLumpSize(lumpspec, LUMP_EDGES, bsp.numedges); + PrintLumpSize(lumpspec, LUMP_SURFEDGES, bsp.numsurfedges); - logprint("%7i %-12s %10i\n", numtextures, "textures", bsp->texdatasize); - logprint("%7s %-12s %10i\n", "", "lightdata", bsp->lightdatasize); - logprint("%7s %-12s %10i\n", "", "visdata", bsp->visdatasize); - logprint("%7s %-12s %10i\n", "", "entdata", bsp->entdatasize); + logprint("%7i %-12s %10i\n", numtextures, "textures", bsp.texdatasize); + logprint("%7s %-12s %10i\n", "", "lightdata", bsp.lightdatasize); + logprint("%7s %-12s %10i\n", "", "visdata", bsp.visdatasize); + logprint("%7s %-12s %10i\n", "", "entdata", bsp.entdatasize); + } else if (std::holds_alternative(bspdata->bsp)) { + const bsp2rmq_t &bsp = std::get(bspdata->bsp); - if (bspdata->bspxentries) { - bspxentry_t *x; - for (x = bspdata->bspxentries; x; x = x->next) { - logprint("%7s %-12s %10i\n", "BSPX", x->lumpname, (int)x->lumpsize); - } - } - } else if (bspdata->version == &bspver_bsp2rmq || bspdata->version == &bspver_h2bsp2rmq) { - const bsp2rmq_t *bsp = &bspdata->data.bsp2rmq; + if (bsp.texdatasize) + numtextures = bsp.dtexdata->nummiptex; - if (bsp->texdatasize) - numtextures = bsp->dtexdata->nummiptex; + logprint("%7i %-12s\n", bsp.nummodels, "models"); - logprint("%7i %-12s\n", bsp->nummodels, "models"); + PrintLumpSize(lumpspec, LUMP_PLANES, bsp.numplanes); + PrintLumpSize(lumpspec, LUMP_VERTEXES, bsp.numvertexes); + PrintLumpSize(lumpspec, LUMP_NODES, bsp.numnodes); + PrintLumpSize(lumpspec, LUMP_TEXINFO, bsp.numtexinfo); + PrintLumpSize(lumpspec, LUMP_FACES, bsp.numfaces); + PrintLumpSize(lumpspec, LUMP_CLIPNODES, bsp.numclipnodes); + PrintLumpSize(lumpspec, LUMP_LEAFS, bsp.numleafs); + PrintLumpSize(lumpspec, LUMP_MARKSURFACES, bsp.nummarksurfaces); + PrintLumpSize(lumpspec, LUMP_EDGES, bsp.numedges); + PrintLumpSize(lumpspec, LUMP_SURFEDGES, bsp.numsurfedges); - PrintLumpSize(lumpspec, LUMP_PLANES, bsp->numplanes); - PrintLumpSize(lumpspec, LUMP_VERTEXES, bsp->numvertexes); - PrintLumpSize(lumpspec, LUMP_NODES, bsp->numnodes); - PrintLumpSize(lumpspec, LUMP_TEXINFO, bsp->numtexinfo); - PrintLumpSize(lumpspec, LUMP_FACES, bsp->numfaces); - PrintLumpSize(lumpspec, LUMP_CLIPNODES, bsp->numclipnodes); - PrintLumpSize(lumpspec, LUMP_LEAFS, bsp->numleafs); - PrintLumpSize(lumpspec, LUMP_MARKSURFACES, bsp->nummarksurfaces); - PrintLumpSize(lumpspec, LUMP_EDGES, bsp->numedges); - PrintLumpSize(lumpspec, LUMP_SURFEDGES, bsp->numsurfedges); + logprint("%7i %-12s %10i\n", numtextures, "textures", bsp.texdatasize); + logprint("%7s %-12s %10i\n", "", "lightdata", bsp.lightdatasize); + logprint("%7s %-12s %10i\n", "", "visdata", bsp.visdatasize); + logprint("%7s %-12s %10i\n", "", "entdata", bsp.entdatasize); + } else if (std::holds_alternative(bspdata->bsp)) { + const bsp2_t &bsp = std::get(bspdata->bsp); - logprint("%7i %-12s %10i\n", numtextures, "textures", bsp->texdatasize); - logprint("%7s %-12s %10i\n", "", "lightdata", bsp->lightdatasize); - logprint("%7s %-12s %10i\n", "", "visdata", bsp->visdatasize); - logprint("%7s %-12s %10i\n", "", "entdata", bsp->entdatasize); - } else if (bspdata->version == &bspver_bsp2 || bspdata->version == &bspver_h2bsp2) { - const bsp2_t *bsp = &bspdata->data.bsp2; + if (bsp.texdatasize) + numtextures = bsp.dtexdata->nummiptex; - if (bsp->texdatasize) - numtextures = bsp->dtexdata->nummiptex; + logprint("%7i %-12s\n", bsp.nummodels, "models"); - logprint("%7i %-12s\n", bsp->nummodels, "models"); + PrintLumpSize(lumpspec, LUMP_PLANES, bsp.numplanes); + PrintLumpSize(lumpspec, LUMP_VERTEXES, bsp.numvertexes); + PrintLumpSize(lumpspec, LUMP_NODES, bsp.numnodes); + PrintLumpSize(lumpspec, LUMP_TEXINFO, bsp.numtexinfo); + PrintLumpSize(lumpspec, LUMP_FACES, bsp.numfaces); + PrintLumpSize(lumpspec, LUMP_CLIPNODES, bsp.numclipnodes); + PrintLumpSize(lumpspec, LUMP_LEAFS, bsp.numleafs); + PrintLumpSize(lumpspec, LUMP_MARKSURFACES, bsp.nummarksurfaces); + PrintLumpSize(lumpspec, LUMP_EDGES, bsp.numedges); + PrintLumpSize(lumpspec, LUMP_SURFEDGES, bsp.numsurfedges); - PrintLumpSize(lumpspec, LUMP_PLANES, bsp->numplanes); - PrintLumpSize(lumpspec, LUMP_VERTEXES, bsp->numvertexes); - PrintLumpSize(lumpspec, LUMP_NODES, bsp->numnodes); - PrintLumpSize(lumpspec, LUMP_TEXINFO, bsp->numtexinfo); - PrintLumpSize(lumpspec, LUMP_FACES, bsp->numfaces); - PrintLumpSize(lumpspec, LUMP_CLIPNODES, bsp->numclipnodes); - PrintLumpSize(lumpspec, LUMP_LEAFS, bsp->numleafs); - PrintLumpSize(lumpspec, LUMP_MARKSURFACES, bsp->nummarksurfaces); - PrintLumpSize(lumpspec, LUMP_EDGES, bsp->numedges); - PrintLumpSize(lumpspec, LUMP_SURFEDGES, bsp->numsurfedges); - - logprint("%7i %-12s %10i\n", numtextures, "textures", bsp->texdatasize); - logprint("%7s %-12s %10i\n", "", "lightdata", bsp->lightdatasize); - logprint("%7s %-12s %10i\n", "", "visdata", bsp->visdatasize); - logprint("%7s %-12s %10i\n", "", "entdata", bsp->entdatasize); + logprint("%7i %-12s %10i\n", numtextures, "textures", bsp.texdatasize); + logprint("%7s %-12s %10i\n", "", "lightdata", bsp.lightdatasize); + logprint("%7s %-12s %10i\n", "", "visdata", bsp.visdatasize); + logprint("%7s %-12s %10i\n", "", "entdata", bsp.entdatasize); } else { Error("Unsupported BSP version: %s", BSPVersionString(bspdata->version)); } + + if (bspdata->bspxentries) { + bspxentry_t *x; + for (x = bspdata->bspxentries; x; x = x->next) { + logprint("%7s %-12s %10i\n", "BSPX", x->lumpname, (int)x->lumpsize); + } + } } /* diff --git a/include/common/bspfile.hh b/include/common/bspfile.hh index 9727af79..e51c20b8 100644 --- a/include/common/bspfile.hh +++ b/include/common/bspfile.hh @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -730,6 +731,15 @@ struct bspxentry_t bspxentry_t *next; }; +// this is just temporary until the types use typesafe +// containers. +#define IMPL_MOVE_COPY(T) \ + T() { memset(this, 0, sizeof(*this)); } \ + T(T &&move) { memcpy(this, &move, sizeof(move)); memset(&move, 0, sizeof(move)); } \ + T(const T ©) { memcpy(this, ©, sizeof(copy)); } \ + T &operator=(T &&move) { memcpy(this, &move, sizeof(move)); memset(&move, 0, sizeof(move)); return *this; } \ + T &operator=(const T ©) { memcpy(this, ©, sizeof(copy)); return *this; } + struct bsp29_t { int nummodels; @@ -777,6 +787,28 @@ struct bsp29_t int numsurfedges; int32_t *dsurfedges; + + IMPL_MOVE_COPY(bsp29_t); + + ~bsp29_t() + { + delete[] dmodels_q; + delete[] dmodels_h2; + delete[] dvisdata; + delete[] dlightdata; + delete[] dtexdata; + delete[] dentdata; + delete[] dleafs; + delete[] dplanes; + delete[] dvertexes; + delete[] dnodes; + delete[] texinfo; + delete[] dfaces; + delete[] dclipnodes; + delete[] dedges; + delete[] dmarksurfaces; + delete[] dsurfedges; + } }; struct bsp2rmq_t @@ -826,6 +858,28 @@ struct bsp2rmq_t int numsurfedges; int32_t *dsurfedges; + + IMPL_MOVE_COPY(bsp2rmq_t); + + ~bsp2rmq_t() + { + delete[] dmodels_q; + delete[] dmodels_h2; + delete[] dvisdata; + delete[] dlightdata; + delete[] dtexdata; + delete[] dentdata; + delete[] dleafs; + delete[] dplanes; + delete[] dvertexes; + delete[] dnodes; + delete[] texinfo; + delete[] dfaces; + delete[] dclipnodes; + delete[] dedges; + delete[] dmarksurfaces; + delete[] dsurfedges; + } }; struct bsp2_t @@ -875,6 +929,28 @@ struct bsp2_t int numsurfedges; int32_t *dsurfedges; + + IMPL_MOVE_COPY(bsp2_t); + + ~bsp2_t() + { + delete[] dmodels_q; + delete[] dmodels_h2; + delete[] dvisdata; + delete[] dlightdata; + delete[] dtexdata; + delete[] dentdata; + delete[] dleafs; + delete[] dplanes; + delete[] dvertexes; + delete[] dnodes; + delete[] texinfo; + delete[] dfaces; + delete[] dclipnodes; + delete[] dedges; + delete[] dmarksurfaces; + delete[] dsurfedges; + } }; struct q2bsp_t @@ -937,6 +1013,30 @@ struct q2bsp_t dbrushside_t *dbrushsides; uint8_t dpop[256]; + + IMPL_MOVE_COPY(q2bsp_t); + + ~q2bsp_t() + { + delete[] dmodels; + delete[] dvis; + delete[] dlightdata; + delete[] dentdata; + delete[] dleafs; + delete[] dplanes; + delete[] dvertexes; + delete[] dnodes; + delete[] texinfo; + delete[] dfaces; + delete[] dedges; + delete[] dleaffaces; + delete[] dleafbrushes; + delete[] dsurfedges; + delete[] dareas; + delete[] dareaportals; + delete[] dbrushes; + delete[] dbrushsides; + } }; struct q2bsp_qbism_t @@ -999,6 +1099,30 @@ struct q2bsp_qbism_t q2_dbrushside_qbism_t *dbrushsides; uint8_t dpop[256]; + + IMPL_MOVE_COPY(q2bsp_qbism_t); + + ~q2bsp_qbism_t() + { + delete[] dmodels; + delete[] dvis; + delete[] dlightdata; + delete[] dentdata; + delete[] dleafs; + delete[] dplanes; + delete[] dvertexes; + delete[] dnodes; + delete[] texinfo; + delete[] dfaces; + delete[] dedges; + delete[] dleaffaces; + delete[] dleafbrushes; + delete[] dsurfedges; + delete[] dareas; + delete[] dareaportals; + delete[] dbrushes; + delete[] dbrushsides; + } }; struct bspversion_t; @@ -1072,6 +1196,33 @@ struct mbsp_t q2_dbrushside_qbism_t *dbrushsides; uint8_t dpop[256]; + + IMPL_MOVE_COPY(mbsp_t); + + ~mbsp_t() + { + delete[] dmodels; + delete[] dvisdata; + delete[] dlightdata; + delete[] dtexdata; + delete[] drgbatexdata; // mxd + delete[] dentdata; + delete[] dleafs; + delete[] dplanes; + delete[] dvertexes; + delete[] dnodes; + delete[] texinfo; + delete[] dfaces; + delete[] dclipnodes; + delete[] dedges; + delete[] dleaffaces; + delete[] dleafbrushes; + delete[] dsurfedges; + delete[] dareas; + delete[] dareaportals; + delete[] dbrushes; + delete[] dbrushsides; + } }; // "generic" bsp - superset of all other supported types struct dheader_t @@ -1091,15 +1242,8 @@ struct bspdata_t { const bspversion_t *version, *loadversion; - struct - { - bsp29_t bsp29; - bsp2rmq_t bsp2rmq; - bsp2_t bsp2; - q2bsp_t q2bsp; - mbsp_t mbsp; - q2bsp_qbism_t q2bsp_qbism; - } data; + // Stay in monostate until a BSP type is requested. + std::variant bsp; bspxentry_t *bspxentries; }; diff --git a/light/light.cc b/light/light.cc index 1a5e42d6..d26fd743 100644 --- a/light/light.cc +++ b/light/light.cc @@ -380,7 +380,8 @@ static void LightWorld(bspdata_t *bspdata, qboolean forcedscale) { logprint("--- LightWorld ---\n"); - mbsp_t *const bsp = &bspdata->data.mbsp; + mbsp_t &bsp = std::get(bspdata->bsp); + delete[] filebase; delete[] lit_filebase; delete[] lux_filebase; @@ -413,30 +414,30 @@ static void LightWorld(bspdata_t *bspdata, qboolean forcedscale) if (!lmshift_lump && write_litfile != ~0) faces_sup = nullptr; // no scales, no lit2 else { // we have scales or lit2 output. yay... - faces_sup = new facesup_t[bsp->numfaces] { }; + faces_sup = new facesup_t[bsp.numfaces] { }; if (lmshift_lump) { - for (int i = 0; i < bsp->numfaces; i++) + for (int i = 0; i < bsp.numfaces; i++) faces_sup[i].lmscale = 1 << lmshift_lump[i]; } else { - for (int i = 0; i < bsp->numfaces; i++) + for (int i = 0; i < bsp.numfaces; i++) faces_sup[i].lmscale = modelinfo.at(0)->lightmapscale; } } - CalculateVertexNormals(bsp); + CalculateVertexNormals(&bsp); const qboolean bouncerequired = cfg_static.bounce.boolValue() && (debugmode == debugmode_none || debugmode == debugmode_bounce || debugmode == debugmode_bouncelights); // mxd - const qboolean isQuake2map = bsp->loadversion->game->id == GAME_QUAKE_II; // mxd + const qboolean isQuake2map = bsp.loadversion->game->id == GAME_QUAKE_II; // mxd if (bouncerequired || isQuake2map) { - MakeTextureColors(bsp); + MakeTextureColors(&bsp); if (isQuake2map) - MakeSurfaceLights(cfg_static, bsp); + MakeSurfaceLights(cfg_static, &bsp); if (bouncerequired) - MakeBounceLights(cfg_static, bsp); + MakeBounceLights(cfg_static, &bsp); } #if 0 @@ -447,7 +448,7 @@ static void LightWorld(bspdata_t *bspdata, qboolean forcedscale) RunThreadsOn(0, info.all_batches.size(), LightBatchThread, &info); #else logprint("--- LightThread ---\n"); // mxd - RunThreadsOn(0, bsp->numfaces, LightThread, bsp); + RunThreadsOn(0, bsp.numfaces, LightThread, &bsp); #endif if (bouncerequired || isQuake2map) { // mxd. Print some extra stats... @@ -460,31 +461,31 @@ static void LightWorld(bspdata_t *bspdata, qboolean forcedscale) // Transfer greyscale lightmap (or color lightmap for Q2/HL) to the bsp and update lightdatasize if (!litonly) { - delete[] bsp->dlightdata; - if (bsp->loadversion->game->has_rgb_lightmap) { - bsp->lightdatasize = lit_file_p; - bsp->dlightdata = new uint8_t[bsp->lightdatasize]; - memcpy(bsp->dlightdata, lit_filebase, bsp->lightdatasize); + delete[] bsp.dlightdata; + if (bsp.loadversion->game->has_rgb_lightmap) { + bsp.lightdatasize = lit_file_p; + bsp.dlightdata = new uint8_t[bsp.lightdatasize]; + memcpy(bsp.dlightdata, lit_filebase, bsp.lightdatasize); } else { - bsp->lightdatasize = file_p; - bsp->dlightdata = new uint8_t[bsp->lightdatasize]; - memcpy(bsp->dlightdata, filebase, bsp->lightdatasize); + bsp.lightdatasize = file_p; + bsp.dlightdata = new uint8_t[bsp.lightdatasize]; + memcpy(bsp.dlightdata, filebase, bsp.lightdatasize); } } else { - // NOTE: bsp->lightdatasize is already valid in the -litonly case + // NOTE: bsp.lightdatasize is already valid in the -litonly case } - logprint("lightdatasize: %i\n", bsp->lightdatasize); + logprint("lightdatasize: %i\n", bsp.lightdatasize); if (faces_sup) { - uint8_t *styles = new uint8_t[4 * bsp->numfaces]; - int32_t *offsets = new int32_t[bsp->numfaces]; - for (int i = 0; i < bsp->numfaces; i++) { + uint8_t *styles = new uint8_t[4 * bsp.numfaces]; + int32_t *offsets = new int32_t[bsp.numfaces]; + for (int i = 0; i < bsp.numfaces; i++) { offsets[i] = faces_sup[i].lightofs; for (int j = 0; j < MAXLIGHTMAPS; j++) styles[i * 4 + j] = faces_sup[i].styles[j]; } - BSPX_AddLump(bspdata, "LMSTYLE", styles, sizeof(*styles) * 4 * bsp->numfaces); - BSPX_AddLump(bspdata, "LMOFFSET", offsets, sizeof(*offsets) * bsp->numfaces); + BSPX_AddLump(bspdata, "LMSTYLE", styles, sizeof(*styles) * 4 * bsp.numfaces); + BSPX_AddLump(bspdata, "LMOFFSET", offsets, sizeof(*offsets) * bsp.numfaces); } else { // kill this stuff if its somehow found. BSPX_AddLump(bspdata, "LMSTYLE", NULL, 0); @@ -914,7 +915,6 @@ static const char *ParseString(int *i_inout, int argc, const char **argv) int light_main(int argc, const char **argv) { bspdata_t bspdata; - mbsp_t *const bsp = &bspdata.data.mbsp; const bspversion_t *loadversion; int i; double start; @@ -1158,6 +1158,8 @@ int light_main(int argc, const char **argv) loadversion = bspdata.version; ConvertBSPFormat(&bspdata, &bspver_generic); + mbsp_t &bsp = std::get(bspdata.bsp); + // mxd. Use 1.0 rangescale as a default to better match with qrad3/arghrad if ((loadversion->game->id == GAME_QUAKE_II) && !cfg.rangescale.isChanged()) { const auto rs = new lockable_vec_t(cfg.rangescale.primaryName(), 1.0f, 0.0f, 100.0f); @@ -1167,32 +1169,32 @@ int light_main(int argc, const char **argv) // mxd. Load or convert textures... SetQdirFromPath(GetBaseDirName(&bspdata), source); LoadPalette(&bspdata); - LoadOrConvertTextures(bsp); + LoadOrConvertTextures(&bsp); - LoadExtendedTexinfoFlags(source, bsp); - LoadEntities(cfg, bsp); + LoadExtendedTexinfoFlags(source, &bsp); + LoadEntities(cfg, &bsp); PrintOptionsSummary(); - FindModelInfo(bsp, lmscaleoverride); + FindModelInfo(&bsp, lmscaleoverride); - FindDebugFace(bsp); - FindDebugVert(bsp); + FindDebugFace(&bsp); + FindDebugVert(&bsp); - MakeTnodes(bsp); + MakeTnodes(&bsp); if (debugmode == debugmode_phong_obj) { StripExtension(source); DefaultExtension(source, ".obj"); - CalculateVertexNormals(bsp); - ExportObj(source, bsp); + CalculateVertexNormals(&bsp); + ExportObj(source, &bsp); close_log(); return 0; } - SetupLights(cfg, bsp); + SetupLights(cfg, &bsp); // PrintLights(); @@ -1209,30 +1211,30 @@ int light_main(int argc, const char **argv) BSPX_AddLump(&bspdata, "LIGHTINGDIR", NULL, 0); if (write_litfile == ~0) { - WriteLitFile(bsp, faces_sup, source, 2); + WriteLitFile(&bsp, faces_sup, source, 2); return 0; // run away before any files are written } else { /*fixme: add a new per-surface offset+lmscale lump for compat/versitility?*/ if (write_litfile & 1) - WriteLitFile(bsp, faces_sup, source, LIT_VERSION); + WriteLitFile(&bsp, faces_sup, source, LIT_VERSION); if (write_litfile & 2) - BSPX_AddLump(&bspdata, "RGBLIGHTING", lit_filebase, bsp->lightdatasize * 3); + BSPX_AddLump(&bspdata, "RGBLIGHTING", lit_filebase, bsp.lightdatasize * 3); if (write_luxfile & 1) - WriteLuxFile(bsp, source, LIT_VERSION); + WriteLuxFile(&bsp, source, LIT_VERSION); if (write_luxfile & 2) - BSPX_AddLump(&bspdata, "LIGHTINGDIR", lux_filebase, bsp->lightdatasize * 3); + BSPX_AddLump(&bspdata, "LIGHTINGDIR", lux_filebase, bsp.lightdatasize * 3); } } /* -novanilla + internal lighting = no grey lightmap */ if (scaledonly && (write_litfile & 2)) - bsp->lightdatasize = 0; + bsp.lightdatasize = 0; #if 0 ExportObj(source, bsp); #endif - WriteEntitiesToString(cfg, bsp); + WriteEntitiesToString(cfg, &bsp); /* Convert data format back if necessary */ ConvertBSPFormat(&bspdata, loadversion); diff --git a/qbsp/writebsp.cc b/qbsp/writebsp.cc index ae1ee028..4f7e0c69 100644 --- a/qbsp/writebsp.cc +++ b/qbsp/writebsp.cc @@ -400,27 +400,28 @@ WriteBSPFile */ static void WriteBSPFile() { - bspdata_t bspdata{}; + bspdata_t bspdata { }; + mbsp_t &bsp = bspdata.bsp.emplace(); bspdata.version = &bspver_generic; - CopyVector(map.exported_planes, &bspdata.data.mbsp.numplanes, &bspdata.data.mbsp.dplanes); - CopyVector(map.exported_leafs, &bspdata.data.mbsp.numleafs, &bspdata.data.mbsp.dleafs); - CopyVector(map.exported_vertexes, &bspdata.data.mbsp.numvertexes, &bspdata.data.mbsp.dvertexes); - CopyVector(map.exported_nodes, &bspdata.data.mbsp.numnodes, &bspdata.data.mbsp.dnodes); - CopyVector(map.exported_texinfos, &bspdata.data.mbsp.numtexinfo, &bspdata.data.mbsp.texinfo); - CopyVector(map.exported_faces, &bspdata.data.mbsp.numfaces, &bspdata.data.mbsp.dfaces); - CopyVector(map.exported_clipnodes, &bspdata.data.mbsp.numclipnodes, &bspdata.data.mbsp.dclipnodes); - CopyVector(map.exported_marksurfaces, &bspdata.data.mbsp.numleaffaces, &bspdata.data.mbsp.dleaffaces); - CopyVector(map.exported_surfedges, &bspdata.data.mbsp.numsurfedges, &bspdata.data.mbsp.dsurfedges); - CopyVector(map.exported_edges, &bspdata.data.mbsp.numedges, &bspdata.data.mbsp.dedges); - CopyVector(map.exported_models, &bspdata.data.mbsp.nummodels, &bspdata.data.mbsp.dmodels); - CopyVector(map.exported_leafbrushes, &bspdata.data.mbsp.numleafbrushes, &bspdata.data.mbsp.dleafbrushes); - CopyVector(map.exported_brushsides, &bspdata.data.mbsp.numbrushsides, &bspdata.data.mbsp.dbrushsides); - CopyVector(map.exported_brushes, &bspdata.data.mbsp.numbrushes, &bspdata.data.mbsp.dbrushes); + CopyVector(map.exported_planes, &bsp.numplanes, &bsp.dplanes); + CopyVector(map.exported_leafs, &bsp.numleafs, &bsp.dleafs); + CopyVector(map.exported_vertexes, &bsp.numvertexes, &bsp.dvertexes); + CopyVector(map.exported_nodes, &bsp.numnodes, &bsp.dnodes); + CopyVector(map.exported_texinfos, &bsp.numtexinfo, &bsp.texinfo); + CopyVector(map.exported_faces, &bsp.numfaces, &bsp.dfaces); + CopyVector(map.exported_clipnodes, &bsp.numclipnodes, &bsp.dclipnodes); + CopyVector(map.exported_marksurfaces, &bsp.numleaffaces, &bsp.dleaffaces); + CopyVector(map.exported_surfedges, &bsp.numsurfedges, &bsp.dsurfedges); + CopyVector(map.exported_edges, &bsp.numedges, &bsp.dedges); + CopyVector(map.exported_models, &bsp.nummodels, &bsp.dmodels); + CopyVector(map.exported_leafbrushes, &bsp.numleafbrushes, &bsp.dleafbrushes); + CopyVector(map.exported_brushsides, &bsp.numbrushsides, &bsp.dbrushsides); + CopyVector(map.exported_brushes, &bsp.numbrushes, &bsp.dbrushes); - CopyString(map.exported_entities, true, &bspdata.data.mbsp.entdatasize, (void **)&bspdata.data.mbsp.dentdata); - CopyString(map.exported_texdata, false, &bspdata.data.mbsp.texdatasize, (void **)&bspdata.data.mbsp.dtexdata); + CopyString(map.exported_entities, true, &bsp.entdatasize, (void **)&bsp.dentdata); + CopyString(map.exported_texdata, false, &bsp.texdatasize, (void **)&bsp.dtexdata); if (map.needslmshifts) { BSPX_AddLump(&bspdata, "LMSHIFT", map.exported_lmshifts.data(), map.exported_lmshifts.size()); @@ -430,12 +431,12 @@ static void WriteBSPFile() } // FIXME: temp - bspdata.data.mbsp.numareaportals = 1; - bspdata.data.mbsp.dareaportals = new dareaportal_t[bspdata.data.mbsp.numareaportals] { }; + bsp.numareaportals = 1; + bsp.dareaportals = new dareaportal_t[bsp.numareaportals] { }; - bspdata.data.mbsp.numareas = 2; - bspdata.data.mbsp.dareas = new darea_t[bspdata.data.mbsp.numareas] { }; - bspdata.data.mbsp.dareas[1].firstareaportal = 1; + bsp.numareas = 2; + bsp.dareas = new darea_t[bsp.numareas] { }; + bsp.dareas[1].firstareaportal = 1; if (!ConvertBSPFormat(&bspdata, options.target_version)) { const bspversion_t *highLimitsFormat = nullptr; @@ -488,6 +489,7 @@ UpdateBSPFileEntitiesLump void UpdateBSPFileEntitiesLump() { bspdata_t bspdata; + StripExtension(options.szBSPName); DefaultExtension(options.szBSPName, ".bsp"); @@ -495,8 +497,10 @@ void UpdateBSPFileEntitiesLump() LoadBSPFile(options.szBSPName, &bspdata); ConvertBSPFormat(&bspdata, &bspver_generic); + mbsp_t &bsp = std::get(bspdata.bsp); + // replace the existing entities lump with map.exported_entities - CopyString(map.exported_entities, true, &bspdata.data.mbsp.entdatasize, (void **)&bspdata.data.mbsp.dentdata); + CopyString(map.exported_entities, true, &bsp.entdatasize, (void **)&bsp.dentdata); // write the .bsp back to disk ConvertBSPFormat(&bspdata, bspdata.loadversion); diff --git a/vis/vis.cc b/vis/vis.cc index 0e74227d..9f48d6db 100644 --- a/vis/vis.cc +++ b/vis/vis.cc @@ -1196,7 +1196,6 @@ char statetmpfile[1024]; int main(int argc, char **argv) { bspdata_t bspdata; - mbsp_t *const bsp = &bspdata.data.mbsp; const bspversion_t *loadversion; int i; @@ -1274,11 +1273,13 @@ int main(int argc, char **argv) loadversion = bspdata.version; ConvertBSPFormat(&bspdata, &bspver_generic); + mbsp_t &bsp = std::get(bspdata.bsp); + strcpy(portalfile, argv[i]); StripExtension(portalfile); strcat(portalfile, ".prt"); - LoadPortals(portalfile, bsp); + LoadPortals(portalfile, &bsp); strcpy(statefile, sourcefile); StripExtension(statefile); @@ -1288,7 +1289,7 @@ int main(int argc, char **argv) StripExtension(statetmpfile); DefaultExtension(statetmpfile, ".vi0"); - if (bsp->loadversion->game->id != GAME_QUAKE_II) { + if (bsp.loadversion->game->id != GAME_QUAKE_II) { uncompressed = new uint8_t[portalleafs * leafbytes_real] { }; } else { uncompressed_q2 = new uint8_t[portalleafs * leafbytes] { }; @@ -1296,17 +1297,17 @@ int main(int argc, char **argv) // CalcPassages (); - CalcVis(bsp); + CalcVis(&bsp); logprint("c_noclip: %i\n", c_noclip); logprint("c_chains: %lu\n", c_chains); - bsp->visdatasize = vismap_p - bsp->dvisdata; - logprint("visdatasize:%i compressed from %u\n", bsp->visdatasize, originalvismapsize); + bsp.visdatasize = vismap_p - bsp.dvisdata; + logprint("visdatasize:%i compressed from %u\n", bsp.visdatasize, originalvismapsize); // no ambient sounds for Q2 - if (bsp->loadversion->game->id != GAME_QUAKE_II) { - CalcAmbientSounds(bsp); + if (bsp.loadversion->game->id != GAME_QUAKE_II) { + CalcAmbientSounds(&bsp); } /* Convert data format back if necessary */