Fix T98379: Wrong evaluation when deactivating/activating collections

This is a regression caused by a230445cae.

The internal cause of the issue was that the synchronization component
was no longer tagged as visible (and hence not evaluated) as it not
connected to any directly visible IDs.

Changed the logic in a way that if any component of an ID is evaluated
the synchronization component will be evaluated as well.

The naming of the flag in the component node is a bit confusing, but
for the simplicity of the change for the upcoming release left it
unchanged.
This commit is contained in:
Sergey Sharybin 2022-05-27 12:09:14 +02:00
parent 5625a21fc7
commit e5c65709a2
Notes: blender-bot 2023-02-14 05:59:31 +01:00
Referenced by issue #98379, Regression: Multiple modifiers failing when deactivating/activating collections
1 changed files with 15 additions and 0 deletions

View File

@ -136,8 +136,22 @@ void deg_graph_build_flush_visibility(Depsgraph *graph)
for (IDNode *id_node : graph->id_nodes) {
for (ComponentNode *comp_node : id_node->components.values()) {
comp_node->affects_directly_visible |= id_node->is_directly_visible;
/* Enforce "visibility" of the syncronization component.
*
* This component is never connected to other ID nodes, and hence can not be handled in the
* same way as other components needed for evaluation. It is only needed for proper
* evaluation of the ID node it belongs to.
*
* The design is such that the synchronization is supposed to happen whenever any part of the
* ID changed/evaluated. Here we mark the component as "visible" so that genetic recalc flag
* flushing and scheduling will handle the component in a generic manner. */
if (comp_node->type == NodeType::SYNCHRONIZATION) {
comp_node->affects_directly_visible = true;
}
}
}
for (OperationNode *op_node : graph->operations) {
op_node->custom_flags = 0;
op_node->num_links_pending = 0;
@ -151,6 +165,7 @@ void deg_graph_build_flush_visibility(Depsgraph *graph)
op_node->custom_flags |= DEG_NODE_VISITED;
}
}
while (!BLI_stack_is_empty(stack)) {
OperationNode *op_node;
BLI_stack_pop(stack, &op_node);