[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [39346] trunk/blender/source/blender/ editors: Nodes: make node set active function usable outside of node editor , and in doing

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Aug 12 20:27:48 CEST 2011


Revision: 39346
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39346
Author:   blendix
Date:     2011-08-12 18:27:48 +0000 (Fri, 12 Aug 2011)
Log Message:
-----------
Nodes: make node set active function usable outside of node editor, and in doing
so fix a missing updating when activating a node with multiple node editors open.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_node.h
    trunk/blender/source/blender/editors/space_node/node_edit.c
    trunk/blender/source/blender/editors/space_node/node_header.c
    trunk/blender/source/blender/editors/space_node/node_intern.h
    trunk/blender/source/blender/editors/space_node/node_select.c

Modified: trunk/blender/source/blender/editors/include/ED_node.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_node.h	2011-08-12 18:24:17 UTC (rev 39345)
+++ trunk/blender/source/blender/editors/include/ED_node.h	2011-08-12 18:27:48 UTC (rev 39346)
@@ -33,12 +33,14 @@
 #ifndef ED_NODE_H
 #define ED_NODE_H
 
+struct ID;
+struct Main;
 struct Material;
 struct Scene;
 struct Tex;
 struct bContext;
 struct bNode;
-struct ID;
+struct bNodeTree;
 struct ScrArea;
 
 /* drawnode.c */
@@ -55,6 +57,8 @@
 void ED_node_link_intersect_test(struct ScrArea *sa, int test);
 void ED_node_link_insert(struct ScrArea *sa);
 
+void ED_node_set_active(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node);
+
 /* node ops.c */
 void ED_operatormacros_node(void);
 

Modified: trunk/blender/source/blender/editors/space_node/node_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_edit.c	2011-08-12 18:24:17 UTC (rev 39345)
+++ trunk/blender/source/blender/editors/space_node/node_edit.c	2011-08-12 18:27:48 UTC (rev 39346)
@@ -479,72 +479,88 @@
 		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)
@@ -1940,7 +1956,7 @@
 }
 
 /* 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 @@
 			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 @@
 		}
 
 		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))
@@ -3205,6 +3221,7 @@
 
 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 @@
 
 	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.");

Modified: trunk/blender/source/blender/editors/space_node/node_header.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_header.c	2011-08-12 18:24:17 UTC (rev 39345)
+++ trunk/blender/source/blender/editors/space_node/node_header.c	2011-08-12 18:27:48 UTC (rev 39346)
@@ -64,6 +64,8 @@
 
 static void do_node_add(bContext *C, void *UNUSED(arg), int event)
 {
+	Main *bmain= CTX_data_main(C);
+	Scene *scene= CTX_data_scene(C);
 	SpaceNode *snode= CTX_wm_space_node(C);
 	ScrArea *sa= CTX_wm_area(C);
 	ARegion *ar;
@@ -87,7 +89,7 @@
 		else node->flag &= ~NODE_TEST;
 	}
 	
-	node= node_add_node(snode, CTX_data_scene(C), event, snode->mx, snode->my);
+	node= node_add_node(snode, bmain, scene, event, snode->mx, snode->my);
 	
 	/* select previous selection before autoconnect */
 	for(node= snode->edittree->nodes.first; node; node= node->next) {

Modified: trunk/blender/source/blender/editors/space_node/node_intern.h
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_intern.h	2011-08-12 18:24:17 UTC (rev 39345)
+++ trunk/blender/source/blender/editors/space_node/node_intern.h	2011-08-12 18:27:48 UTC (rev 39346)
@@ -43,6 +43,7 @@
 struct bNode;
 struct bNodeSocket;
 struct bNodeLink;
+struct Main;
 
 /* temp data to pass on to modal */
 typedef struct bNodeLinkDrag
@@ -97,10 +98,9 @@
 void snode_notify(bContext *C, SpaceNode *snode);
 void snode_dag_update(bContext *C, SpaceNode *snode);
 bNode *next_node(bNodeTree *ntree);
-bNode *node_add_node(SpaceNode *snode, Scene *scene, int type, float locx, float locy);
+bNode *node_add_node(SpaceNode *snode, struct Main *bmain, Scene *scene, int type, float locx, float locy);
 void snode_set_context(SpaceNode *snode, Scene *scene);
 void snode_make_group_editable(SpaceNode *snode, bNode *gnode);
-void node_set_active(SpaceNode *snode, bNode *node);
 void node_deselectall(SpaceNode *snode);
 int node_select_same_type(SpaceNode *snode);
 int node_select_same_type_np(SpaceNode *snode, int dir);

Modified: trunk/blender/source/blender/editors/space_node/node_select.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_select.c	2011-08-12 18:24:17 UTC (rev 39345)
+++ trunk/blender/source/blender/editors/space_node/node_select.c	2011-08-12 18:27:48 UTC (rev 39346)
@@ -37,10 +37,12 @@
 #include "DNA_scene_types.h"
 
 #include "BKE_context.h"
+#include "BKE_main.h"
 
 #include "BLI_rect.h"
 #include "BLI_utildefines.h"
 
+#include "ED_node.h"
 #include "ED_screen.h"
 #include "ED_types.h"
 
@@ -70,7 +72,7 @@
 
 /* ****** Click Select ****** */
  
-static bNode *node_mouse_select(SpaceNode *snode, ARegion *ar, const int mval[2], short extend)
+static bNode *node_mouse_select(Main *bmain, SpaceNode *snode, ARegion *ar, const int mval[2], short extend)
 {
 	bNode *node;
 	float mx, my;
@@ -92,7 +94,7 @@
 		else
 			node->flag ^= SELECT;
 			
-		node_set_active(snode, node);
+		ED_node_set_active(bmain, snode->edittree, node);
 	}
 
 	return node;
@@ -100,6 +102,7 @@
 
 static int node_select_exec(bContext *C, wmOperator *op)
 {
+	Main *bmain= CTX_data_main(C);
 	SpaceNode *snode= CTX_wm_space_node(C);
 	ARegion *ar= CTX_wm_region(C);
 	int mval[2];
@@ -113,7 +116,7 @@
 	extend = RNA_boolean_get(op->ptr, "extend");
 	
 	/* perform the select */
-	node= node_mouse_select(snode, ar, mval, extend);
+	node= node_mouse_select(bmain, snode, ar, mval, extend);
 	
 	/* send notifiers */
 	WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);




More information about the Bf-blender-cvs mailing list