diff options
Diffstat (limited to 'source/blender/editors/space_node/node_edit.c')
-rw-r--r-- | source/blender/editors/space_node/node_edit.c | 60 |
1 files changed, 36 insertions, 24 deletions
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index ffd51bcc44e..6ae72e2a164 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -277,7 +277,7 @@ void ED_node_composite_job(const bContext *C, struct bNodeTree *nodetree, Scene G.is_break = false; #endif - BKE_image_backup_render(scene, BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result")); + BKE_image_backup_render(scene, BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"), false); wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene_owner, "Compositing", WM_JOB_EXCL_RENDER | WM_JOB_PROGRESS, WM_JOB_TYPE_COMPOSITE); @@ -657,10 +657,10 @@ void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node) node->flag |= NODE_DO_OUTPUT; if (was_output == 0) - ED_node_tag_update_nodetree(bmain, ntree); + ED_node_tag_update_nodetree(bmain, ntree, node); } else if (do_update) - ED_node_tag_update_nodetree(bmain, ntree); + ED_node_tag_update_nodetree(bmain, ntree, node); /* if active texture changed, free glsl materials */ if ((node->flag & NODE_ACTIVE_TEXTURE) && !was_active_texture) { @@ -692,7 +692,7 @@ void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node) node->flag |= NODE_DO_OUTPUT; if (was_output == 0) - ED_node_tag_update_nodetree(bmain, ntree); + ED_node_tag_update_nodetree(bmain, ntree, node); /* addnode() doesnt link this yet... */ node->id = (ID *)BKE_image_verify_viewer(IMA_TYPE_COMPOSITE, "Viewer Node"); @@ -722,11 +722,11 @@ void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node) tnode->flag &= ~NODE_DO_OUTPUT; node->flag |= NODE_DO_OUTPUT; - ED_node_tag_update_nodetree(bmain, ntree); + ED_node_tag_update_nodetree(bmain, ntree, node); } } else if (do_update) - ED_node_tag_update_nodetree(bmain, ntree); + ED_node_tag_update_nodetree(bmain, ntree, node); } else if (ntree->type == NTREE_TEXTURE) { // XXX @@ -791,7 +791,7 @@ static void edit_node_properties(wmOperatorType *ot) /* XXX could node be a context pointer? */ RNA_def_string(ot->srna, "node", NULL, MAX_NAME, "Node", ""); RNA_def_int(ot->srna, "socket", 0, 0, MAX_SOCKET, "Socket", "", 0, MAX_SOCKET); - RNA_def_enum(ot->srna, "in_out", node_socket_in_out_items, SOCK_IN, "Socket Side", ""); + RNA_def_enum(ot->srna, "in_out", rna_enum_node_socket_in_out_items, SOCK_IN, "Socket Side", ""); } static int edit_node_invoke_properties(bContext *C, wmOperator *op) @@ -924,14 +924,13 @@ static int node_resize_modal(bContext *C, wmOperator *op, const wmEvent *event) pwidth = &node->miniwidth; oldwidth = nsw->oldminiwidth; widthmin = 0.0f; - widthmax = 100.0f; } else { pwidth = &node->width; oldwidth = nsw->oldwidth; widthmin = node->typeinfo->minwidth; - widthmax = node->typeinfo->maxwidth; } + widthmax = node->typeinfo->maxwidth; { if (nsw->directions & NODE_RESIZE_RIGHT) { @@ -1177,7 +1176,8 @@ static int node_duplicate_exec(bContext *C, wmOperator *op) bNode *node, *newnode, *lastnode; bNodeLink *link, *newlink, *lastlink; const bool keep_inputs = RNA_boolean_get(op->ptr, "keep_inputs"); - + bool do_tag_update = false; + ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C)); lastnode = ntree->nodes.last; @@ -1254,6 +1254,8 @@ static int node_duplicate_exec(bContext *C, wmOperator *op) nodeSetSelected(node, false); node->flag &= ~NODE_ACTIVE; nodeSetSelected(newnode, true); + + do_tag_update |= (do_tag_update || node_connected_to_output(ntree, newnode)); } /* make sure we don't copy new nodes again! */ @@ -1264,7 +1266,9 @@ static int node_duplicate_exec(bContext *C, wmOperator *op) ntreeUpdateTree(CTX_data_main(C), snode->edittree); snode_notify(C, snode); - snode_dag_update(C, snode); + if (do_tag_update) { + snode_dag_update(C, snode); + } return OPERATOR_FINISHED; } @@ -1317,15 +1321,15 @@ static int node_read_renderlayers_exec(bContext *C, wmOperator *UNUSED(op)) /* first tag scenes unread */ for (scene = bmain->scene.first; scene; scene = scene->id.next) - scene->id.flag |= LIB_DOIT; + scene->id.tag |= LIB_TAG_DOIT; for (node = snode->edittree->nodes.first; node; node = node->next) { if (node->type == CMP_NODE_R_LAYERS) { ID *id = node->id; - if (id->flag & LIB_DOIT) { + if (id->tag & LIB_TAG_DOIT) { RE_ReadRenderResult(curscene, (Scene *)id); ntreeCompositTagRender((Scene *)id); - id->flag &= ~LIB_DOIT; + id->tag &= ~LIB_TAG_DOIT; } } } @@ -1623,6 +1627,7 @@ static int node_mute_exec(bContext *C, wmOperator *UNUSED(op)) { SpaceNode *snode = CTX_wm_space_node(C); bNode *node; + bool do_tag_update = false; ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C)); @@ -1631,11 +1636,14 @@ static int node_mute_exec(bContext *C, wmOperator *UNUSED(op)) if ((node->flag & SELECT) && node->typeinfo->update_internal_links) { node->flag ^= NODE_MUTED; snode_update(snode, node); + do_tag_update |= (do_tag_update || node_connected_to_output(snode->edittree, node)); } } snode_notify(C, snode); - snode_dag_update(C, snode); + if (do_tag_update) { + snode_dag_update(C, snode); + } return OPERATOR_FINISHED; } @@ -1661,15 +1669,17 @@ static int node_delete_exec(bContext *C, wmOperator *UNUSED(op)) { SpaceNode *snode = CTX_wm_space_node(C); bNode *node, *next; - + bool do_tag_update = false; + ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C)); for (node = snode->edittree->nodes.first; node; node = next) { next = node->next; if (node->flag & SELECT) { /* check id user here, nodeFreeNode is called for free dbase too */ + do_tag_update |= (do_tag_update || node_connected_to_output(snode->edittree, node)); if (node->id) - node->id->us--; + id_us_min(node->id); nodeFreeNode(snode->edittree, node); } } @@ -1677,7 +1687,9 @@ static int node_delete_exec(bContext *C, wmOperator *UNUSED(op)) ntreeUpdateTree(CTX_data_main(C), snode->edittree); snode_notify(C, snode); - snode_dag_update(C, snode); + if (do_tag_update) { + snode_dag_update(C, snode); + } return OPERATOR_FINISHED; } @@ -1760,7 +1772,7 @@ static int node_delete_reconnect_exec(bContext *C, wmOperator *UNUSED(op)) /* check id user here, nodeFreeNode is called for free dbase too */ if (node->id) - node->id->us--; + id_us_min(node->id); nodeFreeNode(snode->edittree, node); } } @@ -2251,7 +2263,7 @@ void NODE_OT_tree_socket_add(wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - RNA_def_enum(ot->srna, "in_out", node_socket_in_out_items, SOCK_IN, "Socket Type", ""); + RNA_def_enum(ot->srna, "in_out", rna_enum_node_socket_in_out_items, SOCK_IN, "Socket Type", ""); } /********************** Remove interface socket operator *********************/ @@ -2438,7 +2450,7 @@ static int node_shader_script_update_exec(bContext *C, wmOperator *op) Scene *scene = CTX_data_scene(C); SpaceNode *snode = CTX_wm_space_node(C); PointerRNA nodeptr = CTX_data_pointer_get_type(C, "node", &RNA_ShaderNodeScript); - bNodeTree *ntree = NULL; + bNodeTree *ntree_base = NULL; bNode *node = NULL; RenderEngine *engine; RenderEngineType *type; @@ -2451,17 +2463,17 @@ static int node_shader_script_update_exec(bContext *C, wmOperator *op) /* get node */ if (nodeptr.data) { - ntree = nodeptr.id.data; + ntree_base = nodeptr.id.data; node = nodeptr.data; } else if (snode && snode->edittree) { - ntree = snode->edittree; + ntree_base = snode->edittree; node = nodeGetActive(snode->edittree); } if (node) { /* update single node */ - type->update_script_node(engine, ntree, node); + type->update_script_node(engine, ntree_base, node); found = true; } |