Blender V4.5
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 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);
132
133template<typename T> inline T *BKE_id_new(Main *bmain, const char *name)
134{
135 const ID_Type id_type = T::id_type;
136 return static_cast<T *>(BKE_id_new(bmain, id_type, name));
137}
138
146void *BKE_id_new_in_lib(Main *bmain,
147 std::optional<Library *> owner_library,
148 short type,
149 const char *name);
156void *BKE_id_new_nomain(short type, const char *name);
157
158template<typename T> inline T *BKE_id_new_nomain(const char *name)
159{
160 const ID_Type id_type = T::id_type;
161 return static_cast<T *>(BKE_id_new_nomain(id_type, name));
162}
163
167enum {
168 /* *** Generic options (should be handled by all ID types copying, ID creation, etc.). *** */
186
189
197
203
204 /* *** Specific options to some ID types or usages. *** */
205 /* *** May be ignored by unrelated ID copying functions. *** */
207 /* LIB_ID_COPY_NO_PROXY_CLEAR = 1 << 16, */ /* UNUSED */
221
222 /* *** XXX Hackish/not-so-nice specific behaviors needed for some corner cases. *** */
223 /* *** Ideally we should not have those, but we need them for now... *** */
235 /* Copy asset metadata. */
237
238 /* *** Helper 'defines' gathering most common flag sets. *** */
241
248};
249
250void BKE_libblock_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int orig_flag);
262 std::optional<Library *> owner_library,
263 const ID *id,
264 std::optional<const ID *> new_owner_id,
265 ID **new_id_p,
266 int orig_flag);
267
278
283void BKE_id_move_to_same_lib(Main &bmain, ID &id, const ID &owner_id);
284
309
342
349 ID &id,
352
360 ID &id,
363
365 short type,
366 const char *name,
367 const std::optional<Library *> lib = std::nullopt)
369ID *BKE_libblock_find_session_uid(Main *bmain, short type, uint32_t session_uid);
370ID *BKE_libblock_find_session_uid(Main *bmain, uint32_t session_uid);
372 short type,
373 const char *name,
374 const char *lib_name);
376 short type,
377 const char *name,
378 const char *lib_filepath_abs);
379
398
400
401/* `lib_remap.cc` (keep here since they're general functions) */
405enum {
406 /* *** Generic options (should be handled by all ID types freeing). *** */
420
427};
428
436void BKE_libblock_free_data(ID *id, bool do_id_user) ATTR_NONNULL();
438
446
464void BKE_id_free_ex(Main *bmain, void *idv, int flag_orig, bool use_flag_from_idtag);
474void BKE_id_free(Main *bmain, void *idv);
475
480void BKE_id_free_us(Main *bmain, void *idv) ATTR_NONNULL();
481
485void BKE_id_delete(Main *bmain, void *idv) ATTR_NONNULL();
494void BKE_id_delete_ex(Main *bmain, void *idv, const int extra_remapping_flags) ATTR_NONNULL(1, 2);
517size_t BKE_id_multi_delete(Main *bmain, blender::Set<ID *> &ids_to_delete);
518
522void BKE_libblock_management_main_add(Main *bmain, void *idv);
524void BKE_libblock_management_main_remove(Main *bmain, void *idv);
525
526void BKE_libblock_management_usercounts_set(Main *bmain, void *idv);
527void BKE_libblock_management_usercounts_clear(Main *bmain, void *idv);
528
529void id_lib_extern(ID *id);
539void id_us_ensure_real(ID *id);
540void id_us_clear_real(ID *id);
545void id_us_plus_no_lib(ID *id);
546void id_us_plus(ID *id);
547/* decrements the user count for *id. */
548void id_us_min(ID *id);
549void id_fake_user_set(ID *id);
550void id_fake_user_clear(ID *id);
552
554enum {
562
567
573
576};
577
587 Main *bmain, ID *id, int flags, bool *r_force_local, bool *r_force_copy);
591void BKE_lib_id_make_local_generic(Main *bmain, ID *id, int flags);
601bool BKE_lib_id_make_local(Main *bmain, ID *id, int flags);
606
608bool BKE_id_copy_is_allowed(const ID *id);
636ID *BKE_id_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int flag);
648struct ID *BKE_id_copy_in_lib(Main *bmain,
649 std::optional<Library *> owner_library,
650 const ID *id,
651 std::optional<const ID *> new_owner_id,
652 ID **new_id_p,
653 int flag);
659ID *BKE_id_copy(Main *bmain, const ID *id);
660
677 ID *id,
678 eDupli_ID_Flags duplicate_flags,
679 int copy_flags);
680
686ID *BKE_id_copy_for_use_in_bmain(Main *bmain, const ID *id);
687
697void BKE_lib_id_swap(
698 Main *bmain, ID *id_a, ID *id_b, const bool do_self_remap, const int self_remap_flags);
706 Main *bmain, ID *id_a, ID *id_b, const bool do_self_remap, const int self_remap_flags);
707
716void id_sort_by_name(ListBase *lb, ID *id, ID *id_sorting_hint);
721void BKE_lib_id_expand_local(Main *bmain, ID *id, int flags);
722
739 ListBase &lb,
740 ID &id,
741 const char *newname,
742 IDNewNameMode mode,
743 bool do_linked_data);
744
751void BKE_lib_id_clear_library_data(Main *bmain, ID *id, int flags);
752
758void BKE_main_id_tag_idcode(Main *mainvar, short type, int tag, bool value);
762void BKE_main_id_tag_listbase(ListBase *lb, int tag, bool value);
766void BKE_main_id_tag_all(Main *mainvar, int tag, bool value);
767
771void BKE_main_id_flag_listbase(ListBase *lb, int flag, bool value);
775void BKE_main_id_flag_all(Main *bmain, int flag, bool value);
776
781
782void BKE_main_id_refcount_recompute(Main *bmain, bool do_linked_only);
783
785
790
791#define MAX_ID_FULL_NAME (64 + 64 + 3 + 1) /* 64 is MAX_ID_NAME - 2 */
792#define MAX_ID_FULL_NAME_UI (MAX_ID_FULL_NAME + 3) /* Adds `keycode` two letters at beginning. */
803void BKE_id_full_name_get(char name[MAX_ID_FULL_NAME], const ID *id, char separator_char);
818 const ID *id,
819 bool add_lib_hint,
820 char separator_char,
821 int *r_prefix_len);
822
826inline const char *BKE_id_name(const ID &id)
827{
828 return id.name + 2;
829}
830inline char *BKE_id_name(ID &id)
831{
832 return id.name + 2;
833}
834
840char *BKE_id_to_unique_string_key(const ID *id);
841
854void BKE_library_make_local(Main *bmain,
855 const Library *lib,
856 GHash *old_to_new_ids,
857 bool untagged_only,
858 bool set_fake,
859 bool clear_asset_data);
860
861void BKE_id_tag_set_atomic(ID *id, int tag);
862void BKE_id_tag_clear_atomic(ID *id, int tag);
863
865bool BKE_id_is_in_main(Main *bmain, ID *id);
871
872bool BKE_id_can_be_asset(const ID *id);
873
883ID *BKE_id_owner_get(ID *id, const bool debug_relationship_assert = true);
884
891bool BKE_id_is_editable(const Main *bmain, const ID *id);
892
898bool BKE_id_can_use_id(const ID &id_from, const ID &id_to);
899
907void BKE_id_reorder(const ListBase *lb, ID *id, ID *relative, bool after);
908
909void BKE_id_blend_write(BlendWriter *writer, ID *id);
910
911#define IS_TAGGED(_id) ((_id) && (((ID *)_id)->tag & ID_TAG_DOIT))
912
913/* `lib_id_eval.cc` */
914
920void BKE_id_eval_properties_copy(ID *id_cow, ID *id);
void BKE_id_newptr_and_tag_clear(ID *id)
Definition lib_id.cc:407
ID * BKE_id_copy_for_duplicate(Main *bmain, ID *id, eDupli_ID_Flags duplicate_flags, int copy_flags)
Definition lib_id.cc:777
ID * BKE_libblock_find_session_uid(Main *bmain, short type, uint32_t session_uid)
Definition lib_id.cc:1697
void id_lib_extern(ID *id)
Definition lib_id.cc:285
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:1883
void BKE_main_id_repair_duplicate_names_listbase(Main *bmain, ListBase *lb)
Definition lib_id.cc:1248
ID * BKE_id_copy_for_use_in_bmain(Main *bmain, const ID *id)
Definition lib_id.cc:841
void BKE_id_tag_clear_atomic(ID *id, int tag)
Definition lib_id.cc:2468
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:1679
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:663
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:1516
bool id_single_user(bContext *C, ID *id, PointerRNA *ptr, PropertyRNA *prop)
Definition lib_id.cc:1058
IDNewNameMode
void BKE_lib_id_make_local_generic(Main *bmain, ID *id, int flags)
Definition lib_id.cc:532
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:476
void BKE_main_id_tag_idcode(Main *mainvar, short type, int tag, bool value)
Definition lib_id.cc:1207
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:2412
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:1428
bool BKE_id_is_editable(const Main *bmain, const ID *id)
Definition lib_id.cc:2503
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:2450
void BKE_id_free(Main *bmain, void *idv)
void id_us_plus(ID *id)
Definition lib_id.cc:353
void id_sort_by_name(ListBase *lb, ID *id, ID *id_sorting_hint)
Definition lib_id.cc:1770
@ 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
bool BKE_id_copy_is_allowed(const ID *id)
Definition lib_id.cc:654
void BKE_libblock_management_main_remove(Main *bmain, void *idv)
Definition lib_id.cc:1146
ID * BKE_libblock_find_name_and_library_filepath(Main *bmain, short type, const char *name, const char *lib_filepath_abs)
Definition lib_id.cc:1749
void BKE_libblock_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int orig_flag)
Definition lib_id.cc:1663
void * BKE_id_new_in_lib(Main *bmain, std::optional< Library * > owner_library, short type, const char *name)
Definition lib_id.cc:1477
#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:2109
void BKE_main_id_flag_all(Main *bmain, int flag, bool value)
Definition lib_id.cc:1239
void BKE_id_tag_set_atomic(ID *id, int tag)
Definition lib_id.cc:2463
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:2429
ID * BKE_libblock_find_name_and_library(Main *bmain, short type, const char *name, const char *lib_name)
Definition lib_id.cc:1721
void BKE_id_move_to_same_lib(Main &bmain, ID &id, const ID &owner_id)
Definition lib_id.cc:869
bool BKE_id_can_use_id(const ID &id_from, const ID &id_to)
Definition lib_id.cc:2508
void BKE_libblock_free_data(ID *id, bool do_id_user) ATTR_NONNULL()
void id_fake_user_set(ID *id)
Definition lib_id.cc:391
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:1046
IDNewNameResult BKE_id_rename(Main &bmain, ID &id, blender::StringRefNull name, const IDNewNameMode mode=IDNewNameMode::RenameExistingNever)
Definition lib_id.cc:2372
void BKE_id_reorder(const ListBase *lb, ID *id, ID *relative, bool after)
Definition lib_id.cc:2575
blender::Vector< ID * > BKE_id_ordered_list(const ListBase *lb)
Definition lib_id.cc:2556
IDNewNameResult BKE_libblock_rename(Main &bmain, ID &id, blender::StringRefNull name, const IDNewNameMode mode=IDNewNameMode::RenameExistingNever)
Definition lib_id.cc:2350
void BKE_libblock_init_empty(ID *id) ATTR_NONNULL(1)
Definition lib_id.cc:1433
bool BKE_id_is_in_main(Main *bmain, ID *id)
Definition lib_id.cc:2473
@ 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 BKE_main_id_newptr_and_tag_clear(Main *bmain)
Definition lib_id.cc:1981
ID * BKE_id_owner_get(ID *id, const bool debug_relationship_assert=true)
Definition lib_id.cc:2491
void BKE_lib_libblock_session_uid_ensure(ID *id)
Definition lib_id.cc:1458
bool BKE_lib_id_make_local(Main *bmain, ID *id, int flags)
Definition lib_id.cc:586
void id_us_ensure_real(ID *id)
Definition lib_id.cc:308
void * BKE_libblock_copy(Main *bmain, const ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition lib_id.cc:1668
void id_fake_user_clear(ID *id)
Definition lib_id.cc:399
ID * BKE_id_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int flag)
Definition lib_id.cc:767
void id_us_clear_real(ID *id)
Definition lib_id.cc:326
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:1052
void BKE_libblock_management_usercounts_set(Main *bmain, void *idv)
Definition lib_id.cc:1166
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:490
void BKE_main_lib_objects_recalc_all(Main *bmain)
Definition lib_id.cc:1280
ID * BKE_id_copy(Main *bmain, const ID *id)
Definition lib_id.cc:772
void * BKE_id_new(Main *bmain, short type, const char *name)
Definition lib_id.cc:1495
@ 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 id_us_plus_no_lib(ID *id)
Definition lib_id.cc:337
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:1447
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:298
const char * BKE_id_name(const ID &id)
void id_us_min(ID *id)
Definition lib_id.cc:361
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:1334
void BKE_main_id_tag_listbase(ListBase *lb, int tag, bool value)
Definition lib_id.cc:1191
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:1500
void BKE_id_blend_write(BlendWriter *writer, ID *id)
Definition lib_id.cc:2611
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:1113
void BKE_main_id_refcount_recompute(Main *bmain, bool do_linked_only)
Definition lib_id.cc:2015
ID * BKE_libblock_alloc_notest(short type) ATTR_WARN_UNUSED_RESULT
Definition lib_id.cc:1323
void BKE_main_id_flag_listbase(ListBase *lb, int flag, bool value)
Definition lib_id.cc:1223
#define MAX_ID_FULL_NAME
void BKE_libblock_management_usercounts_clear(Main *bmain, void *idv)
Definition lib_id.cc:1178
void BKE_main_id_tag_all(Main *mainvar, int tag, bool value)
Definition lib_id.cc:1214
size_t BKE_libblock_get_alloc_info(short type, const char **r_name)
Definition lib_id.cc:1306
bool BKE_id_can_be_asset(const ID *id)
Definition lib_id.cc:2485
bool BKE_id_is_in_global_main(ID *id)
Definition lib_id.cc:2480
void BKE_libblock_free_runtime_data(ID *id) ATTR_NONNULL()
void BKE_lib_libblock_session_uid_renew(ID *id)
Definition lib_id.cc:1471
#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
#define T
enum IDNewNameResult::Action action
Definition DNA_ID.h:404
int tag
Definition DNA_ID.h:424
char name[66]
Definition DNA_ID.h:415
static DynamicLibrary lib
PointerRNA * ptr
Definition wm_files.cc:4226
uint8_t flag
Definition wm_window.cc:139