From b0064e41e8b4aea4574b077d53acdae2091ec85b Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sun, 12 Mar 2023 06:43:31 -0400 Subject: [PATCH] Only save used vertices Fixed in two ways: - P_LoadExtraVertices is a special construct for extended blockmap types. This is easily resolved with num_orig_vertexes before loading the map. - Original Doom-style blockmap with ZenNode however also adds additional vertices directly into VERTEXES. These have to simply be ignored by cross-referencing them with linedefs to see if they are used by anything. --- src/p_setup.c | 46 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 26d57cba9..def9a0bfe 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -122,6 +122,7 @@ unsigned char mapmd5[16]; boolean udmf; size_t numvertexes, numsegs, numsectors, numsubsectors, numnodes, numlines, numsides, nummapthings; +size_t num_orig_vertexes; vertex_t *vertexes; seg_t *segs; sector_t *sectors; @@ -1921,6 +1922,7 @@ static void P_WriteTextmap(void) side_t *wsides; mtag_t freetag; sectorspecialthings_t *specialthings; + boolean *wusedvertexes; f = fopen(filepath, "w"); if (!f) @@ -1930,14 +1932,15 @@ static void P_WriteTextmap(void) } wmapthings = Z_Calloc(nummapthings * sizeof(*mapthings), PU_LEVEL, NULL); - wvertexes = Z_Calloc(numvertexes * sizeof(*vertexes), PU_LEVEL, NULL); + wvertexes = Z_Calloc(num_orig_vertexes * sizeof(*vertexes), PU_LEVEL, NULL); wsectors = Z_Calloc(numsectors * sizeof(*sectors), PU_LEVEL, NULL); wlines = Z_Calloc(numlines * sizeof(*lines), PU_LEVEL, NULL); wsides = Z_Calloc(numsides * sizeof(*sides), PU_LEVEL, NULL); specialthings = Z_Calloc(numsectors * sizeof(*sectors), PU_LEVEL, NULL); + wusedvertexes = Z_Calloc(num_orig_vertexes * sizeof(boolean), PU_LEVEL, NULL); memcpy(wmapthings, mapthings, nummapthings * sizeof(*mapthings)); - memcpy(wvertexes, vertexes, numvertexes * sizeof(*vertexes)); + memcpy(wvertexes, vertexes, num_orig_vertexes * sizeof(*vertexes)); memcpy(wsectors, sectors, numsectors * sizeof(*sectors)); memcpy(wlines, lines, numlines * sizeof(*lines)); memcpy(wsides, sides, numsides * sizeof(*sides)); @@ -1951,9 +1954,19 @@ static void P_WriteTextmap(void) wsectors[i].tags.tags = memcpy(Z_Malloc(sectors[i].tags.count*sizeof(mtag_t), PU_LEVEL, NULL), sectors[i].tags.tags, sectors[i].tags.count*sizeof(mtag_t)); for (i = 0; i < numlines; i++) + { + size_t v; + if (lines[i].tags.count) wlines[i].tags.tags = memcpy(Z_Malloc(lines[i].tags.count * sizeof(mtag_t), PU_LEVEL, NULL), lines[i].tags.tags, lines[i].tags.count * sizeof(mtag_t)); + v = lines[i].v1 - vertexes; + wusedvertexes[v] = true; + + v = lines[i].v2 - vertexes; + wusedvertexes[v] = true; + } + freetag = Tag_NextUnused(0); for (i = 0; i < nummapthings; i++) @@ -2239,18 +2252,26 @@ static void P_WriteTextmap(void) fprintf(f, "\n"); } - for (i = 0; i < numvertexes; i++) + j = 0; + for (i = 0; i < num_orig_vertexes; i++) { - fprintf(f, "vertex // %s\n", sizeu1(i)); + if (wusedvertexes[i] == false) + { + continue; + } + + fprintf(f, "vertex // %s\n", sizeu1(j)); fprintf(f, "{\n"); - fprintf(f, "x = %f;\n", FIXED_TO_FLOAT(wvertexes[i].x)); - fprintf(f, "y = %f;\n", FIXED_TO_FLOAT(wvertexes[i].y)); - if (wvertexes[i].floorzset) - fprintf(f, "zfloor = %f;\n", FIXED_TO_FLOAT(wvertexes[i].floorz)); - if (wvertexes[i].ceilingzset) - fprintf(f, "zceiling = %f;\n", FIXED_TO_FLOAT(wvertexes[i].ceilingz)); + fprintf(f, "x = %f;\n", FIXED_TO_FLOAT(wvertexes[j].x)); + fprintf(f, "y = %f;\n", FIXED_TO_FLOAT(wvertexes[j].y)); + if (wvertexes[j].floorzset) + fprintf(f, "zfloor = %f;\n", FIXED_TO_FLOAT(wvertexes[j].floorz)); + if (wvertexes[j].ceilingzset) + fprintf(f, "zceiling = %f;\n", FIXED_TO_FLOAT(wvertexes[j].ceilingz)); fprintf(f, "}\n"); fprintf(f, "\n"); + + j++; } for (i = 0; i < numlines; i++) @@ -2570,6 +2591,7 @@ static void P_WriteTextmap(void) Z_Free(wlines); Z_Free(wsides); Z_Free(specialthings); + Z_Free(wusedvertexes); } /** Loads the textmap data, after obtaining the elements count and allocating their respective space. @@ -2946,6 +2968,10 @@ static boolean P_LoadMapData(const virtres_t *virt) if (numlines <= 0) I_Error("Level has no linedefs"); + // Copy original vertex count before BSP modifications, + // as it can alter how -writetextmap works. + num_orig_vertexes = numvertexes; + vertexes = Z_Calloc(numvertexes * sizeof (*vertexes), PU_LEVEL, NULL); sectors = Z_Calloc(numsectors * sizeof (*sectors), PU_LEVEL, NULL); sides = Z_Calloc(numsides * sizeof (*sides), PU_LEVEL, NULL);