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:
Diffstat (limited to 'source/blender/depsgraph/intern')
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc8
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.h4
-rw-r--r--source/blender/depsgraph/intern/node/deg_node_id.cc1
-rw-r--r--source/blender/depsgraph/intern/node/deg_node_id.h12
4 files changed, 20 insertions, 5 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index eb20dfb69a2..dcdf2f48607 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -83,6 +83,7 @@
#include "BKE_key.h"
#include "BKE_lattice.h"
#include "BKE_layer.h"
+#include "BKE_lib_id.h"
#include "BKE_light.h"
#include "BKE_mask.h"
#include "BKE_material.h"
@@ -152,12 +153,14 @@ DepsgraphNodeBuilder::~DepsgraphNodeBuilder()
IDNode *DepsgraphNodeBuilder::add_id_node(ID *id)
{
+ BLI_assert(id->session_uuid != MAIN_ID_SESSION_UUID_UNSET);
+
IDNode *id_node = nullptr;
ID *id_cow = nullptr;
IDComponentsMask previously_visible_components_mask = 0;
uint32_t previous_eval_flags = 0;
DEGCustomDataMeshMasks previous_customdata_masks;
- IDInfo *id_info = id_info_hash_.lookup_default(id, nullptr);
+ IDInfo *id_info = id_info_hash_.lookup_default(id->session_uuid, nullptr);
if (id_info != nullptr) {
id_cow = id_info->id_cow;
previously_visible_components_mask = id_info->previously_visible_components_mask;
@@ -334,7 +337,8 @@ void DepsgraphNodeBuilder::begin_build()
id_info->previously_visible_components_mask = id_node->visible_components_mask;
id_info->previous_eval_flags = id_node->eval_flags;
id_info->previous_customdata_masks = id_node->customdata_masks;
- id_info_hash_.add_new(id_node->id_orig, id_info);
+ BLI_assert(!id_info_hash_.contains(id_node->id_orig_session_uuid));
+ id_info_hash_.add_new(id_node->id_orig_session_uuid, id_info);
id_node->id_cow = nullptr;
}
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index 6f7a8b1c6b5..174f9b129f9 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -285,8 +285,8 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder {
* very root is visible (aka not restricted.). */
bool is_parent_collection_visible_;
- /* Indexed by original ID, values are IDInfo. */
- Map<const ID *, IDInfo *> id_info_hash_;
+ /* Indexed by original ID.session_uuid, values are IDInfo. */
+ Map<uint, IDInfo *> id_info_hash_;
/* Set of IDs which were already build. Makes it easier to keep track of
* what was already built and what was not. */
diff --git a/source/blender/depsgraph/intern/node/deg_node_id.cc b/source/blender/depsgraph/intern/node/deg_node_id.cc
index 4f2fcab5823..8e159a7ff08 100644
--- a/source/blender/depsgraph/intern/node/deg_node_id.cc
+++ b/source/blender/depsgraph/intern/node/deg_node_id.cc
@@ -80,6 +80,7 @@ void IDNode::init(const ID *id, const char *UNUSED(subdata))
/* Store ID-pointer. */
id_type = GS(id->name);
id_orig = (ID *)id;
+ id_orig_session_uuid = id->session_uuid;
eval_flags = 0;
previous_eval_flags = 0;
customdata_masks = DEGCustomDataMeshMasks();
diff --git a/source/blender/depsgraph/intern/node/deg_node_id.h b/source/blender/depsgraph/intern/node/deg_node_id.h
index 04a9006ac10..c4d36685bb8 100644
--- a/source/blender/depsgraph/intern/node/deg_node_id.h
+++ b/source/blender/depsgraph/intern/node/deg_node_id.h
@@ -74,12 +74,22 @@ struct IDNode : public Node {
IDComponentsMask get_visible_components_mask() const;
- /* ID Block referenced. */
/* Type of the ID stored separately, so it's possible to perform check whether CoW is needed
* without de-referencing the id_cow (which is not safe when ID is NOT covered by CoW and has
* been deleted from the main database.) */
ID_Type id_type;
+
+ /* ID Block referenced. */
ID *id_orig;
+
+ /* Session-wide UUID of the id_orig.
+ * Is used on relations update to map evaluated state from old nodes to the new ones, without
+ * relying on pointers (which are not guaranteed to be unique) and without dereferencing id_orig
+ * which could be "stale" pointer. */
+ uint id_orig_session_uuid;
+
+ /* Evaluated datablock.
+ * Will be covered by the copy-on-write system if the ID Type needs it. */
ID *id_cow;
/* Hash to make it faster to look up components. */