Fix missing datablocks types in id_make_local.
authorBastien Montagne <montagne29@wanadoo.fr>
Thu, 21 Jul 2016 14:09:08 +0000 (16:09 +0200)
committerBastien Montagne <montagne29@wanadoo.fr>
Thu, 21 Jul 2016 14:54:36 +0000 (16:54 +0200)
Adding make_local for vfont/gpencil/group/freestyle linestyle/mask/scene/sound/text.

Note that there are still some lose ends here, since some type are not handled by id_copy
(Scene, Sound and VFont), which means in case a datablock of that type is used both
directly and indirectly, localization will fail.

Scene copying might be doable though (maybe with a simple new 'full shalow' mode to existing BKE_scene_copy?),
not sure about sounds and vfonts... Situations where this becomes an issue should be very rare corner cases anyway.

17 files changed:
source/blender/blenkernel/BKE_font.h
source/blender/blenkernel/BKE_gpencil.h
source/blender/blenkernel/BKE_group.h
source/blender/blenkernel/BKE_linestyle.h
source/blender/blenkernel/BKE_mask.h
source/blender/blenkernel/BKE_scene.h
source/blender/blenkernel/BKE_sound.h
source/blender/blenkernel/BKE_text.h
source/blender/blenkernel/intern/font.c
source/blender/blenkernel/intern/gpencil.c
source/blender/blenkernel/intern/group.c
source/blender/blenkernel/intern/library.c
source/blender/blenkernel/intern/linestyle.c
source/blender/blenkernel/intern/mask.c
source/blender/blenkernel/intern/scene.c
source/blender/blenkernel/intern/sound.c
source/blender/blenkernel/intern/text.c

index 0711c423d1c13cd7cbfd07aa66893c23510ee814..6775639125f45e96f57b2e80e188ca652acfb6f6 100644 (file)
@@ -82,6 +82,8 @@ struct VFont *BKE_vfont_load(struct Main *bmain, const char *filepath);
 struct VFont *BKE_vfont_load_exists_ex(struct Main *bmain, const char *filepath, bool *r_exists);
 struct VFont *BKE_vfont_load_exists(struct Main *bmain, const char *filepath);
 
+void BKE_vfont_make_local(struct Main *bmain, struct VFont *vfont, const bool lib_local);
+
 bool BKE_vfont_to_curve_ex(struct Main *bmain, struct Object *ob, int mode,
                            struct ListBase *r_nubase,
                            const wchar_t **r_text, int *r_text_len, bool *r_text_free,
index 6159531d8bd392b98c96a2974ab545a570e470af..e9e3cd3b16e489ed05e57907b5fda9f8638c7541 100644 (file)
@@ -56,6 +56,8 @@ struct bGPDframe *gpencil_frame_duplicate(struct bGPDframe *src);
 struct bGPDlayer *gpencil_layer_duplicate(struct bGPDlayer *src);
 struct bGPdata *gpencil_data_duplicate(struct Main *bmain, struct bGPdata *gpd, bool internal_copy);
 
+void BKE_gpencil_make_local(struct Main *bmain, struct bGPdata *gpd, const bool lib_local);
+
 void gpencil_frame_delete_laststroke(struct bGPDlayer *gpl, struct bGPDframe *gpf);
 
 
index 4f2c89070cbb4922773a1024f05e5f2a5cae263a..09a069ee36fafb36365d399b0bff86f4e5d69041 100644 (file)
@@ -43,6 +43,7 @@ struct Scene;
 void          BKE_group_free(struct Group *group);
 struct Group *BKE_group_add(struct Main *bmain, const char *name);
 struct Group *BKE_group_copy(struct Main *bmain, struct Group *group);
+void          BKE_group_make_local(struct Main *bmain, struct Group *group, const bool lib_local);
 bool          BKE_group_object_add(struct Group *group, struct Object *ob, struct Scene *scene, struct Base *base);
 bool          BKE_group_object_unlink(struct Group *group, struct Object *ob, struct Scene *scene, struct Base *base);
 struct Group *BKE_group_object_find(struct Group *group, struct Object *ob);
index e343cd29622bb6ccf1e78357c5f8c285186cad3c..e96ef4e7be360e67b49144dc759ca918bd43fdcf 100644 (file)
@@ -54,6 +54,8 @@ FreestyleLineStyle *BKE_linestyle_new(struct Main *bmain, const char *name);
 void                BKE_linestyle_free(FreestyleLineStyle *linestyle);
 FreestyleLineStyle *BKE_linestyle_copy(struct Main *bmain, FreestyleLineStyle *linestyle);
 
+void BKE_linestyle_make_local(struct Main *bmain, struct FreestyleLineStyle *linestyle, const bool lib_local);
+
 FreestyleLineStyle *BKE_linestyle_active_from_scene(struct Scene *scene);
 
 LineStyleModifier *BKE_linestyle_color_modifier_add(FreestyleLineStyle *linestyle, const char *name, int type);
index 97bfd0f3f078ac2f0ff118023b9da379f04f2c31..3349bffac8521282f53ce10f8982d4c8b068921c 100644 (file)
@@ -125,6 +125,8 @@ struct Mask *BKE_mask_new(struct Main *bmain, const char *name);
 struct Mask *BKE_mask_copy_nolib(struct Mask *mask);
 struct Mask *BKE_mask_copy(struct Main *bmain, struct Mask *mask);
 
+void BKE_mask_make_local(struct Main *bmain, struct Mask *mask, const bool lib_local);
+
 void BKE_mask_free(struct Mask *mask);
 
 void BKE_mask_coord_from_frame(float r_co[2], const float co[2], const float frame_size[2]);
index 03af0b7d6c930783f8a2df3dc3c43a08c0e6a6f9..d2152950bff48a82bc883f1cf7dd194a22ce8cc1 100644 (file)
@@ -101,6 +101,8 @@ struct Scene *BKE_scene_set_name(struct Main *bmain, const char *name);
 struct Scene *BKE_scene_copy(struct Main *bmain, struct Scene *sce, int type);
 void BKE_scene_groups_relink(struct Scene *sce);
 
+void BKE_scene_make_local(struct Main *bmain, struct Scene *sce, const bool lib_local);
+
 struct Object *BKE_scene_camera_find(struct Scene *sc);
 #ifdef DURIAN_CAMERA_SWITCH
 struct Object *BKE_scene_camera_switch_find(struct Scene *scene); // DURIAN_CAMERA_SWITCH
index 18d9fe061a88f06955fdb9c2798608127dab79f4..28b15b2a31054e768a335f795c35fd69ffbc1a0f 100644 (file)
@@ -80,6 +80,8 @@ void BKE_sound_load(struct Main *main, struct bSound *sound);
 
 void BKE_sound_free(struct bSound *sound);
 
+void BKE_sound_make_local(struct Main *bmain, struct bSound *sound, const bool lib_local);
+
 #if defined(__AUD_C_API_H__) || defined(WITH_SYSTEM_AUDASPACE)
 AUD_Device *BKE_sound_mixdown(struct Scene *scene, AUD_DeviceSpecs specs, int start, float volume);
 #endif
index 858feeeab10a80aa4c5ac14fc894e6fbfbd4dcf9..081b7589af631fa441fc36bde5fad3905a4aa700 100644 (file)
@@ -53,6 +53,7 @@ struct Text    *BKE_text_load_ex(struct Main *bmain, const char *file, const cha
                                  const bool is_internal);
 struct Text    *BKE_text_load  (struct Main *bmain, const char *file, const char *relpath);
 struct Text    *BKE_text_copy          (struct Main *bmain, struct Text *ta);
+void            BKE_text_make_local (struct Main *bmain, struct Text *text, const bool lib_local);
 void                   BKE_text_clear      (struct Text *text);
 void                   BKE_text_write      (struct Text *text, const char *str);
 int             BKE_text_file_modified_check(struct Text *text);
index 5e1f8814ed6366fb70301897c4b07649efd914bf..580842fe176638d9c102bbacc7b7e76fe6118d98 100644 (file)
@@ -309,6 +309,11 @@ VFont *BKE_vfont_load_exists(struct Main *bmain, const char *filepath)
        return BKE_vfont_load_exists_ex(bmain, filepath, NULL);
 }
 
+void BKE_vfont_make_local(Main *bmain, VFont *vfont, const bool lib_local)
+{
+       BKE_id_make_local_generic(bmain, &vfont->id, true, lib_local);
+}
+
 static VFont *which_vfont(Curve *cu, CharInfo *info)
 {
        switch (info->flag & (CU_CHINFO_BOLD | CU_CHINFO_ITALIC)) {
index ac4f566dc6283815da72be080d54f19afa482e5b..8621da0d42e3fa0610408a6be61dae1ec88d3c43 100644 (file)
@@ -390,6 +390,11 @@ bGPdata *gpencil_data_duplicate(Main *bmain, bGPdata *src, bool internal_copy)
        return dst;
 }
 
+void BKE_gpencil_make_local(Main *bmain, bGPdata *gpd, const bool lib_local)
+{
+       BKE_id_make_local_generic(bmain, &gpd->id, true, lib_local);
+}
+
 /* -------- GP-Stroke API --------- */
 
 /* ensure selection status of stroke is in sync with its points */
index 11bbd91e9c9e9e16269024668a75496739407311..d20b0cedd249ab9f633352ecaf4ffd93ddc8e89a 100644 (file)
@@ -105,6 +105,11 @@ Group *BKE_group_copy(Main *bmain, Group *group)
        return groupn;
 }
 
+void BKE_group_make_local(Main *bmain, Group *group, const bool lib_local)
+{
+       BKE_id_make_local_generic(bmain, group, true, lib_local);
+}
+
 /* external */
 static bool group_object_add_internal(Group *group, Object *ob)
 {
index 9323b4b2c6d7af914a16d4723326622b079b19f6..4dd66ac9bc11e05be2498cabf31d27d8ad46592c 100644 (file)
 #include "BKE_object.h"
 #include "BKE_particle.h"
 #include "BKE_packedFile.h"
+#include "BKE_sound.h"
 #include "BKE_speaker.h"
 #include "BKE_scene.h"
 #include "BKE_text.h"
@@ -324,7 +325,9 @@ bool id_make_local(Main *bmain, ID *id, const bool test, const bool lib_local)
 
        switch (GS(id->name)) {
                case ID_SCE:
-                       return false; /* not implemented */
+                       /* Partially implemented (has no copy...). */
+                       if (!test) BKE_scene_make_local(bmain, (Scene *)id, lib_local);
+                       return true;
                case ID_LI:
                        return false; /* can't be linked */
                case ID_OB:
@@ -370,13 +373,19 @@ bool id_make_local(Main *bmain, ID *id, const bool test, const bool lib_local)
                case ID_SCR:
                        return false; /* can't be linked */
                case ID_VF:
-                       return false; /* not implemented */
+                       /* Partially implemented (has no copy...). */
+                       if (!test) BKE_vfont_make_local(bmain, (VFont *)id, lib_local);
+                       return true;
                case ID_TXT:
-                       return false; /* not implemented */
+                       if (!test) BKE_text_make_local(bmain, (Text *)id, lib_local);
+                       return true;
                case ID_SO:
-                       return false; /* not implemented */
+                       /* Partially implemented (has no copy...). */
+                       if (!test) BKE_sound_make_local(bmain, (bSound *)id, lib_local);
+                       return true;
                case ID_GR:
-                       return false; /* not implemented */
+                       if (!test) BKE_group_make_local(bmain, (Group *)id, lib_local);
+                       return true;
                case ID_AR:
                        if (!test) BKE_armature_make_local(bmain, (bArmature *)id, lib_local);
                        return true;
@@ -395,9 +404,14 @@ bool id_make_local(Main *bmain, ID *id, const bool test, const bool lib_local)
                case ID_WM:
                        return false; /* can't be linked */
                case ID_GD:
-                       return false; /* not implemented */
+                       if (!test) BKE_gpencil_make_local(bmain, (bGPdata *)id, lib_local);
+                       return true;
+               case ID_MSK:
+                       if (!test) BKE_mask_make_local(bmain, (Mask *)id, lib_local);
+                       return true;
                case ID_LS:
-                       return false; /* not implemented */
+                       if (!test) BKE_linestyle_make_local(bmain, (FreestyleLineStyle *)id, lib_local);
+                       return true;
        }
 
        return false;
index c4a0d0074fbc31bd189d7a483c1a0a7f629f3933..1aff5d502f810620f3886210272283a11ee9fa90 100644 (file)
@@ -226,6 +226,11 @@ FreestyleLineStyle *BKE_linestyle_copy(struct Main *bmain, FreestyleLineStyle *l
        return new_linestyle;
 }
 
+void BKE_linestyle_make_local(struct Main *bmain, FreestyleLineStyle *linestyle, const bool lib_local)
+{
+       BKE_id_make_local_generic(bmain, &linestyle->id, true, lib_local);
+}
+
 FreestyleLineStyle *BKE_linestyle_active_from_scene(Scene *scene)
 {
        SceneRenderLayer *actsrl = BLI_findlink(&scene->r.layers, scene->r.actlay);
index 9e070bbef228c5f56339c9278686413e20bf7634..014461e0d228f2275193b67d66ae46ccbf8f5516 100644 (file)
@@ -861,6 +861,11 @@ Mask *BKE_mask_copy(Main *bmain, Mask *mask)
        return mask_new;
 }
 
+void BKE_mask_make_local(Main *bmain, Mask *mask, const bool lib_local)
+{
+       BKE_id_make_local_generic(bmain, &mask->id, true, lib_local);
+}
+
 void BKE_mask_point_free(MaskSplinePoint *point)
 {
        if (point->uw)
index d3c4ed82c3d933a9aef7bf90658ad2586ff59012..3e37ee83ceab35919df4efc817eaca46adbb4e43 100644 (file)
@@ -355,6 +355,13 @@ void BKE_scene_groups_relink(Scene *sce)
                BKE_rigidbody_world_groups_relink(sce->rigidbody_world);
 }
 
+void BKE_scene_make_local(Main *bmain, Scene *sce, const bool lib_local)
+{
+       /* For now should work, may need more work though to support all possible corner cases
+        * (also scene_copy probably needs some love). */
+       BKE_id_make_local_generic(bmain, &sce->id, true, lib_local);
+}
+
 /** Free (or release) any data used by this scene (does not free the scene itself). */
 void BKE_scene_free(Scene *sce)
 {
index 414be73e23409cd1b20b30c8c9f0a20979c78e1b..2f47966ec5561694d780718643cba03c1307236d 100644 (file)
@@ -155,6 +155,11 @@ void BKE_sound_free(bSound *sound)
 #endif  /* WITH_AUDASPACE */
 }
 
+void BKE_sound_make_local(Main *bmain, bSound *sound, const bool lib_local)
+{
+       BKE_id_make_local_generic(bmain, &sound->id, true, lib_local);
+}
+
 #ifdef WITH_AUDASPACE
 
 static const char *force_device = NULL;
index 269d6d32b3121fbc39af7e5de137e46fbd543526..82c3132d73e5ec3ba94a90c75ce53f9bed699569 100644 (file)
@@ -499,6 +499,11 @@ Text *BKE_text_copy(Main *bmain, Text *ta)
        return tan;
 }
 
+void BKE_text_make_local(Main *bmain, Text *text, const bool lib_local)
+{
+       BKE_id_make_local_generic(bmain, &text->id, true, lib_local);
+}
+
 void BKE_text_clear(Text *text) /* called directly from rna */
 {
        int oldstate;