From: havoc Date: Sun, 11 Feb 2007 17:44:59 +0000 (+0000) Subject: modified Mod_LoadSkinFrame to set base = r_texture_notexture on failure, this reduced... X-Git-Tag: xonotic-v0.1.0preview~3588 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=e325fa915f9a75b46c45aa1c176581989a293bf4;p=xonotic%2Fdarkplaces.git modified Mod_LoadSkinFrame to set base = r_texture_notexture on failure, this reduced fallback code elsewhere 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 --- diff --git a/model_alias.c b/model_alias.c index c2bd4a8c..c1a975bd 100644 --- a/model_alias.c +++ b/model_alias.c @@ -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 diff --git a/model_shared.c b/model_shared.c index 5e8d7f1d..1edb3fb4 100644 --- a/model_shared.c +++ b/model_shared.c @@ -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)) diff --git a/model_sprite.c b/model_sprite.c index 4f5c4751..f5d9e4ec 100644 --- a/model_sprite.c +++ b/model_sprite.c @@ -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); }