diff --git a/qbsp/writebsp.c b/qbsp/writebsp.c index 22ea0267..34671c7b 100644 --- a/qbsp/writebsp.c +++ b/qbsp/writebsp.c @@ -120,13 +120,13 @@ CountClipNodes_r(mapentity_t *entity, node_t *node) /* ================== -ExportClipNodes_r +ExportClipNodes ================== */ static int -ExportClipNodes_r(mapentity_t *entity, node_t *node) +ExportClipNodes_BSP29(mapentity_t *entity, node_t *node) { - int i, nodenum; + int nodenum; bsp29_dclipnode_t *clipnode; face_t *face, *next; struct lumpdata *clipnodes = &entity->lumps[LUMP_CLIPNODES]; @@ -145,8 +145,43 @@ ExportClipNodes_r(mapentity_t *entity, node_t *node) map.cTotal[LUMP_CLIPNODES]++; clipnode->planenum = node->outputplanenum; - for (i = 0; i < 2; i++) - clipnode->children[i] = ExportClipNodes_r(entity, node->children[i]); + clipnode->children[0] = ExportClipNodes_BSP29(entity, node->children[0]); + clipnode->children[1] = ExportClipNodes_BSP29(entity, node->children[1]); + + for (face = node->faces; face; face = next) { + next = face->next; + memset(face, 0, sizeof(face_t)); + FreeMem(face, FACE, 1); + } + FreeMem(node, NODE, 1); + + return nodenum; +} + +static int +ExportClipNodes_BSP2(mapentity_t *entity, node_t *node) +{ + int nodenum; + bsp2_dclipnode_t *clipnode; + face_t *face, *next; + struct lumpdata *clipnodes = &entity->lumps[LUMP_CLIPNODES]; + + // FIXME: free more stuff? + if (node->planenum == -1) { + int contents = node->contents; + FreeMem(node, NODE, 1); + return contents; + } + + /* emit a clipnode */ + clipnode = (bsp2_dclipnode_t *)clipnodes->data + clipnodes->index; + clipnodes->index++; + nodenum = map.cTotal[LUMP_CLIPNODES]; + map.cTotal[LUMP_CLIPNODES]++; + + clipnode->planenum = node->outputplanenum; + clipnode->children[0] = ExportClipNodes_BSP2(entity, node->children[0]); + clipnode->children[1] = ExportClipNodes_BSP2(entity, node->children[1]); for (face = node->faces; face; face = next) { next = face->next; @@ -175,7 +210,7 @@ ExportClipNodes(mapentity_t *entity, node_t *nodes, const int hullnum) { int oldcount, i, diff; int clipcount = 0; - bsp29_dclipnode_t *olddata, *clipnode; + void *olddata; struct lumpdata *clipnodes = &entity->lumps[LUMP_CLIPNODES]; dmodel_t *model = (dmodel_t *)entity->lumps[LUMP_MODELS].data; @@ -187,7 +222,7 @@ ExportClipNodes(mapentity_t *entity, node_t *nodes, const int hullnum) model->headnode[hullnum] = clipcount + oldcount; CountClipNodes_r(entity, nodes); - if (clipnodes->count > MAX_BSP_CLIPNODES) + if (clipnodes->count > MAX_BSP_CLIPNODES && !options.fBSP2) Error("Clipnode count exceeds bsp29 max (%d > %d)", clipnodes->count, MAX_BSP_CLIPNODES); @@ -201,18 +236,31 @@ ExportClipNodes(mapentity_t *entity, node_t *nodes, const int hullnum) diff = clipcount - model->headnode[1]; if (diff != 0) { model->headnode[1] += diff; - clipnode = 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; + if (options.fBSP2) { + bsp2_dclipnode_t *clipnode = 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; + } + } else { + bsp29_dclipnode_t *clipnode = 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; + } } } } map.cTotal[LUMP_CLIPNODES] = clipcount + oldcount; - ExportClipNodes_r(entity, nodes); + if (options.fBSP2) + ExportClipNodes_BSP2(entity, nodes); + else + ExportClipNodes_BSP29(entity, nodes); } //===========================================================================