From 74527ed79620503f24c38d37ee5fa8acd6f40594 Mon Sep 17 00:00:00 2001 From: havoc Date: Thu, 24 Mar 2005 14:49:39 +0000 Subject: [PATCH] rearranged stale worldmodel removal a bit so that trying to load a level that doesn't exist doesn't mess up things on a server due to a partial reload git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@5123 d7cf8633-e32d-0410-b094-e92efae38249 --- model_brush.c | 16 ++++++++++++++++ model_shared.c | 17 +++++++++-------- model_shared.h | 1 + 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/model_brush.c b/model_brush.c index 087430c6..46644226 100644 --- a/model_brush.c +++ b/model_brush.c @@ -2982,6 +2982,14 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer) if (loadmodel->brush.numsubmodels) loadmodel->brush.submodels = Mem_Alloc(loadmodel->mempool, loadmodel->brush.numsubmodels * sizeof(model_t *)); + if (loadmodel->isworldmodel) + { + // clear out any stale submodels or worldmodels lying around + // if we did this clear before now, an error might abort loading and + // leave things in a bad state + Mod_RemoveStaleWorldModels(loadmodel); + } + // LordHavoc: to clear the fog around the original quake submodel code, I // will explain: // first of all, some background info on the submodels: @@ -5458,6 +5466,14 @@ void Mod_Q3BSP_Load(model_t *mod, void *buffer) loadmodel->brush.num_leafs = 0; Mod_Q3BSP_RecursiveFindNumLeafs(loadmodel->brush.data_nodes); + if (loadmodel->isworldmodel) + { + // clear out any stale submodels or worldmodels lying around + // if we did this clear before now, an error might abort loading and + // leave things in a bad state + Mod_RemoveStaleWorldModels(loadmodel); + } + mod = loadmodel; for (i = 0;i < loadmodel->brush.numsubmodels;i++) { diff --git a/model_shared.c b/model_shared.c index 34859f8c..50fb2699 100644 --- a/model_shared.c +++ b/model_shared.c @@ -280,14 +280,6 @@ static model_t *Mod_LoadModel(model_t *mod, qboolean crash, qboolean checkdisk, Con_DPrintf("loading model %s\n", mod->name); // LordHavoc: unload the existing model in this slot (if there is one) Mod_UnloadModel(mod); - if (isworldmodel) - { - // clear out any stale submodels lying around, as well as the old world model itself - int i; - for (i = 0;i < MAX_MOD_KNOWN;i++) - if (mod_known[i].isworldmodel) - Mod_UnloadModel(mod_known + i); - } // load the model mod->isworldmodel = isworldmodel; @@ -384,6 +376,15 @@ void Mod_PurgeUnused(void) Mod_FreeModel(mod); } +// only used during loading! +void Mod_RemoveStaleWorldModels(model_t *skip) +{ + int i; + for (i = 0;i < MAX_MOD_KNOWN;i++) + if (mod_known[i].isworldmodel && skip != &mod_known[i]) + Mod_UnloadModel(mod_known + i); +} + void Mod_LoadModels(void) { int i; diff --git a/model_shared.h b/model_shared.h index 136cf854..3123203f 100644 --- a/model_shared.h +++ b/model_shared.h @@ -456,6 +456,7 @@ void Mod_UnloadModel (model_t *mod); void Mod_ClearUsed(void); void Mod_PurgeUnused(void); +void Mod_RemoveStaleWorldModels(model_t *skip); // only used during loading! void Mod_LoadModels(void); extern model_t *loadmodel; -- 2.39.2