Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/depsgraph/DEG_depsgraph_query.h13
-rw-r--r--source/blender/depsgraph/intern/depsgraph_query.cc40
2 files changed, 53 insertions, 0 deletions
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);
+}