Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/lib_id.c
| Show First 20 Lines • Show All 85 Lines • ▼ Show 20 Lines | |||||
| #include "BKE_collection.h" | #include "BKE_collection.h" | ||||
| #include "BKE_context.h" | #include "BKE_context.h" | ||||
| #include "BKE_curve.h" | #include "BKE_curve.h" | ||||
| #include "BKE_font.h" | #include "BKE_font.h" | ||||
| #include "BKE_global.h" | #include "BKE_global.h" | ||||
| #include "BKE_gpencil.h" | #include "BKE_gpencil.h" | ||||
| #include "BKE_idcode.h" | #include "BKE_idcode.h" | ||||
| #include "BKE_idprop.h" | #include "BKE_idprop.h" | ||||
| #include "BKE_idtype.h" | |||||
| #include "BKE_image.h" | #include "BKE_image.h" | ||||
| #include "BKE_key.h" | #include "BKE_key.h" | ||||
| #include "BKE_light.h" | #include "BKE_light.h" | ||||
| #include "BKE_lattice.h" | #include "BKE_lattice.h" | ||||
| #include "BKE_lib_id.h" | #include "BKE_lib_id.h" | ||||
| #include "BKE_lib_query.h" | #include "BKE_lib_query.h" | ||||
| #include "BKE_lib_remap.h" | #include "BKE_lib_remap.h" | ||||
| #include "BKE_linestyle.h" | #include "BKE_linestyle.h" | ||||
| ▲ Show 20 Lines • Show All 340 Lines • ▼ Show 20 Lines | bool BKE_lib_id_make_local(Main *bmain, ID *id, const bool test, const int flags) | ||||
| const bool lib_local = (flags & LIB_ID_MAKELOCAL_FULL_LIBRARY) != 0; | const bool lib_local = (flags & LIB_ID_MAKELOCAL_FULL_LIBRARY) != 0; | ||||
| /* We don't care whether ID is directly or indirectly linked | /* We don't care whether ID is directly or indirectly linked | ||||
| * in case we are making a whole lib local... */ | * in case we are making a whole lib local... */ | ||||
| if (!lib_local && (id->tag & LIB_TAG_INDIRECT)) { | if (!lib_local && (id->tag & LIB_TAG_INDIRECT)) { | ||||
| return false; | 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)) { | switch ((ID_Type)GS(id->name)) { | ||||
| case ID_SCE: | case ID_SCE: | ||||
| if (!test) { | if (!test) { | ||||
| BKE_scene_make_local(bmain, (Scene *)id, flags); | BKE_scene_make_local(bmain, (Scene *)id, flags); | ||||
| } | } | ||||
| return true; | return true; | ||||
| case ID_OB: | case ID_OB: | ||||
| if (!test) { | if (!test) { | ||||
| ▲ Show 20 Lines • Show All 226 Lines • ▼ Show 20 Lines | if (*r_newid != NULL) { | ||||
| memset(*r_newid, 0, size); | memset(*r_newid, 0, size); | ||||
| } | } | ||||
| } | } | ||||
| /* Early output is source is NULL. */ | /* Early output is source is NULL. */ | ||||
| if (id == NULL) { | if (id == NULL) { | ||||
| return false; | 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]); | |||||
| if (!BKE_id_copy_is_allowed(id)) { | if (!BKE_id_copy_is_allowed(id)) { | ||||
| return false; | return false; | ||||
| } | } | ||||
| BKE_libblock_copy_ex(bmain, id, r_newid, flag); | BKE_libblock_copy_ex(bmain, id, r_newid, flag); | ||||
| switch ((ID_Type)GS(id->name)) { | switch ((ID_Type)GS(id->name)) { | ||||
| case ID_SCE: | case ID_SCE: | ||||
| BKE_scene_copy_data(bmain, (Scene *)*r_newid, (Scene *)id, flag); | BKE_scene_copy_data(bmain, (Scene *)*r_newid, (Scene *)id, flag); | ||||
| break; | break; | ||||
| case ID_OB: | case ID_OB: | ||||
| BKE_object_copy_data(bmain, (Object *)*r_newid, (Object *)id, flag); | BKE_object_copy_data(bmain, (Object *)*r_newid, (Object *)id, flag); | ||||
| break; | break; | ||||
| case ID_ME: | case ID_ME: | ||||
| BKE_mesh_copy_data(bmain, (Mesh *)*r_newid, (Mesh *)id, flag); | BKE_mesh_copy_data(bmain, (Mesh *)*r_newid, (Mesh *)id, flag); | ||||
| break; | break; | ||||
| case ID_CU: | case ID_CU: | ||||
| BKE_curve_copy_data(bmain, (Curve *)*r_newid, (Curve *)id, flag); | BKE_curve_copy_data(bmain, (Curve *)*r_newid, (Curve *)id, flag); | ||||
| break; | break; | ||||
| case ID_MB: | case ID_MB: | ||||
| BKE_mball_copy_data(bmain, (MetaBall *)*r_newid, (MetaBall *)id, flag); | BKE_mball_copy_data(bmain, (MetaBall *)*r_newid, (MetaBall *)id, flag); | ||||
| break; | break; | ||||
| case ID_MA: | case ID_MA: | ||||
| BKE_material_copy_data(bmain, (Material *)*r_newid, (Material *)id, flag); | BKE_material_copy_data(bmain, (Material *)*r_newid, (Material *)id, flag); | ||||
| break; | break; | ||||
| case ID_TE: | case ID_TE: | ||||
| BKE_texture_copy_data(bmain, (Tex *)*r_newid, (Tex *)id, flag); | BKE_texture_copy_data(bmain, (Tex *)*r_newid, (Tex *)id, flag); | ||||
| break; | break; | ||||
| case ID_IM: | case ID_IM: | ||||
| BKE_image_copy_data(bmain, (Image *)*r_newid, (Image *)id, flag); | BKE_image_copy_data(bmain, (Image *)*r_newid, (Image *)id, flag); | ||||
| break; | break; | ||||
| case ID_LT: | case ID_LT: | ||||
| BKE_lattice_copy_data(bmain, (Lattice *)*r_newid, (Lattice *)id, flag); | BKE_lattice_copy_data(bmain, (Lattice *)*r_newid, (Lattice *)id, flag); | ||||
| break; | break; | ||||
| case ID_LA: | case ID_LA: | ||||
| BKE_light_copy_data(bmain, (Light *)*r_newid, (Light *)id, flag); | BKE_light_copy_data(bmain, (Light *)*r_newid, (Light *)id, flag); | ||||
| break; | break; | ||||
| case ID_SPK: | case ID_SPK: | ||||
| BKE_speaker_copy_data(bmain, (Speaker *)*r_newid, (Speaker *)id, flag); | BKE_speaker_copy_data(bmain, (Speaker *)*r_newid, (Speaker *)id, flag); | ||||
| break; | break; | ||||
| case ID_LP: | case ID_LP: | ||||
| BKE_lightprobe_copy_data(bmain, (LightProbe *)*r_newid, (LightProbe *)id, flag); | BKE_lightprobe_copy_data(bmain, (LightProbe *)*r_newid, (LightProbe *)id, flag); | ||||
| break; | break; | ||||
| case ID_CA: | case ID_CA: | ||||
| BKE_camera_copy_data(bmain, (Camera *)*r_newid, (Camera *)id, flag); | BKE_camera_copy_data(bmain, (Camera *)*r_newid, (Camera *)id, flag); | ||||
| break; | break; | ||||
| case ID_KE: | case ID_KE: | ||||
| BKE_key_copy_data(bmain, (Key *)*r_newid, (Key *)id, flag); | BKE_key_copy_data(bmain, (Key *)*r_newid, (Key *)id, flag); | ||||
| break; | break; | ||||
| case ID_WO: | case ID_WO: | ||||
| BKE_world_copy_data(bmain, (World *)*r_newid, (World *)id, flag); | BKE_world_copy_data(bmain, (World *)*r_newid, (World *)id, flag); | ||||
| break; | break; | ||||
| case ID_TXT: | case ID_TXT: | ||||
| BKE_text_copy_data(bmain, (Text *)*r_newid, (Text *)id, flag); | BKE_text_copy_data(bmain, (Text *)*r_newid, (Text *)id, flag); | ||||
| break; | break; | ||||
| case ID_GR: | case ID_GR: | ||||
| BKE_collection_copy_data(bmain, (Collection *)*r_newid, (Collection *)id, flag); | BKE_collection_copy_data(bmain, (Collection *)*r_newid, (Collection *)id, flag); | ||||
| break; | break; | ||||
| case ID_AR: | case ID_AR: | ||||
| BKE_armature_copy_data(bmain, (bArmature *)*r_newid, (bArmature *)id, flag); | BKE_armature_copy_data(bmain, (bArmature *)*r_newid, (bArmature *)id, flag); | ||||
| break; | break; | ||||
| case ID_AC: | case ID_AC: | ||||
| BKE_action_copy_data(bmain, (bAction *)*r_newid, (bAction *)id, flag); | BKE_action_copy_data(bmain, (bAction *)*r_newid, (bAction *)id, flag); | ||||
| break; | break; | ||||
| case ID_NT: | case ID_NT: | ||||
| BKE_node_tree_copy_data(bmain, (bNodeTree *)*r_newid, (bNodeTree *)id, flag); | BKE_node_tree_copy_data(bmain, (bNodeTree *)*r_newid, (bNodeTree *)id, flag); | ||||
| break; | break; | ||||
| case ID_BR: | case ID_BR: | ||||
| BKE_brush_copy_data(bmain, (Brush *)*r_newid, (Brush *)id, flag); | BKE_brush_copy_data(bmain, (Brush *)*r_newid, (Brush *)id, flag); | ||||
| break; | break; | ||||
| case ID_PA: | case ID_PA: | ||||
| BKE_particlesettings_copy_data( | BKE_particlesettings_copy_data( | ||||
| bmain, (ParticleSettings *)*r_newid, (ParticleSettings *)id, flag); | bmain, (ParticleSettings *)*r_newid, (ParticleSettings *)id, flag); | ||||
| break; | break; | ||||
| case ID_GD: | case ID_GD: | ||||
| BKE_gpencil_copy_data((bGPdata *)*r_newid, (bGPdata *)id, flag); | BKE_gpencil_copy_data((bGPdata *)*r_newid, (bGPdata *)id, flag); | ||||
| break; | break; | ||||
| case ID_MC: | case ID_MC: | ||||
| BKE_movieclip_copy_data(bmain, (MovieClip *)*r_newid, (MovieClip *)id, flag); | BKE_movieclip_copy_data(bmain, (MovieClip *)*r_newid, (MovieClip *)id, flag); | ||||
| break; | break; | ||||
| case ID_MSK: | case ID_MSK: | ||||
| BKE_mask_copy_data(bmain, (Mask *)*r_newid, (Mask *)id, flag); | BKE_mask_copy_data(bmain, (Mask *)*r_newid, (Mask *)id, flag); | ||||
| break; | break; | ||||
| case ID_LS: | case ID_LS: | ||||
| BKE_linestyle_copy_data( | BKE_linestyle_copy_data( | ||||
| bmain, (FreestyleLineStyle *)*r_newid, (FreestyleLineStyle *)id, flag); | bmain, (FreestyleLineStyle *)*r_newid, (FreestyleLineStyle *)id, flag); | ||||
| break; | break; | ||||
| case ID_PAL: | case ID_PAL: | ||||
| BKE_palette_copy_data(bmain, (Palette *)*r_newid, (Palette *)id, flag); | BKE_palette_copy_data(bmain, (Palette *)*r_newid, (Palette *)id, flag); | ||||
| break; | break; | ||||
| case ID_PC: | case ID_PC: | ||||
| BKE_paint_curve_copy_data(bmain, (PaintCurve *)*r_newid, (PaintCurve *)id, flag); | BKE_paint_curve_copy_data(bmain, (PaintCurve *)*r_newid, (PaintCurve *)id, flag); | ||||
| break; | break; | ||||
| case ID_CF: | case ID_CF: | ||||
| BKE_cachefile_copy_data(bmain, (CacheFile *)*r_newid, (CacheFile *)id, flag); | BKE_cachefile_copy_data(bmain, (CacheFile *)*r_newid, (CacheFile *)id, flag); | ||||
| break; | break; | ||||
| case ID_SO: | case ID_SO: | ||||
| BKE_sound_copy_data(bmain, (bSound *)*r_newid, (bSound *)id, flag); | BKE_sound_copy_data(bmain, (bSound *)*r_newid, (bSound *)id, flag); | ||||
| break; | break; | ||||
| case ID_VF: | case ID_VF: | ||||
| BKE_vfont_copy_data(bmain, (VFont *)*r_newid, (VFont *)id, flag); | BKE_vfont_copy_data(bmain, (VFont *)*r_newid, (VFont *)id, flag); | ||||
| break; | break; | ||||
| case ID_LI: | case ID_LI: | ||||
| case ID_SCR: | case ID_SCR: | ||||
| case ID_WM: | case ID_WM: | ||||
| case ID_WS: | case ID_WS: | ||||
| case ID_IP: | case ID_IP: | ||||
| BLI_assert(0); /* Should have been rejected at start of function! */ | BLI_assert(0); /* Should have been rejected at start of function! */ | ||||
| break; | break; | ||||
| } | } | ||||
| } | |||||
| /* Update ID refcount, remap pointers to self in new ID. */ | /* Update ID refcount, remap pointers to self in new ID. */ | ||||
| struct IDCopyLibManagementData data = { | struct IDCopyLibManagementData data = { | ||||
| .id_src = id, | .id_src = id, | ||||
| .id_dst = *r_newid, | .id_dst = *r_newid, | ||||
| .flag = flag, | .flag = flag, | ||||
| }; | }; | ||||
| BKE_library_foreach_ID_link(bmain, *r_newid, id_copy_libmanagement_cb, &data, IDWALK_NOP); | BKE_library_foreach_ID_link(bmain, *r_newid, id_copy_libmanagement_cb, &data, IDWALK_NOP); | ||||
| ▲ Show 20 Lines • Show All 483 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| /** | /** | ||||
| * Initialize an ID of given type, such that it has valid 'empty' data. | * Initialize an ID of given type, such that it has valid 'empty' data. | ||||
| * ID is assumed to be just calloc'ed. | * ID is assumed to be just calloc'ed. | ||||
| */ | */ | ||||
| void BKE_libblock_init_empty(ID *id) | void BKE_libblock_init_empty(ID *id) | ||||
| { | { | ||||
| 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->init_data != NULL) { | |||||
| idtype_info->init_data(id); | |||||
| } | |||||
| return; | |||||
| } | |||||
| printf("No IDTypeInfo for %c%c, using old code...\n", id->name[0], id->name[1]); | |||||
| /* Note that only ID types that are not valid when filled of zero should have a callback here. */ | /* Note that only ID types that are not valid when filled of zero should have a callback here. */ | ||||
| switch ((ID_Type)GS(id->name)) { | switch ((ID_Type)GS(id->name)) { | ||||
| case ID_SCE: | case ID_SCE: | ||||
| BKE_scene_init((Scene *)id); | BKE_scene_init((Scene *)id); | ||||
| break; | break; | ||||
| case ID_LI: | case ID_LI: | ||||
| /* Nothing to do. */ | /* Nothing to do. */ | ||||
| break; | break; | ||||
| ▲ Show 20 Lines • Show All 1,293 Lines • Show Last 20 Lines | |||||