From 382a725f2b5b951316f59b38491bbc97eadf0fe4 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 22 Aug 2021 22:51:47 -0600 Subject: [PATCH] qbsp: refactor writing of leafs, nodes, marksurfaces lump - only support bsp29 for now --- include/qbsp/map.hh | 3 ++ qbsp/bspfile.cc | 12 +++--- qbsp/writebsp.cc | 101 +++++++++++++++----------------------------- 3 files changed, 42 insertions(+), 74 deletions(-) diff --git a/include/qbsp/map.hh b/include/qbsp/map.hh index 153bcb8b..be3a91f3 100644 --- a/include/qbsp/map.hh +++ b/include/qbsp/map.hh @@ -156,6 +156,9 @@ typedef struct mapdata_s { // Final, exported data std::vector exported_texinfos; // FIXME: change to gtexinfo_t std::vector exported_planes; + std::vector exported_leafs_bsp29; // FIXME: change to generic leaf + std::vector exported_nodes_bsp29; // FIXME: change to generic node + std::vector exported_marksurfaces; // FIXME: change type to generic // helpers std::string texinfoTextureName(int texinfo) const { diff --git a/qbsp/bspfile.cc b/qbsp/bspfile.cc index d9f335b4..66727994 100644 --- a/qbsp/bspfile.cc +++ b/qbsp/bspfile.cc @@ -294,13 +294,13 @@ WriteBSPFile(void) Error("Failure writing to file"); AddLumpFromBuffer(f, LUMP_PLANES, map.exported_planes.data(), map.exported_planes.size() * sizeof(map.exported_planes[0])); - AddLump(f, LUMP_LEAFS); + AddLumpFromBuffer(f, LUMP_LEAFS, map.exported_leafs_bsp29.data(), map.exported_leafs_bsp29.size() * sizeof(map.exported_leafs_bsp29[0])); AddLump(f, LUMP_VERTEXES); - AddLump(f, LUMP_NODES); + 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])); AddLump(f, LUMP_FACES); AddLump(f, LUMP_CLIPNODES); - AddLump(f, LUMP_MARKSURFACES); + AddLumpFromBuffer(f, LUMP_MARKSURFACES, map.exported_marksurfaces.data(), map.exported_marksurfaces.size() * sizeof(map.exported_marksurfaces[0])); AddLump(f, LUMP_SURFEDGES); AddLump(f, LUMP_EDGES); AddLump(f, LUMP_MODELS); @@ -383,12 +383,12 @@ PrintBSPFileSizes(void) Message(msgStat, "%8d planes %10d", static_cast(map.exported_planes.size()), static_cast(map.exported_planes.size()) * MemSize[BSP_PLANE]); Message(msgStat, "%8d vertexes %10d", map.cTotal[LUMP_VERTEXES], map.cTotal[LUMP_VERTEXES] * MemSize[BSP_VERTEX]); - Message(msgStat, "%8d nodes %10d", map.cTotal[LUMP_NODES], map.cTotal[LUMP_NODES] * MemSize[BSP_NODE]); + Message(msgStat, "%8d nodes %10d", static_cast(map.exported_nodes_bsp29.size()), static_cast(map.exported_nodes_bsp29.size()) * MemSize[BSP_NODE]); Message(msgStat, "%8d texinfo %10d", static_cast(map.exported_texinfos.size()), static_cast(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 clipnodes %10d", map.cTotal[LUMP_CLIPNODES], map.cTotal[LUMP_CLIPNODES] * MemSize[BSP_CLIPNODE]); - Message(msgStat, "%8d leafs %10d", map.cTotal[LUMP_LEAFS], map.cTotal[LUMP_LEAFS] * MemSize[BSP_LEAF]); - Message(msgStat, "%8d marksurfaces %10d", map.cTotal[LUMP_MARKSURFACES], map.cTotal[LUMP_MARKSURFACES] * MemSize[BSP_MARKSURF]); + Message(msgStat, "%8d leafs %10d", static_cast(map.exported_leafs_bsp29.size()), static_cast(map.exported_leafs_bsp29.size()) * MemSize[BSP_LEAF]); + Message(msgStat, "%8d marksurfaces %10d", static_cast(map.exported_marksurfaces.size()), static_cast(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 edges %10d", map.cTotal[LUMP_EDGES], map.cTotal[LUMP_EDGES] * MemSize[BSP_EDGE]); diff --git a/qbsp/writebsp.cc b/qbsp/writebsp.cc index 118c8712..65fc2f60 100644 --- a/qbsp/writebsp.cc +++ b/qbsp/writebsp.cc @@ -281,7 +281,7 @@ ExportClipNodes(mapentity_t *entity, node_t *nodes, const int hullnum) //=========================================================================== - +#if 0 /* ================== CountLeaves @@ -335,6 +335,7 @@ CountNodes(mapentity_t *entity, node_t *headnode) else CountNodes_r(entity, headnode); } +#endif /* ================== @@ -344,16 +345,8 @@ ExportLeaf static void ExportLeaf_BSP29(mapentity_t *entity, node_t *node) { - struct lumpdata *leaves = &entity->lumps[LUMP_LEAFS]; - struct lumpdata *marksurfs = &entity->lumps[LUMP_MARKSURFACES]; - uint16_t *marksurfnums = (uint16_t *)marksurfs->data; - face_t **markfaces, *face; - bsp29_dleaf_t *dleaf; - - // ptr arithmetic to get correct leaf in memory - dleaf = (bsp29_dleaf_t *)leaves->data + leaves->index; - leaves->index++; - map.cTotal[LUMP_LEAFS]++; + map.exported_leafs_bsp29.push_back({}); + bsp29_dleaf_t *dleaf = &map.exported_leafs_bsp29.back(); dleaf->contents = RemapContentsForExport(node->contents); AssertVanillaContentType(dleaf->contents); @@ -372,25 +365,24 @@ ExportLeaf_BSP29(mapentity_t *entity, node_t *node) dleaf->visofs = -1; // no vis info yet // write the marksurfaces - dleaf->firstmarksurface = map.cTotal[LUMP_MARKSURFACES]; + dleaf->firstmarksurface = static_cast(map.exported_marksurfaces.size()); - for (markfaces = node->markfaces; *markfaces; markfaces++) { - face = *markfaces; + for (face_t **markfaces = node->markfaces; *markfaces; markfaces++) { + face_t *face = *markfaces; if (map.mtexinfos.at(face->texinfo).flags & TEX_SKIP) continue; /* emit a marksurface */ do { - marksurfnums[marksurfs->index] = face->outputnumber; - marksurfs->index++; - map.cTotal[LUMP_MARKSURFACES]++; + map.exported_marksurfaces.push_back(face->outputnumber); face = face->original; /* grab tjunction split faces */ } while (face); } dleaf->nummarksurfaces = - map.cTotal[LUMP_MARKSURFACES] - dleaf->firstmarksurface; + static_cast(map.exported_marksurfaces.size()) - dleaf->firstmarksurface; } +#if 0 static void ExportLeaf_BSP2(mapentity_t *entity, node_t *node) { @@ -490,6 +482,7 @@ ExportLeaf_BSP2rmq(mapentity_t *entity, node_t *node) dleaf->nummarksurfaces = map.cTotal[LUMP_MARKSURFACES] - dleaf->firstmarksurface; } +#endif /* ================== @@ -499,13 +492,13 @@ ExportDrawNodes static void ExportDrawNodes_BSP29(mapentity_t *entity, node_t *node) { - struct lumpdata *nodes = &entity->lumps[LUMP_NODES]; bsp29_dnode_t *dnode; int i; - dnode = (bsp29_dnode_t *)nodes->data + nodes->index; - nodes->index++; - map.cTotal[LUMP_NODES]++; + const size_t ourNodeIndex = map.exported_nodes_bsp29.size(); + map.exported_nodes_bsp29.push_back({}); + + dnode = &map.exported_nodes_bsp29[ourNodeIndex]; // VectorCopy doesn't work since dest are shorts dnode->mins[0] = (short)node->mins[0]; @@ -525,7 +518,8 @@ ExportDrawNodes_BSP29(mapentity_t *entity, node_t *node) if (node->children[i]->contents == CONTENTS_SOLID) dnode->children[i] = -1; else { - int childnum = -(map.cTotal[LUMP_LEAFS] + 1); + int nextLeafIndex = static_cast(map.exported_leafs_bsp29.size()); + int childnum = -(nextLeafIndex + 1); if (childnum < INT16_MIN) { Error("Map exceeds BSP29 node/leaf limit. Recompile with -bsp2 flag."); } @@ -533,12 +527,16 @@ ExportDrawNodes_BSP29(mapentity_t *entity, node_t *node) ExportLeaf_BSP29(entity, node->children[i]); } } else { - int childnum = map.cTotal[LUMP_NODES]; + int childnum = static_cast(map.exported_nodes_bsp29.size()); if (childnum > INT16_MAX) { Error("Map exceeds BSP29 node/leaf limit. Recompile with -bsp2 flag."); } dnode->children[i] = childnum; ExportDrawNodes_BSP29(entity, node->children[i]); + + // Important: our dnode pointer may be invalid after the recursive call, if the vector got resized. + // So re-set the pointer. + dnode = &map.exported_nodes_bsp29[ourNodeIndex]; } } @@ -550,6 +548,7 @@ ExportDrawNodes_BSP29(mapentity_t *entity, node_t *node) Q_assert(dnode->children[0] != dnode->children[1]); } +#if 0 static void ExportDrawNodes_BSP2(mapentity_t *entity, node_t *node) { @@ -633,6 +632,7 @@ ExportDrawNodes_BSP2rmq(mapentity_t *entity, node_t *node) Q_assert(!(dnode->children[0] == -1 && dnode->children[1] == -1)); Q_assert(dnode->children[0] != dnode->children[1]); } +#endif /* ================== @@ -644,63 +644,28 @@ ExportDrawNodes(mapentity_t *entity, node_t *headnode, int firstface) { int i; dmodel_t *dmodel; - struct lumpdata *nodes = &entity->lumps[LUMP_NODES]; - struct lumpdata *leaves = &entity->lumps[LUMP_LEAFS]; - struct lumpdata *marksurfs = &entity->lumps[LUMP_MARKSURFACES]; // Allocate a model entity->lumps[LUMP_MODELS].data = AllocMem(BSP_MODEL, 1, true); entity->lumps[LUMP_MODELS].count = 1; - // Get a feel for how many of these things there are. - CountNodes(entity, headnode); - // emit a model - nodes->data = AllocMem(BSP_NODE, nodes->count, true); - leaves->data = AllocMem(BSP_LEAF, leaves->count, true); - marksurfs->data = AllocMem(BSP_MARKSURF, marksurfs->count, true); - - /* - * Set leaf 0 properly (must be solid). cLeaves etc incremented in - * BeginBSPFile. - */ - if (options.BSPVersion == BSP2VERSION) { - bsp2_dleaf_t *leaf = (bsp2_dleaf_t *)pWorldEnt()->lumps[LUMP_LEAFS].data; - leaf->contents = CONTENTS_SOLID; - } else if (options.BSPVersion == BSP2RMQVERSION) { - bsp2rmq_dleaf_t *leaf = (bsp2rmq_dleaf_t *)pWorldEnt()->lumps[LUMP_LEAFS].data; - leaf->contents = CONTENTS_SOLID; - } else { - bsp29_dleaf_t *leaf = (bsp29_dleaf_t *)pWorldEnt()->lumps[LUMP_LEAFS].data; - leaf->contents = CONTENTS_SOLID; - } - dmodel = (dmodel_t *)entity->lumps[LUMP_MODELS].data; - dmodel->headnode[0] = map.cTotal[LUMP_NODES]; + dmodel->headnode[0] = static_cast(map.exported_nodes_bsp29.size()); dmodel->firstface = firstface; dmodel->numfaces = map.cTotal[LUMP_FACES] - firstface; - if (options.BSPVersion == BSP2VERSION) { - if (headnode->contents < 0) - ExportLeaf_BSP2(entity, headnode); - else - ExportDrawNodes_BSP2(entity, headnode); - } else if (options.BSPVersion == BSP2RMQVERSION) { - if (headnode->contents < 0) - ExportLeaf_BSP2rmq(entity, headnode); - else - ExportDrawNodes_BSP2rmq(entity, headnode); - } else { + const size_t mapleafsAtStart = map.exported_leafs_bsp29.size(); + + { if (headnode->contents < 0) ExportLeaf_BSP29(entity, headnode); else ExportDrawNodes_BSP29(entity, headnode); } - /* Not counting initial vis leaf */ - dmodel->visleafs = leaves->count; - if (entity == pWorldEnt()) - dmodel->visleafs--; + // count how many leafs were exported by the above calls + dmodel->visleafs = static_cast(map.exported_leafs_bsp29.size() - mapleafsAtStart); /* remove the headnode padding */ for (i = 0; i < 3; i++) { @@ -725,9 +690,9 @@ BeginBSPFile(void) map.cTotal[LUMP_EDGES]++; // Leave room for leaf 0 (must be solid) - pWorldEnt()->lumps[LUMP_LEAFS].count++; - pWorldEnt()->lumps[LUMP_LEAFS].index++; - map.cTotal[LUMP_LEAFS]++; + map.exported_leafs_bsp29.push_back({}); + map.exported_leafs_bsp29.back().contents = CONTENTS_SOLID; + Q_assert(map.exported_leafs_bsp29.size() == 1); } /*