From c3f00d78796216ce15b6032f980539af6f1b0687 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 3 Jun 2019 14:47:44 +0200 Subject: Fix T65447: Mask doesn't update in compositor unless there's motion blur on This is probably just one of the related issues. Root of the problem was that compositor job was using original scene and node tree for compositing. It is not guaranteed to have all the evaluated data. Switched compositor job to use it's own render-pipeline-like dependency graph which has everything evaluated in it. Reviewers: brecht Reviewed By: brecht Differential Revision: https://developer.blender.org/D4998 --- source/blender/editors/space_node/node_edit.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index d54a30047e6..7a6e37bfd4d 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -42,6 +42,8 @@ #include "BKE_scene.h" #include "DEG_depsgraph.h" +#include "DEG_depsgraph_build.h" +#include "DEG_depsgraph_query.h" #include "RE_engine.h" #include "RE_pipeline.h" @@ -79,14 +81,19 @@ enum { }; typedef struct CompoJob { + /* Input parameters. */ Main *bmain; Scene *scene; + ViewLayer *view_layer; bNodeTree *ntree; + int recalc_flags; + /* Evaluated state/ */ + Depsgraph *compositor_depsgraph; bNodeTree *localtree; + /* Jon system integration. */ const short *stop; short *do_update; float *progress; - int recalc_flags; } CompoJob; static void compo_tag_output_nodes(bNodeTree *nodetree, int recalc_flags) @@ -182,6 +189,9 @@ static void compo_freejob(void *cjv) if (cj->localtree) { ntreeLocalMerge(cj->bmain, cj->localtree, cj->ntree); } + if (cj->compositor_depsgraph != NULL) { + DEG_graph_free(cj->compositor_depsgraph); + } MEM_freeN(cj); } @@ -190,8 +200,19 @@ static void compo_freejob(void *cjv) static void compo_initjob(void *cjv) { CompoJob *cj = cjv; + Main *bmain = cj->bmain; + Scene *scene = cj->scene; + ViewLayer *view_layer = cj->view_layer; + + cj->compositor_depsgraph = DEG_graph_new(scene, view_layer, DAG_EVAL_RENDER); + DEG_graph_build_for_compositor_preview( + cj->compositor_depsgraph, bmain, scene, view_layer, cj->ntree); + DEG_evaluate_on_framechange(bmain, cj->compositor_depsgraph, CFRA); + + bNodeTree *ntree_eval = (bNodeTree *)DEG_get_evaluated_id(cj->compositor_depsgraph, + &cj->ntree->id); - cj->localtree = ntreeLocalize(cj->ntree); + cj->localtree = ntreeLocalize(ntree_eval); if (cj->recalc_flags) { compo_tag_output_nodes(cj->localtree, cj->recalc_flags); @@ -283,6 +304,7 @@ void ED_node_composite_job(const bContext *C, struct bNodeTree *nodetree, Scene CompoJob *cj; Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); + ViewLayer *view_layer = CTX_data_view_layer(C); /* to fix bug: [#32272] */ if (G.is_rendering) { @@ -307,6 +329,7 @@ void ED_node_composite_job(const bContext *C, struct bNodeTree *nodetree, Scene /* customdata for preview thread */ cj->bmain = bmain; cj->scene = scene; + cj->view_layer = view_layer; cj->ntree = nodetree; cj->recalc_flags = compo_get_recalc_flags(C); -- cgit v1.2.3