[Bf-blender-cvs] [b88f1d3491a] master: Depsgraph: Allow having ID built checks be more granular

Sergey Sharybin noreply at git.blender.org
Thu May 23 16:27:04 CEST 2019


Commit: b88f1d3491a7ce202e4b72ba6b05281147c316d3
Author: Sergey Sharybin
Date:   Mon May 20 12:03:46 2019 +0200
Branches: master
https://developer.blender.org/rBb88f1d3491a7ce202e4b72ba6b05281147c316d3

Depsgraph: Allow having ID built checks be more granular

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

M	source/blender/depsgraph/intern/builder/deg_builder_map.cc
M	source/blender/depsgraph/intern/builder/deg_builder_map.h
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc

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

diff --git a/source/blender/depsgraph/intern/builder/deg_builder_map.cc b/source/blender/depsgraph/intern/builder/deg_builder_map.cc
index a519f3e60b5..4bca4f037b0 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_map.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_map.cc
@@ -23,41 +23,52 @@
 
 #include "intern/builder/deg_builder_map.h"
 
-#include "BLI_utildefines.h"
-#include "BLI_ghash.h"
-
 #include "DNA_ID.h"
 
 namespace DEG {
 
 BuilderMap::BuilderMap()
 {
-  set = BLI_gset_ptr_new("deg builder gset");
 }
 
 BuilderMap::~BuilderMap()
 {
-  BLI_gset_free(set, NULL);
 }
 
-bool BuilderMap::checkIsBuilt(ID *id)
+bool BuilderMap::checkIsBuilt(ID *id, int tag) const
 {
-  return BLI_gset_haskey(set, id);
+  return (getIDTag(id) & tag) == tag;
 }
 
-void BuilderMap::tagBuild(ID *id)
+void BuilderMap::tagBuild(ID *id, int tag)
 {
-  BLI_gset_insert(set, id);
+  IDTagMap::iterator it = id_tags_.find(id);
+  if (it == id_tags_.end()) {
+    id_tags_.insert(make_pair(id, tag));
+    return;
+  }
+  it->second |= tag;
 }
 
-bool BuilderMap::checkIsBuiltAndTag(ID *id)
+bool BuilderMap::checkIsBuiltAndTag(ID *id, int tag)
 {
-  void **key_p;
-  if (!BLI_gset_ensure_p_ex(set, id, &key_p)) {
-    *key_p = id;
+  IDTagMap::iterator it = id_tags_.find(id);
+  if (it == id_tags_.end()) {
+    id_tags_.insert(make_pair(id, tag));
     return false;
   }
-  return true;
+  const bool result = (it->second & tag) == tag;
+  it->second |= tag;
+  return result;
+}
+
+int BuilderMap::getIDTag(ID *id) const
+{
+  IDTagMap::const_iterator it = id_tags_.find(id);
+  if (it == id_tags_.end()) {
+    return 0;
+  }
+  return it->second;
 }
 
 }  // namespace DEG
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_map.h b/source/blender/depsgraph/intern/builder/deg_builder_map.h
index c1db1d9d2bb..1199b517f0c 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_map.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_map.h
@@ -23,6 +23,8 @@
 
 #pragma once
 
+#include "intern/depsgraph_type.h"
+
 struct GSet;
 struct ID;
 
@@ -30,34 +32,47 @@ namespace DEG {
 
 class BuilderMap {
  public:
+  enum {
+    TAG_ANIMATION = (1 << 0),
+    TAG_PARAMETERS = (1 << 1),
+    TAG_TRANSFORM = (1 << 2),
+    TAG_GEOMETRY = (1 << 3),
+
+    /* All ID components has been built. */
+    TAG_COMPLETE = (TAG_ANIMATION | TAG_PARAMETERS | TAG_TRANSFORM | TAG_GEOMETRY),
+  };
+
   BuilderMap();
   ~BuilderMap();
 
-  /* Check whether given ID is already handled by builder (or if it's being
-   * handled). */
-  bool checkIsBuilt(ID *id);
+  /* Check whether given ID is already handled by builder (or if it's being handled). */
+  bool checkIsBuilt(ID *id, int tag = TAG_COMPLETE) const;
 
   /* Tag given ID as handled/built. */
-  void tagBuild(ID *id);
+  void tagBuild(ID *id, int tag = TAG_COMPLETE);
 
-  /* Combination of previous two functions, returns truth if ID was already
-   * handled, or tags is handled otherwise and return false. */
-  bool checkIsBuiltAndTag(ID *id);
+  /* Combination of previous two functions, returns truth if ID was already handled, or tags is
+   * handled otherwise and return false. */
+  bool checkIsBuiltAndTag(ID *id, int tag = TAG_COMPLETE);
 
-  template<typename T> bool checkIsBuilt(T *datablock)
+  template<typename T> bool checkIsBuilt(T *datablock, int tag = TAG_COMPLETE) const
   {
-    return checkIsBuilt(&datablock->id);
+    return checkIsBuilt(&datablock->id, tag);
   }
-  template<typename T> void tagBuild(T *datablock)
+  template<typename T> void tagBuild(T *datablock, int tag = TAG_COMPLETE)
   {
-    tagBuild(&datablock->id);
+    tagBuild(&datablock->id, tag);
   }
-  template<typename T> bool checkIsBuiltAndTag(T *datablock)
+  template<typename T> bool checkIsBuiltAndTag(T *datablock, int tag = TAG_COMPLETE)
   {
-    return checkIsBuiltAndTag(&datablock->id);
+    return checkIsBuiltAndTag(&datablock->id, tag);
   }
 
-  GSet *set;
+ protected:
+  int getIDTag(ID *id) const;
+
+  typedef map<ID *, int> IDTagMap;
+  IDTagMap id_tags_;
 };
 
 }  // namespace DEG
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index a203bfdb81d..3e93b76d508 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -681,7 +681,7 @@ void DepsgraphNodeBuilder::build_object_data(Object *object, bool is_object_visi
       break;
     default: {
       ID *obdata = (ID *)object->data;
-      if (built_map_.checkIsBuilt(obdata) == 0) {
+      if (!built_map_.checkIsBuilt(obdata)) {
         build_animdata(obdata);
       }
       break;



More information about the Bf-blender-cvs mailing list