diff --git a/src/client/refresh/files/maps.c b/src/client/refresh/files/maps.c index e5111a69..d0e60cf7 100644 --- a/src/client/refresh/files/maps.c +++ b/src/client/refresh/files/maps.c @@ -705,7 +705,7 @@ Mod_LoadQBSPMarksurfaces(const char *name, msurface_t ***marksurfaces, unsigned void Mod_LoadQBSPLeafs(const char *name, mleaf_t **leafs, int *numleafs, msurface_t **marksurfaces, unsigned int nummarksurfaces, - const byte *mod_base, const lump_t *l) + int *numclusters, const byte *mod_base, const lump_t *l) { dqleaf_t *in; mleaf_t *out; @@ -724,6 +724,7 @@ Mod_LoadQBSPLeafs(const char *name, mleaf_t **leafs, int *numleafs, *leafs = out; *numleafs = count; + *numclusters = 0; for (i = 0; i < count; i++, in++, out++) { @@ -748,6 +749,11 @@ Mod_LoadQBSPLeafs(const char *name, mleaf_t **leafs, int *numleafs, Com_Error(ERR_DROP, "%s: wrong marksurfaces position in %s", __func__, name); } + + if (out->cluster >= *numclusters) + { + *numclusters = out->cluster + 1; + } } } diff --git a/src/client/refresh/gl1/gl1_model.c b/src/client/refresh/gl1/gl1_model.c index 05ecd412..2093be06 100644 --- a/src/client/refresh/gl1/gl1_model.c +++ b/src/client/refresh/gl1/gl1_model.c @@ -374,13 +374,19 @@ Mod_LoadBrushModel(model_t *mod, const void *buffer, int modfilelen) Mod_LoadVisibility(mod->name, &mod->vis, &mod->numvisibility, mod_base, &header->lumps[LUMP_VISIBILITY]); Mod_LoadQBSPLeafs(mod->name, &mod->leafs, &mod->numleafs, - mod->marksurfaces, mod->nummarksurfaces, mod_base, - &header->lumps[LUMP_LEAFS]); + mod->marksurfaces, mod->nummarksurfaces, &mod->numclusters, + mod_base, &header->lumps[LUMP_LEAFS]); Mod_LoadQBSPNodes(mod->name, mod->planes, mod->numplanes, mod->leafs, mod->numleafs, &mod->nodes, &mod->numnodes, mod_base, &header->lumps[LUMP_NODES], header->ident); Mod_LoadSubmodels(mod, mod_base, &header->lumps[LUMP_MODELS]); mod->numframes = 2; /* regular and alternate animation */ + + if (mod->vis && mod->numclusters != mod->vis->numclusters) + { + Com_Error(ERR_DROP, "%s: Map %s has incorrect number of clusters %d != %d", + __func__, mod->name, mod->numclusters, mod->vis->numclusters); + } } /* Temporary solution, need to use load file dirrectly */ diff --git a/src/client/refresh/gl1/header/model.h b/src/client/refresh/gl1/header/model.h index 9b7cc523..895c8df5 100644 --- a/src/client/refresh/gl1/header/model.h +++ b/src/client/refresh/gl1/header/model.h @@ -84,6 +84,7 @@ typedef struct model_s msurface_t **marksurfaces; int numvisibility; + int numclusters; dvis_t *vis; byte *lightdata; diff --git a/src/client/refresh/gl3/gl3_model.c b/src/client/refresh/gl3/gl3_model.c index 9e72eab1..bd4c8884 100644 --- a/src/client/refresh/gl3/gl3_model.c +++ b/src/client/refresh/gl3/gl3_model.c @@ -375,13 +375,19 @@ Mod_LoadBrushModel(gl3model_t *mod, const void *buffer, int modfilelen) Mod_LoadVisibility(mod->name, &mod->vis, &mod->numvisibility, mod_base, &header->lumps[LUMP_VISIBILITY]); Mod_LoadQBSPLeafs(mod->name, &mod->leafs, &mod->numleafs, - mod->marksurfaces, mod->nummarksurfaces, mod_base, - &header->lumps[LUMP_LEAFS]); + mod->marksurfaces, mod->nummarksurfaces, &mod->numclusters, + mod_base, &header->lumps[LUMP_LEAFS]); Mod_LoadQBSPNodes(mod->name, mod->planes, mod->numplanes, mod->leafs, mod->numleafs, &mod->nodes, &mod->numnodes, mod_base, &header->lumps[LUMP_NODES], header->ident); Mod_LoadSubmodels(mod, mod_base, &header->lumps[LUMP_MODELS]); mod->numframes = 2; /* regular and alternate animation */ + + if (mod->vis && mod->numclusters != mod->vis->numclusters) + { + Com_Error(ERR_DROP, "%s: Map %s has incorrect number of clusters %d != %d", + __func__, mod->name, mod->numclusters, mod->vis->numclusters); + } } /* Temporary solution, need to use load file dirrectly */ diff --git a/src/client/refresh/gl3/header/model.h b/src/client/refresh/gl3/header/model.h index fa4c3c18..000911a3 100644 --- a/src/client/refresh/gl3/header/model.h +++ b/src/client/refresh/gl3/header/model.h @@ -95,6 +95,7 @@ typedef struct model_s msurface_t **marksurfaces; int numvisibility; + int numclusters; dvis_t *vis; byte *lightdata; diff --git a/src/client/refresh/gl4/gl4_model.c b/src/client/refresh/gl4/gl4_model.c index 4c9275d2..6c559491 100644 --- a/src/client/refresh/gl4/gl4_model.c +++ b/src/client/refresh/gl4/gl4_model.c @@ -375,13 +375,19 @@ Mod_LoadBrushModel(gl4model_t *mod, const void *buffer, int modfilelen) Mod_LoadVisibility(mod->name, &mod->vis, &mod->numvisibility, mod_base, &header->lumps[LUMP_VISIBILITY]); Mod_LoadQBSPLeafs(mod->name, &mod->leafs, &mod->numleafs, - mod->marksurfaces, mod->nummarksurfaces, mod_base, - &header->lumps[LUMP_LEAFS]); + mod->marksurfaces, mod->nummarksurfaces, &mod->numclusters, + mod_base, &header->lumps[LUMP_LEAFS]); Mod_LoadQBSPNodes(mod->name, mod->planes, mod->numplanes, mod->leafs, mod->numleafs, &mod->nodes, &mod->numnodes, mod_base, &header->lumps[LUMP_NODES], header->ident); Mod_LoadSubmodels(mod, mod_base, &header->lumps[LUMP_MODELS]); mod->numframes = 2; /* regular and alternate animation */ + + if (mod->vis && mod->numclusters != mod->vis->numclusters) + { + Com_Error(ERR_DROP, "%s: Map %s has incorrect number of clusters %d != %d", + __func__, mod->name, mod->numclusters, mod->vis->numclusters); + } } /* Temporary solution, need to use load file dirrectly */ diff --git a/src/client/refresh/gl4/header/model.h b/src/client/refresh/gl4/header/model.h index 02167472..362155b2 100644 --- a/src/client/refresh/gl4/header/model.h +++ b/src/client/refresh/gl4/header/model.h @@ -95,6 +95,7 @@ typedef struct model_s msurface_t **marksurfaces; int numvisibility; + int numclusters; dvis_t *vis; byte *lightdata; diff --git a/src/client/refresh/ref_shared.h b/src/client/refresh/ref_shared.h index d41392f2..149fbd3b 100644 --- a/src/client/refresh/ref_shared.h +++ b/src/client/refresh/ref_shared.h @@ -340,7 +340,7 @@ extern void Mod_LoadQBSPNodes(const char *name, cplane_t *planes, int numplanes, const byte *mod_base, const lump_t *l, int ident); extern void Mod_LoadQBSPLeafs(const char *name, mleaf_t **leafs, int *numleafs, msurface_t **marksurfaces, unsigned int nummarksurfaces, - const byte *mod_base, const lump_t *l); + int *numclusters, const byte *mod_base, const lump_t *l); extern void Mod_LoadQBSPEdges(const char *name, medge_t **edges, int *numedges, const byte *mod_base, const lump_t *l); extern void Mod_LoadVertexes(const char *name, mvertex_t **vertexes, int *numvertexes, diff --git a/src/client/refresh/soft/header/model.h b/src/client/refresh/soft/header/model.h index 451456d1..44b9dd2d 100644 --- a/src/client/refresh/soft/header/model.h +++ b/src/client/refresh/soft/header/model.h @@ -108,6 +108,7 @@ typedef struct model_s msurface_t **marksurfaces; int numvisibility; + int numclusters; dvis_t *vis; byte *lightdata; diff --git a/src/client/refresh/soft/sw_model.c b/src/client/refresh/soft/sw_model.c index b4447021..da51551e 100644 --- a/src/client/refresh/soft/sw_model.c +++ b/src/client/refresh/soft/sw_model.c @@ -380,14 +380,19 @@ Mod_LoadBrushModel(model_t *mod, const void *buffer, int modfilelen) Mod_LoadVisibility(mod->name, &mod->vis, &mod->numvisibility, mod_base, &header->lumps[LUMP_VISIBILITY]); Mod_LoadQBSPLeafs(mod->name, &mod->leafs, &mod->numleafs, - mod->marksurfaces, mod->nummarksurfaces, mod_base, - &header->lumps[LUMP_LEAFS]); + mod->marksurfaces, mod->nummarksurfaces, &mod->numclusters, + mod_base, &header->lumps[LUMP_LEAFS]); Mod_LoadQBSPNodes(mod->name, mod->planes, mod->numplanes, mod->leafs, mod->numleafs, &mod->nodes, &mod->numnodes, mod_base, &header->lumps[LUMP_NODES], header->ident); Mod_LoadSubmodels(mod, mod_base, &header->lumps[LUMP_MODELS]); mod->numframes = 2; /* regular and alternate animation */ + if (mod->vis && mod->numclusters != mod->vis->numclusters) + { + Com_Error(ERR_DROP, "%s: Map %s has incorrect number of clusters %d != %d", + __func__, mod->name, mod->numclusters, mod->vis->numclusters); + } R_InitSkyBox(mod); } diff --git a/src/client/refresh/vk/header/model.h b/src/client/refresh/vk/header/model.h index ad038b93..6c825c22 100644 --- a/src/client/refresh/vk/header/model.h +++ b/src/client/refresh/vk/header/model.h @@ -104,6 +104,7 @@ typedef struct model_s msurface_t **marksurfaces; int numvisibility; + int numclusters; dvis_t *vis; byte *lightdata; diff --git a/src/client/refresh/vk/vk_model.c b/src/client/refresh/vk/vk_model.c index 2e552161..e1b52aaf 100644 --- a/src/client/refresh/vk/vk_model.c +++ b/src/client/refresh/vk/vk_model.c @@ -348,13 +348,19 @@ Mod_LoadBrushModel(model_t *mod, const void *buffer, int modfilelen) Mod_LoadVisibility(mod->name, &mod->vis, &mod->numvisibility, mod_base, &header->lumps[LUMP_VISIBILITY]); Mod_LoadQBSPLeafs(mod->name, &mod->leafs, &mod->numleafs, - mod->marksurfaces, mod->nummarksurfaces, mod_base, - &header->lumps[LUMP_LEAFS]); + mod->marksurfaces, mod->nummarksurfaces, &mod->numclusters, + mod_base, &header->lumps[LUMP_LEAFS]); Mod_LoadQBSPNodes(mod->name, mod->planes, mod->numplanes, mod->leafs, mod->numleafs, &mod->nodes, &mod->numnodes, mod_base, &header->lumps[LUMP_NODES], header->ident); Mod_LoadSubmodels(mod, mod_base, &header->lumps[LUMP_MODELS]); mod->numframes = 2; /* regular and alternate animation */ + + if (mod->vis && mod->numclusters != mod->vis->numclusters) + { + Com_Error(ERR_DROP, "%s: Map %s has incorrect number of clusters %d != %d", + __func__, mod->name, mod->numclusters, mod->vis->numclusters); + } } /* Temporary solution, need to use load file dirrectly */