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:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user