[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