From 9fc27060104647f0afc5b4f8d54c08dc1cc83b49 Mon Sep 17 00:00:00 2001 From: havoc Date: Mon, 7 May 2007 06:46:04 +0000 Subject: [PATCH] replaced mod_known array with a memexpandablearray_t, this saves 11.5MB git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@7244 d7cf8633-e32d-0410-b094-e92efae38249 --- model_shared.c | 132 +++++++++++++++++++++---------------------------- 1 file changed, 55 insertions(+), 77 deletions(-) diff --git a/model_shared.c b/model_shared.c index 6b485314..058396c4 100644 --- a/model_shared.c +++ b/model_shared.c @@ -30,26 +30,17 @@ cvar_t r_mipskins = {CVAR_SAVE, "r_mipskins", "0", "mipmaps model skins so they model_t *loadmodel; -#if 0 -// LordHavoc: was 512 -static int mod_numknown = 0; -static int mod_maxknown = 0; -static model_t *mod_known = NULL; -#else -// LordHavoc: was 512 -#define MAX_MOD_KNOWN (MAX_MODELS + 256) -static int mod_numknown = 0; -static int mod_maxknown = MAX_MOD_KNOWN; -static model_t mod_known[MAX_MOD_KNOWN]; -#endif +static mempool_t *mod_mempool; +static memexpandablearray_t models; static void mod_start(void) { int i; + int nummodels = Mem_ExpandableArray_IndexRange(&models); model_t *mod; - for (i = 0, mod = mod_known;i < mod_numknown;i++, mod++) - if (mod->name[0] && mod->name[0] != '*') + for (i = 0;i < nummodels;i++) + if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0] && mod->name[0] != '*') if (mod->used) Mod_LoadModel(mod, true, false, mod->isworldmodel); } @@ -57,10 +48,11 @@ static void mod_start(void) static void mod_shutdown(void) { int i; + int nummodels = Mem_ExpandableArray_IndexRange(&models); model_t *mod; - for (i = 0, mod = mod_known;i < mod_numknown;i++, mod++) - if (mod->loaded || mod->mempool) + for (i = 0;i < nummodels;i++) + if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && (mod->loaded || mod->mempool)) Mod_UnloadModel(mod); } @@ -68,18 +60,20 @@ static void mod_newmap(void) { msurface_t *surface; int i, j, k, surfacenum, ssize, tsize; + int nummodels = Mem_ExpandableArray_IndexRange(&models); + model_t *mod; R_SkinFrame_PrepareForPurge(); - for (i = 0;i < mod_numknown;i++) + for (i = 0;i < nummodels;i++) { - if (mod_known[i].mempool && mod_known[i].data_textures) + if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->mempool && mod->data_textures) { - for (j = 0;j < mod_known[i].num_textures;j++) + for (j = 0;j < mod->num_textures;j++) { - for (k = 0;k < mod_known[i].data_textures[j].numskinframes;k++) - R_SkinFrame_MarkUsed(mod_known[i].data_textures[j].skinframes[k]); - for (k = 0;k < mod_known[i].data_textures[j].backgroundnumskinframes;k++) - R_SkinFrame_MarkUsed(mod_known[i].data_textures[j].backgroundskinframes[k]); + for (k = 0;k < mod->data_textures[j].numskinframes;k++) + R_SkinFrame_MarkUsed(mod->data_textures[j].skinframes[k]); + for (k = 0;k < mod->data_textures[j].backgroundnumskinframes;k++) + R_SkinFrame_MarkUsed(mod->data_textures[j].backgroundskinframes[k]); } } } @@ -88,11 +82,11 @@ static void mod_newmap(void) if (!cl_stainmaps_clearonload.integer) return; - for (i = 0;i < mod_numknown;i++) + for (i = 0;i < nummodels;i++) { - if (mod_known[i].mempool && mod_known[i].data_surfaces) + if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->mempool && mod->data_surfaces) { - for (surfacenum = 0, surface = mod_known[i].data_surfaces;surfacenum < mod_known[i].num_surfaces;surfacenum++, surface++) + for (surfacenum = 0, surface = mod->data_surfaces;surfacenum < mod->num_surfaces;surfacenum++, surface++) { if (surface->lightmapinfo && surface->lightmapinfo->stainsamples) { @@ -116,6 +110,9 @@ static void Mod_Precache (void); static void Mod_BuildVBOs(void); void Mod_Init (void) { + mod_mempool = Mem_AllocPool("modelinfo", 0, NULL); + Mem_ExpandableArray_NewArray(&models, mod_mempool, sizeof(model_t), 16); + Mod_BrushInit(); Mod_AliasInit(); Mod_SpriteInit(); @@ -268,36 +265,38 @@ model_t *Mod_LoadModel(model_t *mod, qboolean crash, qboolean checkdisk, qboolea void Mod_ClearUsed(void) { -#if 1 int i; + int nummodels = Mem_ExpandableArray_IndexRange(&models); model_t *mod; - - for (i = 0, mod = mod_known;i < mod_numknown;i++, mod++) - if (mod->name[0]) + for (i = 0;i < nummodels;i++) + if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0]) mod->used = false; -#endif } void Mod_PurgeUnused(void) { int i; + int nummodels = Mem_ExpandableArray_IndexRange(&models); model_t *mod; - - for (i = 0, mod = mod_known;i < mod_numknown;i++, mod++) - if (mod->name[0]) - if (!mod->used) - Mod_UnloadModel(mod); + for (i = 0;i < nummodels;i++) + { + if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0] && !mod->used) + { + Mod_UnloadModel(mod); + Mem_ExpandableArray_FreeRecord(&models, mod); + } + } } // only used during loading! void Mod_RemoveStaleWorldModels(model_t *skip) { int i; + int nummodels = Mem_ExpandableArray_IndexRange(&models); model_t *mod; - - for (i = 0, mod = mod_known;i < mod_numknown;i++, mod++) + for (i = 0;i < nummodels;i++) { - if (mod->isworldmodel && mod->loaded && skip != mod) + if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->isworldmodel && mod->loaded && skip != mod) { Mod_UnloadModel(mod); mod->isworldmodel = false; @@ -315,46 +314,25 @@ Mod_FindName model_t *Mod_FindName(const char *name) { int i; + int nummodels = Mem_ExpandableArray_IndexRange(&models); model_t *mod; if (!name[0]) Host_Error ("Mod_ForName: NULL name"); -// search the currently loaded models - for (i = 0, mod = mod_known;i < mod_numknown;i++, mod++) + // search the currently loaded models + for (i = 0;i < nummodels;i++) { - if (mod->name[0] && !strcmp(mod->name, name)) + if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0] && !strcmp(mod->name, name)) { mod->used = true; return mod; } } - // no match found, find room for a new one - for (i = 0;i < mod_numknown;i++) - if (!mod_known[i].name[0]) - break; - - if (mod_maxknown == i) - { -#if 0 - model_t *old; - mod_maxknown += 256; - old = mod_known; - mod_known = Mem_Alloc(mod_mempool, mod_maxknown * sizeof(model_t)); - if (old) - { - memcpy(mod_known, old, mod_numknown * sizeof(model_t)); - Mem_Free(old); - } -#else - Host_Error ("Mod_FindName: ran out of models"); -#endif - } - if (mod_numknown == i) - mod_numknown++; - mod = mod_known + i; - strlcpy (mod->name, name, sizeof(mod->name)); + // no match found, create a new one + mod = Mem_ExpandableArray_AllocRecord(&models); + strlcpy(mod->name, name, sizeof(mod->name)); mod->loaded = false; mod->used = true; return mod; @@ -383,15 +361,14 @@ Mod_Reload Reloads all models if they have changed ================== */ -void Mod_Reload() +void Mod_Reload(void) { int i; + int nummodels = Mem_ExpandableArray_IndexRange(&models); model_t *mod; - - for (i = 0, mod = mod_known;i < mod_numknown;i++, mod++) - if (mod->name[0] && mod->name[0] != '*') - if (mod->used) - Mod_LoadModel(mod, true, true, mod->isworldmodel); + for (i = 0;i < nummodels;i++) + if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0] && mod->name[0] != '*' && mod->used) + Mod_LoadModel(mod, true, true, mod->isworldmodel); } unsigned char *mod_base; @@ -406,12 +383,13 @@ Mod_Print */ static void Mod_Print(void) { - int i; - model_t *mod; + int i; + int nummodels = Mem_ExpandableArray_IndexRange(&models); + model_t *mod; Con_Print("Loaded models:\n"); - for (i = 0, mod = mod_known;i < mod_numknown;i++, mod++) - if (mod->name[0]) + for (i = 0;i < nummodels;i++) + if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0]) Con_Printf("%4iK %s\n", mod->mempool ? (int)((mod->mempool->totalsize + 1023) / 1024) : 0, mod->name); } -- 2.39.2