[Bf-blender-cvs] [008a5d9106b] blender2.8: Depsgraph: Add missing relations needed for nested datablock relations

Sergey Sharybin noreply at git.blender.org
Tue May 1 13:22:59 CEST 2018


Commit: 008a5d9106bf1226c2cd506d7897443891b5c261
Author: Sergey Sharybin
Date:   Tue May 1 12:41:10 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB008a5d9106bf1226c2cd506d7897443891b5c261

Depsgraph: Add missing relations needed for nested datablock relations

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

M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.h

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

diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 201df94b691..5514d4b9452 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -563,6 +563,7 @@ void DepsgraphRelationBuilder::build_object_data(Object *object)
 		ComponentKey geometry_key((ID *)object->data, DEG_NODE_TYPE_GEOMETRY);
 		ComponentKey key_key(&key->id, DEG_NODE_TYPE_GEOMETRY);
 		add_relation(key_key, geometry_key, "Shapekeys");
+		build_nested_shapekey(&object->id, key);
 	}
 }
 
@@ -1273,6 +1274,7 @@ void DepsgraphRelationBuilder::build_world(World *world)
 		ComponentKey ntree_key(&world->nodetree->id, DEG_NODE_TYPE_SHADING);
 		ComponentKey world_key(&world->id, DEG_NODE_TYPE_SHADING);
 		add_relation(ntree_key, world_key, "NTree->World Shading Update");
+		build_nested_nodetree(&world->id, world->nodetree);
 	}
 }
 
@@ -1804,6 +1806,7 @@ void DepsgraphRelationBuilder::build_lamp(Object *object)
 		build_nodetree(lamp->nodetree);
 		ComponentKey nodetree_key(&lamp->nodetree->id, DEG_NODE_TYPE_SHADING);
 		add_relation(nodetree_key, lamp_parameters_key, "NTree->Lamp Parameters");
+		build_nested_nodetree(&lamp->id, lamp->nodetree);
 	}
 
 	if (DEG_depsgraph_use_copy_on_write()) {
@@ -1896,6 +1899,7 @@ void DepsgraphRelationBuilder::build_material(Material *material)
 		                          DEG_NODE_TYPE_SHADING,
 		                          DEG_OPCODE_MATERIAL_UPDATE);
 		add_relation(ntree_key, material_key, "Material's NTree");
+		build_nested_nodetree(&material->id, material->nodetree);
 	}
 }
 
@@ -1909,6 +1913,7 @@ void DepsgraphRelationBuilder::build_texture(Tex *texture)
 	build_animdata(&texture->id);
 	/* texture's nodetree */
 	build_nodetree(texture->nodetree);
+	build_nested_nodetree(&texture->id, texture->nodetree);
 }
 
 void DepsgraphRelationBuilder::build_compositor(Scene *scene)
@@ -1979,6 +1984,43 @@ void DepsgraphRelationBuilder::build_copy_on_write_relations()
 	}
 }
 
+/* Nested datablocks (node trees, shape keys) requires special relation to
+ * ensure owner's datablock remapping happens after node tree itself is ready.
+ *
+ * This is similar to what happens in ntree_hack_remap_pointers().
+ */
+void DepsgraphRelationBuilder::build_nested_datablock(ID *owner, ID *id) {
+	if (!DEG_depsgraph_use_copy_on_write()) {
+		return;
+	}
+	OperationKey owner_copy_on_write_key(owner,
+	                                     DEG_NODE_TYPE_COPY_ON_WRITE,
+	                                     DEG_OPCODE_COPY_ON_WRITE);
+	OperationKey id_copy_on_write_key(id,
+	                                  DEG_NODE_TYPE_COPY_ON_WRITE,
+	                                  DEG_OPCODE_COPY_ON_WRITE);
+	add_relation(id_copy_on_write_key,
+	             owner_copy_on_write_key,
+	             "Eval Order");
+}
+
+void DepsgraphRelationBuilder::build_nested_nodetree(ID *owner,
+                                                     bNodeTree *ntree)
+{
+	if (ntree == NULL) {
+		return;
+	}
+	build_nested_datablock(owner, &ntree->id);
+}
+
+void DepsgraphRelationBuilder::build_nested_shapekey(ID *owner, Key *key)
+{
+	if (key == NULL) {
+		return;
+	}
+	build_nested_datablock(owner, &key->id);
+}
+
 void DepsgraphRelationBuilder::build_copy_on_write_relations(IDDepsNode *id_node)
 {
 	ID *id_orig = id_node->id_orig;
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
index 7469540521b..7c88eea6f72 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
@@ -251,6 +251,10 @@ struct DepsgraphRelationBuilder
 	void build_movieclip(MovieClip *clip);
 	void build_lightprobe(Object *object);
 
+	void build_nested_datablock(ID *owner, ID *id);
+	void build_nested_nodetree(ID *owner, bNodeTree *ntree);
+	void build_nested_shapekey(ID *owner, Key *key);
+
 	void add_collision_relations(const OperationKey &key,
 	                             Scene *scene,
 	                             Object *object,



More information about the Bf-blender-cvs mailing list