diff options
Diffstat (limited to 'source/blender/makesdna/DNA_ID.h')
-rw-r--r-- | source/blender/makesdna/DNA_ID.h | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h index 67e33366199..077f9bf8bdc 100644 --- a/source/blender/makesdna/DNA_ID.h +++ b/source/blender/makesdna/DNA_ID.h @@ -566,6 +566,16 @@ enum { /* RESET_AFTER_USE Used by undo system to tag unchanged IDs re-used from old Main (instead of * read from memfile). */ LIB_TAG_UNDO_OLD_ID_REUSED = 1 << 19, + + /* This ID is part of a temporary #Main which is expected to be freed in a short time-frame. + * Don't allow assigning this to non-temporary members (since it's likely to cause errors). + * When set #ID.session_uuid isn't initialized, since the data isn't part of the session. */ + LIB_TAG_TEMP_MAIN = 1 << 20, + + /** + * The data-block is a library override that needs re-sync to its linked reference. + */ + LIB_TAG_LIB_OVERRIDE_NEED_RESYNC = 1 << 21, }; /* Tag given ID for an update in all the dependency graphs. */ @@ -722,8 +732,36 @@ typedef enum IDRecalcFlag { FILTER_ID_TE | FILTER_ID_TXT | FILTER_ID_VF | FILTER_ID_WO | FILTER_ID_CF | FILTER_ID_WS | \ FILTER_ID_LP | FILTER_ID_HA | FILTER_ID_PT | FILTER_ID_VO | FILTER_ID_SIM) -/* IMPORTANT: this enum matches the order currently use in set_listbasepointers, - * keep them in sync! */ +/** + * This enum defines the index assigned to each type of IDs in the array returned by + * #set_listbasepointers, and by extension, controls the default order in which each ID type is + * processed during standard 'foreach' looping over all IDs of a #Main data-base. + * + * About Order: + * ------------ + * + * This is (loosely) defined with a relationship order in mind, from lowest level (ID types using, + * referencing almost no other ID types) to highest level (ID types potentially using many other ID + * types). + * + * So e.g. it ensures that this dependency chain is respected: + * #Material <- #Mesh <- #Object <- #Collection <- #Scene + * + * Default order of processing of IDs in 'foreach' macros (#FOREACH_MAIN_ID_BEGIN and the like), + * built on top of #set_listbasepointers, is actually reversed compared to the order defined here, + * since processing usually needs to happen on users before it happens on used IDs (when freeing + * e.g.). + * + * DO NOT rely on this order as being full-proofed dependency order, there are many cases were it + * can be violated (most obvious cases being custom properties and drivers, which can reference any + * other ID types). + * + * However, this order can be considered as an optimization heuristic, especially when processing + * relationships in a non-recursive pattern: in typical cases, a vast majority of those + * relationships can be processed fine in the first pass, and only few additional passes are + * required to address all remaining relationship cases. + * See e.g. how #BKE_library_unused_linked_data_set_tag is doing this. + */ enum { INDEX_ID_LI = 0, INDEX_ID_IP, @@ -763,6 +801,8 @@ enum { INDEX_ID_SCE, INDEX_ID_WS, INDEX_ID_WM, + /* TODO: This should probably be tweaked, #Mask and #Simulation are rather low-level types that + * should most likely be defined //before// #Object and geometry type indices? */ INDEX_ID_MSK, INDEX_ID_SIM, INDEX_ID_NULL, |