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:
Diffstat (limited to 'source/blender/editors/space_node/node_edit.c')
-rw-r--r--source/blender/editors/space_node/node_edit.c71
1 files changed, 44 insertions, 27 deletions
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index c719f749582..9cafc46ca53 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -479,72 +479,88 @@ static void snode_tag_changed(SpaceNode *snode, bNode *node)
NodeTagIDChanged(snode->nodetree, gnode->id);
}
-void node_set_active(SpaceNode *snode, bNode *node)
+static int has_nodetree(bNodeTree *ntree, bNodeTree *lookup)
{
- nodeSetActive(snode->edittree, node);
+ bNode *node;
+
+ if(ntree == lookup)
+ return 1;
+
+ for(node=ntree->nodes.first; node; node=node->next)
+ if(node->type == NODE_GROUP && node->id)
+ if(has_nodetree((bNodeTree*)node->id, lookup))
+ return 1;
+
+ return 0;
+}
+
+void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node)
+{
+ nodeSetActive(ntree, node);
if(node->type!=NODE_GROUP) {
int was_output= (node->flag & NODE_DO_OUTPUT);
/* tree specific activate calls */
- if(snode->treetype==NTREE_SHADER) {
+ if(ntree->type==NTREE_SHADER) {
/* when we select a material, active texture is cleared, for buttons */
if(node->id && GS(node->id->name)==ID_MA)
- nodeClearActiveID(snode->edittree, ID_TE);
+ nodeClearActiveID(ntree, ID_TE);
if(node->type==SH_NODE_OUTPUT) {
bNode *tnode;
- for(tnode= snode->edittree->nodes.first; tnode; tnode= tnode->next)
+ for(tnode= ntree->nodes.first; tnode; tnode= tnode->next)
if( tnode->type==SH_NODE_OUTPUT)
tnode->flag &= ~NODE_DO_OUTPUT;
node->flag |= NODE_DO_OUTPUT;
if(was_output==0)
- ED_node_changed_update(snode->id, node);
+ ED_node_generic_update(bmain, ntree, node);
}
WM_main_add_notifier(NC_MATERIAL|ND_NODES, node->id);
}
- else if(snode->treetype==NTREE_COMPOSIT) {
- Scene *scene= (Scene*)snode->id;
-
+ else if(ntree->type==NTREE_COMPOSIT) {
/* make active viewer, currently only 1 supported... */
if( ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
bNode *tnode;
- for(tnode= snode->edittree->nodes.first; tnode; tnode= tnode->next)
+ for(tnode= ntree->nodes.first; tnode; tnode= tnode->next)
if( ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))
tnode->flag &= ~NODE_DO_OUTPUT;
node->flag |= NODE_DO_OUTPUT;
- if(was_output==0) {
- snode_tag_changed(snode, node);
-
- ED_node_changed_update(snode->id, node);
- }
+ if(was_output==0)
+ ED_node_generic_update(bmain, ntree, node);
/* addnode() doesnt link this yet... */
node->id= (ID *)BKE_image_verify_viewer(IMA_TYPE_COMPOSITE, "Viewer Node");
}
else if(node->type==CMP_NODE_R_LAYERS) {
- if(node->id==NULL || node->id==(ID *)scene) {
- scene->r.actlay= node->custom1;
+ Scene *scene;
+
+ for(scene=bmain->scene.first; scene; scene=scene->id.next) {
+ if(scene->nodetree && scene->use_nodes && has_nodetree(scene->nodetree, ntree)) {
+ if(node->id==NULL || node->id==(ID *)scene) {
+ scene->r.actlay= node->custom1;
+ }
+ }
}
}
else if(node->type==CMP_NODE_COMPOSITE) {
bNode *tnode;
- for(tnode= snode->edittree->nodes.first; tnode; tnode= tnode->next)
+ for(tnode= ntree->nodes.first; tnode; tnode= tnode->next)
if( tnode->type==CMP_NODE_COMPOSITE)
tnode->flag &= ~NODE_DO_OUTPUT;
node->flag |= NODE_DO_OUTPUT;
- ED_node_changed_update(snode->id, node);
+ ED_node_generic_update(bmain, ntree, node);
}
}
- else if(snode->treetype==NTREE_TEXTURE) {
+ else if(ntree->type==NTREE_TEXTURE) {
// XXX
#if 0
if(node->id)
@@ -1625,7 +1641,7 @@ void NODE_OT_link_viewer(wmOperatorType *ot)
/* return 0, nothing done */
-static int node_mouse_groupheader(SpaceNode *snode)
+static int UNUSED_FUNCTION(node_mouse_groupheader)(SpaceNode *snode)
{
bNode *gnode;
float mx=0, my=0;
@@ -1940,7 +1956,7 @@ void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace)
}
/* can be called from menus too, but they should do own undopush and redraws */
-bNode *node_add_node(SpaceNode *snode, Scene *scene, int type, float locx, float locy)
+bNode *node_add_node(SpaceNode *snode, Main *bmain, Scene *scene, int type, float locx, float locy)
{
bNode *node= NULL, *gnode;
@@ -1955,7 +1971,7 @@ bNode *node_add_node(SpaceNode *snode, Scene *scene, int type, float locx, float
return NULL;
}
else {
- bNodeTree *ngroup= BLI_findlink(&G.main->nodetree, type-NODE_GROUP_MENU);
+ bNodeTree *ngroup= BLI_findlink(&bmain->nodetree, type-NODE_GROUP_MENU);
if(ngroup)
node= nodeAddNodeType(snode->edittree, NODE_GROUP, ngroup, NULL);
}
@@ -1976,7 +1992,7 @@ bNode *node_add_node(SpaceNode *snode, Scene *scene, int type, float locx, float
}
node_tree_verify_groups(snode->nodetree);
- node_set_active(snode, node);
+ ED_node_set_active(bmain, snode->edittree, node);
if(snode->nodetree->type==NTREE_COMPOSIT) {
if(ELEM4(node->type, CMP_NODE_R_LAYERS, CMP_NODE_COMPOSITE, CMP_NODE_DEFOCUS, CMP_NODE_OUTPUT_FILE))
@@ -2991,10 +3007,10 @@ static int node_mute_exec(bContext *C, wmOperator *UNUSED(op))
for(node= snode->edittree->nodes.first; node; node= node->next) {
if(node->flag & SELECT) {
- if(node->inputs.first && node->outputs.first) {
+ /* Be able to mute in-/output nodes as well. - DingTo
+ if(node->inputs.first && node->outputs.first) { */
node->flag ^= NODE_MUTED;
snode_tag_changed(snode, node);
- }
}
}
@@ -3205,6 +3221,7 @@ void NODE_OT_show_cyclic_dependencies(wmOperatorType *ot)
static int node_add_file_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
SpaceNode *snode= CTX_wm_space_node(C);
bNode *node;
@@ -3245,7 +3262,7 @@ static int node_add_file_exec(bContext *C, wmOperator *op)
ED_preview_kill_jobs(C);
- node = node_add_node(snode, scene, ntype, snode->mx, snode->my);
+ node = node_add_node(snode, bmain, scene, ntype, snode->mx, snode->my);
if (!node) {
BKE_report(op->reports, RPT_WARNING, "Could not add an image node.");