+ int crc;
+ void *buf;
+
+ mod->used = true;
+
+ if (mod->name[0] == '*') // submodel
+ return mod;
+
+ crc = 0;
+ buf = NULL;
+ if (!mod->needload)
+ {
+ if (checkdisk)
+ {
+ buf = COM_LoadFile (mod->name, false);
+ if (!buf)
+ {
+ if (crash)
+ Host_Error ("Mod_LoadModel: %s not found", mod->name); // LordHavoc: Sys_Error was *ANNOYING*
+ return NULL;
+ }
+
+ crc = CRC_Block(buf, com_filesize);
+ }
+ else
+ crc = mod->crc;
+
+ if (mod->crc == crc && mod->isworldmodel == isworldmodel)
+ {
+ if (buf)
+ Mem_Free(buf);
+ return mod; // already loaded
+ }
+ }
+
+ Con_DPrintf("loading model %s\n", mod->name);
+
+ if (!buf)
+ {
+ buf = COM_LoadFile (mod->name, false);
+ if (!buf)
+ {
+ if (crash)
+ Host_Error ("Mod_LoadModel: %s not found", mod->name);
+ return NULL;
+ }
+ crc = CRC_Block(buf, com_filesize);
+ }
+
+ // allocate a new model
+ loadmodel = mod;
+
+ // LordHavoc: unload the existing model in this slot (if there is one)
+ Mod_UnloadModel(mod);
+ mod->isworldmodel = isworldmodel;
+ mod->needload = false;
+ mod->used = true;
+ mod->crc = crc;
+
+ // all models use memory, so allocate a memory pool
+ mod->mempool = Mem_AllocPool(mod->name);
+ // all models load textures, so allocate a texture pool
+ if (cls.state != ca_dedicated)
+ mod->texturepool = R_AllocTexturePool();
+
+ // call the apropriate loader
+ if (!memcmp(buf, "IDPO" , 4)) Mod_LoadAliasModel (mod, buf);
+ else if (!memcmp(buf, "IDP2" , 4)) Mod_LoadQ2AliasModel(mod, buf);
+ else if (!memcmp(buf, "ZYMOTIC" , 7)) Mod_LoadZymoticModel(mod, buf);
+ else if (!memcmp(buf, "IDSP" , 4)) Mod_LoadSpriteModel (mod, buf);
+ else Mod_LoadBrushModel (mod, buf);
+
+ Mem_Free(buf);
+
+ return mod;
+}
+
+void Mod_CheckLoaded (model_t *mod)
+{
+ if (mod)
+ {
+ if (mod->needload)
+ Mod_LoadModel(mod, true, true, mod->isworldmodel);
+ else
+ {
+ if (mod->type == mod_invalid)
+ Host_Error("Mod_CheckLoaded: invalid model\n");
+ mod->used = true;
+ return;
+ }
+ }