From b679887bd5f77f2cd4611a4dd77e5177de3c2326 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 9 May 2019 15:50:46 +0200 Subject: Depsgraph: Add queries whether ID is original/evaluated --- source/blender/depsgraph/DEG_depsgraph_query.h | 13 +++++++ source/blender/depsgraph/intern/depsgraph_query.cc | 40 ++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/source/blender/depsgraph/DEG_depsgraph_query.h b/source/blender/depsgraph/DEG_depsgraph_query.h index 3030bfb28b3..a7b5535d11a 100644 --- a/source/blender/depsgraph/DEG_depsgraph_query.h +++ b/source/blender/depsgraph/DEG_depsgraph_query.h @@ -100,6 +100,19 @@ struct Object *DEG_get_original_object(struct Object *object); /* Get original version of given evaluated ID datablock. */ struct ID *DEG_get_original_id(struct ID *id); +/* Check whether given ID is an original, + * + * Original IDs are considered all the IDs which are not covered by copy-on-write system and are + * not out-of-main localized datablocks. */ +bool DEG_is_original_id(struct ID *id); +bool DEG_is_original_object(struct Object *object); + +/* Opposite of the above. + * + * If the datablock is not original it must be evaluated, and vice versa. */ +bool DEG_is_evaluated_id(struct ID *id); +bool DEG_is_evaluated_object(struct Object *object); + /* ************************ DEG object iterators ********************* */ enum { diff --git a/source/blender/depsgraph/intern/depsgraph_query.cc b/source/blender/depsgraph/intern/depsgraph_query.cc index a653366a588..02f2519b3fb 100644 --- a/source/blender/depsgraph/intern/depsgraph_query.cc +++ b/source/blender/depsgraph/intern/depsgraph_query.cc @@ -263,3 +263,43 @@ ID *DEG_get_original_id(ID *id) BLI_assert((id->tag & LIB_TAG_COPIED_ON_WRITE) != 0); return (ID *)id->orig_id; } + +bool DEG_is_original_id(ID *id) +{ + /* Some explanation of the logic. + * + * What we want here is to be able to tell whether given ID is a result of dependency graph + * evaluation or not. + * + * All the datablocks which are created by copy-on-write mechanism will have will be tagged with + * LIB_TAG_COPIED_ON_WRITE tag. Those datablocks can not be original. + * + * Modifier stack evaluation might create special datablocks which have all the modifiers + * applied, and those will be tagged with LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT. Such datablocks + * can not be original as well. + * + * Localization is usually happening from evaluated datablock, or will have some special pointer + * magic which will make them to act as evaluated. + * + * NOTE: We conder ID evaluated if ANY of those flags is set. We do NOT require ALL of them. */ + if (id->tag & + (LIB_TAG_COPIED_ON_WRITE | LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT | LIB_TAG_LOCALIZED)) { + return false; + } + return true; +} + +bool DEG_is_original_object(Object *object) +{ + return DEG_is_original_id(&object->id); +} + +bool DEG_is_evaluated_id(ID *id) +{ + return !DEG_is_original_id(id); +} + +bool DEG_is_evaluated_object(Object *object) +{ + return !DEG_is_original_object(object); +} -- cgit v1.2.3