qbsp: output clipnodes in bsp2 format

Signed-off-by: Kevin Shanahan <kmshanah@disenchant.net>
This commit is contained in:
Kevin Shanahan 2013-08-19 16:39:24 +09:30
parent 083dc9fda1
commit ce26465f57
1 changed files with 62 additions and 14 deletions

View File

@ -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);
}
//===========================================================================