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
path: root/source
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2019-05-20 13:03:46 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2019-05-23 17:22:25 +0300
commitb88f1d3491a7ce202e4b72ba6b05281147c316d3 (patch)
tree3f00047de71054d94c8b28d2dff409e78617b528 /source
parent026c8ddd2a04bde5b9a92251734d4d0fd17c64b8 (diff)
Depsgraph: Allow having ID built checks be more granular
Diffstat (limited to 'source')
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_map.cc39
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_map.h43
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc2
3 files changed, 55 insertions, 29 deletions
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;