Merge branch 'blender-v3.2-release'
This commit is contained in:
@@ -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;
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user