]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_shared.c
made dedicated servers hog a whole lot less CPU time
[xonotic/darkplaces.git] / model_shared.c
index 20dc64f7453c87761ed3cf77d9a87d36a05506d5..c5e9d2f6c2e7581ae3a7db81d7dd528616e2337c 100644 (file)
@@ -265,7 +265,7 @@ void Mod_UnloadModel (model_t *mod)
        Mod_FreeModel(mod);
        strcpy(mod->name, name);
        mod->isworldmodel = isworldmodel;
-       mod->needload = true;
+       mod->loaded = false;
 }
 
 /*
@@ -289,31 +289,40 @@ static model_t *Mod_LoadModel(model_t *mod, qboolean crash, qboolean checkdisk,
        crc = 0;
        buf = NULL;
        if (mod->isworldmodel != isworldmodel)
-               mod->needload = true;
-       if (mod->needload || checkdisk)
+               mod->loaded = false;
+       if (!mod->loaded || checkdisk)
        {
-               if (checkdisk && !mod->needload)
+               if (checkdisk && mod->loaded)
                        Con_DPrintf("checking model %s\n", mod->name);
                buf = FS_LoadFile (mod->name, tempmempool, false);
                if (buf)
                {
                        crc = CRC_Block(buf, fs_filesize);
                        if (mod->crc != crc)
-                               mod->needload = true;
+                               mod->loaded = false;
                }
        }
-       if (!mod->needload)
+       if (mod->loaded)
                return mod; // already loaded
 
        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;
        mod->used = true;
        mod->crc = crc;
-       // errors can prevent the corresponding mod->needload = false;
-       mod->needload = true;
+       // errors can prevent the corresponding mod->loaded = true;
+       mod->loaded = false;
 
        // default model radius and bounding box (mainly for missing models)
        mod->radius = 16;
@@ -353,7 +362,7 @@ static model_t *Mod_LoadModel(model_t *mod, qboolean crash, qboolean checkdisk,
        }
 
        // no errors occurred
-       mod->needload = false;
+       mod->loaded = true;
        return mod;
 }
 
@@ -361,7 +370,7 @@ void Mod_CheckLoaded(model_t *mod)
 {
        if (mod)
        {
-               if (mod->needload)
+               if (!mod->loaded)
                        Mod_LoadModel(mod, true, true, mod->isworldmodel);
                else
                {
@@ -448,7 +457,7 @@ model_t *Mod_FindName(const char *name)
        {
                mod = freemod;
                strcpy (mod->name, name);
-               mod->needload = true;
+               mod->loaded = false;
                mod->used = true;
                return mod;
        }
@@ -457,20 +466,6 @@ model_t *Mod_FindName(const char *name)
        return NULL;
 }
 
-/*
-==================
-Mod_TouchModel
-
-==================
-*/
-void Mod_TouchModel(const char *name)
-{
-       model_t *mod;
-
-       mod = Mod_FindName(name);
-       mod->used = true;
-}
-
 /*
 ==================
 Mod_ForName