Blender V5.0
BKE_lib_id.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4#pragma once
5
32
33#include <optional>
34
35#include "BLI_compiler_attrs.h"
36#include "BLI_set.hh"
37#include "BLI_string_ref.hh"
38#include "BLI_utildefines.h"
39#include "BLI_vector.hh"
40
41#include "DNA_ID.h"
42#include "DNA_userdef_enums.h"
43
44struct BlendWriter;
45struct Depsgraph;
46struct GHash;
47struct ID;
48struct ID_Readfile_Data;
49struct Library;
50struct ListBase;
51struct Main;
52struct PointerRNA;
53struct PropertyRNA;
54struct bContext;
55
56namespace blender::bke::id {
57
72
93
94} // namespace blender::bke::id
95
99size_t BKE_libblock_get_alloc_info(short type, const char **r_name);
118void *BKE_libblock_alloc(Main *bmain, short type, const char *name, int flag)
128 std::optional<Library *> owner_library,
129 short type,
130 const char *name,
137
145
150
151/* *** ID's session_uid management. *** */
152
156#define MAIN_ID_SESSION_UID_UNSET 0
157
174
184void *BKE_id_new(Main *bmain, short type, const char *name);
185
186template<typename T> inline T *BKE_id_new(Main *bmain, const char *name)
187{
188 const ID_Type id_type = T::id_type;
189 return static_cast<T *>(BKE_id_new(bmain, id_type, name));
190}
191
199void *BKE_id_new_in_lib(Main *bmain,
200 std::optional<Library *> owner_library,
201 short type,
202 const char *name);
209void *BKE_id_new_nomain(short type, const char *name);
210
211template<typename T> inline T *BKE_id_new_nomain(const char *name)
212{
213 const ID_Type id_type = T::id_type;
214 return static_cast<T *>(BKE_id_new_nomain(id_type, name));
215}
216
220enum {
221 /* *** Generic options (should be handled by all ID types copying, ID creation, etc.). *** */
239
242
250
256
261
262 /* *** Specific options to some ID types or usages. *** */
263 /* *** May be ignored by unrelated ID copying functions. *** */
265 /* LIB_ID_COPY_NO_PROXY_CLEAR = 1 << 16, */ /* UNUSED */
279
280 /* *** XXX Hackish/not-so-nice specific behaviors needed for some corner cases. *** */
281 /* *** Ideally we should not have those, but we need them for now... *** */
293 /* Copy asset metadata. */
295
296 /* *** Helper 'defines' gathering most common flag sets. *** */
299
306};
307
308void BKE_libblock_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int orig_flag);
320 std::optional<Library *> owner_library,
321 const ID *id,
322 std::optional<const ID *> new_owner_id,
323 ID **new_id_p,
324 int orig_flag);
325
336
341void BKE_id_move_to_same_lib(Main &bmain, ID &id, const ID &owner_id);
342
367
400
407 ID &id,
410
418 ID &id,
421
429 short type,
430 const char *name,
431 const std::optional<Library *> lib = std::nullopt)
433ID *BKE_libblock_find_session_uid(Main *bmain, short type, uint32_t session_uid);
434ID *BKE_libblock_find_session_uid(Main *bmain, uint32_t session_uid);
441 short type,
442 const char *name,
443 const char *lib_name);
450 short type,
451 const char *name,
452 const char *lib_filepath_abs);
453
472
474
475/* `lib_remap.cc` (keep here since they're general functions) */
479enum {
480 /* *** Generic options (should be handled by all ID types freeing). *** */
494
501};
502
509
526
528void BKE_libblock_free_data(ID *id, bool do_id_user) ATTR_NONNULL();
529
535
553void BKE_id_free_ex(Main *bmain, void *idv, int flag_orig, bool use_flag_from_idtag);
563void BKE_id_free(Main *bmain, void *idv);
564
569void BKE_id_free_us(Main *bmain, void *idv) ATTR_NONNULL();
570
574void BKE_id_delete(Main *bmain, void *idv) ATTR_NONNULL();
583void BKE_id_delete_ex(Main *bmain, void *idv, const int extra_remapping_flags) ATTR_NONNULL(1, 2);
606size_t BKE_id_multi_delete(Main *bmain, blender::Set<ID *> &ids_to_delete);
607
611void BKE_libblock_management_main_add(Main *bmain, void *idv);
613void BKE_libblock_management_main_remove(Main *bmain, void *idv);
614
615void BKE_libblock_management_usercounts_set(Main *bmain, void *idv);
616void BKE_libblock_management_usercounts_clear(Main *bmain, void *idv);
617
618void id_lib_extern(ID *id);
628void id_us_ensure_real(ID *id);
629void id_us_clear_real(ID *id);
634void id_us_plus_no_lib(ID *id);
635void id_us_plus(ID *id);
636/* decrements the user count for *id. */
637void id_us_min(ID *id);
638void id_fake_user_set(ID *id);
639void id_fake_user_clear(ID *id);
641
643enum {
651
656
662
665};
666
676 Main *bmain, ID *id, int flags, bool *r_force_local, bool *r_force_copy);
680void BKE_lib_id_make_local_generic(Main *bmain, ID *id, int flags);
690bool BKE_lib_id_make_local(Main *bmain, ID *id, int flags);
695
697bool BKE_id_copy_is_allowed(const ID *id);
725ID *BKE_id_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int flag);
737struct ID *BKE_id_copy_in_lib(Main *bmain,
738 std::optional<Library *> owner_library,
739 const ID *id,
740 std::optional<const ID *> new_owner_id,
741 ID **new_id_p,
742 int flag);
748ID *BKE_id_copy(Main *bmain, const ID *id);
749
766 ID *id,
767 eDupli_ID_Flags duplicate_flags,
768 int copy_flags);
769
775ID *BKE_id_copy_for_use_in_bmain(Main *bmain, const ID *id);
776
786void BKE_lib_id_swap(
787 Main *bmain, ID *id_a, ID *id_b, const bool do_self_remap, const int self_remap_flags);
795 Main *bmain, ID *id_a, ID *id_b, const bool do_self_remap, const int self_remap_flags);
796
805void id_sort_by_name(ListBase *lb, ID *id, ID *id_sorting_hint);
810void BKE_lib_id_expand_local(Main *bmain, ID *id, int flags);
811
828 ListBase &lb,
829 ID &id,
830 const char *newname,
831 IDNewNameMode mode,
832 bool do_linked_data);
833
840void BKE_lib_id_clear_library_data(Main *bmain, ID *id, int flags);
841
847void BKE_main_id_tag_idcode(Main *mainvar, short type, int tag, bool value);
851void BKE_main_id_tag_listbase(ListBase *lb, int tag, bool value);
855void BKE_main_id_tag_all(Main *mainvar, int tag, bool value);
856
860void BKE_main_id_flag_listbase(ListBase *lb, int flag, bool value);
864void BKE_main_id_flag_all(Main *bmain, int flag, bool value);
865
870
871void BKE_main_id_refcount_recompute(Main *bmain, bool do_linked_only);
872
874
879
881#define MAX_ID_FULL_NAME (256 + 256 + 3 + 1)
883#define MAX_ID_FULL_NAME_UI (MAX_ID_FULL_NAME + 3)
894void BKE_id_full_name_get(char name[MAX_ID_FULL_NAME], const ID *id, char separator_char);
909 const ID *id,
910 bool add_lib_hint,
911 char separator_char,
912 int *r_prefix_len);
913
917inline const char *BKE_id_name(const ID &id)
918{
919 return id.name + 2;
920}
921inline char *BKE_id_name(ID &id)
922{
923 return id.name + 2;
924}
925
931char *BKE_id_to_unique_string_key(const ID *id);
932
945void BKE_library_make_local(Main *bmain,
946 const Library *lib,
947 GHash *old_to_new_ids,
948 bool untagged_only,
949 bool set_fake,
950 bool clear_asset_data);
951
952void BKE_id_tag_set_atomic(ID *id, int tag);
953void BKE_id_tag_clear_atomic(ID *id, int tag);
954
956bool BKE_id_is_in_main(Main *bmain, ID *id);
962
963bool BKE_id_can_be_asset(const ID *id);
964
974ID *BKE_id_owner_get(ID *id, const bool debug_relationship_assert = true);
975
982bool BKE_id_is_editable(const Main *bmain, const ID *id);
983
989bool BKE_id_can_use_id(const ID &id_from, const ID &id_to);
990
998void BKE_id_reorder(const ListBase *lb, ID *id, ID *relative, bool after);
999
1000void BKE_id_blend_write(BlendWriter *writer, ID *id);
1001
1002#define IS_TAGGED(_id) ((_id) && (((ID *)_id)->tag & ID_TAG_DOIT))
1003
1004/* `lib_id_eval.cc` */
1005
1011void BKE_id_eval_properties_copy(ID *id_cow, ID *id);
void BKE_id_newptr_and_tag_clear(ID *id)
Definition lib_id.cc:412
ID * BKE_id_copy_for_duplicate(Main *bmain, ID *id, eDupli_ID_Flags duplicate_flags, int copy_flags)
Definition lib_id.cc:787
ID * BKE_libblock_find_session_uid(Main *bmain, short type, uint32_t session_uid)
Definition lib_id.cc:1728
void id_lib_extern(ID *id)
Definition lib_id.cc:290
void BKE_id_delete(Main *bmain, void *idv) ATTR_NONNULL()
IDNewNameResult BKE_id_new_name_validate(Main &bmain, ListBase &lb, ID &id, const char *newname, IDNewNameMode mode, bool do_linked_data)
Definition lib_id.cc:1903
void BKE_main_id_repair_duplicate_names_listbase(Main *bmain, ListBase *lb)
Definition lib_id.cc:1258
@ LIB_ID_MAKELOCAL_INDIRECT
@ LIB_ID_MAKELOCAL_FORCE_LOCAL
@ LIB_ID_MAKELOCAL_LIBOVERRIDE_CLEAR
@ LIB_ID_MAKELOCAL_ASSET_DATA_CLEAR
@ LIB_ID_MAKELOCAL_FULL_LIBRARY
@ LIB_ID_MAKELOCAL_FORCE_COPY
ID * BKE_id_copy_for_use_in_bmain(Main *bmain, const ID *id)
Definition lib_id.cc:851
void BKE_id_tag_clear_atomic(ID *id, int tag)
Definition lib_id.cc:2488
ID * BKE_libblock_find_name(Main *bmain, short type, const char *name, const std::optional< Library * > lib=std::nullopt) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition lib_id.cc:1710
struct ID * BKE_id_copy_in_lib(Main *bmain, std::optional< Library * > owner_library, const ID *id, std::optional< const ID * > new_owner_id, ID **new_id_p, int flag)
Definition lib_id.cc:675
void BKE_libblock_copy_in_lib(Main *bmain, std::optional< Library * > owner_library, const ID *id, std::optional< const ID * > new_owner_id, ID **new_id_p, int orig_flag)
Definition lib_id.cc:1535
bool id_single_user(bContext *C, ID *id, PointerRNA *ptr, PropertyRNA *prop)
Definition lib_id.cc:1068
IDNewNameMode
void BKE_lib_id_make_local_generic(Main *bmain, ID *id, int flags)
Definition lib_id.cc:544
void size_t BKE_id_multi_tagged_delete(Main *bmain) ATTR_NONNULL()
void BKE_lib_id_expand_local(Main *bmain, ID *id, int flags)
Definition lib_id.cc:481
void BKE_main_id_tag_idcode(Main *mainvar, short type, int tag, bool value)
Definition lib_id.cc:1217
void BKE_id_free_us(Main *bmain, void *idv) ATTR_NONNULL()
void BKE_id_full_name_get(char name[MAX_ID_FULL_NAME], const ID *id, char separator_char)
Definition lib_id.cc:2432
void BKE_libblock_free_data_py(ID *id)
void BKE_libblock_free_datablock(ID *id, int flag) ATTR_NONNULL()
void * BKE_libblock_alloc(Main *bmain, short type, const char *name, int flag) ATTR_WARN_UNUSED_RESULT
Definition lib_id.cc:1447
void BKE_libblock_free_runtime_data(ID *id)
bool BKE_id_is_editable(const Main *bmain, const ID *id)
Definition lib_id.cc:2523
size_t BKE_id_multi_delete(Main *bmain, blender::Set< ID * > &ids_to_delete)
char * BKE_id_to_unique_string_key(const ID *id)
Definition lib_id.cc:2470
void BKE_id_free(Main *bmain, void *idv)
void id_us_plus(ID *id)
Definition lib_id.cc:358
void id_sort_by_name(ListBase *lb, ID *id, ID *id_sorting_hint)
Definition lib_id.cc:1790
bool BKE_id_copy_is_allowed(const ID *id)
Definition lib_id.cc:666
void BKE_libblock_management_main_remove(Main *bmain, void *idv)
Definition lib_id.cc:1156
ID * BKE_libblock_find_name_and_library_filepath(Main *bmain, short type, const char *name, const char *lib_filepath_abs)
Definition lib_id.cc:1767
void BKE_libblock_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int orig_flag)
Definition lib_id.cc:1694
void * BKE_id_new_in_lib(Main *bmain, std::optional< Library * > owner_library, short type, const char *name)
Definition lib_id.cc:1496
#define MAX_ID_FULL_NAME_UI
void BKE_library_make_local(Main *bmain, const Library *lib, GHash *old_to_new_ids, bool untagged_only, bool set_fake, bool clear_asset_data)
Definition lib_id.cc:2129
void BKE_main_id_flag_all(Main *bmain, int flag, bool value)
Definition lib_id.cc:1249
void BKE_id_tag_set_atomic(ID *id, int tag)
Definition lib_id.cc:2483
void BKE_id_full_name_ui_prefix_get(char name[MAX_ID_FULL_NAME_UI], const ID *id, bool add_lib_hint, char separator_char, int *r_prefix_len)
Definition lib_id.cc:2449
ID * BKE_libblock_find_name_and_library(Main *bmain, short type, const char *name, const char *lib_name)
Definition lib_id.cc:1752
void BKE_id_move_to_same_lib(Main &bmain, ID &id, const ID &owner_id)
Definition lib_id.cc:879
bool BKE_id_can_use_id(const ID &id_from, const ID &id_to)
Definition lib_id.cc:2528
void BKE_libblock_free_data(ID *id, bool do_id_user) ATTR_NONNULL()
void id_fake_user_set(ID *id)
Definition lib_id.cc:396
void BKE_lib_id_swap(Main *bmain, ID *id_a, ID *id_b, const bool do_self_remap, const int self_remap_flags)
Definition lib_id.cc:1056
IDNewNameResult BKE_id_rename(Main &bmain, ID &id, blender::StringRefNull name, const IDNewNameMode mode=IDNewNameMode::RenameExistingNever)
Definition lib_id.cc:2392
void BKE_id_reorder(const ListBase *lb, ID *id, ID *relative, bool after)
Definition lib_id.cc:2595
blender::Vector< ID * > BKE_id_ordered_list(const ListBase *lb)
Definition lib_id.cc:2576
IDNewNameResult BKE_libblock_rename(Main &bmain, ID &id, blender::StringRefNull name, const IDNewNameMode mode=IDNewNameMode::RenameExistingNever)
Definition lib_id.cc:2370
void BKE_libblock_init_empty(ID *id) ATTR_NONNULL(1)
Definition lib_id.cc:1452
bool BKE_id_is_in_main(Main *bmain, ID *id)
Definition lib_id.cc:2493
void BKE_main_id_newptr_and_tag_clear(Main *bmain)
Definition lib_id.cc:2001
ID * BKE_id_owner_get(ID *id, const bool debug_relationship_assert=true)
Definition lib_id.cc:2511
void BKE_lib_libblock_session_uid_ensure(ID *id)
Definition lib_id.cc:1477
bool BKE_lib_id_make_local(Main *bmain, ID *id, int flags)
Definition lib_id.cc:598
void id_us_ensure_real(ID *id)
Definition lib_id.cc:313
void * BKE_libblock_copy(Main *bmain, const ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition lib_id.cc:1699
void id_fake_user_clear(ID *id)
Definition lib_id.cc:404
ID * BKE_id_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int flag)
Definition lib_id.cc:777
void id_us_clear_real(ID *id)
Definition lib_id.cc:331
void BKE_lib_id_swap_full(Main *bmain, ID *id_a, ID *id_b, const bool do_self_remap, const int self_remap_flags)
Definition lib_id.cc:1062
void BKE_libblock_management_usercounts_set(Main *bmain, void *idv)
Definition lib_id.cc:1176
void BKE_lib_id_make_local_generic_action_define(Main *bmain, ID *id, int flags, bool *r_force_local, bool *r_force_copy)
Definition lib_id.cc:502
void BKE_main_lib_objects_recalc_all(Main *bmain)
Definition lib_id.cc:1290
ID * BKE_id_copy(Main *bmain, const ID *id)
Definition lib_id.cc:782
void * BKE_id_new(Main *bmain, short type, const char *name)
Definition lib_id.cc:1514
void id_us_plus_no_lib(ID *id)
Definition lib_id.cc:342
void BKE_id_eval_properties_copy(ID *id_cow, ID *id)
void BKE_libblock_runtime_reset_remapping_status(ID *id) ATTR_NONNULL(1)
Definition lib_id.cc:1466
@ LIB_ID_CREATE_NO_ALLOCATE
@ LIB_ID_CREATE_LOCALIZE
@ LIB_ID_COPY_ASSET_METADATA
@ LIB_ID_COPY_NODETREE_LOCALIZE
@ LIB_ID_COPY_NO_PREVIEW
@ LIB_ID_COPY_ID_NEW_SET
@ LIB_ID_COPY_CACHES
@ LIB_ID_COPY_NO_LIB_OVERRIDE
@ LIB_ID_COPY_SET_COPIED_ON_WRITE
@ LIB_ID_CREATE_LOCAL
@ LIB_ID_COPY_ACTIONS
@ LIB_ID_COPY_NO_LIB_OVERRIDE_LOCAL_DATA_FLAG
@ LIB_ID_COPY_LOCALIZE
@ LIB_ID_CREATE_NO_USER_REFCOUNT
@ LIB_ID_COPY_NO_ANIMDATA
@ LIB_ID_COPY_SHAPEKEY
@ LIB_ID_CREATE_NO_MAIN
@ LIB_ID_COPY_DEFAULT
@ LIB_ID_CREATE_NO_DEG_TAG
@ LIB_ID_COPY_RIGID_BODY_NO_COLLECTION_HANDLING
void BKE_id_delete_ex(Main *bmain, void *idv, const int extra_remapping_flags) ATTR_NONNULL(1
void id_lib_indirect_weak_link(ID *id)
Definition lib_id.cc:303
const char * BKE_id_name(const ID &id)
void BKE_libblock_runtime_ensure(ID &id)
Definition lib_id.cc:1316
void id_us_min(ID *id)
Definition lib_id.cc:366
@ LIB_ID_FREE_NO_UI_USER
@ LIB_ID_FREE_NOT_ALLOCATED
@ LIB_ID_FREE_NO_DEG_TAG
@ LIB_ID_FREE_NO_USER_REFCOUNT
@ LIB_ID_FREE_NO_MAIN
@ LIB_ID_FREE_NO_NAMEMAP_REMOVE
void * BKE_libblock_alloc_in_lib(Main *bmain, std::optional< Library * > owner_library, short type, const char *name, int flag) ATTR_WARN_UNUSED_RESULT
Definition lib_id.cc:1352
void BKE_main_id_tag_listbase(ListBase *lb, int tag, bool value)
Definition lib_id.cc:1201
void BKE_lib_id_clear_library_data(Main *bmain, ID *id, int flags)
Definition lib_id.cc:208
eLibIDDuplicateFlags
@ LIB_ID_DUPLICATE_IS_ROOT_ID
@ LIB_ID_DUPLICATE_IS_SUBPROCESS
void * BKE_id_new_nomain(short type, const char *name)
Definition lib_id.cc:1519
void BKE_id_blend_write(BlendWriter *writer, ID *id)
Definition lib_id.cc:2631
void BKE_id_free_ex(Main *bmain, void *idv, int flag_orig, bool use_flag_from_idtag)
void BKE_libblock_management_main_add(Main *bmain, void *idv)
Definition lib_id.cc:1123
void BKE_main_id_refcount_recompute(Main *bmain, bool do_linked_only)
Definition lib_id.cc:2035
ID * BKE_libblock_alloc_notest(short type) ATTR_WARN_UNUSED_RESULT
Definition lib_id.cc:1340
void BKE_main_id_flag_listbase(ListBase *lb, int flag, bool value)
Definition lib_id.cc:1233
#define MAX_ID_FULL_NAME
void BKE_libblock_management_usercounts_clear(Main *bmain, void *idv)
Definition lib_id.cc:1188
void BKE_main_id_tag_all(Main *mainvar, int tag, bool value)
Definition lib_id.cc:1224
size_t BKE_libblock_get_alloc_info(short type, const char **r_name)
Definition lib_id.cc:1323
bool BKE_id_can_be_asset(const ID *id)
Definition lib_id.cc:2505
bool BKE_id_is_in_global_main(ID *id)
Definition lib_id.cc:2500
void BKE_lib_libblock_session_uid_renew(ID *id)
Definition lib_id.cc:1490
#define ATTR_WARN_UNUSED_RESULT
#define ATTR_NONNULL(...)
#define ENUM_OPERATORS(_type, _max)
ID and Library types, which are fundamental for SDNA.
ID_Type
eDupli_ID_Flags
#define C
Definition RandGen.cpp:29
long long int int64_t
#define T
const char * name
enum IDNewNameResult::Action action
Definition DNA_ID.h:414
int tag
Definition DNA_ID.h:442
ID_Readfile_Data * readfile_data
Definition BKE_lib_id.hh:91
static DynamicLibrary lib
PointerRNA * ptr
Definition wm_files.cc:4238
uint8_t flag
Definition wm_window.cc:145