diff options
author | Sergey Sharybin <sergey@blender.org> | 2022-05-05 16:39:58 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey@blender.org> | 2022-05-05 16:39:58 +0300 |
commit | 47ba5418537bef4785dd7789d434c2d4228ec7aa (patch) | |
tree | 45165372af878053952f72005d11eef8763f91ce | |
parent | b968e2bf48ff7a67972c938e17c1723f1c116ddc (diff) | |
parent | b891c72d2da6c0e04569baac32da23c8b736aacf (diff) |
Merge branch 'blender-v3.2-release'
-rw-r--r-- | source/blender/editors/space_node/node_intern.hh | 10 | ||||
-rw-r--r-- | source/blender/editors/space_node/space_node.cc | 84 |
2 files changed, 65 insertions, 29 deletions
diff --git a/source/blender/editors/space_node/node_intern.hh b/source/blender/editors/space_node/node_intern.hh index 10d4ad36d95..4157176cd68 100644 --- a/source/blender/editors/space_node/node_intern.hh +++ b/source/blender/editors/space_node/node_intern.hh @@ -74,8 +74,14 @@ struct SpaceNode_Runtime { /** Mouse position for drawing socket-less links and adding nodes. */ float2 cursor; - /** For auto compositing. */ - bool recalc; + /* Indicates that the compositing tree in the space needs to be re-evaluated using the + * auto-compositing pipeline. + * Takes priority over the regular compsiting. */ + bool recalc_auto_compositing; + + /* Indicates that the compositing int the space tree needs to be re-evaluated using + * regular compositing pipeline. */ + bool recalc_regular_compositing; /** Temporary data for modal linking operator. */ std::unique_ptr<bNodeLinkDrag> linkdrag; diff --git a/source/blender/editors/space_node/space_node.cc b/source/blender/editors/space_node/space_node.cc index 34f357ae5c3..296cd1ff133 100644 --- a/source/blender/editors/space_node/space_node.cc +++ b/source/blender/editors/space_node/space_node.cc @@ -324,6 +324,39 @@ static bool any_node_uses_id(const bNodeTree *ntree, const ID *id) return false; } +/** + * Tag the space to recalculate the compositing tree using auto-compositing pipeline. + * + * Will check the space to be using a compsiting tree, and check whether auto-compositing + * is enabled. If the checks do not pass then the function has no affect. */ +static void node_area_tag_recalc_auto_compositing(SpaceNode *snode, ScrArea *area) +{ + if (!ED_node_is_compositor(snode)) { + return; + } + + if (snode->flag & SNODE_AUTO_RENDER) { + snode->runtime->recalc_auto_compositing = true; + ED_area_tag_refresh(area); + } +} + +/** + * Tag the space to recalculate the current tree. + * + * For all node trees this will do `snode_set_context()` which takes care of setting an active + * tree. This will be done in the area refresh callback. + * + * For compositor tree this will additionally start of the compositor job. */ +static void node_area_tag_tree_recalc(SpaceNode *snode, ScrArea *area) +{ + if (ED_node_is_compositor(snode)) { + snode->runtime->recalc_regular_compositing = true; + } + + ED_area_tag_refresh(area); +} + static void node_area_listener(const wmSpaceTypeListenerParams *params) { ScrArea *area = params->area; @@ -346,25 +379,20 @@ static void node_area_listener(const wmSpaceTypeListenerParams *params) UI_view2d_center_set(®ion->v2d, path->view_center[0], path->view_center[1]); } - ED_area_tag_refresh(area); + node_area_tag_tree_recalc(snode, area); break; } case ND_FRAME: - ED_area_tag_refresh(area); + node_area_tag_tree_recalc(snode, area); break; case ND_COMPO_RESULT: ED_area_tag_redraw(area); break; case ND_TRANSFORM_DONE: - if (ED_node_is_compositor(snode)) { - if (snode->flag & SNODE_AUTO_RENDER) { - snode->runtime->recalc = true; - ED_area_tag_refresh(area); - } - } + node_area_tag_recalc_auto_compositing(snode, area); break; case ND_LAYER_CONTENT: - ED_area_tag_refresh(area); + node_area_tag_tree_recalc(snode, area); break; } break; @@ -373,46 +401,46 @@ static void node_area_listener(const wmSpaceTypeListenerParams *params) case NC_MATERIAL: if (ED_node_is_shader(snode)) { if (wmn->data == ND_SHADING) { - ED_area_tag_refresh(area); + node_area_tag_tree_recalc(snode, area); } else if (wmn->data == ND_SHADING_DRAW) { - ED_area_tag_refresh(area); + node_area_tag_tree_recalc(snode, area); } else if (wmn->data == ND_SHADING_LINKS) { - ED_area_tag_refresh(area); + node_area_tag_tree_recalc(snode, area); } } break; case NC_TEXTURE: if (ED_node_is_shader(snode) || ED_node_is_texture(snode)) { if (wmn->data == ND_NODES) { - ED_area_tag_refresh(area); + node_area_tag_tree_recalc(snode, area); } } break; case NC_WORLD: if (ED_node_is_shader(snode) && shader_type == SNODE_SHADER_WORLD) { - ED_area_tag_refresh(area); + node_area_tag_tree_recalc(snode, area); } break; case NC_OBJECT: if (ED_node_is_shader(snode)) { if (wmn->data == ND_OB_SHADING) { - ED_area_tag_refresh(area); + node_area_tag_tree_recalc(snode, area); } } else if (ED_node_is_geometry(snode)) { /* Rather strict check: only redraw when the reference matches the current editor's ID. */ if (wmn->data == ND_MODIFIER) { if (wmn->reference == snode->id || snode->id == nullptr) { - ED_area_tag_refresh(area); + node_area_tag_tree_recalc(snode, area); } } } break; case NC_SPACE: if (wmn->data == ND_SPACE_NODE) { - ED_area_tag_refresh(area); + node_area_tag_tree_recalc(snode, area); } else if (wmn->data == ND_SPACE_NODE_VIEW) { ED_area_tag_redraw(area); @@ -420,7 +448,7 @@ static void node_area_listener(const wmSpaceTypeListenerParams *params) break; case NC_NODE: if (wmn->action == NA_EDITED) { - ED_area_tag_refresh(area); + node_area_tag_tree_recalc(snode, area); } else if (wmn->action == NA_SELECTED) { ED_area_tag_redraw(area); @@ -429,14 +457,14 @@ static void node_area_listener(const wmSpaceTypeListenerParams *params) case NC_SCREEN: switch (wmn->data) { case ND_ANIMPLAY: - ED_area_tag_refresh(area); + node_area_tag_tree_recalc(snode, area); break; } break; case NC_MASK: if (wmn->action == NA_EDITED) { if (snode->nodetree && snode->nodetree->type == NTREE_COMPOSIT) { - ED_area_tag_refresh(area); + node_area_tag_tree_recalc(snode, area); } } break; @@ -447,7 +475,7 @@ static void node_area_listener(const wmSpaceTypeListenerParams *params) /* Without this check drawing on an image could become very slow when the compositor is * open. */ if (any_node_uses_id(snode->nodetree, (ID *)wmn->reference)) { - ED_area_tag_refresh(area); + node_area_tag_tree_recalc(snode, area); } } } @@ -457,7 +485,7 @@ static void node_area_listener(const wmSpaceTypeListenerParams *params) if (wmn->action == NA_EDITED) { if (ED_node_is_compositor(snode)) { if (any_node_uses_id(snode->nodetree, (ID *)wmn->reference)) { - ED_area_tag_refresh(area); + node_area_tag_tree_recalc(snode, area); } } } @@ -465,12 +493,12 @@ static void node_area_listener(const wmSpaceTypeListenerParams *params) case NC_LINESTYLE: if (ED_node_is_shader(snode) && shader_type == SNODE_SHADER_LINESTYLE) { - ED_area_tag_refresh(area); + node_area_tag_tree_recalc(snode, area); } break; case NC_WM: if (wmn->data == ND_UNDO) { - ED_area_tag_refresh(area); + node_area_tag_tree_recalc(snode, area); } break; case NC_GPENCIL: @@ -493,11 +521,13 @@ static void node_area_refresh(const struct bContext *C, ScrArea *area) Scene *scene = (Scene *)snode->id; if (scene->use_nodes) { /* recalc is set on 3d view changes for auto compo */ - if (snode->runtime->recalc) { - snode->runtime->recalc = false; + if (snode->runtime->recalc_auto_compositing) { + snode->runtime->recalc_auto_compositing = false; + snode->runtime->recalc_regular_compositing = false; node_render_changed_exec((struct bContext *)C, nullptr); } - else { + else if (snode->runtime->recalc_regular_compositing) { + snode->runtime->recalc_regular_compositing = false; ED_node_composite_job(C, snode->nodetree, scene); } } |