Depsgraph: Fix broken copy-on-write draw after ownership changes

Need to build layer collections callbacks using proper CoW pointer.
This commit is contained in:
Sergey Sharybin
2017-11-09 16:42:10 +01:00
parent cec7f1215a
commit 3dde21f97e
2 changed files with 16 additions and 4 deletions

View File

@@ -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

View File

@@ -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)