1
1

Merge branch 'blender-v3.2-release'

This commit is contained in:
2022-05-05 15:39:58 +02:00
2 changed files with 65 additions and 29 deletions

View File

@@ -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;

View File

@@ -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);
}
}