diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-06-03 15:47:44 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-06-04 10:41:33 +0300 |
commit | c3f00d78796216ce15b6032f980539af6f1b0687 (patch) | |
tree | 32be9b0d474e1e37a9b5a83dd78a636bb415c12d /source/blender/editors/space_node | |
parent | b998a7b384c6a598ea851fbc06a2df8829c34329 (diff) |
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
Diffstat (limited to 'source/blender/editors/space_node')
-rw-r--r-- | source/blender/editors/space_node/node_edit.c | 27 |
1 files changed, 25 insertions, 2 deletions
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); |