[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