[Bf-blender-cvs] [0021b589e00] idtype-refactor: Use new idtype callbacks in id_lib code.
Bastien Montagne
noreply at git.blender.org
Wed Mar 4 14:44:07 CET 2020
Commit: 0021b589e0002e09ad97b638830a6089f7d5f718
Author: Bastien Montagne
Date: Wed Mar 4 14:43:01 2020 +0100
Branches: idtype-refactor
https://developer.blender.org/rB0021b589e0002e09ad97b638830a6089f7d5f718
Use new idtype callbacks in id_lib code.
As before, it falls back to old code currently when no IDType is found.
New IDTypeInfo is only defined for Object so far.
===================================================================
M source/blender/blenkernel/BKE_idtype.h
M source/blender/blenkernel/intern/idtype.c
M source/blender/blenkernel/intern/lib_id.c
M source/blender/blenkernel/intern/lib_id_delete.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_idtype.h b/source/blender/blenkernel/BKE_idtype.h
index 31b8e11821b..183d8c3a26d 100644
--- a/source/blender/blenkernel/BKE_idtype.h
+++ b/source/blender/blenkernel/BKE_idtype.h
@@ -78,17 +78,34 @@ typedef struct IDTypeInfo {
int flags;
/* ********** ID management callbacks ********** */
+ /**
+ * Initialize a new, empty calloc'ed data-block. May be NULL if there is nothing to do.
+ */
IDTypeInitDataFunction init_data;
+
+ /**
+ * Copy the given data-block's data from source to destination. May be NULL if mere memcopy of
+ * the ID struct itself is enough.
+ */
IDTypeCopyDataFunction copy_data;
+
+ /**
+ * Free the data of the data-block (NOT the ID itself). May be NULL if there is nothing to do.
+ */
IDTypeFreeDataFunction free_data;
+
+ /**
+ * Make a linked data-block local. May be NULL if default behavior from
+ * `BKE_lib_id_make_local_generic()` is enough.
+ */
IDTypeMakeLocalFunction make_local;
} IDTypeInfo;
/* Module initialization. */
void BKE_idtype_init(void);
-const struct IDTypeInfo *BKE_idtype_get_info_from_idcode(short id_code);
-const struct IDTypeInfo *BKE_idtype_get_info_from_id(struct ID *id);
+const struct IDTypeInfo *BKE_idtype_get_info_from_idcode(const short id_code);
+const struct IDTypeInfo *BKE_idtype_get_info_from_id(const struct ID *id);
extern IDTypeInfo IDType_ID_OB;
diff --git a/source/blender/blenkernel/intern/idtype.c b/source/blender/blenkernel/intern/idtype.c
index 229cc9393c4..b6b2d685ffb 100644
--- a/source/blender/blenkernel/intern/idtype.c
+++ b/source/blender/blenkernel/intern/idtype.c
@@ -62,7 +62,7 @@ void BKE_idtype_init(void)
id_type_init();
}
-const IDTypeInfo *BKE_idtype_get_info_from_idcode(short id_code)
+const IDTypeInfo *BKE_idtype_get_info_from_idcode(const short id_code)
{
int id_index = BKE_idcode_to_index(id_code);
@@ -75,7 +75,7 @@ const IDTypeInfo *BKE_idtype_get_info_from_idcode(short id_code)
}
}
-const IDTypeInfo *BKE_idtype_get_info_from_id(ID *id)
+const IDTypeInfo *BKE_idtype_get_info_from_id(const ID *id)
{
return BKE_idtype_get_info_from_idcode(GS(id->name));
}
diff --git a/source/blender/blenkernel/intern/lib_id.c b/source/blender/blenkernel/intern/lib_id.c
index 05605c9e661..203ff22f5cb 100644
--- a/source/blender/blenkernel/intern/lib_id.c
+++ b/source/blender/blenkernel/intern/lib_id.c
@@ -448,6 +448,28 @@ bool BKE_lib_id_make_local(Main *bmain, ID *id, const bool test, const int flags
return false;
}
+ const IDTypeInfo *idtype_info = BKE_idtype_get_info_from_id(id);
+
+ printf("%s: ", __func__);
+
+ if (idtype_info != NULL) {
+ printf("Found IDTypeInfo for %c%c, using new code...\n", id->name[0], id->name[1]);
+ if ((idtype_info->flags & IDTYPE_FLAGS_NO_MAKELOCAL) == 0) {
+ if (!test) {
+ if (idtype_info->make_local != NULL) {
+ idtype_info->make_local(bmain, id, flags);
+ }
+ else {
+ BKE_lib_id_make_local_generic(bmain, id, flags);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ printf("No IDTypeInfo for %c%c, using old code...\n", id->name[0], id->name[1]);
+
switch ((ID_Type)GS(id->name)) {
case ID_SCE:
if (!test) {
@@ -690,115 +712,137 @@ bool BKE_id_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int flag)
if (id == NULL) {
return false;
}
- if (!BKE_id_copy_is_allowed(id)) {
- return false;
+
+ const IDTypeInfo *idtype_info = BKE_idtype_get_info_from_id(id);
+
+ printf("%s: ", __func__);
+
+ if (idtype_info != NULL) {
+ printf("Found IDTypeInfo for %c%c, using new code...\n", id->name[0], id->name[1]);
+
+ if ((idtype_info->flags & IDTYPE_FLAGS_NO_COPY) != 0) {
+ return false;
+ }
+
+ BKE_libblock_copy_ex(bmain, id, r_newid, flag);
+
+ if (idtype_info->copy_data != NULL) {
+ idtype_info->copy_data(bmain, *r_newid, id, flag);
+ }
}
+ else {
+ printf("No IDTypeInfo for %c%c, using old code...\n", id->name[0], id->name[1]);
- BKE_libblock_copy_ex(bmain, id, r_newid, flag);
+ if (!BKE_id_copy_is_allowed(id)) {
+ return false;
+ }
- switch ((ID_Type)GS(id->name)) {
- case ID_SCE:
- BKE_scene_copy_data(bmain, (Scene *)*r_newid, (Scene *)id, flag);
- break;
- case ID_OB:
- BKE_object_copy_data(bmain, (Object *)*r_newid, (Object *)id, flag);
- break;
- case ID_ME:
- BKE_mesh_copy_data(bmain, (Mesh *)*r_newid, (Mesh *)id, flag);
- break;
- case ID_CU:
- BKE_curve_copy_data(bmain, (Curve *)*r_newid, (Curve *)id, flag);
- break;
- case ID_MB:
- BKE_mball_copy_data(bmain, (MetaBall *)*r_newid, (MetaBall *)id, flag);
- break;
- case ID_MA:
- BKE_material_copy_data(bmain, (Material *)*r_newid, (Material *)id, flag);
- break;
- case ID_TE:
- BKE_texture_copy_data(bmain, (Tex *)*r_newid, (Tex *)id, flag);
- break;
- case ID_IM:
- BKE_image_copy_data(bmain, (Image *)*r_newid, (Image *)id, flag);
- break;
- case ID_LT:
- BKE_lattice_copy_data(bmain, (Lattice *)*r_newid, (Lattice *)id, flag);
- break;
- case ID_LA:
- BKE_light_copy_data(bmain, (Light *)*r_newid, (Light *)id, flag);
- break;
- case ID_SPK:
- BKE_speaker_copy_data(bmain, (Speaker *)*r_newid, (Speaker *)id, flag);
- break;
- case ID_LP:
- BKE_lightprobe_copy_data(bmain, (LightProbe *)*r_newid, (LightProbe *)id, flag);
- break;
- case ID_CA:
- BKE_camera_copy_data(bmain, (Camera *)*r_newid, (Camera *)id, flag);
- break;
- case ID_KE:
- BKE_key_copy_data(bmain, (Key *)*r_newid, (Key *)id, flag);
- break;
- case ID_WO:
- BKE_world_copy_data(bmain, (World *)*r_newid, (World *)id, flag);
- break;
- case ID_TXT:
- BKE_text_copy_data(bmain, (Text *)*r_newid, (Text *)id, flag);
- break;
- case ID_GR:
- BKE_collection_copy_data(bmain, (Collection *)*r_newid, (Collection *)id, flag);
- break;
- case ID_AR:
- BKE_armature_copy_data(bmain, (bArmature *)*r_newid, (bArmature *)id, flag);
- break;
- case ID_AC:
- BKE_action_copy_data(bmain, (bAction *)*r_newid, (bAction *)id, flag);
- break;
- case ID_NT:
- BKE_node_tree_copy_data(bmain, (bNodeTree *)*r_newid, (bNodeTree *)id, flag);
- break;
- case ID_BR:
- BKE_brush_copy_data(bmain, (Brush *)*r_newid, (Brush *)id, flag);
- break;
- case ID_PA:
- BKE_particlesettings_copy_data(
- bmain, (ParticleSettings *)*r_newid, (ParticleSettings *)id, flag);
- break;
- case ID_GD:
- BKE_gpencil_copy_data((bGPdata *)*r_newid, (bGPdata *)id, flag);
- break;
- case ID_MC:
- BKE_movieclip_copy_data(bmain, (MovieClip *)*r_newid, (MovieClip *)id, flag);
- break;
- case ID_MSK:
- BKE_mask_copy_data(bmain, (Mask *)*r_newid, (Mask *)id, flag);
- break;
- case ID_LS:
- BKE_linestyle_copy_data(
- bmain, (FreestyleLineStyle *)*r_newid, (FreestyleLineStyle *)id, flag);
- break;
- case ID_PAL:
- BKE_palette_copy_data(bmain, (Palette *)*r_newid, (Palette *)id, flag);
- break;
- case ID_PC:
- BKE_paint_curve_copy_data(bmain, (PaintCurve *)*r_newid, (PaintCurve *)id, flag);
- break;
- case ID_CF:
- BKE_cachefile_copy_data(bmain, (CacheFile *)*r_newid, (CacheFile *)id, flag);
- break;
- case ID_SO:
- BKE_sound_copy_data(bmain, (bSound *)*r_newid, (bSound *)id, flag);
- break;
- case ID_VF:
- BKE_vfont_copy_data(bmain, (VFont *)*r_newid, (VFont *)id, flag);
- break;
- case ID_LI:
- case ID_SCR:
- case ID_WM:
- case ID_WS:
- case ID_IP:
- BLI_assert(0); /* Should have been rejected at start of function! */
- break;
+ BKE_libblock_copy_ex(bmain, id, r_newid, flag);
+
+ switch ((ID_Type)GS(id->name)) {
+ case ID_SCE:
+ BKE_scene_copy_data(bmain, (Scene *)*r_newid, (Scene *)id, flag);
+ break;
+ case ID_OB:
+ BKE_object_copy_data(bmain, (Object *)*r_newid, (Object *)id, flag);
+ break;
+ case ID_ME:
+ BKE_mesh_copy_data(bmain, (Mesh *)*r_newid, (Mesh *)id, flag);
+ break;
+ case ID_CU:
+ BKE_curve_copy_data(bmain, (Curve *)*r_newid, (Curve *)id, flag);
+ break;
+ case ID_MB:
+ BKE_mball_copy_data(bmain, (MetaBall *)*r_newid, (MetaBall *)id, flag);
+ break;
+ case ID_MA:
+ BKE_material_copy_data(bmain, (Material *)*r_newid, (Material *)id, flag);
+ break;
+ case ID_TE:
+ BKE_texture_copy_data(bmain, (Tex *)*r_newid, (Tex *)id, flag);
+ break;
+ case ID_IM:
+ BKE_image_copy_data(bmain, (Image *)*r_newid, (Image *)id, flag);
+ break;
+ case ID_LT:
+ BKE_lattice_copy_data(bmain, (Lattice *)*r_newid, (Lattice *)id, flag);
+ break;
+ case ID_LA:
+ BKE_light_copy_data(bmain, (Light *)*r_newid, (Light *)id, flag);
+ break;
+ case ID_SPK:
+ BKE_speaker_copy_data(bmain, (Speaker *)*r_newid, (Speaker *)id, flag);
+ break;
+ case ID_LP:
+ BKE_lightprobe_copy_data(bmain, (LightProbe *)*r_newid, (LightProbe *)id, flag);
+ break;
+ case ID_CA:
+ BKE_camera_copy_data(bmain, (Camera *)*r_newid, (Camera *)id, flag);
+ break;
+ case ID_KE:
+ BKE_key_copy_data(bmain, (Key *)*r_newid, (Key *)id, flag);
+ break;
+ case ID_WO:
+ BKE_world_copy_data(bmain, (World *)*r_newid, (World *)id, flag);
+ break;
+ case ID_TXT:
+ BKE_text_copy_data(bmain, (Text *)*r_newid, (Text *)id, flag);
+ break;
+ case ID_GR:
+ BKE_collection_copy_data(bmain, (Collection *)*r_newid, (Collection *)id, flag);
+ break;
+ case ID_AR:
+ BKE_armature_copy_data(bmain, (bArmature *)*r_newid, (bArmature *)id, flag);
+ break;
+ case ID_AC:
+ BKE_action_copy_data(bmain, (bAction *)*r_newid, (bAction *)id, flag);
+ break;
+ case ID_NT:
+ BKE_node_tree_copy_data(bmain, (bNodeTree *)*r_newid, (bNodeTree *)id, flag);
+ break;
+ case ID_BR:
+ BKE_brush_cop
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list