qbsp: refactor clipnode writing (changes .bsp output)

- drop reshuffling feature from ExportClipNodes
  As far as I can tell, the only purpose of this was to keep clipnodes
  for a given model contiguous within the lump (i.e. keep the different
  hulls contiguous).

  Vanilla qbsp didn't appear to have done this, and the code was
  unmaintainable/complex, so I'm dropping the feature.
This commit is contained in:
Eric Wasylishen 2021-08-23 02:02:57 -06:00
parent bc5e743817
commit 671bacf30c
3 changed files with 15 additions and 81 deletions

View File

@ -159,6 +159,7 @@ typedef struct mapdata_s {
std::vector<bsp29_dleaf_t> exported_leafs_bsp29; // FIXME: change to generic leaf std::vector<bsp29_dleaf_t> exported_leafs_bsp29; // FIXME: change to generic leaf
std::vector<bsp29_dnode_t> exported_nodes_bsp29; // FIXME: change to generic node std::vector<bsp29_dnode_t> exported_nodes_bsp29; // FIXME: change to generic node
std::vector<uint16_t> exported_marksurfaces; // FIXME: change type to generic std::vector<uint16_t> exported_marksurfaces; // FIXME: change type to generic
std::vector<bsp29_dclipnode_t> exported_clipnodes;
// helpers // helpers
std::string texinfoTextureName(int texinfo) const { std::string texinfoTextureName(int texinfo) const {

View File

@ -299,7 +299,7 @@ WriteBSPFile(void)
AddLumpFromBuffer(f, LUMP_NODES, map.exported_nodes_bsp29.data(), map.exported_nodes_bsp29.size() * sizeof(map.exported_nodes_bsp29[0])); AddLumpFromBuffer(f, LUMP_NODES, map.exported_nodes_bsp29.data(), map.exported_nodes_bsp29.size() * sizeof(map.exported_nodes_bsp29[0]));
AddLumpFromBuffer(f, LUMP_TEXINFO, map.exported_texinfos.data(), map.exported_texinfos.size() * sizeof(map.exported_texinfos[0])); AddLumpFromBuffer(f, LUMP_TEXINFO, map.exported_texinfos.data(), map.exported_texinfos.size() * sizeof(map.exported_texinfos[0]));
AddLump(f, LUMP_FACES); AddLump(f, LUMP_FACES);
AddLump(f, LUMP_CLIPNODES); AddLumpFromBuffer(f, LUMP_CLIPNODES, map.exported_clipnodes.data(), map.exported_clipnodes.size() * sizeof(map.exported_clipnodes[0]));
AddLumpFromBuffer(f, LUMP_MARKSURFACES, map.exported_marksurfaces.data(), map.exported_marksurfaces.size() * sizeof(map.exported_marksurfaces[0])); AddLumpFromBuffer(f, LUMP_MARKSURFACES, map.exported_marksurfaces.data(), map.exported_marksurfaces.size() * sizeof(map.exported_marksurfaces[0]));
AddLump(f, LUMP_SURFEDGES); AddLump(f, LUMP_SURFEDGES);
AddLump(f, LUMP_EDGES); AddLump(f, LUMP_EDGES);
@ -386,7 +386,7 @@ PrintBSPFileSizes(void)
Message(msgStat, "%8d nodes %10d", static_cast<int>(map.exported_nodes_bsp29.size()), static_cast<int>(map.exported_nodes_bsp29.size()) * MemSize[BSP_NODE]); Message(msgStat, "%8d nodes %10d", static_cast<int>(map.exported_nodes_bsp29.size()), static_cast<int>(map.exported_nodes_bsp29.size()) * MemSize[BSP_NODE]);
Message(msgStat, "%8d texinfo %10d", static_cast<int>(map.exported_texinfos.size()), static_cast<int>(map.exported_texinfos.size()) * MemSize[BSP_TEXINFO]); Message(msgStat, "%8d texinfo %10d", static_cast<int>(map.exported_texinfos.size()), static_cast<int>(map.exported_texinfos.size()) * MemSize[BSP_TEXINFO]);
Message(msgStat, "%8d faces %10d", map.cTotal[LUMP_FACES], map.cTotal[LUMP_FACES] * MemSize[BSP_FACE]); Message(msgStat, "%8d faces %10d", map.cTotal[LUMP_FACES], map.cTotal[LUMP_FACES] * MemSize[BSP_FACE]);
Message(msgStat, "%8d clipnodes %10d", map.cTotal[LUMP_CLIPNODES], map.cTotal[LUMP_CLIPNODES] * MemSize[BSP_CLIPNODE]); Message(msgStat, "%8d clipnodes %10d", static_cast<int>(map.exported_clipnodes.size()), static_cast<int>(map.exported_clipnodes.size()) * MemSize[BSP_CLIPNODE]);
Message(msgStat, "%8d leafs %10d", static_cast<int>(map.exported_leafs_bsp29.size()), static_cast<int>(map.exported_leafs_bsp29.size()) * MemSize[BSP_LEAF]); Message(msgStat, "%8d leafs %10d", static_cast<int>(map.exported_leafs_bsp29.size()), static_cast<int>(map.exported_leafs_bsp29.size()) * MemSize[BSP_LEAF]);
Message(msgStat, "%8d marksurfaces %10d", static_cast<int>(map.exported_marksurfaces.size()), static_cast<int>(map.exported_marksurfaces.size()) * MemSize[BSP_MARKSURF]); Message(msgStat, "%8d marksurfaces %10d", static_cast<int>(map.exported_marksurfaces.size()), static_cast<int>(map.exported_marksurfaces.size()) * MemSize[BSP_MARKSURF]);
Message(msgStat, "%8d surfedges %10d", map.cTotal[LUMP_SURFEDGES], map.cTotal[LUMP_SURFEDGES] * MemSize[BSP_SURFEDGE]); Message(msgStat, "%8d surfedges %10d", map.cTotal[LUMP_SURFEDGES], map.cTotal[LUMP_SURFEDGES] * MemSize[BSP_SURFEDGE]);

View File

@ -114,24 +114,6 @@ ExportMapTexinfo(int texinfonum)
//=========================================================================== //===========================================================================
/*
==================
CountClipNodes_r
==================
*/
static void
CountClipNodes_r(mapentity_t *entity, node_t *node)
{
if (node->planenum == -1)
return;
entity->lumps[LUMP_CLIPNODES].count++;
CountClipNodes_r(entity, node->children[0]);
CountClipNodes_r(entity, node->children[1]);
}
/* /*
================== ==================
ExportClipNodes ExportClipNodes
@ -140,10 +122,8 @@ ExportClipNodes
static int static int
ExportClipNodes_BSP29(mapentity_t *entity, node_t *node) ExportClipNodes_BSP29(mapentity_t *entity, node_t *node)
{ {
int nodenum;
bsp29_dclipnode_t *clipnode; bsp29_dclipnode_t *clipnode;
face_t *face, *next; face_t *face, *next;
struct lumpdata *clipnodes = &entity->lumps[LUMP_CLIPNODES];
// FIXME: free more stuff? // FIXME: free more stuff?
if (node->planenum == -1) { if (node->planenum == -1) {
@ -153,14 +133,17 @@ ExportClipNodes_BSP29(mapentity_t *entity, node_t *node)
} }
/* emit a clipnode */ /* emit a clipnode */
clipnode = (bsp29_dclipnode_t *)clipnodes->data + clipnodes->index; const int nodenum = static_cast<int>(map.exported_clipnodes.size());
clipnodes->index++; map.exported_clipnodes.push_back({});
nodenum = map.cTotal[LUMP_CLIPNODES];
map.cTotal[LUMP_CLIPNODES]++;
const int child0 = ExportClipNodes_BSP29(entity, node->children[0]);
const int child1 = ExportClipNodes_BSP29(entity, node->children[1]);
// Careful not to modify the vector while using this clipnode pointer
clipnode = &map.exported_clipnodes.at(nodenum);
clipnode->planenum = ExportMapPlane(node->planenum); clipnode->planenum = ExportMapPlane(node->planenum);
clipnode->children[0] = ExportClipNodes_BSP29(entity, node->children[0]); clipnode->children[0] = child0;
clipnode->children[1] = ExportClipNodes_BSP29(entity, node->children[1]); clipnode->children[1] = child1;
for (face = node->faces; face; face = next) { for (face = node->faces; face; face = next) {
next = face->next; next = face->next;
@ -172,6 +155,7 @@ ExportClipNodes_BSP29(mapentity_t *entity, node_t *node)
return nodenum; return nodenum;
} }
#if 0
static int static int
ExportClipNodes_BSP2(mapentity_t *entity, node_t *node) ExportClipNodes_BSP2(mapentity_t *entity, node_t *node)
{ {
@ -206,6 +190,7 @@ ExportClipNodes_BSP2(mapentity_t *entity, node_t *node)
return nodenum; return nodenum;
} }
#endif
/* /*
================== ==================
@ -222,61 +207,9 @@ accomodate new data interleaved with old.
void void
ExportClipNodes(mapentity_t *entity, node_t *nodes, const int hullnum) ExportClipNodes(mapentity_t *entity, node_t *nodes, const int hullnum)
{ {
int oldcount, i, diff;
int clipcount = 0;
void *olddata;
struct lumpdata *clipnodes = &entity->lumps[LUMP_CLIPNODES];
dmodel_t *model = (dmodel_t *)entity->lumps[LUMP_MODELS].data; dmodel_t *model = (dmodel_t *)entity->lumps[LUMP_MODELS].data;
oldcount = clipnodes->count; model->headnode[hullnum] = ExportClipNodes_BSP29(entity, nodes);
/* Count nodes before this one */
const int entnum = entity - &map.entities.at(0);
for (i = 0; i < entnum; i++)
clipcount += map.entities.at(i).lumps[LUMP_CLIPNODES].count;
model->headnode[hullnum] = clipcount + oldcount;
CountClipNodes_r(entity, nodes);
if (clipnodes->count > MAX_BSP_CLIPNODES && (options.BSPVersion == BSPVERSION || options.BSPVersion == BSPHLVERSION))
Error("Clipnode count exceeds bsp 29 max (%d > %d)",
clipnodes->count, MAX_BSP_CLIPNODES);
olddata = clipnodes->data;
clipnodes->data = AllocMem(BSP_CLIPNODE, clipnodes->count, true);
if (olddata) {
memcpy(clipnodes->data, olddata, oldcount * MemSize[BSP_CLIPNODE]);
FreeMem(olddata, BSP_CLIPNODE, oldcount);
/* Worth special-casing for entity 0 (no modification needed) */
diff = clipcount - model->headnode[1];
if (diff != 0) {
for (i = 1; i < hullnum; i++)
model->headnode[i] += diff;
if (options.BSPVersion == BSPVERSION || options.BSPVersion == BSPHLVERSION) {
bsp29_dclipnode_t *clipnode = (bsp29_dclipnode_t *)clipnodes->data;
for (i = 0; i < oldcount; i++, clipnode++) {
if (clipnode->children[0] < MAX_BSP_CLIPNODES)
clipnode->children[0] += diff;
if (clipnode->children[1] < MAX_BSP_CLIPNODES)
clipnode->children[1] += diff;
}
} else {
bsp2_dclipnode_t *clipnode = (bsp2_dclipnode_t *)clipnodes->data;
for (i = 0; i < oldcount; i++, clipnode++) {
if (clipnode->children[0] >= 0)
clipnode->children[0] += diff;
if (clipnode->children[1] >= 0)
clipnode->children[1] += diff;
}
}
}
}
map.cTotal[LUMP_CLIPNODES] = clipcount + oldcount;
if (options.BSPVersion == BSPVERSION || options.BSPVersion == BSPHLVERSION)
ExportClipNodes_BSP29(entity, nodes);
else
ExportClipNodes_BSP2(entity, nodes);
} }
//=========================================================================== //===========================================================================