Depsgraph: Create CoW copy of scene early on
Originally this only needed for view collections, but it will be needed for bases really soon as well.
This commit is contained in:
@@ -206,7 +206,7 @@ struct DepsgraphNodeBuilder {
|
||||
LayerCollectionState *state);
|
||||
void build_layer_collections(ListBase *layer_collections,
|
||||
LayerCollectionState *state);
|
||||
void build_view_layer_collections(ViewLayer *view_layer);
|
||||
void build_view_layer_collections(Scene *scene, ViewLayer *view_layer);
|
||||
protected:
|
||||
/* State which never changes, same for the whole builder time. */
|
||||
Main *bmain_;
|
||||
|
||||
@@ -98,24 +98,9 @@ void DepsgraphNodeBuilder::build_layer_collections(ListBase *layer_collections,
|
||||
}
|
||||
|
||||
void DepsgraphNodeBuilder::build_view_layer_collections(
|
||||
Scene *scene,
|
||||
ViewLayer *view_layer)
|
||||
{
|
||||
Scene *scene_cow;
|
||||
ViewLayer *view_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_);
|
||||
view_layer_cow = (ViewLayer *)BLI_findstring(
|
||||
&scene_cow->view_layers,
|
||||
view_layer->name,
|
||||
offsetof(ViewLayer, name));
|
||||
}
|
||||
else {
|
||||
scene_cow = scene_;
|
||||
view_layer_cow = view_layer;
|
||||
}
|
||||
|
||||
LayerCollectionState state;
|
||||
state.index = 0;
|
||||
ComponentDepsNode *comp = add_component_node(
|
||||
@@ -124,16 +109,16 @@ void DepsgraphNodeBuilder::build_view_layer_collections(
|
||||
add_operation_node(comp,
|
||||
function_bind(BKE_layer_eval_layer_collection_pre,
|
||||
_1,
|
||||
scene_cow,
|
||||
view_layer_cow),
|
||||
scene,
|
||||
view_layer),
|
||||
DEG_OPCODE_VIEW_LAYER_INIT);
|
||||
add_operation_node(comp,
|
||||
function_bind(BKE_layer_eval_layer_collection_post,
|
||||
_1,
|
||||
view_layer_cow),
|
||||
view_layer),
|
||||
DEG_OPCODE_VIEW_LAYER_DONE);
|
||||
state.parent = NULL;
|
||||
build_layer_collections(&view_layer_cow->layer_collections, &state);
|
||||
build_layer_collections(&view_layer->layer_collections, &state);
|
||||
}
|
||||
|
||||
} // namespace DEG
|
||||
|
||||
@@ -69,6 +69,22 @@ void DepsgraphNodeBuilder::build_view_layer(Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
eDepsNode_LinkedState_Type linked_state)
|
||||
{
|
||||
Scene *scene_cow;
|
||||
ViewLayer *view_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);
|
||||
view_layer_cow = (ViewLayer *)BLI_findstring(
|
||||
&scene_cow->view_layers,
|
||||
view_layer->name,
|
||||
offsetof(ViewLayer, name));
|
||||
}
|
||||
else {
|
||||
scene_cow = scene;
|
||||
view_layer_cow = view_layer;
|
||||
}
|
||||
|
||||
/* scene ID block */
|
||||
add_id_node(&scene->id);
|
||||
|
||||
@@ -141,7 +157,7 @@ void DepsgraphNodeBuilder::build_view_layer(Scene *scene,
|
||||
}
|
||||
|
||||
/* Collections. */
|
||||
build_view_layer_collections(view_layer);
|
||||
build_view_layer_collections(scene_cow, view_layer_cow);
|
||||
|
||||
/* Parameters evaluation for scene relations mainly. */
|
||||
add_operation_node(&scene->id,
|
||||
|
||||
Reference in New Issue
Block a user