diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-06-04 12:33:41 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-06-04 12:43:27 +0300 |
commit | 30c0d780f9d9012e45db4553e8df1c9526f03b27 (patch) | |
tree | 372ee3f12ab9305218c2cb5a8f288e1a7d40c2fb /source/blender/depsgraph/intern | |
parent | 04bac387315ce09822c36bc20e0fe4e7d533fec8 (diff) |
Depsgraph: Only run editors ID update on manual edits
This is how it worked in 2.79 and it is how it is expected to be working.
Avoids unintended icons update during animation playback.
Fixes T64318: Update of material icons during animation 2x performance penalty
Diffstat (limited to 'source/blender/depsgraph/intern')
4 files changed, 11 insertions, 1 deletions
diff --git a/source/blender/depsgraph/intern/depsgraph_tag.cc b/source/blender/depsgraph/intern/depsgraph_tag.cc index fc1c6be19af..2d4963e8fef 100644 --- a/source/blender/depsgraph/intern/depsgraph_tag.cc +++ b/source/blender/depsgraph/intern/depsgraph_tag.cc @@ -741,6 +741,8 @@ static void deg_graph_clear_id_node_func(void *__restrict data_v, * the recalc flag. */ DEG::Depsgraph *deg_graph = reinterpret_cast<DEG::Depsgraph *>(data_v); DEG::IDNode *id_node = deg_graph->id_nodes[i]; + + id_node->is_user_modified = false; id_node->id_cow->recalc &= ~ID_RECALC_ALL; /* Clear embedded node trees too. */ diff --git a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc index 6d8dcf2778f..06e63b6868c 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc @@ -187,6 +187,10 @@ BLI_INLINE OperationNode *flush_schedule_children(OperationNode *op_node, FlushQ if (rel->flag & RELATION_FLAG_NO_FLUSH) { continue; } + if (op_node->flag & DEPSOP_FLAG_USER_MODIFIED) { + IDNode *id_node = op_node->owner->owner; + id_node->is_user_modified = true; + } /* Relation only allows flushes on user changes, but the node was not * affected by user. */ if ((rel->flag & RELATION_FLAG_FLUSH_USER_EDIT_ONLY) && @@ -257,7 +261,7 @@ void flush_editors_id_update(Depsgraph *graph, const DEGEditorUpdateContext *upd * TODO: image datablocks do not use COW, so might not be detected * correctly. */ if (deg_copy_on_write_is_expanded(id_cow)) { - if (graph->is_active) { + if (graph->is_active && id_node->is_user_modified) { deg_editors_id_update(update_ctx, id_orig); } /* ID may need to get its auto-override operations refreshed. */ diff --git a/source/blender/depsgraph/intern/node/deg_node_id.cc b/source/blender/depsgraph/intern/node/deg_node_id.cc index c5b9c56bcf0..8a7ec927f8c 100644 --- a/source/blender/depsgraph/intern/node/deg_node_id.cc +++ b/source/blender/depsgraph/intern/node/deg_node_id.cc @@ -112,6 +112,7 @@ void IDNode::init(const ID *id, const char *UNUSED(subdata)) is_directly_visible = true; is_collection_fully_expanded = false; has_base = false; + is_user_modified = false; visible_components_mask = 0; previously_visible_components_mask = 0; diff --git a/source/blender/depsgraph/intern/node/deg_node_id.h b/source/blender/depsgraph/intern/node/deg_node_id.h index b4351ec988c..e6eb91a6b2d 100644 --- a/source/blender/depsgraph/intern/node/deg_node_id.h +++ b/source/blender/depsgraph/intern/node/deg_node_id.h @@ -99,6 +99,9 @@ struct IDNode : public Node { /* Is used to figure out whether object came to the dependency graph via a base. */ bool has_base; + /* Accumulated flag from operation. Is initialized and used during updates flush. */ + bool is_user_modified; + IDComponentsMask visible_components_mask; IDComponentsMask previously_visible_components_mask; |