From aab6a7b9af8faa0cddcd06a892fac78cab7d3190 Mon Sep 17 00:00:00 2001 From: Andrey Nazarov Date: Fri, 1 Sep 2023 01:22:34 +0300 Subject: [PATCH 1/7] Add mgu6m2 vis bug workaround. --- src/common/bsp.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/common/bsp.c b/src/common/bsp.c index a88bc05f9..103fcc5a5 100644 --- a/src/common/bsp.c +++ b/src/common/bsp.c @@ -1658,6 +1658,11 @@ byte *BSP_ClusterVis(bsp_t *bsp, byte *mask, int cluster, int vis) Q_SetBit(mask, 939); Q_SetBit(mask, 947); } + } else if (bsp->checksum == 0x2b2ccdd1) { + // mgu6m2, waterfall + Q_SetBit(mask, 213); + Q_SetBit(mask, 214); + Q_SetBit(mask, 217); } } From 9b673e362b7c620f331248f10a2aeb029f46861c Mon Sep 17 00:00:00 2001 From: Andrey Nazarov Date: Wed, 21 Feb 2024 20:18:47 +0300 Subject: [PATCH 2/7] =?UTF-8?q?Print=20BSP=20stats=20in=20=E2=80=98bsplist?= =?UTF-8?q?=E2=80=99=20verbose=20mode.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/bsp.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/common/bsp.c b/src/common/bsp.c index 103fcc5a5..8ca309d92 100644 --- a/src/common/bsp.c +++ b/src/common/bsp.c @@ -764,6 +764,11 @@ typedef struct { uint32_t memsize; } lump_info_t; +typedef struct { + int ofs; + const char *name; +} bsp_stat_t; + #define L(name, lump, mem_t, disksize1, disksize2) \ { BSP_Load##name, #name, lump, { disksize1, disksize2 }, sizeof(mem_t) } @@ -792,12 +797,55 @@ static const lump_info_t bsp_lumps[] = { #undef L +#define F(x) { q_offsetof(bsp_t, num##x), #x } + +static const bsp_stat_t bsp_stats[] = { + F(brushsides), + F(texinfo), + F(planes), + F(nodes), + F(leafs), + F(leafbrushes), + F(models), + F(brushes), + F(visibility), + F(entitychars), + F(areas), + F(areaportals), +#if USE_REF + F(faces), + F(leaffaces), + F(lightmapbytes), + F(vertices), + F(edges), + F(surfedges), +#endif +}; + +#undef F + static list_t bsp_cache; +static void BSP_PrintStats(bsp_t *bsp) +{ + for (int i = 0; i < q_countof(bsp_stats); i++) { + const bsp_stat_t *s = &bsp_stats[i]; + Com_Printf("%8d : %s\n", *(int *)((byte *)bsp + s->ofs), s->name); + } +#if USE_REF + if (bsp->lm_decoupled) + Com_Printf("DECOUPLED_LM lump present\n"); +#endif + if (bsp->extended) + Com_Printf("QBSP extended format\n"); + Com_Printf("------------------\n"); +} + static void BSP_List_f(void) { bsp_t *bsp; size_t bytes; + bool verbose = Cmd_Argc() > 1; if (LIST_EMPTY(&bsp_cache)) { Com_Printf("BSP cache is empty\n"); @@ -810,6 +858,8 @@ static void BSP_List_f(void) LIST_FOR_EACH(bsp_t, bsp, &bsp_cache, entry) { Com_Printf("%8zu : %s (%d refs)\n", bsp->hunk.mapped, bsp->name, bsp->refcount); + if (verbose) + BSP_PrintStats(bsp); bytes += bsp->hunk.mapped; } Com_Printf("Total resident: %zu\n", bytes); From 7a335f0d721a7ffd731b6f45f602391299e433e7 Mon Sep 17 00:00:00 2001 From: Andrey Nazarov Date: Sat, 24 Feb 2024 17:39:05 +0300 Subject: [PATCH 3/7] Reject BSP files with too many models. --- src/common/bsp.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/common/bsp.c b/src/common/bsp.c index 8ca309d92..7f497de1a 100644 --- a/src/common/bsp.c +++ b/src/common/bsp.c @@ -629,6 +629,10 @@ LOAD(SubModels) DEBUG("map with no models"); return Q_ERR_INVALID_FORMAT; } + if (count > MAX_MODELS - 2) { + DEBUG("too many models"); + return Q_ERR_INVALID_FORMAT; + } bsp->nummodels = count; bsp->models = ALLOC(sizeof(*out) * count); From 235ca5128c54d3df7802a86f3ba2d5565c8db730 Mon Sep 17 00:00:00 2001 From: Andrey Nazarov Date: Sun, 3 Mar 2024 21:08:42 +0300 Subject: [PATCH 4/7] Fix possible UB in BSP_LoadSurfEdges(). --- src/common/bsp.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/common/bsp.c b/src/common/bsp.c index 7f497de1a..c6eebc73a 100644 --- a/src/common/bsp.c +++ b/src/common/bsp.c @@ -337,21 +337,19 @@ LOAD(Edges) LOAD(SurfEdges) { msurfedge_t *out; - int i, vert; - int32_t index; + int i; + uint32_t index, vert; bsp->numsurfedges = count; bsp->surfedges = ALLOC(sizeof(*out) * count); out = bsp->surfedges; for (i = 0; i < count; i++, out++) { - index = (int32_t)BSP_Long(); + index = BSP_Long(); - vert = 0; - if (index < 0) { + vert = index >> 31; + if (vert) index = -index; - vert = 1; - } if (index >= bsp->numedges) { DEBUG("bad edgenum"); From a388a76135c00b46731263d46a65eaf9684c1dd1 Mon Sep 17 00:00:00 2001 From: Andrey Nazarov Date: Mon, 29 Apr 2024 15:15:33 +0300 Subject: [PATCH 5/7] Print BSP extensions on single line. --- src/common/bsp.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/common/bsp.c b/src/common/bsp.c index c6eebc73a..90dd04129 100644 --- a/src/common/bsp.c +++ b/src/common/bsp.c @@ -830,16 +830,28 @@ static list_t bsp_cache; static void BSP_PrintStats(bsp_t *bsp) { + bool extended = bsp->extended; + for (int i = 0; i < q_countof(bsp_stats); i++) { const bsp_stat_t *s = &bsp_stats[i]; Com_Printf("%8d : %s\n", *(int *)((byte *)bsp + s->ofs), s->name); } + #if USE_REF - if (bsp->lm_decoupled) - Com_Printf("DECOUPLED_LM lump present\n"); + extended |= bsp->lm_decoupled; #endif - if (bsp->extended) - Com_Printf("QBSP extended format\n"); + + if (extended) { + Com_Printf("Features :"); + if (bsp->extended) + Com_Printf(" QBSP"); +#if USE_REF + if (bsp->lm_decoupled) + Com_Printf(" DECOUPLED_LM"); +#endif + Com_Printf("\n"); + } + Com_Printf("------------------\n"); } From fd7d0c86ed9b29423b67cddfd7df39e65b006063 Mon Sep 17 00:00:00 2001 From: Andrey Nazarov Date: Mon, 6 May 2024 16:58:15 +0300 Subject: [PATCH 6/7] Print number of clusters too. --- src/common/bsp.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/common/bsp.c b/src/common/bsp.c index 90dd04129..8fdfa6c03 100644 --- a/src/common/bsp.c +++ b/src/common/bsp.c @@ -836,6 +836,8 @@ static void BSP_PrintStats(bsp_t *bsp) const bsp_stat_t *s = &bsp_stats[i]; Com_Printf("%8d : %s\n", *(int *)((byte *)bsp + s->ofs), s->name); } + if (bsp->vis) + Com_Printf("%8u : clusters\n", bsp->vis->numclusters); #if USE_REF extended |= bsp->lm_decoupled; From a5f7296169c7a0f800fa348c4d3f8b3d40a419d9 Mon Sep 17 00:00:00 2001 From: Andrey Nazarov Date: Mon, 4 Nov 2024 19:43:09 +0300 Subject: [PATCH 7/7] Update mgu6m2 checksum. --- src/common/bsp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/common/bsp.c b/src/common/bsp.c index 8fdfa6c03..9ab5638e0 100644 --- a/src/common/bsp.c +++ b/src/common/bsp.c @@ -853,6 +853,7 @@ static void BSP_PrintStats(bsp_t *bsp) #endif Com_Printf("\n"); } + Com_Printf("Checksum : %#x\n", bsp->checksum); Com_Printf("------------------\n"); } @@ -1724,7 +1725,7 @@ byte *BSP_ClusterVis(bsp_t *bsp, byte *mask, int cluster, int vis) Q_SetBit(mask, 939); Q_SetBit(mask, 947); } - } else if (bsp->checksum == 0x2b2ccdd1) { + } else if (bsp->checksum == 0x1ebe8001) { // mgu6m2, waterfall Q_SetBit(mask, 213); Q_SetBit(mask, 214);