22# include <type_traits>
186#define MAX_IDPROP_NAME 64
187#define DEFAULT_ALLOC_FOR_NULL_STRINGS 64
373#define MAX_ID_NAME 258
389 return *
reinterpret_cast<const uint64_t *
>(this->data);
392 static constexpr IDHash get_null()
398 return *
this == IDHash::get_null();
403 return memcmp(a.
data,
b.data,
sizeof(a.
data)) == 0;
655#define ID_FAKE_USERS(id) ((((const ID *)id)->flag & ID_FLAG_FAKEUSER) ? 1 : 0)
662#define ID_EXTRA_USERS(id) (((const ID *)id)->tag & ID_TAG_EXTRAUSER ? 1 : 0)
671#define ID_EXTRA_REAL_USERS(id) (((const ID *)id)->tag & ID_TAG_EXTRAUSER_SET ? 1 : 0)
676#define ID_REAL_USERS(id) (((const ID *)id)->us - ID_FAKE_USERS(id))
681#define ID_REFCOUNTING_USERS(id) (ID_REAL_USERS(id) - ID_EXTRA_REAL_USERS(id))
683#define ID_CHECK_UNDO(id) (!ELEM(GS((id)->name), ID_SCR, ID_WM, ID_WS, ID_BR))
685#define ID_BLEND_PATH(_bmain, _id) \
686 ((_id)->lib ? BKE_main_blendfile_path_from_library(*(_id)->lib) : \
687 BKE_main_blendfile_path((_bmain)))
688#define ID_BLEND_PATH_FROM_GLOBAL(_id) \
689 ((_id)->lib ? BKE_main_blendfile_path_from_library(*(_id)->lib) : \
690 BKE_main_blendfile_path_from_global())
692#define ID_MISSING(_id) ((((const ID *)(_id))->tag & ID_TAG_MISSING) != 0)
694#define ID_IS_LINKED(_id) (((const ID *)(_id))->lib != NULL)
700#define ID_IS_PACKED(_id) (ID_IS_LINKED(_id) && ((_id)->flag & ID_FLAG_LINKED_AND_PACKED))
702#define ID_TYPE_SUPPORTS_ASSET_EDITABLE(id_type) \
703 ELEM(id_type, ID_BR, ID_TE, ID_NT, ID_IM, ID_PC, ID_MA)
705#define ID_IS_EDITABLE(_id) \
706 ((((const ID *)(_id))->lib == NULL) || \
707 ((((const ID *)(_id))->lib->runtime->tag & LIBRARY_ASSET_EDITABLE) && \
708 ID_TYPE_SUPPORTS_ASSET_EDITABLE(GS((((const ID *)(_id))->name)))))
712#define ID_IS_OVERRIDABLE_LIBRARY_HIERARCHY(_id) \
713 (ID_IS_LINKED(_id) && !ID_MISSING(_id) && \
714 (BKE_idtype_get_info_from_id((const ID *)(_id))->flags & IDTYPE_FLAGS_NO_LIBLINKING) == 0 && \
715 !ELEM(GS(((ID *)(_id))->name), ID_SCE))
716#define ID_IS_OVERRIDABLE_LIBRARY(_id) \
717 (ID_IS_OVERRIDABLE_LIBRARY_HIERARCHY((_id)) && (((const ID *)(_id))->tag & ID_TAG_EXTERN) != 0)
723#define ID_IS_OVERRIDE_LIBRARY_REAL(_id) \
724 (((const ID *)(_id))->override_library != NULL && \
725 ((const ID *)(_id))->override_library->reference != NULL)
727#define ID_IS_OVERRIDE_LIBRARY_VIRTUAL(_id) \
728 ((((const ID *)(_id))->flag & ID_FLAG_EMBEDDED_DATA_LIB_OVERRIDE) != 0)
730#define ID_IS_OVERRIDE_LIBRARY(_id) \
731 (ID_IS_OVERRIDE_LIBRARY_REAL(_id) || ID_IS_OVERRIDE_LIBRARY_VIRTUAL(_id))
733#define ID_IS_OVERRIDE_LIBRARY_HIERARCHY_ROOT(_id) \
734 (!ID_IS_OVERRIDE_LIBRARY_REAL(_id) || \
735 ((ID *)(_id))->override_library->hierarchy_root == ((ID *)(_id)))
737#define ID_IS_ASSET(_id) (((const ID *)(_id))->asset_data != NULL)
740#define ID_TYPE_USE_COPY_ON_EVAL(_id_type) \
741 (!ELEM(_id_type, ID_LI, ID_SCR, ID_VF, ID_BR, ID_WM, ID_PAL, ID_PC, ID_WS, ID_IM))
745#define ID_TYPE_SUPPORTS_PARAMS_WITHOUT_COW(id_type) ELEM(id_type, ID_ME)
749#define ID_TYPE_IS_DEPRECATED(id_type) false
754#define GS(a) (CHECK_TYPE_ANY(a, char *, const char *), (ID_Type)(*((const short *)(a))))
756#define ID_NEW_SET(_id, _idn) \
757 (((ID *)(_id))->newid = (ID *)(_idn), \
758 ((ID *)(_id))->newid->tag |= ID_TAG_NEW, \
759 (void *)((ID *)(_id))->newid)
760#define ID_NEW_REMAP(a) \
761 if ((a) && (a)->id.newid) { \
762 *(void **)&(a) = (a)->id.newid; \
1046#define ID_TAG_KEEP_ON_UNDO (ID_TAG_EXTRAUSER | ID_TAG_MISSING | ID_TAG_RUNTIME)
1197#define FILTER_ID_AC (1ULL << 0)
1198#define FILTER_ID_AR (1ULL << 1)
1199#define FILTER_ID_BR (1ULL << 2)
1200#define FILTER_ID_CA (1ULL << 3)
1201#define FILTER_ID_CU_LEGACY (1ULL << 4)
1202#define FILTER_ID_GD_LEGACY (1ULL << 5)
1203#define FILTER_ID_GR (1ULL << 6)
1204#define FILTER_ID_IM (1ULL << 7)
1205#define FILTER_ID_LA (1ULL << 8)
1206#define FILTER_ID_LS (1ULL << 9)
1207#define FILTER_ID_LT (1ULL << 10)
1208#define FILTER_ID_MA (1ULL << 11)
1209#define FILTER_ID_MB (1ULL << 12)
1210#define FILTER_ID_MC (1ULL << 13)
1211#define FILTER_ID_ME (1ULL << 14)
1212#define FILTER_ID_MSK (1ULL << 15)
1213#define FILTER_ID_NT (1ULL << 16)
1214#define FILTER_ID_OB (1ULL << 17)
1215#define FILTER_ID_PAL (1ULL << 18)
1216#define FILTER_ID_PC (1ULL << 19)
1217#define FILTER_ID_SCE (1ULL << 20)
1218#define FILTER_ID_SPK (1ULL << 21)
1219#define FILTER_ID_SO (1ULL << 22)
1220#define FILTER_ID_TE (1ULL << 23)
1221#define FILTER_ID_TXT (1ULL << 24)
1222#define FILTER_ID_VF (1ULL << 25)
1223#define FILTER_ID_WO (1ULL << 26)
1224#define FILTER_ID_PA (1ULL << 27)
1225#define FILTER_ID_CF (1ULL << 28)
1226#define FILTER_ID_WS (1ULL << 29)
1227#define FILTER_ID_LP (1ULL << 31)
1228#define FILTER_ID_CV (1ULL << 32)
1229#define FILTER_ID_PT (1ULL << 33)
1230#define FILTER_ID_VO (1ULL << 34)
1231#define FILTER_ID_SIM (1ULL << 35)
1232#define FILTER_ID_KE (1ULL << 36)
1233#define FILTER_ID_SCR (1ULL << 37)
1234#define FILTER_ID_WM (1ULL << 38)
1235#define FILTER_ID_LI (1ULL << 39)
1236#define FILTER_ID_GP (1ULL << 40)
1237#define FILTER_ID_IP (1ULL << 41)
1239#define FILTER_ID_ALL \
1240 (FILTER_ID_AC | FILTER_ID_AR | FILTER_ID_BR | FILTER_ID_CA | FILTER_ID_CU_LEGACY | \
1241 FILTER_ID_GD_LEGACY | FILTER_ID_GR | FILTER_ID_IM | FILTER_ID_LA | FILTER_ID_LS | \
1242 FILTER_ID_LT | FILTER_ID_MA | FILTER_ID_MB | FILTER_ID_MC | FILTER_ID_ME | FILTER_ID_MSK | \
1243 FILTER_ID_NT | FILTER_ID_OB | FILTER_ID_PA | FILTER_ID_PAL | FILTER_ID_PC | FILTER_ID_SCE | \
1244 FILTER_ID_SPK | FILTER_ID_SO | FILTER_ID_TE | FILTER_ID_TXT | FILTER_ID_VF | FILTER_ID_WO | \
1245 FILTER_ID_CF | FILTER_ID_WS | FILTER_ID_LP | FILTER_ID_CV | FILTER_ID_PT | FILTER_ID_VO | \
1246 FILTER_ID_SIM | FILTER_ID_KE | FILTER_ID_SCR | FILTER_ID_WM | FILTER_ID_LI | FILTER_ID_GP | \
1360#define INDEX_ID_MAX (INDEX_ID_NULL + 1)
1365template<
typename,
typename =
void>
struct has_ID_member : std::false_type {};
1366template<
typename T>
struct has_ID_member<
T, std::void_t<decltype(&T::id)>> : std::true_type {};
1367template<
typename T>
constexpr bool has_ID_as_first_member()
1369 if constexpr (std::is_standard_layout_v<T> && has_ID_member<T>::value) {
1370 return offsetof(
T,
id) == 0 && std::is_same_v<
decltype(T::id),
ID>;
1383constexpr bool is_ID_v = detail::has_ID_as_first_member<T>() || std::is_same_v<T, ID>;
1389namespace dna::detail {
1390template<
typename Dst,
typename Src,
typename SrcRuntime>
1391constexpr void id_cast_assert([[maybe_unused]] SrcRuntime *src)
1393 static_assert(blender::dna::is_ID_v<Src>);
1394 static_assert(blender::dna::is_ID_v<Dst>);
1395 if constexpr (std::is_same_v<Src, ID> && !std::is_same_v<Dst, ID>) {
1397 BLI_assert(src ==
nullptr ||
GS(src->name) == Dst::id_type);
1399 else if constexpr (!std::is_same_v<Src, ID> && std::is_same_v<Dst, ID>) {
1404 static_assert(std::is_same_v<Src, Dst>);
1417template<
typename Dst,
typename Src>
inline Dst id_cast(Src &&
id)
1419 using DstDecay = std::decay_t<Dst>;
1420 using SrcDecay = std::decay_t<Src>;
1421 static_assert(std::is_pointer_v<SrcDecay> == std::is_pointer_v<DstDecay>);
1422 if constexpr (std::is_pointer_v<SrcDecay>) {
1423 dna::detail::id_cast_assert<std::decay_t<std::remove_pointer_t<DstDecay>>,
1424 std::decay_t<std::remove_pointer_t<SrcDecay>>>(id);
1427 static_assert(std::is_lvalue_reference_v<Src> && std::is_lvalue_reference_v<Dst>);
1428 dna::detail::id_cast_assert<DstDecay, SrcDecay>(&
id);
1431 return reinterpret_cast<Dst
>(id);
BLI_INLINE bool operator!=(const ListBase &a, const ListBase &b)
struct LibraryRuntimeHandle LibraryRuntimeHandle
@ 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
@ LIBOVERRIDE_TAG_NEEDS_RESTORE
@ LIBOVERRIDE_TAG_RESYNC_ISOLATED_FROM_ROOT
@ LIBOVERRIDE_TAG_NEEDS_RELOAD
@ LIBOVERRIDE_TAG_NEED_RESYNC_ORIGINAL
struct IDPropertyGroupChildrenSet IDPropertyGroupChildrenSet
@ 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
@ PRV_TAG_DEFFERED_DELETE
@ PRV_TAG_DEFFERED_RENDERING
@ PRV_TAG_DEFFERED_INVALID
@ ID_REMAP_IS_LINKED_DIRECT
@ ID_REMAP_IS_USER_ONE_SKIPPED
@ LIBOVERRIDE_PROP_TAG_NEEDS_RETORE
@ LIBOVERRIDE_PROP_OP_TAG_UNUSED
@ LIBOVERRIDE_OP_SUBTRACT
@ LIBOVERRIDE_OP_MULTIPLY
@ LIBOVERRIDE_OP_INSERT_BEFORE
@ LIBOVERRIDE_OP_INSERT_AFTER
@ LIBOVERRIDE_FLAG_NO_HIERARCHY
@ LIBOVERRIDE_FLAG_SYSTEM_DEFINED
struct ID_RuntimeHandle ID_RuntimeHandle
struct PreviewImageRuntimeHandle PreviewImageRuntimeHandle
@ ID_FLAG_INDIRECT_WEAK_LINK
@ ID_FLAG_EMBEDDED_DATA_LIB_OVERRIDE
@ ID_FLAG_LINKED_AND_PACKED
@ ID_FLAG_LIB_OVERRIDE_RESYNC_LEFTOVER
@ LIBRARY_FLAG_IS_ARCHIVE
Enumerations for DNA_ID.h.
#define DNA_DEFINE_CXX_METHODS(class_name)
These structs are the foundation for all linked lists in the library system.
bool operator==(const AssetWeakReference &a, const AssetWeakReference &b)
unsigned long long int uint64_t
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
IDPropertyGroupChildrenSet * children_map
IDPropertyUIDataEnumItem * enum_items
IDPropertyUIData * ui_data
unsigned int recalc_after_undo_push
ID_RuntimeHandle * runtime
struct AssetMetaData * asset_data
IDProperty * system_properties
IDOverrideLibrary * override_library
unsigned int recalc_up_to_undo_push
struct LibraryWeakReference * library_weak_reference
char library_filepath[1024]
char library_id_name[258]
struct PackedFile * packedfile
LibraryRuntimeHandle * runtime
struct Library * archive_parent_library
PreviewImageRuntimeHandle * runtime
short changed_timestamp[2]