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.
This commit is contained in:
@@ -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_texture_default(struct Tex *tex);
|
||||
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);
|
||||
|
||||
|
@@ -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)
|
||||
@@ -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))
|
||||
@@ -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.");
|
||||
|
@@ -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 @@ static void do_node_add(bContext *C, void *UNUSED(arg), int event)
|
||||
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) {
|
||||
|
@@ -43,6 +43,7 @@ struct wmWindowManager;
|
||||
struct bNode;
|
||||
struct bNodeSocket;
|
||||
struct bNodeLink;
|
||||
struct Main;
|
||||
|
||||
/* temp data to pass on to modal */
|
||||
typedef struct bNodeLinkDrag
|
||||
@@ -97,10 +98,9 @@ void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *tre
|
||||
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);
|
||||
|
@@ -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 @@ static bNode *node_under_mouse(bNodeTree *ntree, int mx, int my)
|
||||
|
||||
/* ****** 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 @@ static bNode *node_mouse_select(SpaceNode *snode, ARegion *ar, const int mval[2]
|
||||
else
|
||||
node->flag ^= SELECT;
|
||||
|
||||
node_set_active(snode, node);
|
||||
ED_node_set_active(bmain, snode->edittree, node);
|
||||
}
|
||||
|
||||
return node;
|
||||
@@ -100,6 +102,7 @@ static bNode *node_mouse_select(SpaceNode *snode, ARegion *ar, const int mval[2]
|
||||
|
||||
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 @@ static int node_select_exec(bContext *C, wmOperator *op)
|
||||
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);
|
||||
|
Reference in New Issue
Block a user