diff options
author | Hans Goudey <h.goudey@me.com> | 2022-09-21 19:53:26 +0300 |
---|---|---|
committer | Hans Goudey <h.goudey@me.com> | 2022-09-21 19:59:33 +0300 |
commit | bcc37dd9604266434369ee0d0985e2b33910355d (patch) | |
tree | 016522f82ba2760a57fba38b7aa6eae378956ab1 /source/blender/depsgraph/intern | |
parent | fd0333afab93878630c55888029c3ea9d27323e6 (diff) | |
parent | c1f622e63e387c70bd2577e87260b8df9a496d1d (diff) |
Merge branch 'master' into refactor-mesh-selection-generic
Diffstat (limited to 'source/blender/depsgraph/intern')
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder_key.cc (renamed from source/blender/depsgraph/intern/builder/deg_builder_relations_keys.cc) | 32 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder_key.h | 201 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder_nodes.cc | 60 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder_nodes.h | 30 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder_relations.h | 127 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/node/deg_node_component.cc | 9 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/node/deg_node_factory_impl.h | 9 |
7 files changed, 278 insertions, 190 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_keys.cc b/source/blender/depsgraph/intern/builder/deg_builder_key.cc index 8506a97c408..741c415b5cd 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations_keys.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_key.cc @@ -7,20 +7,26 @@ * Methods for constructing depsgraph */ -#include "intern/builder/deg_builder_relations.h" +#include "intern/builder/deg_builder_key.h" + +#include "RNA_path.h" namespace blender::deg { -//////////////////////////////////////////////////////////////////////////////// -/* Time source. */ +/* -------------------------------------------------------------------- */ +/** \name Time source + * \{ */ string TimeSourceKey::identifier() const { return string("TimeSourceKey"); } -//////////////////////////////////////////////////////////////////////////////// -// Component. +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Component + * \{ */ string ComponentKey::identifier() const { @@ -35,8 +41,11 @@ string ComponentKey::identifier() const return result; } -//////////////////////////////////////////////////////////////////////////////// -// Operation. +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Operation + * \{ */ string OperationKey::identifier() const { @@ -51,8 +60,11 @@ string OperationKey::identifier() const return result; } -//////////////////////////////////////////////////////////////////////////////// -// RNA path. +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name RNA path + * \{ */ RNAPathKey::RNAPathKey(ID *id, const char *path, RNAPointerSource source) : id(id), source(source) { @@ -79,4 +91,6 @@ string RNAPathKey::identifier() const return string("RnaPathKey(") + "id: " + id_name + ", prop: '" + prop_name + "')"; } +/** \} */ + } // namespace blender::deg diff --git a/source/blender/depsgraph/intern/builder/deg_builder_key.h b/source/blender/depsgraph/intern/builder/deg_builder_key.h new file mode 100644 index 00000000000..4f8b2dc9f8f --- /dev/null +++ b/source/blender/depsgraph/intern/builder/deg_builder_key.h @@ -0,0 +1,201 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later + * Copyright 2013 Blender Foundation. All rights reserved. */ + +/** \file + * \ingroup depsgraph + */ + +#pragma once + +#include "intern/builder/deg_builder_rna.h" +#include "intern/depsgraph_type.h" +#include "intern/node/deg_node_component.h" +#include "intern/node/deg_node_id.h" +#include "intern/node/deg_node_operation.h" + +#include "DNA_ID.h" + +#include "RNA_access.h" +#include "RNA_types.h" + +struct ID; +struct PropertyRNA; + +namespace blender::deg { + +struct TimeSourceKey { + TimeSourceKey() = default; + + string identifier() const; +}; + +struct ComponentKey { + ComponentKey() = default; + + inline ComponentKey(const ID *id, NodeType type, const char *name = "") + : id(id), type(type), name(name) + { + } + + string identifier() const; + + const ID *id = nullptr; + NodeType type = NodeType::UNDEFINED; + const char *name = ""; +}; + +struct OperationKey { + OperationKey() = default; + + inline OperationKey(const ID *id, NodeType component_type, const char *name, int name_tag = -1) + : id(id), + component_type(component_type), + component_name(""), + opcode(OperationCode::OPERATION), + name(name), + name_tag(name_tag) + { + } + + OperationKey(const ID *id, + NodeType component_type, + const char *component_name, + const char *name, + int name_tag) + : id(id), + component_type(component_type), + component_name(component_name), + opcode(OperationCode::OPERATION), + name(name), + name_tag(name_tag) + { + } + + OperationKey(const ID *id, NodeType component_type, OperationCode opcode) + : id(id), + component_type(component_type), + component_name(""), + opcode(opcode), + name(""), + name_tag(-1) + { + } + + OperationKey(const ID *id, + NodeType component_type, + const char *component_name, + OperationCode opcode) + : id(id), + component_type(component_type), + component_name(component_name), + opcode(opcode), + name(""), + name_tag(-1) + { + } + + OperationKey(const ID *id, + NodeType component_type, + OperationCode opcode, + const char *name, + int name_tag = -1) + : id(id), + component_type(component_type), + component_name(""), + opcode(opcode), + name(name), + name_tag(name_tag) + { + } + + OperationKey(const ID *id, + NodeType component_type, + const char *component_name, + OperationCode opcode, + const char *name, + int name_tag = -1) + : id(id), + component_type(component_type), + component_name(component_name), + opcode(opcode), + name(name), + name_tag(name_tag) + { + } + + OperationKey(OperationKey &&other) noexcept = default; + OperationKey &operator=(OperationKey &&other) = default; + + OperationKey(const OperationKey &other) = default; + OperationKey &operator=(const OperationKey &other) = default; + + string identifier() const; + + const ID *id = nullptr; + NodeType component_type = NodeType::UNDEFINED; + const char *component_name = ""; + OperationCode opcode = OperationCode::OPERATION; + const char *name = ""; + int name_tag = -1; +}; + +/* Similar to the the OperationKey but does not contain external references, which makes it + * suitable to identify operations even after the original database or graph was destroyed. + * The downside of this key over the OperationKey is that it performs string allocation upon + * the key construction. */ +struct PersistentOperationKey : public OperationKey { + /* Create the key which identifies the given operation node. */ + PersistentOperationKey(const OperationNode *operation_node) + { + const ComponentNode *component_node = operation_node->owner; + const IDNode *id_node = component_node->owner; + + /* Copy names over to our object, so that the key stays valid even after the `operation_node` + * is destroyed.*/ + component_name_storage_ = component_node->name; + name_storage_ = operation_node->name; + + /* Assign fields used by the OperationKey API. */ + id = id_node->id_orig; + component_type = component_node->type; + component_name = component_name_storage_.c_str(); + opcode = operation_node->opcode; + name = name_storage_.c_str(); + name_tag = operation_node->name_tag; + } + + PersistentOperationKey(PersistentOperationKey &&other) noexcept : OperationKey(other) + { + component_name_storage_ = std::move(other.component_name_storage_); + name_storage_ = std::move(other.name_storage_); + + /* Re-assign pointers to the strings. + * This is needed because string content can actually change address if the string uses the + * small string optimization. */ + component_name = component_name_storage_.c_str(); + name = name_storage_.c_str(); + } + + PersistentOperationKey &operator=(PersistentOperationKey &&other) = delete; + + PersistentOperationKey(const PersistentOperationKey &other) = delete; + PersistentOperationKey &operator=(const PersistentOperationKey &other) = delete; + + private: + string component_name_storage_; + string name_storage_; +}; + +struct RNAPathKey { + RNAPathKey(ID *id, const char *path, RNAPointerSource source); + RNAPathKey(ID *id, const PointerRNA &ptr, PropertyRNA *prop, RNAPointerSource source); + + string identifier() const; + + ID *id; + PointerRNA ptr; + PropertyRNA *prop; + RNAPointerSource source; +}; + +} // namespace blender::deg diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index 80be781da48..f95c0700a47 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -104,6 +104,7 @@ #include "SEQ_sequencer.h" #include "intern/builder/deg_builder.h" +#include "intern/builder/deg_builder_key.h" #include "intern/builder/deg_builder_rna.h" #include "intern/depsgraph.h" #include "intern/depsgraph_tag.h" @@ -208,7 +209,7 @@ IDNode *DepsgraphNodeBuilder::add_id_node(ID *id) return id_node; } -IDNode *DepsgraphNodeBuilder::find_id_node(ID *id) +IDNode *DepsgraphNodeBuilder::find_id_node(const ID *id) { return graph_->find_id_node(id); } @@ -228,6 +229,17 @@ ComponentNode *DepsgraphNodeBuilder::add_component_node(ID *id, return comp_node; } +ComponentNode *DepsgraphNodeBuilder::find_component_node(const ID *id, + const NodeType comp_type, + const char *comp_name) +{ + IDNode *id_node = find_id_node(id); + if (id_node == nullptr) { + return nullptr; + } + return id_node->find_component(comp_type, comp_name); +} + OperationNode *DepsgraphNodeBuilder::add_operation_node(ComponentNode *comp_node, OperationCode opcode, const DepsEvalOperationCb &op, @@ -311,23 +323,32 @@ bool DepsgraphNodeBuilder::has_operation_node(ID *id, return find_operation_node(id, comp_type, comp_name, opcode, name, name_tag) != nullptr; } -OperationNode *DepsgraphNodeBuilder::find_operation_node(ID *id, +OperationNode *DepsgraphNodeBuilder::find_operation_node(const ID *id, NodeType comp_type, const char *comp_name, OperationCode opcode, const char *name, int name_tag) { - ComponentNode *comp_node = add_component_node(id, comp_type, comp_name); + ComponentNode *comp_node = find_component_node(id, comp_type, comp_name); + if (comp_node == nullptr) { + return nullptr; + } return comp_node->find_operation(opcode, name, name_tag); } OperationNode *DepsgraphNodeBuilder::find_operation_node( - ID *id, NodeType comp_type, OperationCode opcode, const char *name, int name_tag) + const ID *id, NodeType comp_type, OperationCode opcode, const char *name, int name_tag) { return find_operation_node(id, comp_type, "", opcode, name, name_tag); } +OperationNode *DepsgraphNodeBuilder::find_operation_node(const OperationKey &key) +{ + return find_operation_node( + key.id, key.component_type, key.component_name, key.opcode, key.name, key.name_tag); +} + ID *DepsgraphNodeBuilder::get_cow_id(const ID *id_orig) const { return graph_->get_cow_id(id_orig); @@ -371,17 +392,8 @@ void DepsgraphNodeBuilder::begin_build() id_node->id_cow = nullptr; } - for (OperationNode *op_node : graph_->entry_tags) { - ComponentNode *comp_node = op_node->owner; - IDNode *id_node = comp_node->owner; - - SavedEntryTag entry_tag; - entry_tag.id_orig = id_node->id_orig; - entry_tag.component_type = comp_node->type; - entry_tag.opcode = op_node->opcode; - entry_tag.name = op_node->name; - entry_tag.name_tag = op_node->name_tag; - saved_entry_tags_.append(entry_tag); + for (const OperationNode *op_node : graph_->entry_tags) { + saved_entry_tags_.append_as(op_node); } /* Make sure graph has no nodes left from previous state. */ @@ -499,23 +511,15 @@ void DepsgraphNodeBuilder::update_invalid_cow_pointers() void DepsgraphNodeBuilder::tag_previously_tagged_nodes() { - for (const SavedEntryTag &entry_tag : saved_entry_tags_) { - IDNode *id_node = find_id_node(entry_tag.id_orig); - if (id_node == nullptr) { - continue; - } - ComponentNode *comp_node = id_node->find_component(entry_tag.component_type); - if (comp_node == nullptr) { - continue; - } - OperationNode *op_node = comp_node->find_operation( - entry_tag.opcode, entry_tag.name.c_str(), entry_tag.name_tag); - if (op_node == nullptr) { + for (const OperationKey &operation_key : saved_entry_tags_) { + OperationNode *operation_node = find_operation_node(operation_key); + if (operation_node == nullptr) { continue; } + /* Since the tag is coming from a saved copy of entry tags, this means * that originally node was explicitly tagged for user update. */ - op_node->tag_update(graph_, DEG_UPDATE_SOURCE_USER_EDIT); + operation_node->tag_update(graph_, DEG_UPDATE_SOURCE_USER_EDIT); } } diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h index d5ac601ebff..a8efe8fca9f 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h @@ -8,6 +8,7 @@ #pragma once #include "intern/builder/deg_builder.h" +#include "intern/builder/deg_builder_key.h" #include "intern/builder/deg_builder_map.h" #include "intern/depsgraph_type.h" #include "intern/node/deg_node_id.h" @@ -56,6 +57,7 @@ struct ComponentNode; struct Depsgraph; class DepsgraphBuilderCache; struct IDNode; +struct OperationKey; struct OperationNode; struct TimeSourceNode; @@ -92,10 +94,11 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder { int foreach_id_cow_detect_need_for_update_callback(ID *id_cow_self, ID *id_pointer); IDNode *add_id_node(ID *id); - IDNode *find_id_node(ID *id); + IDNode *find_id_node(const ID *id); TimeSourceNode *add_time_source(); ComponentNode *add_component_node(ID *id, NodeType comp_type, const char *comp_name = ""); + ComponentNode *find_component_node(const ID *id, NodeType comp_type, const char *comp_name = ""); OperationNode *add_operation_node(ComponentNode *comp_node, OperationCode opcode, @@ -137,15 +140,20 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder { const char *name = "", int name_tag = -1); - OperationNode *find_operation_node(ID *id, + OperationNode *find_operation_node(const ID *id, NodeType comp_type, const char *comp_name, OperationCode opcode, const char *name = "", int name_tag = -1); - OperationNode *find_operation_node( - ID *id, NodeType comp_type, OperationCode opcode, const char *name = "", int name_tag = -1); + OperationNode *find_operation_node(const ID *id, + NodeType comp_type, + OperationCode opcode, + const char *name = "", + int name_tag = -1); + + OperationNode *find_operation_node(const OperationKey &key); virtual void build_id(ID *id); @@ -255,17 +263,9 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder { }; protected: - /* Allows to identify an operation which was tagged for update at the time - * relations are being updated. We can not reuse operation node pointer - * since it will change during dependency graph construction. */ - struct SavedEntryTag { - ID *id_orig; - NodeType component_type; - OperationCode opcode; - string name; - int name_tag; - }; - Vector<SavedEntryTag> saved_entry_tags_; + /* Entry tags from the previous state of the dependency graph. + * Stored before the graph is re-created so that they can be transferred over. */ + Vector<PersistentOperationKey> saved_entry_tags_; struct BuilderWalkUserData { DepsgraphNodeBuilder *builder; diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h index 7d3a0fd9217..901e4a1acbb 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h @@ -14,14 +14,13 @@ #include "DNA_ID.h" -#include "RNA_access.h" #include "RNA_path.h" -#include "RNA_types.h" #include "BLI_string.h" #include "BLI_utildefines.h" #include "intern/builder/deg_builder.h" +#include "intern/builder/deg_builder_key.h" #include "intern/builder/deg_builder_map.h" #include "intern/builder/deg_builder_rna.h" #include "intern/builder/deg_builder_stack.h" @@ -69,8 +68,6 @@ struct bNodeTree; struct bPoseChannel; struct bSound; -struct PropertyRNA; - namespace blender::deg { struct ComponentNode; @@ -84,128 +81,6 @@ struct Relation; struct RootPChanMap; struct TimeSourceNode; -struct TimeSourceKey { - TimeSourceKey() = default; - - string identifier() const; -}; - -struct ComponentKey { - ComponentKey() = default; - - inline ComponentKey(const ID *id, NodeType type, const char *name = "") - : id(id), type(type), name(name) - { - } - - string identifier() const; - - const ID *id = nullptr; - NodeType type = NodeType::UNDEFINED; - const char *name = ""; -}; - -struct OperationKey { - OperationKey() = default; - - inline OperationKey(const ID *id, NodeType component_type, const char *name, int name_tag = -1) - : id(id), - component_type(component_type), - component_name(""), - opcode(OperationCode::OPERATION), - name(name), - name_tag(name_tag) - { - } - - OperationKey(const ID *id, - NodeType component_type, - const char *component_name, - const char *name, - int name_tag) - : id(id), - component_type(component_type), - component_name(component_name), - opcode(OperationCode::OPERATION), - name(name), - name_tag(name_tag) - { - } - - OperationKey(const ID *id, NodeType component_type, OperationCode opcode) - : id(id), - component_type(component_type), - component_name(""), - opcode(opcode), - name(""), - name_tag(-1) - { - } - - OperationKey(const ID *id, - NodeType component_type, - const char *component_name, - OperationCode opcode) - : id(id), - component_type(component_type), - component_name(component_name), - opcode(opcode), - name(""), - name_tag(-1) - { - } - - OperationKey(const ID *id, - NodeType component_type, - OperationCode opcode, - const char *name, - int name_tag = -1) - : id(id), - component_type(component_type), - component_name(""), - opcode(opcode), - name(name), - name_tag(name_tag) - { - } - - OperationKey(const ID *id, - NodeType component_type, - const char *component_name, - OperationCode opcode, - const char *name, - int name_tag = -1) - : id(id), - component_type(component_type), - component_name(component_name), - opcode(opcode), - name(name), - name_tag(name_tag) - { - } - - string identifier() const; - - const ID *id = nullptr; - NodeType component_type = NodeType::UNDEFINED; - const char *component_name = ""; - OperationCode opcode = OperationCode::OPERATION; - const char *name = ""; - int name_tag = -1; -}; - -struct RNAPathKey { - RNAPathKey(ID *id, const char *path, RNAPointerSource source); - RNAPathKey(ID *id, const PointerRNA &ptr, PropertyRNA *prop, RNAPointerSource source); - - string identifier() const; - - ID *id; - PointerRNA ptr; - PropertyRNA *prop; - RNAPointerSource source; -}; - class DepsgraphRelationBuilder : public DepsgraphBuilder { public: DepsgraphRelationBuilder(Main *bmain, Depsgraph *graph, DepsgraphBuilderCache *cache); diff --git a/source/blender/depsgraph/intern/node/deg_node_component.cc b/source/blender/depsgraph/intern/node/deg_node_component.cc index 40b4b36a29c..ebb4450579f 100644 --- a/source/blender/depsgraph/intern/node/deg_node_component.cc +++ b/source/blender/depsgraph/intern/node/deg_node_component.cc @@ -90,10 +90,11 @@ ComponentNode::~ComponentNode() string ComponentNode::identifier() const { - const string idname = this->owner->name; - const string typebuf = "" + to_string(static_cast<int>(type)) + ")"; - return typebuf + name + " : " + idname + - "( affects_visible_id: " + (affects_visible_id ? "true" : "false") + ")"; + const string type_name = type_get_factory(type)->type_name(); + const string name_part = name[0] ? (string(" '") + name + "'") : ""; + + return "[" + type_name + "]" + name_part + " : " + + "(affects_visible_id: " + (affects_visible_id ? "true" : "false") + ")"; } OperationNode *ComponentNode::find_operation(OperationIDKey key) const diff --git a/source/blender/depsgraph/intern/node/deg_node_factory_impl.h b/source/blender/depsgraph/intern/node/deg_node_factory_impl.h index d9d0a1c1e3e..5059368120e 100644 --- a/source/blender/depsgraph/intern/node/deg_node_factory_impl.h +++ b/source/blender/depsgraph/intern/node/deg_node_factory_impl.h @@ -34,15 +34,8 @@ Node *DepsNodeFactoryImpl<ModeObjectType>::create_node(const ID *id, const char *name) const { Node *node = new ModeObjectType(); - /* Populate base node settings. */ node->type = type(); - /* Set name if provided, or use default type name. */ - if (name[0] != '\0') { - node->name = name; - } - else { - node->name = type_name(); - } + node->name = name; node->init(id, subdata); return node; } |