Add option to id_make_local to force localization of datablock, even if not used...
authorBastien Montagne <montagne29@wanadoo.fr>
Thu, 14 Jul 2016 11:03:22 +0000 (13:03 +0200)
committerBastien Montagne <montagne29@wanadoo.fr>
Thu, 14 Jul 2016 16:33:12 +0000 (18:33 +0200)
Will be used by link/append code.

42 files changed:
source/blender/blenkernel/BKE_action.h
source/blender/blenkernel/BKE_armature.h
source/blender/blenkernel/BKE_brush.h
source/blender/blenkernel/BKE_camera.h
source/blender/blenkernel/BKE_curve.h
source/blender/blenkernel/BKE_image.h
source/blender/blenkernel/BKE_key.h
source/blender/blenkernel/BKE_lamp.h
source/blender/blenkernel/BKE_lattice.h
source/blender/blenkernel/BKE_library.h
source/blender/blenkernel/BKE_material.h
source/blender/blenkernel/BKE_mball.h
source/blender/blenkernel/BKE_mesh.h
source/blender/blenkernel/BKE_node.h
source/blender/blenkernel/BKE_object.h
source/blender/blenkernel/BKE_particle.h
source/blender/blenkernel/BKE_speaker.h
source/blender/blenkernel/BKE_texture.h
source/blender/blenkernel/BKE_world.h
source/blender/blenkernel/intern/action.c
source/blender/blenkernel/intern/anim_sys.c
source/blender/blenkernel/intern/armature.c
source/blender/blenkernel/intern/brush.c
source/blender/blenkernel/intern/camera.c
source/blender/blenkernel/intern/curve.c
source/blender/blenkernel/intern/image.c
source/blender/blenkernel/intern/key.c
source/blender/blenkernel/intern/lamp.c
source/blender/blenkernel/intern/lattice.c
source/blender/blenkernel/intern/library.c
source/blender/blenkernel/intern/material.c
source/blender/blenkernel/intern/mball.c
source/blender/blenkernel/intern/mesh.c
source/blender/blenkernel/intern/node.c
source/blender/blenkernel/intern/object.c
source/blender/blenkernel/intern/particle.c
source/blender/blenkernel/intern/speaker.c
source/blender/blenkernel/intern/texture.c
source/blender/blenkernel/intern/world.c
source/blender/editors/interface/interface_templates.c
source/blender/editors/object/object_relations.c
source/blender/editors/space_outliner/outliner_tools.c

index 5874f95502bebf4c133fef856436042d7378ef25..ac9b0b6fb101dc2ca186f354f89d4025c27e4113 100644 (file)
@@ -63,7 +63,7 @@ struct bAction *BKE_action_copy(struct Main *bmain, struct bAction *src);
 /* Deallocate all of the Action's data, but not the Action itself */
 void BKE_action_free(struct bAction *act);
 
-void BKE_action_make_local(struct Main *bmain, struct bAction *act);
+void BKE_action_make_local(struct Main *bmain, struct bAction *act, const bool force_local);
 
 
 /* Action API ----------------- */
index 326c335338f7337be450b0c513b2401311ac35fc..bfd4a7e3dd8c459d295d99371a2520ea302d3c52 100644 (file)
@@ -76,7 +76,7 @@ struct bArmature *BKE_armature_from_object(struct Object *ob);
 int  BKE_armature_bonelist_count(struct ListBase *lb);
 void BKE_armature_bonelist_free(struct ListBase *lb);
 void BKE_armature_free(struct bArmature *arm);
-void BKE_armature_make_local(struct Main *bmain, struct bArmature *arm);
+void BKE_armature_make_local(struct Main *bmain, struct bArmature *arm, const bool force_local);
 struct bArmature *BKE_armature_copy(struct Main *bmain, struct bArmature *arm);
 
 /* Bounding box. */
index c7116bf2ef684c02b60eef3651a442f990effa2f..4be4d95490bee624a54adca9be2ed73f0f61589f 100644 (file)
@@ -45,7 +45,7 @@ void BKE_brush_init(struct Brush *brush);
 struct Brush *BKE_brush_add(struct Main *bmain, const char *name, short ob_mode);
 struct Brush *BKE_brush_first_search(struct Main *bmain, short ob_mode);
 struct Brush *BKE_brush_copy(struct Main *bmain, struct Brush *brush);
-void BKE_brush_make_local(struct Main *bmain, struct Brush *brush);
+void BKE_brush_make_local(struct Main *bmain, struct Brush *brush, const bool force_local);
 void BKE_brush_unlink(struct Main *bmain, struct Brush *brush);
 void BKE_brush_free(struct Brush *brush);
 
index 97f4b30894b2cc172476d63533e4b2eea639ba4d..3ae0e0e1111700574794ac1af3c34ac270c0a614 100644 (file)
@@ -53,7 +53,7 @@ struct GPUFXSettings;
 void BKE_camera_init(struct Camera *cam);
 void *BKE_camera_add(struct Main *bmain, const char *name);
 struct Camera *BKE_camera_copy(struct Main *bmain, struct Camera *cam);
-void BKE_camera_make_local(struct Main *bmain, struct Camera *cam);
+void BKE_camera_make_local(struct Main *bmain, struct Camera *cam, const bool force_local);
 void BKE_camera_free(struct Camera *ca);
 
 /* Camera Usage */
index 89dbe2469105bf296c7028e61585bef7d92e0b89..c2a0404e96e38485e30f384d0cd38041477c935c 100644 (file)
@@ -71,7 +71,7 @@ void BKE_curve_editfont_free(struct Curve *cu);
 void BKE_curve_init(struct Curve *cu);
 struct Curve *BKE_curve_add(struct Main *bmain, const char *name, int type);
 struct Curve *BKE_curve_copy(struct Main *bmain, struct Curve *cu);
-void BKE_curve_make_local(struct Main *bmain, struct Curve *cu);
+void BKE_curve_make_local(struct Main *bmain, struct Curve *cu, const bool force_local);
 short BKE_curve_type_get(struct Curve *cu);
 void BKE_curve_type_test(struct Object *ob);
 void BKE_curve_curve_dimension_update(struct Curve *cu);
index 0895feef983447e0153f94d172cfb2e1a50be478..db73b42d894a06278c09ab180d116048958e8ce9 100644 (file)
@@ -108,7 +108,7 @@ struct anim *openanim_noload(const char *name, int flags, int streamindex, char
 
 void    BKE_image_de_interlace(struct Image *ima, int odd);
 
-void    BKE_image_make_local(struct Main *bmain, struct Image *ima);
+void    BKE_image_make_local(struct Main *bmain, struct Image *ima, const bool force_local);
 
 void    BKE_image_tag_time(struct Image *ima);
 
index f30f9eac4e81b115ba82cef62028a573111cb0d2..b55915276b1703dc7d0b478d60793148d5a98a8c 100644 (file)
@@ -53,7 +53,7 @@ void        BKE_key_free_nolib(struct Key *key);
 struct Key *BKE_key_add(struct ID *id);
 struct Key *BKE_key_copy(struct Main *bmain, struct Key *key);
 struct Key *BKE_key_copy_nolib(struct Key *key);
-void        BKE_key_make_local(struct Main *bmain, struct Key *key);
+void        BKE_key_make_local(struct Main *bmain, struct Key *key, const bool force_local);
 void        BKE_key_sort(struct Key *key);
 
 void key_curve_position_weights(float t, float data[4], int type);
index 49b43550e67902343931c0e3c4e385fdd683009c..dc977eabbb1f24916fdcf0b1d2385eb6678e4e7e 100644 (file)
@@ -46,7 +46,7 @@ void BKE_lamp_init(struct Lamp *la);
 struct Lamp *BKE_lamp_add(struct Main *bmain, const char *name) ATTR_WARN_UNUSED_RESULT;
 struct Lamp *BKE_lamp_copy(struct Main *bmain, struct Lamp *la) ATTR_WARN_UNUSED_RESULT;
 struct Lamp *localize_lamp(struct Lamp *la) ATTR_WARN_UNUSED_RESULT;
-void BKE_lamp_make_local(struct Main *bmain, struct Lamp *la);
+void BKE_lamp_make_local(struct Main *bmain, struct Lamp *la, const bool force_local);
 void BKE_lamp_free(struct Lamp *la);
 
 void lamp_drivers_update(struct Scene *scene, struct Lamp *la, float ctime);
index 606df9dcec88eef2c36711fb4096f503f22bfe32..4f72bbecff45e46c3b866407c239e8363495c125 100644 (file)
@@ -49,7 +49,7 @@ void BKE_lattice_init(struct Lattice *lt);
 struct Lattice *BKE_lattice_add(struct Main *bmain, const char *name);
 struct Lattice *BKE_lattice_copy(struct Main *bmain, struct Lattice *lt);
 void BKE_lattice_free(struct Lattice *lt);
-void BKE_lattice_make_local(struct Main *bmain, struct Lattice *lt);
+void BKE_lattice_make_local(struct Main *bmain, struct Lattice *lt, const bool force_local);
 void calc_lat_fudu(int flag, int res, float *r_fu, float *r_du);
 
 struct LatticeDeformData;
index d419d25747181bcc32478fdaed7f29d9d8101a78..3e8ede638ca4917831d53be9d6178db50ef2caec 100644 (file)
@@ -80,7 +80,7 @@ void id_us_min(struct ID *id);
 void id_fake_user_set(struct ID *id);
 void id_fake_user_clear(struct ID *id);
 
-bool id_make_local(struct Main *bmain, struct ID *id, bool test);
+bool id_make_local(struct Main *bmain, struct ID *id, const bool test, const bool force_local);
 bool id_single_user(struct bContext *C, struct ID *id, struct PointerRNA *ptr, struct PropertyRNA *prop);
 bool id_copy(struct Main *bmain, struct ID *id, struct ID **newid, bool test);
 void id_sort_by_name(struct ListBase *lb, struct ID *id);
index 0bc54ee4a16ef32c575997f2fb44265d777a0449..bbe104cd6ee5c23e4b811978c295696fc8baf4c9 100644 (file)
@@ -57,7 +57,7 @@ struct Material *BKE_material_add(struct Main *bmain, const char *name);
 struct Material *BKE_material_copy(struct Main *bmain, struct Material *ma);
 struct Material *localize_material(struct Material *ma);
 struct Material *give_node_material(struct Material *ma); /* returns node material or self */
-void BKE_material_make_local(struct Main *bmain, struct Material *ma);
+void BKE_material_make_local(struct Main *bmain, struct Material *ma, const bool force_local);
 
 /* UNUSED */
 // void automatname(struct Material *);
index 42704c1b2db73a95e149d9a5ec418463e05fe282..191e87210995c8c934ea30ba7ca30e9ff0c6d9b1 100644 (file)
@@ -43,7 +43,7 @@ void BKE_mball_init(struct MetaBall *mb);
 struct MetaBall *BKE_mball_add(struct Main *bmain, const char *name);
 struct MetaBall *BKE_mball_copy(struct Main *bmain, struct MetaBall *mb);
 
-void BKE_mball_make_local(struct Main *bmain, struct MetaBall *mb);
+void BKE_mball_make_local(struct Main *bmain, struct MetaBall *mb, const bool force_local);
 
 bool BKE_mball_is_basis_for(struct Object *ob1, struct Object *ob2);
 bool BKE_mball_is_basis(struct Object *ob);
index d3bb34d7a41c7521f3425b2d884a32831f1f0cd6..ef8d1c9831891d5ea201f681141578122c158628 100644 (file)
@@ -91,7 +91,7 @@ struct Mesh *BKE_mesh_copy(struct Main *bmain, struct Mesh *me);
 void BKE_mesh_update_customdata_pointers(struct Mesh *me, const bool do_ensure_tess_cd);
 void BKE_mesh_ensure_skin_customdata(struct Mesh *me);
 
-void BKE_mesh_make_local(struct Main *bmain, struct Mesh *me);
+void BKE_mesh_make_local(struct Main *bmain, struct Mesh *me, const bool force_local);
 void BKE_mesh_boundbox_calc(struct Mesh *me, float r_loc[3], float r_size[3]);
 void BKE_mesh_texspace_calc(struct Mesh *me);
 float (*BKE_mesh_orco_verts_get(struct Object *ob))[3];
index b44cb226f0d15a83ce81217dc1a6dac3da4fe545..647b96fb9aef7a82bafd7427c4a6ae3603ff6117 100644 (file)
@@ -346,7 +346,7 @@ void              ntreeUserDecrefID(struct bNodeTree *ntree);
 
 struct bNodeTree *ntreeFromID(struct ID *id);
 
-void              ntreeMakeLocal(struct Main *bmain, struct bNodeTree *ntree, bool id_in_mainlist);
+void              ntreeMakeLocal(struct Main *bmain, struct bNodeTree *ntree, bool id_in_mainlist, const bool force_local);
 struct bNode     *ntreeFindType(const struct bNodeTree *ntree, int type);
 bool              ntreeHasType(const struct bNodeTree *ntree, int type);
 bool              ntreeHasTree(const struct bNodeTree *ntree, const struct bNodeTree *lookup);
index 09a6a71694441533aa110319b1939ea595b33671..509524a7ce06710fc9286eb47979c4b885c79d15 100644 (file)
@@ -107,7 +107,7 @@ struct Object *BKE_object_lod_matob_get(struct Object *ob, struct Scene *scene);
 
 struct Object *BKE_object_copy_ex(struct Main *bmain, struct Object *ob, bool copy_caches);
 struct Object *BKE_object_copy(struct Main *bmain, struct Object *ob);
-void BKE_object_make_local(struct Main *bmain, struct Object *ob);
+void BKE_object_make_local(struct Main *bmain, struct Object *ob, const bool force_local);
 bool BKE_object_is_libdata(struct Object *ob);
 bool BKE_object_obdata_is_libdata(struct Object *ob);
 
index 0b2e23834572a667bbd05fb10b2a8e7aa038fdc6..b22facd23947c1e34dcc121739c005e4fd1249b4 100644 (file)
@@ -324,7 +324,7 @@ struct ModifierData *object_add_particle_system(struct Scene *scene, struct Obje
 void object_remove_particle_system(struct Scene *scene, struct Object *ob);
 struct ParticleSettings *psys_new_settings(const char *name, struct Main *main);
 struct ParticleSettings *BKE_particlesettings_copy(struct Main *bmain, struct ParticleSettings *part);
-void BKE_particlesettings_make_local(struct Main *bmain, struct ParticleSettings *part);
+void BKE_particlesettings_make_local(struct Main *bmain, struct ParticleSettings *part, const bool force_local);
 
 void psys_reset(struct ParticleSystem *psys, int mode);
 
index 89b948a2126e0364412dd154c86d9b26d2ee375a..fb730d95b923acccb088af05ecfc5f039290e27c 100644 (file)
@@ -34,7 +34,7 @@ struct Speaker;
 void BKE_speaker_init(struct Speaker *spk);
 void *BKE_speaker_add(struct Main *bmain, const char *name);
 struct Speaker *BKE_speaker_copy(struct Main *bmain, struct Speaker *spk);
-void BKE_speaker_make_local(struct Main *bmain, struct Speaker *spk);
+void BKE_speaker_make_local(struct Main *bmain, struct Speaker *spk, const bool force_local);
 void BKE_speaker_free(struct Speaker *spk);
 
 #endif
index 56f056c681ab93a18645447bab351d6fdd8b2e4e..eef02f633500b5d5803a76a54f1e37b542a96b37 100644 (file)
@@ -72,7 +72,7 @@ void         BKE_texture_default(struct Tex *tex);
 struct Tex  *BKE_texture_copy(struct Main *bmain, struct Tex *tex);
 struct Tex  *BKE_texture_add(struct Main *bmain, const char *name);
 struct Tex  *BKE_texture_localize(struct Tex *tex);
-void         BKE_texture_make_local(struct Main *bmain, struct Tex *tex);
+void         BKE_texture_make_local(struct Main *bmain, struct Tex *tex, const bool force_local);
 void         BKE_texture_type_set(struct Tex *tex, int type);
 
 void         BKE_texture_mtex_default(struct MTex *mtex);
index da5cca09b27d7e0b69af708ce52491df0fcce97c..8b8dac4ab2201b9627ad43ddb13f6ccab6d3baa3 100644 (file)
@@ -41,7 +41,7 @@ void BKE_world_init(struct World *wrld);
 struct World *add_world(struct Main *bmian, const char *name);
 struct World *BKE_world_copy(struct Main *bmain, struct World *wrld);
 struct World *localize_world(struct World *wrld);
-void BKE_world_make_local(struct Main *bmain, struct World *wrld);
+void BKE_world_make_local(struct Main *bmain, struct World *wrld, const bool force_local);
 
 #endif
 
index f7ff1261c8a8b520be97d7dcbc4ea9f1e58d48fd..fa49797126d87c892fcea494a04baad6740f9d60 100644 (file)
@@ -95,11 +95,11 @@ bAction *add_empty_action(Main *bmain, const char name[])
 /* .................................. */
 
 // does copy_fcurve...
-void BKE_action_make_local(Main *bmain, bAction *act)
+void BKE_action_make_local(Main *bmain, bAction *act, const bool force_local)
 {
        bool is_local = false, is_lib = false;
 
-       /* - only lib users: do nothing
+       /* - only lib users: do nothing (unless force_local is set)
         * - only local users: set flag
         * - mixed: make copy
         */
@@ -110,7 +110,7 @@ void BKE_action_make_local(Main *bmain, bAction *act)
 
        BKE_library_ID_test_usages(bmain, act, &is_local, &is_lib);
 
-       if (is_local) {
+       if (force_local || is_local) {
                if (!is_lib) {
                        id_clear_lib_data(bmain, &act->id);
                        BKE_id_expand_local(&act->id);
index d6f93528262ea99dde9b82d93bc5282bfc61208c..d04b950c0434a3064c0b755ed2d73787350fa0da 100644 (file)
@@ -400,8 +400,8 @@ static void make_local_strips(ListBase *strips)
        NlaStrip *strip;
 
        for (strip = strips->first; strip; strip = strip->next) {
-               if (strip->act) BKE_action_make_local(G.main, strip->act);
-               if (strip->remap && strip->remap->target) BKE_action_make_local(G.main, strip->remap->target);
+               if (strip->act) BKE_action_make_local(G.main, strip->act, false);
+               if (strip->remap && strip->remap->target) BKE_action_make_local(G.main, strip->remap->target, false);
                
                make_local_strips(&strip->strips);
        }
@@ -413,10 +413,10 @@ void BKE_animdata_make_local(AnimData *adt)
        NlaTrack *nlt;
        
        /* Actions - Active and Temp */
-       if (adt->action) BKE_action_make_local(G.main, adt->action);
-       if (adt->tmpact) BKE_action_make_local(G.main, adt->tmpact);
+       if (adt->action) BKE_action_make_local(G.main, adt->action, false);
+       if (adt->tmpact) BKE_action_make_local(G.main, adt->tmpact, false);
        /* Remaps */
-       if (adt->remap && adt->remap->target) BKE_action_make_local(G.main, adt->remap->target);
+       if (adt->remap && adt->remap->target) BKE_action_make_local(G.main, adt->remap->target, false);
        
        /* Drivers */
        /* TODO: need to remap the ID-targets too? */
index 5f564e1c4d2fc8682ad679362ebb44bdf6828ed1..53e28177bdffea3f9be01e7ad8446b7ba2734146 100644 (file)
@@ -144,11 +144,11 @@ void BKE_armature_free(bArmature *arm)
        }
 }
 
-void BKE_armature_make_local(Main *bmain, bArmature *arm)
+void BKE_armature_make_local(Main *bmain, bArmature *arm, const bool force_local)
 {
        bool is_local = false, is_lib = false;
 
-       /* - only lib users: do nothing
+       /* - only lib users: do nothing (unless force_local is set)
         * - only local users: set flag
         * - mixed: make copy
         */
@@ -159,7 +159,7 @@ void BKE_armature_make_local(Main *bmain, bArmature *arm)
 
        BKE_library_ID_test_usages(bmain, arm, &is_local, &is_lib);
 
-       if (is_local) {
+       if (force_local || is_local) {
                if (!is_lib) {
                        id_clear_lib_data(bmain, &arm->id);
                        BKE_id_expand_local(&arm->id);
index 20621feac6cde3ddb087480da41e216190f12d58..3d9cabdc15dff7368c1f9355d526a2f0905ea19e 100644 (file)
@@ -219,11 +219,11 @@ void BKE_brush_free(Brush *brush)
        BKE_previewimg_free(&(brush->preview));
 }
 
-void BKE_brush_make_local(Main *bmain, Brush *brush)
+void BKE_brush_make_local(Main *bmain, Brush *brush, const bool force_local)
 {
        bool is_local = false, is_lib = false;
 
-       /* - only lib users: do nothing
+       /* - only lib users: do nothing (unless force_local is set)
         * - only local users: set flag
         * - mixed: make copy
         */
@@ -234,12 +234,12 @@ void BKE_brush_make_local(Main *bmain, Brush *brush)
 
        if (brush->clone.image) {
                /* Special case: ima always local immediately. Clone image should only have one user anyway. */
-               id_make_local(bmain, &brush->clone.image->id, false);
+               id_make_local(bmain, &brush->clone.image->id, false, false);
        }
 
        BKE_library_ID_test_usages(bmain, brush, &is_local, &is_lib);
 
-       if (is_local) {
+       if (force_local || is_local) {
                if (!is_lib) {
                        id_clear_lib_data(bmain, &brush->id);
                        BKE_id_expand_local(&brush->id);
index ae7aac8b54fcd3229d778401198430f7f6cf0942..cd085816b4d1bba8d4b93a014e908e35e2c39048 100644 (file)
@@ -107,11 +107,11 @@ Camera *BKE_camera_copy(Main *bmain, Camera *cam)
        return camn;
 }
 
-void BKE_camera_make_local(Main *bmain, Camera *cam)
+void BKE_camera_make_local(Main *bmain, Camera *cam, const bool force_local)
 {
        bool is_local = false, is_lib = false;
 
-       /* - only lib users: do nothing
+       /* - only lib users: do nothing (unless force_local is set)
         * - only local users: set flag
         * - mixed: make copy
         */
@@ -122,7 +122,7 @@ void BKE_camera_make_local(Main *bmain, Camera *cam)
 
        BKE_library_ID_test_usages(bmain, cam, &is_local, &is_lib);
 
-       if (is_local) {
+       if (force_local || is_local) {
                if (!is_lib) {
                        id_clear_lib_data(bmain, &cam->id);
                        BKE_id_expand_local(&cam->id);
index 0e634e21ea3d00321c629cf4d459ff431e9c6740..fa7dac5d432b07905f98d6b14f911d9f0dc80ae1 100644 (file)
@@ -215,11 +215,11 @@ Curve *BKE_curve_copy(Main *bmain, Curve *cu)
        return cun;
 }
 
-void BKE_curve_make_local(Main *bmain, Curve *cu)
+void BKE_curve_make_local(Main *bmain, Curve *cu, const bool force_local)
 {
        bool is_local = false, is_lib = false;
 
-       /* - when there are only lib users: don't do
+       /* - only lib users: do nothing (unless force_local is set)
         * - when there are only local users: set flag
         * - mixed: do a copy
         */
@@ -230,11 +230,11 @@ void BKE_curve_make_local(Main *bmain, Curve *cu)
 
        BKE_library_ID_test_usages(bmain, cu, &is_local, &is_lib);
 
-       if (is_local) {
+       if (force_local || is_local) {
                if (!is_lib) {
                        id_clear_lib_data(bmain, &cu->id);
                        if (cu->key) {
-                               BKE_key_make_local(bmain, cu->key);
+                               BKE_key_make_local(bmain, cu->key, force_local);
                        }
                        BKE_id_expand_local(&cu->id);
                }
index f993c05e19827b4016f8ab4e54bf6591b1be0fa9..ae3163d388e49915f53dce219694981e960f689f 100644 (file)
@@ -469,11 +469,11 @@ Image *BKE_image_copy(Main *bmain, Image *ima)
        return nima;
 }
 
-void BKE_image_make_local(Main *bmain, Image *ima)
+void BKE_image_make_local(Main *bmain, Image *ima, const bool force_local)
 {
        bool is_local = false, is_lib = false;
 
-       /* - only lib users: do nothing
+       /* - only lib users: do nothing (unless force_local is set)
         * - only local users: set flag
         * - mixed: make copy
         */
@@ -484,7 +484,7 @@ void BKE_image_make_local(Main *bmain, Image *ima)
 
        BKE_library_ID_test_usages(bmain, ima, &is_local, &is_lib);
 
-       if (is_local) {
+       if (force_local || is_local) {
                if (!is_lib) {
                        id_clear_lib_data(bmain, &ima->id);
                        BKE_id_expand_local(&ima->id);
index e59facd3c39d6034efd91fea0641af23d3384aca..c61aee704d2edded8f8f9abf7f8d4ac3c15023b4 100644 (file)
@@ -203,7 +203,7 @@ Key *BKE_key_copy_nolib(Key *key)
        return keyn;
 }
 
-void BKE_key_make_local(Main *bmain, Key *key)
+void BKE_key_make_local(Main *bmain, Key *key, const bool UNUSED(force_local))
 {
        /* Note that here for now we simply just make it local...
         * Sounds fishy behavior, but since skeys are not *real* IDs... */
index 003b154a70b0c65baaec8085d96d68c444e2b806..c224b5ca0a7cc3a21638819ef037099958f247e4 100644 (file)
@@ -172,11 +172,11 @@ Lamp *localize_lamp(Lamp *la)
        return lan;
 }
 
-void BKE_lamp_make_local(Main *bmain, Lamp *la)
+void BKE_lamp_make_local(Main *bmain, Lamp *la, const bool force_local)
 {
        bool is_local = false, is_lib = false;
 
-       /* - only lib users: do nothing
+       /* - only lib users: do nothing (unless force_local is set)
         * - only local users: set flag
         * - mixed: make copy
         */
@@ -187,7 +187,7 @@ void BKE_lamp_make_local(Main *bmain, Lamp *la)
 
        BKE_library_ID_test_usages(bmain, la, &is_local, &is_lib);
 
-       if (is_local) {
+       if (force_local || is_local) {
                if (!is_lib) {
                        id_clear_lib_data(bmain, &la->id);
                        BKE_id_expand_local(&la->id);
index 67f49266efc829bbd5d1aa12b6cb1107707e0df8..9d4f14110a2e2e3e191ec531f7b3f6f42a27ac13 100644 (file)
@@ -330,11 +330,11 @@ void BKE_lattice_free(Lattice *lt)
 }
 
 
-void BKE_lattice_make_local(Main *bmain, Lattice *lt)
+void BKE_lattice_make_local(Main *bmain, Lattice *lt, const bool force_local)
 {
        bool is_local = false, is_lib = false;
 
-       /* - only lib users: do nothing
+       /* - only lib users: do nothing (unless force_local is set)
         * - only local users: set flag
         * - mixed: make copy
         */
@@ -345,11 +345,11 @@ void BKE_lattice_make_local(Main *bmain, Lattice *lt)
 
        BKE_library_ID_test_usages(bmain, lt, &is_local, &is_lib);
 
-       if (is_local) {
+       if (force_local || is_local) {
                if (!is_lib) {
                        id_clear_lib_data(bmain, &lt->id);
                        if (lt->key) {
-                               BKE_key_make_local(bmain, lt->key);
+                               BKE_key_make_local(bmain, lt->key, force_local);
                        }
                        BKE_id_expand_local(&lt->id);
                }
index 869e02448eac326cc8743dd73e7275974b67488f..4680d481ff6872eeb12255c0464e428b116f47e4 100644 (file)
@@ -271,7 +271,7 @@ void BKE_id_expand_local(ID *id)
 
 /* calls the appropriate make_local method for the block, unless test. Returns true
  * if the block can be made local. */
-bool id_make_local(Main *bmain, ID *id, bool test)
+bool id_make_local(Main *bmain, ID *id, const bool test, const bool force_local)
 {
        if (id->tag & LIB_TAG_INDIRECT)
                return false;
@@ -282,45 +282,45 @@ bool id_make_local(Main *bmain, ID *id, bool test)
                case ID_LI:
                        return false; /* can't be linked */
                case ID_OB:
-                       if (!test) BKE_object_make_local(bmain, (Object *)id);
+                       if (!test) BKE_object_make_local(bmain, (Object *)id, force_local);
                        return true;
                case ID_ME:
-                       if (!test) BKE_mesh_make_local(bmain, (Mesh *)id);
+                       if (!test) BKE_mesh_make_local(bmain, (Mesh *)id, force_local);
                        return true;
                case ID_CU:
-                       if (!test) BKE_curve_make_local(bmain, (Curve *)id);
+                       if (!test) BKE_curve_make_local(bmain, (Curve *)id, force_local);
                        return true;
                case ID_MB:
-                       if (!test) BKE_mball_make_local(bmain, (MetaBall *)id);
+                       if (!test) BKE_mball_make_local(bmain, (MetaBall *)id, force_local);
                        return true;
                case ID_MA:
-                       if (!test) BKE_material_make_local(bmain, (Material *)id);
+                       if (!test) BKE_material_make_local(bmain, (Material *)id, force_local);
                        return true;
                case ID_TE:
-                       if (!test) BKE_texture_make_local(bmain, (Tex *)id);
+                       if (!test) BKE_texture_make_local(bmain, (Tex *)id, force_local);
                        return true;
                case ID_IM:
-                       if (!test) BKE_image_make_local(bmain, (Image *)id);
+                       if (!test) BKE_image_make_local(bmain, (Image *)id, force_local);
                        return true;
                case ID_LT:
-                       if (!test) BKE_lattice_make_local(bmain, (Lattice *)id);
+                       if (!test) BKE_lattice_make_local(bmain, (Lattice *)id, force_local);
                        return true;
                case ID_LA:
-                       if (!test) BKE_lamp_make_local(bmain, (Lamp *)id);
+                       if (!test) BKE_lamp_make_local(bmain, (Lamp *)id, force_local);
                        return true;
                case ID_CA:
-                       if (!test) BKE_camera_make_local(bmain, (Camera *)id);
+                       if (!test) BKE_camera_make_local(bmain, (Camera *)id, force_local);
                        return true;
                case ID_SPK:
-                       if (!test) BKE_speaker_make_local(bmain, (Speaker *)id);
+                       if (!test) BKE_speaker_make_local(bmain, (Speaker *)id, force_local);
                        return true;
                case ID_IP:
                        return false; /* deprecated */
                case ID_KE:
-                       if (!test) BKE_key_make_local(bmain, (Key *)id);
+                       if (!test) BKE_key_make_local(bmain, (Key *)id, force_local);
                        return true;
                case ID_WO:
-                       if (!test) BKE_world_make_local(bmain, (World *)id);
+                       if (!test) BKE_world_make_local(bmain, (World *)id, force_local);
                        return true;
                case ID_SCR:
                        return false; /* can't be linked */
@@ -333,19 +333,19 @@ bool id_make_local(Main *bmain, ID *id, bool test)
                case ID_GR:
                        return false; /* not implemented */
                case ID_AR:
-                       if (!test) BKE_armature_make_local(bmain, (bArmature *)id);
+                       if (!test) BKE_armature_make_local(bmain, (bArmature *)id, force_local);
                        return true;
                case ID_AC:
-                       if (!test) BKE_action_make_local(bmain, (bAction *)id);
+                       if (!test) BKE_action_make_local(bmain, (bAction *)id, force_local);
                        return true;
                case ID_NT:
-                       if (!test) ntreeMakeLocal(bmain, (bNodeTree *)id, true);
+                       if (!test) ntreeMakeLocal(bmain, (bNodeTree *)id, true, force_local);
                        return true;
                case ID_BR:
-                       if (!test) BKE_brush_make_local(bmain, (Brush *)id);
+                       if (!test) BKE_brush_make_local(bmain, (Brush *)id, force_local);
                        return true;
                case ID_PA:
-                       if (!test) BKE_particlesettings_make_local(bmain, (ParticleSettings *)id);
+                       if (!test) BKE_particlesettings_make_local(bmain, (ParticleSettings *)id, force_local);
                        return true;
                case ID_WM:
                        return false; /* can't be linked */
@@ -1487,7 +1487,7 @@ void id_clear_lib_data_ex(Main *bmain, ID *id, bool id_in_mainlist)
        ntree = ntreeFromID(id);
 
        if (ntree) {
-               ntreeMakeLocal(bmain, ntree, false);
+               ntreeMakeLocal(bmain, ntree, false, false);
        }
 
        if (GS(id->name) == ID_OB) {
index 17811893c03c770101c9dcac77c73890344e92a2..2ae369fdd1bf9597d1bde9f2dc80436751064058 100644 (file)
@@ -285,11 +285,11 @@ Material *localize_material(Material *ma)
        return man;
 }
 
-void BKE_material_make_local(Main *bmain, Material *ma)
+void BKE_material_make_local(Main *bmain, Material *ma, const bool force_local)
 {
        bool is_local = false, is_lib = false;
 
-       /* - only lib users: do nothing
+       /* - only lib users: do nothing (unless force_local is set)
         * - only local users: set flag
         * - mixed: make copy
         */
@@ -300,7 +300,7 @@ void BKE_material_make_local(Main *bmain, Material *ma)
 
        BKE_library_ID_test_usages(bmain, ma, &is_local, &is_lib);
 
-       if (is_local) {
+       if (force_local || is_local) {
                if (!is_lib) {
                        id_clear_lib_data(bmain, &ma->id);
                        BKE_id_expand_local(&ma->id);
index 9a0a6e3540ceb74eb8daec1ae5706bd84e7530e0..aeb38b3bd1d0cb18d4ef003ee36e5f8f1e821efe 100644 (file)
@@ -127,11 +127,11 @@ MetaBall *BKE_mball_copy(Main *bmain, MetaBall *mb)
        return mbn;
 }
 
-void BKE_mball_make_local(Main *bmain, MetaBall *mb)
+void BKE_mball_make_local(Main *bmain, MetaBall *mb, const bool force_local)
 {
        bool is_local = false, is_lib = false;
 
-       /* - only lib users: do nothing
+       /* - only lib users: do nothing (unless force_local is set)
         * - only local users: set flag
         * - mixed: make copy
         */
@@ -142,7 +142,7 @@ void BKE_mball_make_local(Main *bmain, MetaBall *mb)
 
        BKE_library_ID_test_usages(bmain, mb, &is_local, &is_lib);
 
-       if (is_local) {
+       if (force_local || is_local) {
                if (!is_lib) {
                        id_clear_lib_data(bmain, &mb->id);
                        BKE_id_expand_local(&mb->id);
index 787b990573424f06cae913bb41952bbff709459c..1dd22f4a32bbec26e24d1db21e14005d2948ff08 100644 (file)
@@ -555,11 +555,11 @@ BMesh *BKE_mesh_to_bmesh(
        return bm;
 }
 
-void BKE_mesh_make_local(Main *bmain, Mesh *me)
+void BKE_mesh_make_local(Main *bmain, Mesh *me, const bool force_local)
 {
        bool is_local = false, is_lib = false;
 
-       /* - only lib users: do nothing
+       /* - only lib users: do nothing (unless force_local is set)
         * - only local users: set flag
         * - mixed: make copy
         */
@@ -570,11 +570,11 @@ void BKE_mesh_make_local(Main *bmain, Mesh *me)
 
        BKE_library_ID_test_usages(bmain, me, &is_local, &is_lib);
 
-       if (is_local) {
+       if (force_local || is_local) {
                if (!is_lib) {
                        id_clear_lib_data(bmain, &me->id);
                        if (me->key) {
-                               BKE_key_make_local(bmain, me->key);
+                               BKE_key_make_local(bmain, me->key, force_local);
                        }
                        BKE_id_expand_local(&me->id);
                }
index 296a00388c48458bb4ba0cfad486d667f8dd26f5..1058b22f96efbce9957c65fdb5e4e2c6c324f5ea 100644 (file)
@@ -1951,11 +1951,11 @@ bNodeTree *ntreeFromID(ID *id)
        }
 }
 
-void ntreeMakeLocal(Main *bmain, bNodeTree *ntree, bool id_in_mainlist)
+void ntreeMakeLocal(Main *bmain, bNodeTree *ntree, bool id_in_mainlist, const bool force_local)
 {
        bool is_lib = false, is_local = false;
        
-       /* - only lib users: do nothing
+       /* - only lib users: do nothing (unless force_local is set)
         * - only local users: set flag
         * - mixed: make copy
         */
@@ -1966,7 +1966,7 @@ void ntreeMakeLocal(Main *bmain, bNodeTree *ntree, bool id_in_mainlist)
 
        BKE_library_ID_test_usages(bmain, ntree, &is_local, &is_lib);
 
-       if (is_local) {
+       if (force_local || is_local) {
                if (!is_lib) {
                        id_clear_lib_data_ex(bmain, (ID *)ntree, id_in_mainlist);
                        BKE_id_expand_local(&ntree->id);
index 30a193506a61aed1d4c596c90e2ba2d01252eeae..4bdcec51360a6c24045e5fee03c4c179b0788f95 100644 (file)
@@ -1186,11 +1186,11 @@ Object *BKE_object_copy(Main *bmain, Object *ob)
        return BKE_object_copy_ex(bmain, ob, false);
 }
 
-void BKE_object_make_local(Main *bmain, Object *ob)
+void BKE_object_make_local(Main *bmain, Object *ob, const bool force_local)
 {
        bool is_local = false, is_lib = false;
 
-       /* - only lib users: do nothing
+       /* - only lib users: do nothing (unless force_local is set)
         * - only local users: set flag
         * - mixed: make copy
         */
@@ -1201,7 +1201,7 @@ void BKE_object_make_local(Main *bmain, Object *ob)
 
        BKE_library_ID_test_usages(bmain, ob, &is_local, &is_lib);
 
-       if (is_local) {
+       if (force_local || is_local) {
                if (!is_lib) {
                        id_clear_lib_data(bmain, &ob->id);
                        BKE_id_expand_local(&ob->id);
index 934c5b9ff066c7dab92f9101ee316eb8907aa0a6..2ff6c6c8b659355463a7c793c6d9c027c6932cd9 100644 (file)
@@ -3343,11 +3343,11 @@ ParticleSettings *BKE_particlesettings_copy(Main *bmain, ParticleSettings *part)
        return partn;
 }
 
-void BKE_particlesettings_make_local(Main *bmain, ParticleSettings *part)
+void BKE_particlesettings_make_local(Main *bmain, ParticleSettings *part, const bool force_local)
 {
        bool is_local = false, is_lib = false;
 
-       /* - only lib users: do nothing
+       /* - only lib users: do nothing (unless force_local is set)
         * - only local users: set flag
         * - mixed: make copy
         */
@@ -3358,7 +3358,7 @@ void BKE_particlesettings_make_local(Main *bmain, ParticleSettings *part)
 
        BKE_library_ID_test_usages(bmain, part, &is_local, &is_lib);
 
-       if (is_local) {
+       if (force_local || is_local) {
                if (!is_lib) {
                        id_clear_lib_data(bmain, &part->id);
                        BKE_id_expand_local(&part->id);
index a91d86571796ec1a288dc28c096a2d6d80efd0c3..c027f3b38ca80f6902c0d89d50f06f9a41a0653c 100644 (file)
@@ -85,11 +85,11 @@ Speaker *BKE_speaker_copy(Main *bmain, Speaker *spk)
        return spkn;
 }
 
-void BKE_speaker_make_local(Main *bmain, Speaker *spk)
+void BKE_speaker_make_local(Main *bmain, Speaker *spk, const bool force_local)
 {
        bool is_local = false, is_lib = false;
 
-       /* - only lib users: do nothing
+       /* - only lib users: do nothing (unless force_local is set)
         * - only local users: set flag
         * - mixed: make copy
         */
@@ -100,7 +100,7 @@ void BKE_speaker_make_local(Main *bmain, Speaker *spk)
 
        BKE_library_ID_test_usages(bmain, spk, &is_local, &is_lib);
 
-       if (is_local) {
+       if (force_local || is_local) {
                if (!is_lib) {
                        id_clear_lib_data(bmain, &spk->id);
                        BKE_id_expand_local(&spk->id);
index e34d632f2caa2c7a00f4665ce0e96c7df3d8abb7..460417cc2c0593eff7ac9f78a120b2b1b58447bf 100644 (file)
@@ -918,11 +918,11 @@ Tex *BKE_texture_localize(Tex *tex)
 
 /* ------------------------------------------------------------------------- */
 
-void BKE_texture_make_local(Main *bmain, Tex *tex)
+void BKE_texture_make_local(Main *bmain, Tex *tex, const bool force_local)
 {
        bool is_local = false, is_lib = false;
 
-       /* - only lib users: do nothing
+       /* - only lib users: do nothing (unless force_local is set)
         * - only local users: set flag
         * - mixed: make copy
         */
@@ -933,7 +933,7 @@ void BKE_texture_make_local(Main *bmain, Tex *tex)
 
        BKE_library_ID_test_usages(bmain, tex, &is_local, &is_lib);
 
-       if (is_local) {
+       if (force_local || is_local) {
                if (!is_lib) {
                        id_clear_lib_data(bmain, &tex->id);
                        BKE_id_expand_local(&tex->id);
index 9795a8174f8eb5be2704f7b9b4b7cbb666af7b67..277aeaa7e42247616ab481e6190c42ae72da8f4c 100644 (file)
@@ -176,11 +176,11 @@ World *localize_world(World *wrld)
        return wrldn;
 }
 
-void BKE_world_make_local(Main *bmain, World *wrld)
+void BKE_world_make_local(Main *bmain, World *wrld, const bool force_local)
 {
        bool is_local = false, is_lib = false;
 
-       /* - only lib users: do nothing
+       /* - only lib users: do nothing (unless force_local is set)
         * - only local users: set flag
         * - mixed: make copy
         */
@@ -191,7 +191,7 @@ void BKE_world_make_local(Main *bmain, World *wrld)
 
        BKE_library_ID_test_usages(bmain, wrld, &is_local, &is_lib);
 
-       if (is_local) {
+       if (force_local || is_local) {
                if (!is_lib) {
                        id_clear_lib_data(bmain, &wrld->id);
                        BKE_id_expand_local(&wrld->id);
index d91bd498225a65699c1ef6e118437ca6c78faf3e..aec4065adafb1daacd8e207712f3c0fe5dae5dcb 100644 (file)
@@ -302,7 +302,7 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
                        break;
                case UI_ID_LOCAL:
                        if (id) {
-                               if (id_make_local(CTX_data_main(C), id, false)) {
+                               if (id_make_local(CTX_data_main(C), id, false, false)) {
                                        /* reassign to get get proper updates/notifiers */
                                        idptr = RNA_property_pointer_get(&template->ptr, template->prop);
                                        RNA_property_pointer_set(&template->ptr, template->prop, idptr);
@@ -455,7 +455,7 @@ static void template_ID(
                        else {
                                but = uiDefIconBut(block, UI_BTYPE_BUT, 0, ICON_LIBRARY_DATA_DIRECT, 0, 0, UI_UNIT_X, UI_UNIT_Y,
                                                   NULL, 0, 0, 0, 0, TIP_("Direct linked library datablock, click to make local"));
-                               if (!id_make_local(CTX_data_main(C), id, true /* test */) || (idfrom && idfrom->lib))
+                               if (!id_make_local(CTX_data_main(C), id, true /* test */, false) || (idfrom && idfrom->lib))
                                        UI_but_flag_enable(but, UI_BUT_DISABLED);
                        }
 
index 6b16e19f79087d3f74aa1f47f0b3d1955299b280..b3edf1f5e0d19c443e4dae3f5018a3097db8e813 100644 (file)
@@ -2104,11 +2104,11 @@ static void make_local_makelocalmaterial(Material *ma)
        AnimData *adt;
        int b;
 
-       id_make_local(G.main, &ma->id, false);
+       id_make_local(G.main, &ma->id, false, false);
 
        for (b = 0; b < MAX_MTEX; b++)
                if (ma->mtex[b] && ma->mtex[b]->tex)
-                       id_make_local(G.main, &ma->mtex[b]->tex->id, false);
+                       id_make_local(G.main, &ma->mtex[b]->tex->id, false, false);
 
        adt = BKE_animdata_from_id(&ma->id);
        if (adt) BKE_animdata_make_local(adt);
@@ -2237,7 +2237,7 @@ static int make_local_exec(bContext *C, wmOperator *op)
                }
 
                if (ob->id.lib)
-                       id_make_local(bmain, &ob->id, false);
+                       id_make_local(bmain, &ob->id, false, false);
        }
        CTX_DATA_END;
 
@@ -2259,7 +2259,7 @@ static int make_local_exec(bContext *C, wmOperator *op)
                id = ob->data;
 
                if (id && (ELEM(mode, MAKE_LOCAL_SELECT_OBDATA, MAKE_LOCAL_SELECT_OBDATA_MATERIAL))) {
-                       id_make_local(bmain, id, false);
+                       id_make_local(bmain, id, false, false);
                        adt = BKE_animdata_from_id(id);
                        if (adt) BKE_animdata_make_local(adt);
 
@@ -2275,7 +2275,7 @@ static int make_local_exec(bContext *C, wmOperator *op)
                }
 
                for (psys = ob->particlesystem.first; psys; psys = psys->next)
-                       id_make_local(bmain, &psys->part->id, false);
+                       id_make_local(bmain, &psys->part->id, false, false);
 
                adt = BKE_animdata_from_id(&ob->id);
                if (adt) BKE_animdata_make_local(adt);
@@ -2294,7 +2294,7 @@ static int make_local_exec(bContext *C, wmOperator *op)
 
                                for (b = 0; b < MAX_MTEX; b++)
                                        if (la->mtex[b] && la->mtex[b]->tex)
-                                               id_make_local(bmain, &la->mtex[b]->tex->id, false);
+                                               id_make_local(bmain, &la->mtex[b]->tex->id, false, false);
                        }
                        else {
                                for (a = 0; a < ob->totcol; a++) {
index 253e8180c3dd3a6d704e4b84e23fac6a15d3c5fa..111e60e51595b8578dfb333ccaded3a1b5cbd33b 100644 (file)
@@ -439,7 +439,7 @@ static void id_local_cb(
                Main *bmain = CTX_data_main(C);
                /* if the ID type has no special local function,
                 * just clear the lib */
-               if (id_make_local(bmain, tselem->id, false) == false) {
+               if (id_make_local(bmain, tselem->id, false, false) == false) {
                        id_clear_lib_data(bmain, tselem->id);
                }
        }