Commit: 95847f6ac7ce074501d0f7f2b874ef4036601dc4 Author: Bastien Montagne Date: Fri Jan 9 09:52:51 2015 +0100 Branches: master https://developer.blender.org/rB95847f6ac7ce074501d0f7f2b874ef4036601dc4
Fix T43159: Copying of linked datablocks using relpath leads to invalid paths in new copies. Propper fix reverting most of rB60e70c0c6014e5, which was only partial specific fix. This code uses generic `BKE_id_lib_local_paths()` func to handle all possible paths. Reviewers: sergey, campbellbarton Differential Revision: https://developer.blender.org/D977 =================================================================== M source/blender/blenkernel/intern/action.c M source/blender/blenkernel/intern/armature.c M source/blender/blenkernel/intern/brush.c M source/blender/blenkernel/intern/camera.c M source/blender/blenkernel/intern/curve.c M source/blender/blenkernel/intern/group.c M source/blender/blenkernel/intern/image.c M source/blender/blenkernel/intern/key.c M source/blender/blenkernel/intern/lamp.c M source/blender/blenkernel/intern/lattice.c M source/blender/blenkernel/intern/linestyle.c M source/blender/blenkernel/intern/mask.c M source/blender/blenkernel/intern/material.c M source/blender/blenkernel/intern/mball.c M source/blender/blenkernel/intern/mesh.c M source/blender/blenkernel/intern/node.c M source/blender/blenkernel/intern/object.c M source/blender/blenkernel/intern/particle.c M source/blender/blenkernel/intern/speaker.c M source/blender/blenkernel/intern/text.c M source/blender/blenkernel/intern/texture.c M source/blender/blenkernel/intern/world.c =================================================================== diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index b066d53..f94f1e7 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -215,6 +215,10 @@ bAction *BKE_action_copy(bAction *src) } } + if (src->id.lib) { + BKE_id_lib_local_paths(G.main, src->id.lib, &dst->id); + } + return dst; } diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index f4a5d33..df57db2 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -222,6 +222,10 @@ bArmature *BKE_armature_copy(bArmature *arm) newArm->act_edbone = NULL; newArm->sketch = NULL; + if (arm->id.lib) { + BKE_id_lib_local_paths(G.main, arm->id.lib, &newArm->id); + } + return newArm; } diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index 7c1915e..55d347a 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -178,6 +178,10 @@ Brush *BKE_brush_copy(Brush *brush) brushn->id.us++; } + if (brush->id.lib) { + BKE_id_lib_local_paths(G.main, brush->id.lib, &brushn->id); + } + return brushn; } diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c index d0470ba..e424823 100644 --- a/source/blender/blenkernel/intern/camera.c +++ b/source/blender/blenkernel/intern/camera.c @@ -78,6 +78,10 @@ Camera *BKE_camera_copy(Camera *cam) id_lib_extern((ID *)camn->dof_ob); + if (cam->id.lib) { + BKE_id_lib_local_paths(G.main, cam->id.lib, &camn->id); + } + return camn; } diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 937ceff..3abe3c5 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -237,6 +237,10 @@ Curve *BKE_curve_copy(Curve *cu) id_us_plus((ID *)cun->vfonti); id_us_plus((ID *)cun->vfontbi); + if (cu->id.lib) { + BKE_id_lib_local_paths(G.main, cu->id.lib, &cun->id); + } + return cun; } diff --git a/source/blender/blenkernel/intern/group.c b/source/blender/blenkernel/intern/group.c index 6ea6baf..1f9cf2e 100644 --- a/source/blender/blenkernel/intern/group.c +++ b/source/blender/blenkernel/intern/group.c @@ -149,6 +149,10 @@ Group *BKE_group_copy(Group *group) groupn = BKE_libblock_copy(&group->id); BLI_duplicatelist(&groupn->gobject, &group->gobject); + if (group->id.lib) { + BKE_id_lib_local_paths(G.main, group->id.lib, &groupn->id); + } + return groupn; } diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 3d55340..870c077 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -365,11 +365,6 @@ Image *BKE_image_copy(Main *bmain, Image *ima) Image *nima = image_alloc(bmain, ima->id.name + 2, ima->source, ima->type); BLI_strncpy(nima->name, ima->name, sizeof(ima->name)); - if (ima->id.lib && BLI_path_is_rel(ima->name)) { - /* If path is relative, and source is a lib, path is relative to lib file, not main one! */ - BLI_path_abs(nima->name, ima->id.lib->filepath); - BLI_path_rel(nima->name, bmain->name); - } nima->flag = ima->flag; nima->tpageflag = ima->tpageflag; @@ -389,6 +384,10 @@ Image *BKE_image_copy(Main *bmain, Image *ima) if (ima->packedfile) nima->packedfile = dupPackedFile(ima->packedfile); + if (ima->id.lib) { + BKE_id_lib_local_paths(bmain, ima->id.lib, &nima->id); + } + return nima; } diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c index 32e95e7..560a3c0 100644 --- a/source/blender/blenkernel/intern/key.c +++ b/source/blender/blenkernel/intern/key.c @@ -167,7 +167,11 @@ Key *BKE_key_copy(Key *key) kbn = kbn->next; kb = kb->next; } - + + if (key->id.lib) { + BKE_id_lib_local_paths(G.main, key->id.lib, &keyn->id); + } + return keyn; } diff --git a/source/blender/blenkernel/intern/lamp.c b/source/blender/blenkernel/intern/lamp.c index e738b16..93b9c22 100644 --- a/source/blender/blenkernel/intern/lamp.c +++ b/source/blender/blenkernel/intern/lamp.c @@ -126,6 +126,10 @@ Lamp *BKE_lamp_copy(Lamp *la) if (la->preview) lan->preview = BKE_previewimg_copy(la->preview); + if (la->id.lib) { + BKE_id_lib_local_paths(G.main, la->id.lib, &lan->id); + } + return lan; } diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 7732d59..fa62308 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -284,6 +284,10 @@ Lattice *BKE_lattice_copy(Lattice *lt) ltn->editlatt = NULL; + if (lt->id.lib) { + BKE_id_lib_local_paths(G.main, lt->id.lib, <n->id); + } + return ltn; } diff --git a/source/blender/blenkernel/intern/linestyle.c b/source/blender/blenkernel/intern/linestyle.c index 5bee933..d244e9d 100644 --- a/source/blender/blenkernel/intern/linestyle.c +++ b/source/blender/blenkernel/intern/linestyle.c @@ -210,6 +210,10 @@ FreestyleLineStyle *BKE_linestyle_copy(FreestyleLineStyle *linestyle) for (m = (LineStyleModifier *)linestyle->geometry_modifiers.first; m; m = m->next) BKE_linestyle_geometry_modifier_copy(new_linestyle, m); + if (linestyle->id.lib) { + BKE_id_lib_local_paths(G.main, linestyle->id.lib, &new_linestyle->id); + } + return new_linestyle; } diff --git a/source/blender/blenkernel/intern/mask.c b/source/blender/blenkernel/intern/mask.c index b8c78ce..83ca6cd 100644 --- a/source/blender/blenkernel/intern/mask.c +++ b/source/blender/blenkernel/intern/mask.c @@ -50,6 +50,7 @@ #include "DNA_sequence_types.h" #include "BKE_curve.h" +#include "BKE_global.h" #include "BKE_library.h" #include "BKE_main.h" #include "BKE_mask.h" @@ -855,6 +856,10 @@ Mask *BKE_mask_copy(Mask *mask) mask_new->id.us++; } + if (mask->id.lib) { + BKE_id_lib_local_paths(G.main, mask->id.lib, &mask_new->id); + } + return mask_new; } diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 83800a3..981064b 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -252,6 +252,10 @@ Material *BKE_material_copy(Material *ma) BLI_listbase_clear(&man->gpumaterial); + if (ma->id.lib) { + BKE_id_lib_local_paths(G.main, ma->id.lib, &man->id); + } + return man; } diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index 4c45269..34ab2a8 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -238,6 +238,10 @@ MetaBall *BKE_mball_copy(MetaBall *mb) mbn->editelems = NULL; mbn->lastelem = NULL; + if (mb->id.lib) { + BKE_id_lib_local_paths(G.main, mb->id.lib, &mbn->id); + } + return mbn; } diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 2e80379..c47d294 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -562,6 +562,10 @@ Mesh *BKE_mesh_copy_ex(Main *bmain, Mesh *me) men->key = BKE_key_copy(me->key); if (men->key) men->key->from = (ID *)men; + if (me->id.lib) { + BKE_id_lib_local_paths(bmain, me->id.lib, &men->id); + } + return men; } diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index ce86e07..7414a85 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -1202,6 +1202,10 @@ static bNodeTree *ntreeCopyTree_internal(bNodeTree *ntree, Main *bmain, bool do_ /* node tree will generate its own interface type */ newtree->interface_type = NULL; + if (ntree->id.lib) { + BKE_id_lib_local_paths(bmain, ntree->id.lib, &newtree->id); + } + return newtree; } diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index d4a2c32..a9292ac 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -1518,6 +1518,10 @@ Object *BKE_object_copy_ex(Main *bmain, Object *ob, bool copy_caches) /* Copy runtime surve data. */ obn->curve_cache = NULL; + if (ob->id.lib) { + BKE_id_lib_local_paths(bmain, ob->id.lib, &obn->id); + } + return obn; } diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index dfc6285..4868fea 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -3701,6 +3701,10 @@ ParticleSettings *BKE_particlesettings_copy(ParticleSettings *part) BLI_duplicatelist(&partn->dupliweights, &part->dupliweights); + if (part->id.lib) { + BKE_id_lib_local_paths(G.main, part->id.lib, &partn->id); + } + return partn; } diff --git a/source/blender/blenkernel/intern/speaker.c b/source/blender/blenkernel/intern/speaker.c index 08daa09..b11d0ae 100644 --- a/source/blender/blenkernel/intern/speaker.c +++ b/source/blender/blenkernel/intern/speaker.c @@ -67,6 +67,10 @@ Speaker *BKE_speaker_copy(Speaker *spk) if (spkn->sound) spkn->sound->id.us++; + if (spk->id.lib) { + BKE_id_lib_local_paths(G.main, spk->id.lib, &spkn->id); + } + return spkn; } diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index 86c7f6f..3a311bf 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -455,17 +455,7 @@ Text *BKE_text_copy(Main *bmain, Text *ta) /* file name can be NULL */ if (ta->name) { - if (ta->id.lib && BLI_path_is_rel(ta->name)) { - char tname[FILE_MAXFILE]; - /* If path is relative, and source is a lib, path is relative to lib file, not main one! */ - BLI_strncpy(tname, ta->name, sizeof(tname)); - BLI_path_abs(tname, ta->id.lib->filepath); - BLI_path_rel(tname, bmain->name); - tan->name = BLI_strdup(tname); - } - else { - tan->name = BLI_strdup(ta->name); - } + tan->name = BLI_strdup(ta->name); } else { tan->name = NULL; @@ -499,6 +489,10 @@ Te @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] http://lists.blender.org/mailman/listinfo/bf-blender-cvs
