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:
authorSergey Sharybin <sergey@blender.org>2022-09-15 16:57:54 +0300
committerSergey Sharybin <sergey@blender.org>2022-09-21 17:48:48 +0300
commit8bffadcdc4ff605a5fb0ac0c2a22bbc344509b99 (patch)
tree337194e3a01b48ebac053af892faa1ef6a83c73b /source/blender/depsgraph/intern/builder/deg_builder_key.h
parentcd3a19f20ce938ce1e68ee85b3169fdc28d8b72e (diff)
Refactor: Simplify transfer of tags in the depsgraph builder
Base it in an existing building blocks rather than having dedicated structure for it. No functional changes is expected, just preparing to make the code more reusable.
Diffstat (limited to 'source/blender/depsgraph/intern/builder/deg_builder_key.h')
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_key.h56
1 files changed, 56 insertions, 0 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_key.h b/source/blender/depsgraph/intern/builder/deg_builder_key.h
index cbb0daa4fc9..4f8b2dc9f8f 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_key.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_key.h
@@ -9,6 +9,9 @@
#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"
@@ -120,6 +123,12 @@ struct OperationKey {
{
}
+ 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;
@@ -130,6 +139,53 @@ struct OperationKey {
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);