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:
authorSergey Sharybin <sergey@blender.org>2022-05-05 16:39:58 +0300
committerSergey Sharybin <sergey@blender.org>2022-05-05 16:39:58 +0300
commit47ba5418537bef4785dd7789d434c2d4228ec7aa (patch)
tree45165372af878053952f72005d11eef8763f91ce
parentb968e2bf48ff7a67972c938e17c1723f1c116ddc (diff)
parentb891c72d2da6c0e04569baac32da23c8b736aacf (diff)
Merge branch 'blender-v3.2-release'
-rw-r--r--source/blender/editors/space_node/node_intern.hh10
-rw-r--r--source/blender/editors/space_node/space_node.cc84
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(&region->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);
}
}