]> git.rm.cloudns.org Git - xonotic/darkplaces.git/commitdiff
modified Mod_LoadSkinFrame to set base = r_texture_notexture on failure, this reduced...
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Sun, 11 Feb 2007 17:44:59 +0000 (17:44 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Sun, 11 Feb 2007 17:44:59 +0000 (17:44 +0000)
reworked Mod_BuildAliasSkinsFromSkinFiles, it no longer tries fallbacks if a skin texture fails to load
fixed a crash on missing meshes in a skin file (which are intentionally nodraw, just like in Quake3)

git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@6826 d7cf8633-e32d-0410-b094-e92efae38249

model_alias.c
model_shared.c
model_sprite.c

index c2bd4a8c3863e4c22d1eb8b5e6017d7c6fd3cb8e..c1a975bde1639c9e7a06a69dd4068370578e73a3 100644 (file)
@@ -700,42 +700,30 @@ static void Mod_BuildAliasSkinsFromSkinFiles(texture_t *skin, skinfile_t *skinfi
                for (i = 0;skinfile;skinfile = skinfile->next, i++, skin += loadmodel->num_surfaces)
                {
                        memset(skin, 0, sizeof(*skin));
+                       Mod_BuildAliasSkinFromSkinFrame(skin, NULL);
+                       // don't render unmentioned meshes
+                       skin->basematerialflags = skin->currentmaterialflags = 0;
+                       // see if a mesh
                        for (skinfileitem = skinfile->items;skinfileitem;skinfileitem = skinfileitem->next)
                        {
                                // leave the skin unitialized (nodraw) if the replacement is "common/nodraw" or "textures/common/nodraw"
                                if (!strcmp(skinfileitem->name, meshname) && strcmp(skinfileitem->replacement, "common/nodraw") && strcmp(skinfileitem->replacement, "textures/common/nodraw"))
                                {
-                                       memset(&tempskinframe, 0, sizeof(tempskinframe));
-                                       if (Mod_LoadSkinFrame(&tempskinframe, skinfileitem->replacement, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, true, true))
-                                               Mod_BuildAliasSkinFromSkinFrame(skin, &tempskinframe);
-                                       else
-                                       {
+                                       if (!Mod_LoadSkinFrame(&tempskinframe, skinfileitem->replacement, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, true, true))
                                                if (cls.state != ca_dedicated)
-                                                       Con_Printf("mesh \"%s\": failed to load skin #%i \"%s\", falling back to mesh's internal shader name \"%s\"\n", meshname, i, skinfileitem->replacement, shadername);
-                                               if (Mod_LoadSkinFrame(&tempskinframe, shadername, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, true, true))
-                                                       Mod_BuildAliasSkinFromSkinFrame(skin, &tempskinframe);
-                                               else
-                                               {
-                                                       if (cls.state != ca_dedicated)
-                                                               Con_Printf("failed to load skin \"%s\"\n", shadername);
-                                                       Mod_BuildAliasSkinFromSkinFrame(skin, NULL);
-                                               }
-                                       }
+                                                       Con_Printf("mesh \"%s\": failed to load skin #%i \"%s\"\n", meshname, i, skinfileitem->replacement);
+                                       Mod_BuildAliasSkinFromSkinFrame(skin, &tempskinframe);
+                                       break;
                                }
                        }
                }
        }
        else
        {
-               memset(&tempskinframe, 0, sizeof(tempskinframe));
-               if (Mod_LoadSkinFrame(&tempskinframe, shadername, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, true, true))
-                       Mod_BuildAliasSkinFromSkinFrame(skin, &tempskinframe);
-               else
-               {
+               if (!Mod_LoadSkinFrame(&tempskinframe, shadername, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, true, true))
                        if (cls.state != ca_dedicated)
                                Con_Printf("Can't find texture \"%s\" for mesh \"%s\", using grey checkerboard\n", shadername, meshname);
-                       Mod_BuildAliasSkinFromSkinFrame(skin, NULL);
-               }
+               Mod_BuildAliasSkinFromSkinFrame(skin, &tempskinframe);
        }
 }
 
@@ -1147,13 +1135,9 @@ void Mod_IDP2_Load(model_t *mod, void *buffer, void *bufferend)
                loadmodel->data_textures = (texture_t *)Mem_Alloc(loadmodel->mempool, loadmodel->num_surfaces * loadmodel->numskins * sizeof(texture_t));
                for (i = 0;i < loadmodel->numskins;i++, inskin += MD2_SKINNAME)
                {
-                       if (Mod_LoadSkinFrame(&tempskinframe, inskin, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, true, true))
-                               Mod_BuildAliasSkinFromSkinFrame(loadmodel->data_textures + i * loadmodel->num_surfaces, &tempskinframe);
-                       else
-                       {
+                       if (!Mod_LoadSkinFrame(&tempskinframe, inskin, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, true, true))
                                Con_Printf("%s is missing skin \"%s\"\n", loadmodel->name, inskin);
-                               Mod_BuildAliasSkinFromSkinFrame(loadmodel->data_textures + i * loadmodel->num_surfaces, NULL);
-                       }
+                       Mod_BuildAliasSkinFromSkinFrame(loadmodel->data_textures + i * loadmodel->num_surfaces, &tempskinframe);
                }
        }
        else
index 5e8d7f1dfc8d35111384671e48639951c2ca6e14..1edb3fb44504470b95c0e976a8eb59beebb65d3b 100644 (file)
@@ -1000,6 +1000,7 @@ int Mod_LoadSkinFrame(skinframe_t *skinframe, const char *basename, int texturef
 {
        imageskin_t s;
        memset(skinframe, 0, sizeof(*skinframe));
+       skinframe->base = r_texture_notexture;
        if (cls.state == ca_dedicated)
                return false;
        if (!image_loadskin(&s, basename))
index 4f5c475174a6f0758af9f71fa69a92d1ce2ef1cc..f5d9e4ec516b6cbb31a4af843ccd41902ee40127 100644 (file)
@@ -167,9 +167,7 @@ static void Mod_Sprite_SharedSetup(const unsigned char *datapointer, int version
                                        sprintf (name, "%s_%i_%i", loadmodel->name, i, j);
                                else
                                        sprintf (name, "%s_%i", loadmodel->name, i);
-                               Mod_LoadSkinFrame(&loadmodel->sprite.sprdata_frames[realframes].texture.skinframes[0], name, (r_mipsprites.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_CLAMP | TEXF_PRECACHE | TEXF_PICMIP, false, false);
-
-                               if (!loadmodel->sprite.sprdata_frames[realframes].texture.skinframes[0].base)
+                               if (!Mod_LoadSkinFrame(&loadmodel->sprite.sprdata_frames[realframes].texture.skinframes[0], name, (r_mipsprites.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_CLAMP | TEXF_PRECACHE | TEXF_PICMIP, false, false))
                                {
                                        if (groupframes > 1)
                                                sprintf (fogname, "%s_%i_%ifog", loadmodel->name, i, j);
@@ -388,12 +386,8 @@ void Mod_IDS2_Load(model_t *mod, void *buffer, void *bufferend)
                        modelradius = x + y;
 
                if (width > 0 && height > 0 && cls.state != ca_dedicated)
-               {
-                       Mod_LoadSkinFrame(&sprframe->texture.skinframes[0], pinframe->name, (r_mipsprites.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_CLAMP | TEXF_PRECACHE | TEXF_PICMIP, false, false);
-                       // TODO: use a default texture if we can't load it?
-                       if (sprframe->texture.skinframes[0].base == NULL)
+                       if (!Mod_LoadSkinFrame(&sprframe->texture.skinframes[0], pinframe->name, (r_mipsprites.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_CLAMP | TEXF_PRECACHE | TEXF_PICMIP, false, false))
                                Host_Error("Mod_IDS2_Load: failed to load %s", pinframe->name);
-               }
 
                Mod_SpriteSetupTexture(sprframe, fullbright, false);
        }