[Bf-blender-cvs] [b679887bd5f] master: Depsgraph: Add queries whether ID is original/evaluated

Sergey Sharybin noreply at git.blender.org
Thu May 16 11:49:39 CEST 2019


Commit: b679887bd5f77f2cd4611a4dd77e5177de3c2326
Author: Sergey Sharybin
Date:   Thu May 9 15:50:46 2019 +0200
Branches: master
https://developer.blender.org/rBb679887bd5f77f2cd4611a4dd77e5177de3c2326

Depsgraph: Add queries whether ID is original/evaluated

===================================================================

M	source/blender/depsgraph/DEG_depsgraph_query.h
M	source/blender/depsgraph/intern/depsgraph_query.cc

===================================================================

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);
+}



More information about the Bf-blender-cvs mailing list