forked from bartvdbraak/blender
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
This commit is contained in:
parent
1b8240f5af
commit
95847f6ac7
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 @@ Text *BKE_text_copy(Main *bmain, Text *ta)
|
||||
|
||||
init_undo_text(tan);
|
||||
|
||||
if (ta->id.lib) {
|
||||
BKE_id_lib_local_paths(bmain, ta->id.lib, &tan->id);
|
||||
}
|
||||
|
||||
return tan;
|
||||
}
|
||||
|
||||
|
@ -844,6 +844,10 @@ Tex *BKE_texture_copy(Tex *tex)
|
||||
texn->nodetree = ntreeCopyTree(tex->nodetree);
|
||||
}
|
||||
|
||||
if (tex->id.lib) {
|
||||
BKE_id_lib_local_paths(G.main, tex->id.lib, &texn->id);
|
||||
}
|
||||
|
||||
return texn;
|
||||
}
|
||||
|
||||
|
@ -140,7 +140,11 @@ World *BKE_world_copy(World *wrld)
|
||||
wrldn->preview = BKE_previewimg_copy(wrld->preview);
|
||||
|
||||
BLI_listbase_clear(&wrldn->gpumaterial);
|
||||
|
||||
|
||||
if (wrld->id.lib) {
|
||||
BKE_id_lib_local_paths(G.main, wrld->id.lib, &wrldn->id);
|
||||
}
|
||||
|
||||
return wrldn;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user