diff options
Diffstat (limited to 'source/blender/depsgraph')
-rw-r--r-- | source/blender/depsgraph/intern/depsgraph_tag.cc | 5 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc | 2 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/node/deg_node_id.h | 3 |
3 files changed, 9 insertions, 1 deletions
diff --git a/source/blender/depsgraph/intern/depsgraph_tag.cc b/source/blender/depsgraph/intern/depsgraph_tag.cc index 4bc9e0d2d14..6614509f860 100644 --- a/source/blender/depsgraph/intern/depsgraph_tag.cc +++ b/source/blender/depsgraph/intern/depsgraph_tag.cc @@ -284,6 +284,7 @@ void depsgraph_tag_component(Depsgraph *graph, * here. */ if (component_node == nullptr) { if (component_type == NodeType::ANIMATION) { + id_node->is_cow_explicitly_tagged = true; depsgraph_id_tag_copy_on_write(graph, id_node, update_source); } return; @@ -301,6 +302,9 @@ void depsgraph_tag_component(Depsgraph *graph, if (component_node->need_tag_cow_before_update()) { depsgraph_id_tag_copy_on_write(graph, id_node, update_source); } + if (component_type == NodeType::COPY_ON_WRITE) { + id_node->is_cow_explicitly_tagged = true; + } } /* This is a tag compatibility with legacy code. @@ -888,6 +892,7 @@ void DEG_ids_clear_recalc(Depsgraph *depsgraph, const bool backup) * correctly when there are multiple depsgraph with others still using * the recalc flag. */ id_node->is_user_modified = false; + id_node->is_cow_explicitly_tagged = false; deg_graph_clear_id_recalc_flags(id_node->id_cow); if (deg_graph->is_active) { deg_graph_clear_id_recalc_flags(id_node->id_orig); diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc index 851d0bcf000..8a3c5c5b776 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc @@ -904,7 +904,7 @@ ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph, const IDNode * modifiers. * * TODO: Investigate modes besides edit-mode. */ - if (check_datablock_expanded(id_cow)) { + if (check_datablock_expanded(id_cow) && !id_node->is_cow_explicitly_tagged) { const ID_Type id_type = GS(id_orig->name); if (OB_DATA_SUPPORT_EDITMODE(id_type) && BKE_object_data_is_in_editmode(id_orig)) { /* Make sure pointers in the edit mode data are updated in the copy. diff --git a/source/blender/depsgraph/intern/node/deg_node_id.h b/source/blender/depsgraph/intern/node/deg_node_id.h index 257e42b8e67..f18c44b6332 100644 --- a/source/blender/depsgraph/intern/node/deg_node_id.h +++ b/source/blender/depsgraph/intern/node/deg_node_id.h @@ -121,6 +121,9 @@ struct IDNode : public Node { /* Accumulated flag from operation. Is initialized and used during updates flush. */ bool is_user_modified; + /* Copy-on-Write component has been explicitly tagged for update. */ + bool is_cow_explicitly_tagged; + /* Accumulate recalc flags from multiple update passes. */ int id_cow_recalc_backup; |