Blender V4.3
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
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 GHash;
46struct ID;
47struct Library;
48struct ListBase;
49struct Main;
50struct PointerRNA;
51struct PropertyRNA;
52struct bContext;
53
57size_t BKE_libblock_get_alloc_info(short type, const char **r_name);
73void *BKE_libblock_alloc(Main *bmain, short type, const char *name, int flag)
83 std::optional<Library *> owner_library,
84 short type,
85 const char *name,
92
97
98/* *** ID's session_uid management. *** */
99
103#define MAIN_ID_SESSION_UID_UNSET 0
104
121
131void *BKE_id_new(Main *bmain, short type, const char *name);
139void *BKE_id_new_in_lib(Main *bmain,
140 std::optional<Library *> owner_library,
141 short type,
142 const char *name);
149void *BKE_id_new_nomain(short type, const char *name);
150
154enum {
155 /* *** Generic options (should be handled by all ID types copying, ID creation, etc.). *** */
167
170
176
180
181 /* *** Specific options to some ID types or usages. *** */
182 /* *** May be ignored by unrelated ID copying functions. *** */
184 /* LIB_ID_COPY_NO_PROXY_CLEAR = 1 << 16, */ /* UNUSED */
196
197 /* *** XXX Hackish/not-so-nice specific behaviors needed for some corner cases. *** */
198 /* *** Ideally we should not have those, but we need them for now... *** */
210 /* Copy asset metadata. */
212
213 /* *** Helper 'defines' gathering most common flag sets. *** */
216
223};
224
225void BKE_libblock_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int orig_flag);
237 std::optional<Library *> owner_library,
238 const ID *id,
239 const ID *new_owner_id,
240 ID **new_id_p,
241 int orig_flag);
242
253
258void BKE_id_move_to_same_lib(Main &bmain, ID &id, const ID &owner_id);
259
284
315
322 ID &id,
325
333 ID &id,
336
338 short type,
339 const char *name,
340 const std::optional<Library *> lib = std::nullopt)
342ID *BKE_libblock_find_session_uid(Main *bmain, short type, uint32_t session_uid);
344 short type,
345 const char *name,
346 const char *lib_name);
348 short type,
349 const char *name,
350 const char *lib_filepath_abs);
351
367
369
370/* `lib_remap.cc` (keep here since they're general functions) */
374enum {
375 /* *** Generic options (should be handled by all ID types freeing). *** */
389
396};
397
399void BKE_libblock_free_data(ID *id, bool do_id_user) ATTR_NONNULL();
400
408
426void BKE_id_free_ex(Main *bmain, void *idv, int flag_orig, bool use_flag_from_idtag);
436void BKE_id_free(Main *bmain, void *idv);
437
442void BKE_id_free_us(Main *bmain, void *idv) ATTR_NONNULL();
443
447void BKE_id_delete(Main *bmain, void *idv) ATTR_NONNULL();
456void BKE_id_delete_ex(Main *bmain, void *idv, const int extra_remapping_flags) ATTR_NONNULL(1, 2);
479size_t BKE_id_multi_delete(Main *bmain, blender::Set<ID *> &ids_to_delete);
480
484void BKE_libblock_management_main_add(Main *bmain, void *idv);
486void BKE_libblock_management_main_remove(Main *bmain, void *idv);
487
488void BKE_libblock_management_usercounts_set(Main *bmain, void *idv);
489void BKE_libblock_management_usercounts_clear(Main *bmain, void *idv);
490
491void id_lib_extern(ID *id);
501void id_us_ensure_real(ID *id);
502void id_us_clear_real(ID *id);
507void id_us_plus_no_lib(ID *id);
508void id_us_plus(ID *id);
509/* decrements the user count for *id. */
510void id_us_min(ID *id);
511void id_fake_user_set(ID *id);
512void id_fake_user_clear(ID *id);
514
516enum {
524
529
535
538};
539
549 Main *bmain, ID *id, int flags, bool *r_force_local, bool *r_force_copy);
553void BKE_lib_id_make_local_generic(Main *bmain, ID *id, int flags);
563bool BKE_lib_id_make_local(Main *bmain, ID *id, int flags);
567bool id_single_user(bContext *C, ID *id, PointerRNA *ptr, PropertyRNA *prop);
568
570bool BKE_id_copy_is_allowed(const ID *id);
598ID *BKE_id_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int flag);
610struct ID *BKE_id_copy_in_lib(Main *bmain,
611 std::optional<Library *> owner_library,
612 const ID *id,
613 const ID *new_owner_id,
614 ID **new_id_p,
615 int flag);
621ID *BKE_id_copy(Main *bmain, const ID *id);
622
639 ID *id,
640 eDupli_ID_Flags duplicate_flags,
641 int copy_flags);
642
648ID *BKE_id_copy_for_use_in_bmain(Main *bmain, const ID *id);
649
659void BKE_lib_id_swap(
660 Main *bmain, ID *id_a, ID *id_b, const bool do_self_remap, const int self_remap_flags);
668 Main *bmain, ID *id_a, ID *id_b, const bool do_self_remap, const int self_remap_flags);
669
678void id_sort_by_name(ListBase *lb, ID *id, ID *id_sorting_hint);
683void BKE_lib_id_expand_local(Main *bmain, ID *id, int flags);
684
701 ListBase &lb,
702 ID &id,
703 const char *newname,
704 IDNewNameMode mode,
705 bool do_linked_data);
706
713void BKE_lib_id_clear_library_data(Main *bmain, ID *id, int flags);
714
720void BKE_main_id_tag_idcode(Main *mainvar, short type, int tag, bool value);
724void BKE_main_id_tag_listbase(ListBase *lb, int tag, bool value);
728void BKE_main_id_tag_all(Main *mainvar, int tag, bool value);
729
733void BKE_main_id_flag_listbase(ListBase *lb, int flag, bool value);
737void BKE_main_id_flag_all(Main *bmain, int flag, bool value);
738
743
744void BKE_main_id_refcount_recompute(Main *bmain, bool do_linked_only);
745
747
752
753#define MAX_ID_FULL_NAME (64 + 64 + 3 + 1) /* 64 is MAX_ID_NAME - 2 */
754#define MAX_ID_FULL_NAME_UI (MAX_ID_FULL_NAME + 3) /* Adds 'keycode' two letters at beginning. */
765void BKE_id_full_name_get(char name[MAX_ID_FULL_NAME], const ID *id, char separator_char);
780 const ID *id,
781 bool add_lib_hint,
782 char separator_char,
783 int *r_prefix_len);
784
788inline const char *BKE_id_name(const ID &id)
789{
790 return id.name + 2;
791}
792inline char *BKE_id_name(ID &id)
793{
794 return id.name + 2;
795}
796
802char *BKE_id_to_unique_string_key(const ID *id);
803
816void BKE_library_make_local(Main *bmain,
817 const Library *lib,
818 GHash *old_to_new_ids,
819 bool untagged_only,
820 bool set_fake,
821 bool clear_asset_data);
822
823void BKE_id_tag_set_atomic(ID *id, int tag);
824void BKE_id_tag_clear_atomic(ID *id, int tag);
825
827bool BKE_id_is_in_main(Main *bmain, ID *id);
833
834bool BKE_id_can_be_asset(const ID *id);
835
845ID *BKE_id_owner_get(ID *id, const bool debug_relationship_assert = true);
846
853bool BKE_id_is_editable(const Main *bmain, const ID *id);
854
860bool BKE_id_can_use_id(const ID &id_from, const ID &id_to);
861
869void BKE_id_reorder(const ListBase *lb, ID *id, ID *relative, bool after);
870
871void BKE_id_blend_write(BlendWriter *writer, ID *id);
872
873#define IS_TAGGED(_id) ((_id) && (((ID *)_id)->tag & ID_TAG_DOIT))
874
875/* `lib_id_eval.cc` */
876
882void BKE_id_eval_properties_copy(ID *id_cow, ID *id);
void BKE_id_newptr_and_tag_clear(ID *id)
Definition lib_id.cc:405
ID * BKE_id_copy_for_duplicate(Main *bmain, ID *id, eDupli_ID_Flags duplicate_flags, int copy_flags)
Definition lib_id.cc:770
ID * BKE_libblock_find_session_uid(Main *bmain, short type, uint32_t session_uid)
Definition lib_id.cc:1675
void id_lib_extern(ID *id)
Definition lib_id.cc:283
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:1850
void BKE_main_id_repair_duplicate_names_listbase(Main *bmain, ListBase *lb)
Definition lib_id.cc:1235
ID * BKE_id_copy_for_use_in_bmain(Main *bmain, const ID *id)
Definition lib_id.cc:834
void BKE_id_tag_clear_atomic(ID *id, int tag)
Definition lib_id.cc:2421
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:1657
bool id_single_user(bContext *C, ID *id, PointerRNA *ptr, PropertyRNA *prop)
Definition lib_id.cc:1034
IDNewNameMode
void BKE_lib_id_make_local_generic(Main *bmain, ID *id, int flags)
Definition lib_id.cc:530
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:474
void BKE_main_id_tag_idcode(Main *mainvar, short type, int tag, bool value)
Definition lib_id.cc:1191
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:2365
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:1415
bool BKE_id_is_editable(const Main *bmain, const ID *id)
Definition lib_id.cc:2456
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:2403
@ 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_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_free(Main *bmain, void *idv)
void id_us_plus(ID *id)
Definition lib_id.cc:351
void id_sort_by_name(ListBase *lb, ID *id, ID *id_sorting_hint)
Definition lib_id.cc:1737
bool BKE_id_copy_is_allowed(const ID *id)
Definition lib_id.cc:647
void BKE_libblock_management_main_remove(Main *bmain, void *idv)
Definition lib_id.cc:1130
ID * BKE_libblock_find_name_and_library_filepath(Main *bmain, short type, const char *name, const char *lib_filepath_abs)
Definition lib_id.cc:1715
void BKE_libblock_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int orig_flag)
Definition lib_id.cc:1641
void * BKE_id_new_in_lib(Main *bmain, std::optional< Library * > owner_library, short type, const char *name)
Definition lib_id.cc:1464
#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:2075
void BKE_main_id_flag_all(Main *bmain, int flag, bool value)
Definition lib_id.cc:1225
void BKE_id_tag_set_atomic(ID *id, int tag)
Definition lib_id.cc:2416
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:2382
ID * BKE_libblock_find_name_and_library(Main *bmain, short type, const char *name, const char *lib_name)
Definition lib_id.cc:1687
void BKE_id_move_to_same_lib(Main &bmain, ID &id, const ID &owner_id)
Definition lib_id.cc:862
bool BKE_id_can_use_id(const ID &id_from, const ID &id_to)
Definition lib_id.cc:2461
void BKE_libblock_free_data(ID *id, bool do_id_user) ATTR_NONNULL()
void id_fake_user_set(ID *id)
Definition lib_id.cc:389
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:1022
IDNewNameResult BKE_id_rename(Main &bmain, ID &id, blender::StringRefNull name, const IDNewNameMode mode=IDNewNameMode::RenameExistingNever)
Definition lib_id.cc:2338
void BKE_id_reorder(const ListBase *lb, ID *id, ID *relative, bool after)
Definition lib_id.cc:2524
blender::Vector< ID * > BKE_id_ordered_list(const ListBase *lb)
Definition lib_id.cc:2505
IDNewNameResult BKE_libblock_rename(Main &bmain, ID &id, blender::StringRefNull name, const IDNewNameMode mode=IDNewNameMode::RenameExistingNever)
Definition lib_id.cc:2316
void BKE_libblock_init_empty(ID *id) ATTR_NONNULL(1)
Definition lib_id.cc:1420
void BKE_libblock_copy_in_lib(Main *bmain, std::optional< Library * > owner_library, const ID *id, const ID *new_owner_id, ID **new_id_p, int orig_flag)
Definition lib_id.cc:1503
bool BKE_id_is_in_main(Main *bmain, ID *id)
Definition lib_id.cc:2426
void BKE_main_id_newptr_and_tag_clear(Main *bmain)
Definition lib_id.cc:1947
ID * BKE_id_owner_get(ID *id, const bool debug_relationship_assert=true)
Definition lib_id.cc:2444
void BKE_lib_libblock_session_uid_ensure(ID *id)
Definition lib_id.cc:1445
struct ID * BKE_id_copy_in_lib(Main *bmain, std::optional< Library * > owner_library, const ID *id, const ID *new_owner_id, ID **new_id_p, int flag)
Definition lib_id.cc:656
bool BKE_lib_id_make_local(Main *bmain, ID *id, int flags)
Definition lib_id.cc:584
void id_us_ensure_real(ID *id)
Definition lib_id.cc:306
void * BKE_libblock_copy(Main *bmain, const ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition lib_id.cc:1646
void id_fake_user_clear(ID *id)
Definition lib_id.cc:397
ID * BKE_id_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int flag)
Definition lib_id.cc:760
void id_us_clear_real(ID *id)
Definition lib_id.cc:324
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:1028
void BKE_libblock_management_usercounts_set(Main *bmain, void *idv)
Definition lib_id.cc:1150
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:488
void BKE_main_lib_objects_recalc_all(Main *bmain)
Definition lib_id.cc:1267
ID * BKE_id_copy(Main *bmain, const ID *id)
Definition lib_id.cc:765
@ 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_id_new(Main *bmain, short type, const char *name)
Definition lib_id.cc:1482
void id_us_plus_no_lib(ID *id)
Definition lib_id.cc:335
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:1434
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:296
const char * BKE_id_name(const ID &id)
@ 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
void id_us_min(ID *id)
Definition lib_id.cc:359
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:1321
void BKE_main_id_tag_listbase(ListBase *lb, int tag, bool value)
Definition lib_id.cc:1175
void BKE_lib_id_clear_library_data(Main *bmain, ID *id, int flags)
Definition lib_id.cc:206
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:1487
void * BKE_libblock_alloc_notest(short type) ATTR_WARN_UNUSED_RESULT
Definition lib_id.cc:1310
void BKE_id_blend_write(BlendWriter *writer, ID *id)
Definition lib_id.cc:2560
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:1097
void BKE_main_id_refcount_recompute(Main *bmain, bool do_linked_only)
Definition lib_id.cc:1981
void BKE_main_id_flag_listbase(ListBase *lb, int flag, bool value)
Definition lib_id.cc:1209
#define MAX_ID_FULL_NAME
void BKE_libblock_management_usercounts_clear(Main *bmain, void *idv)
Definition lib_id.cc:1162
void BKE_main_id_tag_all(Main *mainvar, int tag, bool value)
Definition lib_id.cc:1198
size_t BKE_libblock_get_alloc_info(short type, const char **r_name)
Definition lib_id.cc:1293
bool BKE_id_can_be_asset(const ID *id)
Definition lib_id.cc:2438
bool BKE_id_is_in_global_main(ID *id)
Definition lib_id.cc:2433
void BKE_lib_libblock_session_uid_renew(ID *id)
Definition lib_id.cc:1458
#define ATTR_WARN_UNUSED_RESULT
#define ATTR_NONNULL(...)
#define ENUM_OPERATORS(_type, _max)
ID and Library types, which are fundamental for SDNA.
eDupli_ID_Flags
unsigned int uint32_t
Definition stdint.h:80
enum IDNewNameResult::Action action
Definition DNA_ID.h:413
int tag
Definition DNA_ID.h:434
static DynamicLibrary lib
PointerRNA * ptr
Definition wm_files.cc:4126
uint8_t flag
Definition wm_window.cc:138