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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2012-12-03 20:21:43 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2012-12-03 20:21:43 +0400
commit81a762e79f8391942026f8c8614fe5c364b85168 (patch)
treec9674dead7904d468cfb648fcea16d2b94d18a8f /source/blender/blenkernel/intern/depsgraph.c
parent458131e3957d14d7440acd7fe12a0e381fbf936f (diff)
Fix cycles viewport render getting stuck with driven/animated nodes, the updated
flag would not get cleared due to the nodetree not being a real datablock.
Diffstat (limited to 'source/blender/blenkernel/intern/depsgraph.c')
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index d23a608d31f..3ed759392b6 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -1940,13 +1940,13 @@ void DAG_scene_sort(Main *bmain, Scene *sce)
static void lib_id_recalc_tag(Main *bmain, ID *id)
{
id->flag |= LIB_ID_RECALC;
- bmain->id_tag_update[id->name[0]] = 1;
+ DAG_id_type_tag(bmain, GS(id->name));
}
static void lib_id_recalc_data_tag(Main *bmain, ID *id)
{
id->flag |= LIB_ID_RECALC_DATA;
- bmain->id_tag_update[id->name[0]] = 1;
+ DAG_id_type_tag(bmain, GS(id->name));
}
/* node was checked to have lasttime != curtime and is if type ID_OB */
@@ -2818,6 +2818,7 @@ void DAG_ids_check_recalc(Main *bmain, Scene *scene, int time)
void DAG_ids_clear_recalc(Main *bmain)
{
ListBase *lbarray[MAX_LIBARRAY];
+ bNodeTree *ntree;
int a;
/* loop over all ID types */
@@ -2830,9 +2831,15 @@ void DAG_ids_clear_recalc(Main *bmain)
/* we tag based on first ID type character to avoid
* looping over all ID's in case there are no tags */
if (id && bmain->id_tag_update[id->name[0]]) {
- for (; id; id = id->next)
+ for (; id; id = id->next) {
if (id->flag & (LIB_ID_RECALC | LIB_ID_RECALC_DATA))
id->flag &= ~(LIB_ID_RECALC | LIB_ID_RECALC_DATA);
+
+ /* some ID's contain semi-datablock nodetree */
+ ntree = ntreeFromID(id);
+ if (ntree && (ntree->id.flag & (LIB_ID_RECALC | LIB_ID_RECALC_DATA)))
+ ntree->id.flag &= ~(LIB_ID_RECALC | LIB_ID_RECALC_DATA);
+ }
}
}
@@ -2899,8 +2906,18 @@ void DAG_id_tag_update(ID *id, short flag)
}
}
-void DAG_id_type_tag(struct Main *bmain, short idtype)
+void DAG_id_type_tag(Main *bmain, short idtype)
{
+ if (idtype == ID_NT) {
+ /* stupid workaround so parent datablocks of nested nodetree get looped
+ * over when we loop over tagged datablock types */
+ DAG_id_type_tag(bmain, ID_MA);
+ DAG_id_type_tag(bmain, ID_TE);
+ DAG_id_type_tag(bmain, ID_LA);
+ DAG_id_type_tag(bmain, ID_WO);
+ DAG_id_type_tag(bmain, ID_SCE);
+ }
+
bmain->id_tag_update[((char *)&idtype)[0]] = 1;
}