diff --git a/source/blender/depsgraph/intern/eval/deg_eval.cc b/source/blender/depsgraph/intern/eval/deg_eval.cc index 5ca32d00ba5..3bdc33b8d01 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval.cc @@ -105,8 +105,7 @@ void evaluate_node(const DepsgraphEvalState *state, OperationNode *operation_nod * times. * This is a thread-safe modification as the node's flags are only read for a non-scheduled nodes * and this node has been scheduled. */ - operation_node->flag &= ~(DEPSOP_FLAG_DIRECTLY_MODIFIED | DEPSOP_FLAG_NEEDS_UPDATE | - DEPSOP_FLAG_USER_MODIFIED); + operation_node->flag &= ~DEPSOP_FLAG_CLEAR_ON_EVAL; } void deg_task_run_func(TaskPool *pool, void *taskdata) @@ -270,6 +269,10 @@ void schedule_node(DepsgraphEvalState *state, bool is_scheduled = atomic_fetch_and_or_uint8((uint8_t *)&node->scheduled, uint8_t(true)); if (!is_scheduled) { if (node->is_noop()) { + /* Clear flags to avoid affecting subsequent update propagation. + * For normal nodes these are cleared when it is evaluated. */ + node->flag &= ~DEPSOP_FLAG_CLEAR_ON_EVAL; + /* skip NOOP node, schedule children right away */ schedule_children(state, node, schedule_fn); } diff --git a/source/blender/depsgraph/intern/node/deg_node_operation.h b/source/blender/depsgraph/intern/node/deg_node_operation.h index 1bc4b36141e..df4a157d486 100644 --- a/source/blender/depsgraph/intern/node/deg_node_operation.h +++ b/source/blender/depsgraph/intern/node/deg_node_operation.h @@ -224,6 +224,10 @@ enum OperationFlag { /* Set of flags which gets flushed along the relations. */ DEPSOP_FLAG_FLUSH = (DEPSOP_FLAG_USER_MODIFIED), + + /* Set of flags which get cleared upon evaluation. */ + DEPSOP_FLAG_CLEAR_ON_EVAL = (DEPSOP_FLAG_DIRECTLY_MODIFIED | DEPSOP_FLAG_NEEDS_UPDATE | + DEPSOP_FLAG_USER_MODIFIED), }; /* Atomic Operation - Base type for all operations */