From 008a5d9106bf1226c2cd506d7897443891b5c261 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 1 May 2018 12:41:10 +0200 Subject: Depsgraph: Add missing relations needed for nested datablock relations --- .../intern/builder/deg_builder_relations.cc | 42 ++++++++++++++++++++++ .../intern/builder/deg_builder_relations.h | 4 +++ 2 files changed, 46 insertions(+) (limited to 'source/blender/depsgraph/intern') 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, -- cgit v1.2.3