]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_shared.c
added DP_ASINACOSATANATAN2TAN extension which adds common trig functions missing...
[xonotic/darkplaces.git] / model_shared.c
index 8b2333f48e01d19c3153cb4e765cbbd719e8b80c..920d85e571a5c44c54d4922b580ea0df698b51f6 100644 (file)
@@ -49,7 +49,7 @@ static void mod_start(void)
        model_t *mod;
 
        for (i = 0, mod = mod_known;i < mod_numknown;i++, mod++)
-               if (mod->name[0])
+               if (mod->name[0] && mod->name[0] != '*')
                        if (mod->used)
                                Mod_LoadModel(mod, true, false, mod->isworldmodel);
 }
@@ -60,7 +60,7 @@ static void mod_shutdown(void)
        model_t *mod;
 
        for (i = 0, mod = mod_known;i < mod_numknown;i++, mod++)
-               if (mod->loaded)
+               if (mod->loaded || mod->mempool)
                        Mod_UnloadModel(mod);
 }
 
@@ -118,7 +118,7 @@ void Mod_UnloadModel (model_t *mod)
        char name[MAX_QPATH];
        qboolean isworldmodel;
        qboolean used;
-       strcpy(name, mod->name);
+       strlcpy(name, mod->name, sizeof(name));
        isworldmodel = mod->isworldmodel;
        used = mod->used;
        // free textures/memory attached to the model
@@ -127,7 +127,7 @@ void Mod_UnloadModel (model_t *mod)
        // clear the struct to make it available
        memset(mod, 0, sizeof(model_t));
        // restore the fields we want to preserve
-       strcpy(mod->name, name);
+       strlcpy(mod->name, name, sizeof(mod->name));
        mod->isworldmodel = isworldmodel;
        mod->used = used;
        mod->loaded = false;
@@ -178,7 +178,7 @@ model_t *Mod_LoadModel(model_t *mod, qboolean crash, qboolean checkdisk, qboolea
 
        Con_DPrintf("loading model %s\n", mod->name);
        // LordHavoc: unload the existing model in this slot (if there is one)
-       if (mod->loaded)
+       if (mod->loaded || mod->mempool)
                Mod_UnloadModel(mod);
 
        // load the model
@@ -197,15 +197,16 @@ model_t *Mod_LoadModel(model_t *mod, qboolean crash, qboolean checkdisk, qboolea
        VectorSet(mod->rotatedmins, -mod->radius, -mod->radius, -mod->radius);
        VectorSet(mod->rotatedmaxs, mod->radius, mod->radius, mod->radius);
 
-       // all models use memory, so allocate a memory pool
-       mod->mempool = Mem_AllocPool(mod->name, 0, NULL);
-       // all models load textures, so allocate a texture pool
-       if (cls.state != ca_dedicated)
-               mod->texturepool = R_AllocTexturePool();
-
        if (buf)
        {
                char *bufend = (char *)buf + filesize;
+
+               // all models use memory, so allocate a memory pool
+               mod->mempool = Mem_AllocPool(mod->name, 0, NULL);
+               // all models load textures, so allocate a texture pool
+               if (cls.state != ca_dedicated)
+                       mod->texturepool = R_AllocTexturePool();
+
                num = LittleLong(*((int *)buf));
                // call the apropriate loader
                loadmodel = mod;
@@ -322,7 +323,7 @@ model_t *Mod_FindName(const char *name)
        if (mod_numknown == i)
                mod_numknown++;
        mod = mod_known + i;
-       strcpy (mod->name, name);
+       strlcpy (mod->name, name, sizeof(mod->name));
        mod->loaded = false;
        mod->used = true;
        return mod;
@@ -344,6 +345,24 @@ model_t *Mod_ForName(const char *name, qboolean crash, qboolean checkdisk, qbool
        return model;
 }
 
+/*
+==================
+Mod_Reload
+
+Reloads all models if they have changed
+==================
+*/
+void Mod_Reload()
+{
+       int i;
+       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);
+}
+
 unsigned char *mod_base;