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.
This commit is contained in:
Sally Coolatta 2023-03-12 06:43:31 -04:00
parent f02057bf2e
commit b0064e41e8

View file

@ -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);