21# include <type_traits>
176#define MAX_IDPROP_NAME 64
177#define DEFAULT_ALLOC_FOR_NULL_STRINGS 64
363#define MAX_ID_NAME 66
578#define ID_FAKE_USERS(id) ((((const ID *)id)->flag & ID_FLAG_FAKEUSER) ? 1 : 0)
585#define ID_EXTRA_USERS(id) (((const ID *)id)->tag & ID_TAG_EXTRAUSER ? 1 : 0)
594#define ID_EXTRA_REAL_USERS(id) (((const ID *)id)->tag & ID_TAG_EXTRAUSER_SET ? 1 : 0)
599#define ID_REAL_USERS(id) (((const ID *)id)->us - ID_FAKE_USERS(id))
604#define ID_REFCOUNTING_USERS(id) (ID_REAL_USERS(id) - ID_EXTRA_REAL_USERS(id))
606#define ID_CHECK_UNDO(id) (!ELEM(GS((id)->name), ID_SCR, ID_WM, ID_WS, ID_BR))
608#define ID_BLEND_PATH(_bmain, _id) \
609 ((_id)->lib ? (_id)->lib->runtime->filepath_abs : BKE_main_blendfile_path((_bmain)))
610#define ID_BLEND_PATH_FROM_GLOBAL(_id) \
611 ((_id)->lib ? (_id)->lib->runtime->filepath_abs : BKE_main_blendfile_path_from_global())
613#define ID_MISSING(_id) ((((const ID *)(_id))->tag & ID_TAG_MISSING) != 0)
615#define ID_IS_LINKED(_id) (((const ID *)(_id))->lib != NULL)
617#define ID_TYPE_SUPPORTS_ASSET_EDITABLE(id_type) \
618 ELEM(id_type, ID_BR, ID_TE, ID_NT, ID_IM, ID_PC, ID_MA)
620#define ID_IS_EDITABLE(_id) \
621 ((((const ID *)(_id))->lib == NULL) || \
622 ((((const ID *)(_id))->lib->runtime->tag & LIBRARY_ASSET_EDITABLE) && \
623 ID_TYPE_SUPPORTS_ASSET_EDITABLE(GS((((const ID *)(_id))->name)))))
627#define ID_IS_OVERRIDABLE_LIBRARY_HIERARCHY(_id) \
628 (ID_IS_LINKED(_id) && !ID_MISSING(_id) && \
629 (BKE_idtype_get_info_from_id((const ID *)(_id))->flags & IDTYPE_FLAGS_NO_LIBLINKING) == 0 && \
630 !ELEM(GS(((ID *)(_id))->name), ID_SCE))
631#define ID_IS_OVERRIDABLE_LIBRARY(_id) \
632 (ID_IS_OVERRIDABLE_LIBRARY_HIERARCHY((_id)) && (((const ID *)(_id))->tag & ID_TAG_EXTERN) != 0)
638#define ID_IS_OVERRIDE_LIBRARY_REAL(_id) \
639 (((const ID *)(_id))->override_library != NULL && \
640 ((const ID *)(_id))->override_library->reference != NULL)
642#define ID_IS_OVERRIDE_LIBRARY_VIRTUAL(_id) \
643 ((((const ID *)(_id))->flag & ID_FLAG_EMBEDDED_DATA_LIB_OVERRIDE) != 0)
645#define ID_IS_OVERRIDE_LIBRARY(_id) \
646 (ID_IS_OVERRIDE_LIBRARY_REAL(_id) || ID_IS_OVERRIDE_LIBRARY_VIRTUAL(_id))
648#define ID_IS_OVERRIDE_LIBRARY_HIERARCHY_ROOT(_id) \
649 (!ID_IS_OVERRIDE_LIBRARY_REAL(_id) || \
650 ((ID *)(_id))->override_library->hierarchy_root == ((ID *)(_id)))
652#define ID_IS_ASSET(_id) (((const ID *)(_id))->asset_data != NULL)
655#define ID_TYPE_USE_COPY_ON_EVAL(_id_type) \
656 (!ELEM(_id_type, ID_LI, ID_IP, ID_SCR, ID_VF, ID_BR, ID_WM, ID_PAL, ID_PC, ID_WS, ID_IM))
660#define ID_TYPE_SUPPORTS_PARAMS_WITHOUT_COW(id_type) ELEM(id_type, ID_ME)
662#define ID_TYPE_IS_DEPRECATED(id_type) ELEM(id_type, ID_IP)
667#define GS(a) (CHECK_TYPE_ANY(a, char *, const char *), (ID_Type)(*((const short *)(a))))
669#define ID_NEW_SET(_id, _idn) \
670 (((ID *)(_id))->newid = (ID *)(_idn), \
671 ((ID *)(_id))->newid->tag |= ID_TAG_NEW, \
672 (void *)((ID *)(_id))->newid)
673#define ID_NEW_REMAP(a) \
674 if ((a) && (a)->id.newid) { \
675 *(void **)&(a) = (a)->id.newid; \
954#define ID_TAG_KEEP_ON_UNDO (ID_TAG_EXTRAUSER | ID_TAG_MISSING | ID_TAG_RUNTIME)
1105#define FILTER_ID_AC (1ULL << 0)
1106#define FILTER_ID_AR (1ULL << 1)
1107#define FILTER_ID_BR (1ULL << 2)
1108#define FILTER_ID_CA (1ULL << 3)
1109#define FILTER_ID_CU_LEGACY (1ULL << 4)
1110#define FILTER_ID_GD_LEGACY (1ULL << 5)
1111#define FILTER_ID_GR (1ULL << 6)
1112#define FILTER_ID_IM (1ULL << 7)
1113#define FILTER_ID_LA (1ULL << 8)
1114#define FILTER_ID_LS (1ULL << 9)
1115#define FILTER_ID_LT (1ULL << 10)
1116#define FILTER_ID_MA (1ULL << 11)
1117#define FILTER_ID_MB (1ULL << 12)
1118#define FILTER_ID_MC (1ULL << 13)
1119#define FILTER_ID_ME (1ULL << 14)
1120#define FILTER_ID_MSK (1ULL << 15)
1121#define FILTER_ID_NT (1ULL << 16)
1122#define FILTER_ID_OB (1ULL << 17)
1123#define FILTER_ID_PAL (1ULL << 18)
1124#define FILTER_ID_PC (1ULL << 19)
1125#define FILTER_ID_SCE (1ULL << 20)
1126#define FILTER_ID_SPK (1ULL << 21)
1127#define FILTER_ID_SO (1ULL << 22)
1128#define FILTER_ID_TE (1ULL << 23)
1129#define FILTER_ID_TXT (1ULL << 24)
1130#define FILTER_ID_VF (1ULL << 25)
1131#define FILTER_ID_WO (1ULL << 26)
1132#define FILTER_ID_PA (1ULL << 27)
1133#define FILTER_ID_CF (1ULL << 28)
1134#define FILTER_ID_WS (1ULL << 29)
1135#define FILTER_ID_LP (1ULL << 31)
1136#define FILTER_ID_CV (1ULL << 32)
1137#define FILTER_ID_PT (1ULL << 33)
1138#define FILTER_ID_VO (1ULL << 34)
1139#define FILTER_ID_SIM (1ULL << 35)
1140#define FILTER_ID_KE (1ULL << 36)
1141#define FILTER_ID_SCR (1ULL << 37)
1142#define FILTER_ID_WM (1ULL << 38)
1143#define FILTER_ID_LI (1ULL << 39)
1144#define FILTER_ID_GP (1ULL << 40)
1145#define FILTER_ID_IP (1ULL << 41)
1147#define FILTER_ID_ALL \
1148 (FILTER_ID_AC | FILTER_ID_AR | FILTER_ID_BR | FILTER_ID_CA | FILTER_ID_CU_LEGACY | \
1149 FILTER_ID_GD_LEGACY | FILTER_ID_GR | FILTER_ID_IM | FILTER_ID_LA | FILTER_ID_LS | \
1150 FILTER_ID_LT | FILTER_ID_MA | FILTER_ID_MB | FILTER_ID_MC | FILTER_ID_ME | FILTER_ID_MSK | \
1151 FILTER_ID_NT | FILTER_ID_OB | FILTER_ID_PA | FILTER_ID_PAL | FILTER_ID_PC | FILTER_ID_SCE | \
1152 FILTER_ID_SPK | FILTER_ID_SO | FILTER_ID_TE | FILTER_ID_TXT | FILTER_ID_VF | FILTER_ID_WO | \
1153 FILTER_ID_CF | FILTER_ID_WS | FILTER_ID_LP | FILTER_ID_CV | FILTER_ID_PT | FILTER_ID_VO | \
1154 FILTER_ID_SIM | FILTER_ID_KE | FILTER_ID_SCR | FILTER_ID_WM | FILTER_ID_LI | FILTER_ID_GP | \
1269#define INDEX_ID_MAX (INDEX_ID_NULL + 1)
1278template<
typename,
typename =
void>
struct has_ID_member : std::false_type {};
1279template<
typename T>
struct has_ID_member<
T, std::void_t<decltype(&T::id)>> : std::true_type {};
1280template<
typename T>
constexpr bool has_ID_as_first_member()
1282 if constexpr (std::is_standard_layout_v<T> && has_ID_member<T>::value) {
1283 return offsetof(
T,
id) == 0 && std::is_same_v<
decltype(T::id),
ID>;
1296constexpr bool is_ID_v = detail::has_ID_as_first_member<T>() || std::is_same_v<T, ID>;
1302namespace dna::detail {
1303template<
typename Dst,
typename Src,
typename SrcRuntime>
1304constexpr void id_cast_assert([[maybe_unused]] SrcRuntime *src)
1306 static_assert(blender::dna::is_ID_v<Src>);
1307 static_assert(blender::dna::is_ID_v<Dst>);
1308 if constexpr (std::is_same_v<Src, ID> && !std::is_same_v<Dst, ID>) {
1310 BLI_assert(src ==
nullptr ||
GS(src->name) == Dst::id_type);
1312 else if constexpr (!std::is_same_v<Src, ID> && std::is_same_v<Dst, ID>) {
1317 static_assert(std::is_same_v<Src, Dst>);
1330template<
typename Dst,
typename Src>
inline Dst id_cast(Src &&
id)
1332 using DstDecay = std::decay_t<Dst>;
1333 using SrcDecay = std::decay_t<Src>;
1334 static_assert(std::is_pointer_v<SrcDecay> == std::is_pointer_v<DstDecay>);
1335 if constexpr (std::is_pointer_v<SrcDecay>) {
1336 dna::detail::id_cast_assert<std::decay_t<std::remove_pointer_t<DstDecay>>,
1337 std::decay_t<std::remove_pointer_t<SrcDecay>>>(id);
1340 static_assert(std::is_lvalue_reference_v<Src> && std::is_lvalue_reference_v<Dst>);
1341 dna::detail::id_cast_assert<DstDecay, SrcDecay>(&
id);
1344 return reinterpret_cast<Dst
>(id);
struct LibraryRuntimeHandle LibraryRuntimeHandle
@ LIBOVERRIDE_PROP_TAG_NEEDS_RETORE
@ LIBOVERRIDE_PROP_OP_TAG_UNUSED
@ PRV_TAG_DEFFERED_DELETE
@ PRV_TAG_DEFFERED_RENDERING
@ PRV_TAG_DEFFERED_INVALID
@ ID_RECALC_AUDIO_LISTENER
@ ID_RECALC_GEOMETRY_ALL_MODES
@ ID_RECALC_SEQUENCER_STRIPS
@ ID_RECALC_ANIMATION_NO_FLUSH
@ LIBOVERRIDE_OP_FLAG_MANDATORY
@ LIBOVERRIDE_OP_FLAG_LOCKED
@ LIBOVERRIDE_OP_FLAG_IDPOINTER_ITEM_USE_ID
@ LIBOVERRIDE_OP_FLAG_IDPOINTER_MATCH_REFERENCE
@ ID_REMAP_IS_LINKED_DIRECT
@ ID_REMAP_IS_USER_ONE_SKIPPED
@ ID_TAG_UNDO_OLD_ID_REUSED_UNCHANGED
@ ID_TAG_UNDO_OLD_ID_REUSED_NOUNDO
@ ID_TAG_NO_USER_REFCOUNT
@ ID_TAG_LIBOVERRIDE_AUTOREFRESH
@ ID_TAG_UNDO_OLD_ID_REREAD_IN_PLACE
@ ID_TAG_COPIED_ON_EVAL_FINAL_RESULT
@ ID_TAG_LIBOVERRIDE_NEED_RESYNC
@ ID_TAG_LIBOVERRIDE_REFOK
@ ID_FLAG_INDIRECT_WEAK_LINK
@ ID_FLAG_EMBEDDED_DATA_LIB_OVERRIDE
@ ID_FLAG_LIB_OVERRIDE_RESYNC_LEFTOVER
@ LIBOVERRIDE_OP_SUBTRACT
@ LIBOVERRIDE_OP_MULTIPLY
@ LIBOVERRIDE_OP_INSERT_BEFORE
@ LIBOVERRIDE_OP_INSERT_AFTER
@ LIBOVERRIDE_FLAG_NO_HIERARCHY
@ LIBOVERRIDE_FLAG_SYSTEM_DEFINED
struct PreviewImageRuntimeHandle PreviewImageRuntimeHandle
@ LIBOVERRIDE_TAG_NEEDS_RESTORE
@ LIBOVERRIDE_TAG_RESYNC_ISOLATED_FROM_ROOT
@ LIBOVERRIDE_TAG_NEEDS_RELOAD
@ LIBOVERRIDE_TAG_NEED_RESYNC_ORIGINAL
Enumerations for DNA_ID.h.
These structs are the foundation for all linked lists in the library system.
#define DNA_DEFINE_CXX_METHODS(class_name)
struct IDOverrideLibraryPropertyOperation * next
struct IDOverrideLibraryPropertyOperation * prev
int subitem_reference_index
char * subitem_local_name
struct ID * subitem_reference_id
struct ID * subitem_local_id
char * subitem_reference_name
struct IDOverrideLibraryProperty * prev
unsigned int rna_prop_type
struct IDOverrideLibraryProperty * next
struct GHash * rna_path_to_override_properties
struct ID * hierarchy_root
IDOverrideLibraryRuntime * runtime
IDPropertyUIDataEnumItem * enum_items
IDPropertyUIData * ui_data
struct ID_Readfile_Data * readfile_data
struct Depsgraph * depsgraph
unsigned int recalc_after_undo_push
struct AssetMetaData * asset_data
IDProperty * system_properties
IDOverrideLibrary * override_library
unsigned int recalc_up_to_undo_push
struct LibraryWeakReference * library_weak_reference
struct ID_Runtime runtime
char library_filepath[1024]
struct PackedFile * packedfile
LibraryRuntimeHandle * runtime
PreviewImageRuntimeHandle * runtime
short changed_timestamp[2]