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:
Diffstat (limited to 'source/blender/depsgraph/intern/depsgraph_tag.cc')
-rw-r--r--source/blender/depsgraph/intern/depsgraph_tag.cc48
1 files changed, 42 insertions, 6 deletions
diff --git a/source/blender/depsgraph/intern/depsgraph_tag.cc b/source/blender/depsgraph/intern/depsgraph_tag.cc
index f9105b53536..729a0929dd5 100644
--- a/source/blender/depsgraph/intern/depsgraph_tag.cc
+++ b/source/blender/depsgraph/intern/depsgraph_tag.cc
@@ -447,6 +447,24 @@ const char *update_source_as_string(eUpdateSource source)
return "UNKNOWN";
}
+int deg_recalc_flags_for_legacy_zero()
+{
+ return ID_RECALC_ALL & ~(ID_RECALC_PSYS_ALL | ID_RECALC_ANIMATION);
+}
+
+int deg_recalc_flags_effective(Depsgraph *graph, int flags)
+{
+ if (graph != NULL) {
+ if (!graph->is_active) {
+ return 0;
+ }
+ }
+ if (flags == 0) {
+ return deg_recalc_flags_for_legacy_zero();
+ }
+ return flags;
+}
+
/* Special tag function which tags all components which needs to be tagged
* for update flag=0.
*
@@ -462,7 +480,7 @@ void deg_graph_node_tag_zero(Main *bmain,
}
ID *id = id_node->id_orig;
/* TODO(sergey): Which recalc flags to set here? */
- id_node->id_cow->recalc |= ID_RECALC_ALL & ~(ID_RECALC_PSYS_ALL | ID_RECALC_ANIMATION);
+ id_node->id_cow->recalc |= deg_recalc_flags_for_legacy_zero();
GHASH_FOREACH_BEGIN (ComponentNode *, comp_node, id_node->components) {
if (comp_node->type == NodeType::ANIMATION) {
continue;
@@ -607,6 +625,16 @@ void graph_id_tag_update(
if (id_node != NULL) {
id_node->id_cow->recalc |= flag;
}
+ /* When ID is tagged for update based on an user edits store the recalc flags in the original ID.
+ * This way IDs in the undo steps will have this flag preserved, making it possible to restore
+ * all needed tags when new dependency graph is created on redo.
+ * This is the only way to ensure modifications to animation data (such as keyframes i.e.)
+ * properly triggers animation update for the newely constructed dependency graph on redo (while
+ * usually newly created dependency graph skips animation update to avoid loss of unkeyed
+ * changes). */
+ if (update_source == DEG_UPDATE_SOURCE_USER_EDIT) {
+ id->recalc |= deg_recalc_flags_effective(graph, flag);
+ }
int current_flag = flag;
while (current_flag != 0) {
IDRecalcFlag tag = (IDRecalcFlag)(1 << bitscan_forward_clear_i(&current_flag));
@@ -779,6 +807,16 @@ void DEG_ids_check_recalc(
DEG::deg_editors_scene_update(&update_ctx, updated);
}
+static void deg_graph_clear_id_recalc_flags(ID *id)
+{
+ id->recalc &= ~ID_RECALC_ALL;
+ bNodeTree *ntree = ntreeFromID(id);
+ /* Clear embedded node trees too. */
+ if (ntree) {
+ ntree->id.recalc &= ~ID_RECALC_ALL;
+ }
+}
+
static void deg_graph_clear_id_node_func(void *__restrict data_v,
const int i,
const ParallelRangeTLS *__restrict /*tls*/)
@@ -790,12 +828,10 @@ static void deg_graph_clear_id_node_func(void *__restrict 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. */
- bNodeTree *ntree_cow = ntreeFromID(id_node->id_cow);
- if (ntree_cow) {
- ntree_cow->id.recalc &= ~ID_RECALC_ALL;
+ 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);
}
}