Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2019-05-22 12:40:25 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2019-05-23 17:45:54 +0300
commitba4e6e59b2e487c54d97863a8176f3c9cac51f20 (patch)
tree3a203b7507283bc773b1af530375b1c50df775be /source/blender/depsgraph/intern/depsgraph_tag.cc
parentfd3f75a02cf9c40c7ba0d15f2c55188b18662a93 (diff)
Depsgraph: Don't tag original IDs for recalc
Tagging original ID introduces a conflict of interest when a separate graph is created and is tagging objects to be re-evaluated with its context. This is part of the problem in T63111: tags within a temporary dependency graph affects viewport and vice versa, which makes logic to wrongly consider that something did change in the scene and that baking is to be redone. This effectively reverts db3bfd0, but this time everything seems to be updating fine in the viewport.
Diffstat (limited to 'source/blender/depsgraph/intern/depsgraph_tag.cc')
-rw-r--r--source/blender/depsgraph/intern/depsgraph_tag.cc17
1 files changed, 5 insertions, 12 deletions
diff --git a/source/blender/depsgraph/intern/depsgraph_tag.cc b/source/blender/depsgraph/intern/depsgraph_tag.cc
index 88f1130b7fb..fc1c6be19af 100644
--- a/source/blender/depsgraph/intern/depsgraph_tag.cc
+++ b/source/blender/depsgraph/intern/depsgraph_tag.cc
@@ -249,7 +249,6 @@ void depsgraph_id_tag_copy_on_write(Depsgraph *graph, IDNode *id_node, eUpdateSo
{
ComponentNode *cow_comp = id_node->find_component(NodeType::COPY_ON_WRITE);
cow_comp->tag_update(graph, update_source);
- id_node->id_orig->recalc |= ID_RECALC_COPY_ON_WRITE;
}
void depsgraph_tag_component(Depsgraph *graph,
@@ -357,16 +356,16 @@ static void graph_id_tag_update_single_flag(Main *bmain,
/* TODO(sergey): Shall we raise some panic here? */
return;
}
- /* Tag ID recalc flag. */
- DepsNodeFactory *factory = type_get_factory(component_type);
- BLI_assert(factory != NULL);
- id->recalc |= factory->id_recalc_tag();
/* Some sanity checks before moving forward. */
if (id_node == NULL) {
/* Happens when object is tagged for update and not yet in the
* dependency graph (but will be after relations update). */
return;
}
+ /* Tag ID recalc flag. */
+ DepsNodeFactory *factory = type_get_factory(component_type);
+ BLI_assert(factory != NULL);
+ id_node->id_cow->recalc |= factory->id_recalc_tag();
/* Tag corresponding dependency graph operation for update. */
if (component_type == NodeType::ID_REF) {
id_node->tag_update(graph, update_source);
@@ -440,7 +439,7 @@ void deg_graph_node_tag_zero(Main *bmain,
}
ID *id = id_node->id_orig;
/* TODO(sergey): Which recalc flags to set here? */
- id->recalc |= ID_RECALC_ALL & ~(ID_RECALC_PSYS_ALL | ID_RECALC_ANIMATION);
+ id_node->id_cow->recalc |= ID_RECALC_ALL & ~(ID_RECALC_PSYS_ALL | ID_RECALC_ANIMATION);
GHASH_FOREACH_BEGIN (ComponentNode *, comp_node, id_node->components) {
if (comp_node->type == NodeType::ANIMATION) {
continue;
@@ -579,7 +578,6 @@ void graph_id_tag_update(
if (flag == 0) {
deg_graph_node_tag_zero(bmain, graph, id_node, update_source);
}
- id->recalc |= flag;
int current_flag = flag;
while (current_flag != 0) {
IDRecalcFlag tag = (IDRecalcFlag)(1 << bitscan_forward_clear_i(&current_flag));
@@ -744,17 +742,12 @@ static void deg_graph_clear_id_node_func(void *__restrict data_v,
DEG::Depsgraph *deg_graph = reinterpret_cast<DEG::Depsgraph *>(data_v);
DEG::IDNode *id_node = deg_graph->id_nodes[i];
id_node->id_cow->recalc &= ~ID_RECALC_ALL;
- id_node->id_orig->recalc &= ~ID_RECALC_ALL;
/* Clear embedded node trees too. */
bNodeTree *ntree_cow = ntreeFromID(id_node->id_cow);
if (ntree_cow) {
ntree_cow->id.recalc &= ~ID_RECALC_ALL;
}
- bNodeTree *ntree_orig = ntreeFromID(id_node->id_orig);
- if (ntree_orig) {
- ntree_orig->id.recalc &= ~ID_RECALC_ALL;
- }
}
void DEG_ids_clear_recalc(Main *UNUSED(bmain), Depsgraph *depsgraph)