diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-11-09 18:42:10 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-11-09 18:42:54 +0300 |
commit | 3dde21f97ef6a7b4c2dfb1dc196530de04a1576a (patch) | |
tree | 528dca37ca27ce07f3082d76cfed25ac196d2fc7 /source/blender | |
parent | cec7f1215acffcd31e591fce83d78268aff6e72a (diff) |
Depsgraph: Fix broken copy-on-write draw after ownership changes
Need to build layer collections callbacks using proper CoW pointer.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder_nodes_layer_collection.cc | 12 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/depsgraph_query.cc | 8 |
2 files changed, 16 insertions, 4 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer_collection.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer_collection.cc index b3dc293b13b..3d099416d1e 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer_collection.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer_collection.cc @@ -99,13 +99,19 @@ void DepsgraphNodeBuilder::build_scene_layer_collections( SceneLayer *scene_layer) { Scene *scene_cow; + SceneLayer *scene_layer_cow; if (DEG_depsgraph_use_copy_on_write()) { /* Make sure we've got ID node, so we can get pointer to CoW datablock. */ scene_cow = expand_cow_datablock(scene_); + scene_layer_cow = (SceneLayer *)BLI_findstring( + &scene_cow->render_layers, + scene_layer->name, + offsetof(SceneLayer, name)); } else { scene_cow = scene_; + scene_layer_cow = scene_layer; } LayerCollectionState state; @@ -117,17 +123,17 @@ void DepsgraphNodeBuilder::build_scene_layer_collections( function_bind(BKE_layer_eval_layer_collection_pre, _1, scene_cow, - scene_layer), + scene_layer_cow), DEG_OPCODE_SCENE_LAYER_INIT, scene_layer->name); add_operation_node(comp, function_bind(BKE_layer_eval_layer_collection_post, _1, - scene_layer), + scene_layer_cow), DEG_OPCODE_SCENE_LAYER_DONE, scene_layer->name); state.parent = NULL; - build_layer_collections(&scene_layer->layer_collections, &state); + build_layer_collections(&scene_layer_cow->layer_collections, &state); } } // namespace DEG diff --git a/source/blender/depsgraph/intern/depsgraph_query.cc b/source/blender/depsgraph/intern/depsgraph_query.cc index 8b451ccee32..940cadba872 100644 --- a/source/blender/depsgraph/intern/depsgraph_query.cc +++ b/source/blender/depsgraph/intern/depsgraph_query.cc @@ -92,7 +92,13 @@ Scene *DEG_get_evaluated_scene(Depsgraph *graph) SceneLayer *DEG_get_evaluated_scene_layer(Depsgraph *graph) { DEG::Depsgraph *deg_graph = reinterpret_cast<DEG::Depsgraph *>(graph); - return deg_graph->scene_layer; + Scene *scene_cow = DEG_get_evaluated_scene(graph); + SceneLayer *scene_layer_orig = deg_graph->scene_layer; + SceneLayer *scene_layer_cow = + (SceneLayer *)BLI_findstring(&scene_cow->render_layers, + scene_layer_orig->name, + offsetof(SceneLayer, name)); + return scene_layer_cow; } Object *DEG_get_evaluated_object(Depsgraph *depsgraph, Object *object) |