diff options
-rw-r--r-- | source/blender/blenkernel/BKE_node.h | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 197 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node_composit.c | 39 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 3 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 3 | ||||
-rw-r--r-- | source/blender/include/butspace.h | 20 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_node_types.h | 10 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 5 | ||||
-rw-r--r-- | source/blender/src/butspace.c | 26 | ||||
-rw-r--r-- | source/blender/src/buttons_shading.c | 7 | ||||
-rw-r--r-- | source/blender/src/drawnode.c | 94 | ||||
-rw-r--r-- | source/blender/src/editnode.c | 65 | ||||
-rw-r--r-- | source/blender/src/header_node.c | 6 |
13 files changed, 358 insertions, 125 deletions
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 622236a6264..f289de038d6 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -41,6 +41,7 @@ struct bNodeStack; struct uiBlock; struct rctf; struct ListBase; +struct RenderData; #define SOCK_IN 1 #define SOCK_OUT 2 @@ -101,6 +102,7 @@ void ntreeSolveOrder(struct bNodeTree *ntree); void ntreeBeginExecTree(struct bNodeTree *ntree); void ntreeExecTree(struct bNodeTree *ntree, void *callerdata, int thread); +void ntreeCompositExecTree(struct bNodeTree *ntree, struct RenderData *rd, int do_previews); void ntreeEndExecTree(struct bNodeTree *ntree); void ntreeInitPreview(struct bNodeTree *, int xsize, int ysize); @@ -126,6 +128,8 @@ struct bNode *nodeGetActive(struct bNodeTree *ntree); struct bNode *nodeGetActiveID(struct bNodeTree *ntree, short idtype); void nodeClearActiveID(struct bNodeTree *ntree, short idtype); +void NodeTagChanged(struct bNodeTree *ntree, struct bNode *node); + /* ************** Groups ****************** */ struct bNode *nodeMakeGroupFromSelected(struct bNodeTree *ntree); @@ -218,9 +222,9 @@ extern bNodeType *node_all_composit[]; /* API */ struct CompBuf; -struct RenderData; -void ntreeCompositExecTree(struct bNodeTree *ntree, struct RenderData *rd, int do_previews); int ntreeCompositNeedsRender(struct bNodeTree *ntree); +void ntreeCompositTagRender(struct bNodeTree *ntree); + void free_compbuf(struct CompBuf *cbuf); /* internal...*/ #endif diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index a1f0c4095e2..3e99f83a8f6 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -38,6 +38,7 @@ #include "BKE_blender.h" #include "BKE_colortools.h" #include "BKE_global.h" +#include "BKE_image.h" #include "BKE_library.h" #include "BKE_main.h" #include "BKE_node.h" @@ -282,7 +283,7 @@ static void group_verify_own_indices(bNodeTree *ngroup) if(sock->own_index==0 && sock->intern==0) sock->own_index= ++(ngroup->cur_index); } - printf("internal index %d\n", ngroup->cur_index); +// printf("internal index %d\n", ngroup->cur_index); } @@ -776,8 +777,10 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node) sock->own_index= 0; duplicatelist(&nnode->outputs, &node->outputs); - for(sock= nnode->outputs.first; sock; sock= sock->next) + for(sock= nnode->outputs.first; sock; sock= sock->next) { sock->own_index= 0; + sock->ns.data= NULL; + } if(nnode->id) nnode->id->us++; @@ -850,8 +853,10 @@ static void node_unlink_node(bNodeTree *ntree, bNode *node) for(link= ntree->links.first; link; link= next) { next= link->next; - if(link->fromnode==node) + if(link->fromnode==node) { lb= &node->outputs; + NodeTagChanged(ntree, link->tonode); + } else if(link->tonode==node) lb= &node->inputs; else @@ -869,6 +874,16 @@ static void node_unlink_node(bNodeTree *ntree, bNode *node) } } +static void composit_free_sockets(bNode *node) +{ + bNodeSocket *sock; + + for(sock= node->outputs.first; sock; sock= sock->next) { + if(sock->ns.data) + free_compbuf(sock->ns.data); + } +} + void nodeFreeNode(bNodeTree *ntree, bNode *node) { node_unlink_node(ntree, node); @@ -877,6 +892,8 @@ void nodeFreeNode(bNodeTree *ntree, bNode *node) if(node->id) node->id->us--; + if(ntree->type==NTREE_COMPOSIT) + composit_free_sockets(node); BLI_freelistN(&node->inputs); BLI_freelistN(&node->outputs); @@ -1207,6 +1224,22 @@ void ntreeSolveOrder(bNodeTree *ntree) might be different for editor or for "real" use... */ } +/* should be callback! */ +void NodeTagChanged(bNodeTree *ntree, bNode *node) +{ + if(ntree->type==NTREE_COMPOSIT) { + bNodeSocket *sock; + + for(sock= node->outputs.first; sock; sock= sock->next) { + if(sock->ns.data) { + free_compbuf(sock->ns.data); + sock->ns.data= NULL; + } + } + node->need_exec= 1; + } +} + #pragma mark /* *************** preview *********** */ /* if node->preview, then we assume the rect to exist */ @@ -1362,6 +1395,54 @@ static int ntree_begin_exec_tree(bNodeTree *ntree) return index; } +/* copy socket compbufs to stack */ +static void composit_begin_exec(bNodeTree *ntree) +{ + bNode *node; + + for(node= ntree->nodes.first; node; node= node->next) { + bNodeSocket *sock; + for(sock= node->outputs.first; sock; sock= sock->next) { + if(sock->ns.data) { + bNodeStack *ns= ntree->stack + sock->stack_index; + + ns->data= sock->ns.data; + sock->ns.data= NULL; + } + } + } +} + +/* copy stack compbufs to sockets */ +static void composit_end_exec(bNodeTree *ntree) +{ + extern void print_compbuf(char *str, struct CompBuf *cbuf); + bNode *node; + bNodeStack *ns; + int a; + + for(node= ntree->nodes.first; node; node= node->next) { + bNodeSocket *sock; + + for(sock= node->outputs.first; sock; sock= sock->next) { + ns= ntree->stack + sock->stack_index; + if(ns->data) { + sock->ns.data= ns->data; + ns->data= NULL; + } + } + node->need_exec= 0; + } + + for(ns= ntree->stack, a=0; a<ntree->stacksize; a++, ns++) { + if(ns->data) { + print_compbuf("error: buf hanging in stack", ns->data); + free_compbuf(ns->data); + } + } + +} + /* stack indices make sure all nodes only write in allocated data, for making it thread safe */ /* only root tree gets the stack, to enable instances to have own stack entries */ /* only two threads now! */ @@ -1385,7 +1466,8 @@ void ntreeBeginExecTree(bNodeTree *ntree) /* tag inputs, the get_stack() gives own socket stackdata if not in use */ for(a=0; a<ntree->stacksize; a++, ns++) ns->hasinput= 1; - /* tag outputs, so we know when we can skip operations */ + /* tag used outputs, so we know when we can skip operations */ + /* hrms... groups... */ for(node= ntree->nodes.first; node; node= node->next) { bNodeSocket *sock; for(sock= node->inputs.first; sock; sock= sock->next) { @@ -1395,8 +1477,10 @@ void ntreeBeginExecTree(bNodeTree *ntree) } } } - - ntree->stack1= MEM_dupallocN(ntree->stack); + if(ntree->type==NTREE_COMPOSIT) + composit_begin_exec(ntree); + else + ntree->stack1= MEM_dupallocN(ntree->stack); } ntree->init |= NTREE_EXEC_INIT; @@ -1407,25 +1491,17 @@ void ntreeEndExecTree(bNodeTree *ntree) if(ntree->init & NTREE_EXEC_INIT) { - if(ntree->stack) { - - /* another callback candidate! */ - if(ntree->type==NTREE_COMPOSIT) { - bNodeStack *ns; - int a; - - for(ns= ntree->stack, a=0; a<ntree->stacksize; a++, ns++) - if(ns->data) - free_compbuf(ns->data); - for(ns= ntree->stack1, a=0; a<ntree->stacksize; a++, ns++) - if(ns->data) - free_compbuf(ns->data); - } + /* another callback candidate! */ + if(ntree->type==NTREE_COMPOSIT) + composit_end_exec(ntree); + + if(ntree->stack) MEM_freeN(ntree->stack); - ntree->stack= NULL; + ntree->stack= NULL; + + if(ntree->stack1) MEM_freeN(ntree->stack1); - ntree->stack1= NULL; - } + ntree->stack1= NULL; ntree->init &= ~NTREE_EXEC_INIT; } @@ -1477,3 +1553,78 @@ void ntreeExecTree(bNodeTree *ntree, void *callerdata, int thread) } } +/* optimized tree execute test for compositing */ +void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) +{ + bNode *node; + bNodeSocket *sock; + bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ + bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ + bNodeStack *stack; + int totnode; + + if(ntree==NULL) return; + + totnode= BLI_countlist(&ntree->nodes); + + if(do_preview) + ntreeInitPreview(ntree, 0, 0); + + ntreeBeginExecTree(ntree); + + stack= ntree->stack; + + for(node= ntree->nodes.first; node; node= node->next) { + if(node->typeinfo->execfunc) { + int a; + + node_get_stack(node, stack, nsin, nsout); + + /* test the inputs */ + for(a=0, sock= node->inputs.first; sock; sock= sock->next, a++) { + /* is sock in use? */ + if(sock->link) { + if(nsin[a]->data==NULL || sock->link->fromnode->need_exec) { + node->need_exec= 1; + break; + } + } + } + + /* test the outputs */ + for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) { + if(nsout[a]->data==NULL && nsout[a]->hasoutput) { + node->need_exec= 1; + break; + } + } + if(node->need_exec) { + + /* free output buffers */ + for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) { + if(nsout[a]->data) { + free_compbuf(nsout[a]->data); + nsout[a]->data= NULL; + } + } + if(ntree->timecursor) + ntree->timecursor(totnode); + + printf("exec node %s\n", node->name); + node->typeinfo->execfunc(rd, node, nsin, nsout); + } + } + else if(node->type==NODE_GROUP && node->id) { + node_get_stack(node, stack, nsin, nsout); + node_group_execute(stack, rd, node, nsin, nsout); + } + totnode--; + } + + + ntreeEndExecTree(ntree); + + free_unused_animimages(); + +} + diff --git a/source/blender/blenkernel/intern/node_composit.c b/source/blender/blenkernel/intern/node_composit.c index 93e5bb8a902..bcb3e9e600d 100644 --- a/source/blender/blenkernel/intern/node_composit.c +++ b/source/blender/blenkernel/intern/node_composit.c @@ -81,9 +81,9 @@ static CompBuf *alloc_compbuf(int sizex, int sizey, int type, int alloc) cbuf->type= type; if(alloc) { if(cbuf->type==CB_RGBA) - cbuf->rect= MEM_mallocN(4*sizeof(float)*sizex*sizey, "new rect"); + cbuf->rect= MEM_mallocN(4*sizeof(float)*sizex*sizey, "compbuf RGBA rect"); else - cbuf->rect= MEM_mallocN(sizeof(float)*sizex*sizey, "new rect"); + cbuf->rect= MEM_mallocN(sizeof(float)*sizex*sizey, "compbuf Fac rect"); cbuf->malloc= 1; } cbuf->disprect.xmin= 0; @@ -101,6 +101,14 @@ void free_compbuf(CompBuf *cbuf) MEM_freeN(cbuf); } +void print_compbuf(char *str, CompBuf *cbuf) +{ + printf("Compbuf %s %d %d %p\n", str, cbuf->x, cbuf->y, cbuf->rect); + +} + + + #if 0 /* on first call, disprect should be initialized to 'out', then you can call this on all 'src' images */ static void get_overlap_rct(CompBuf *out, CompBuf *src, rcti *disprect) @@ -449,7 +457,7 @@ static void node_composit_exec_viewer(void *data, bNode *node, bNodeStack **in, cbuf= alloc_compbuf(rectx, recty, CB_RGBA, 0); // no alloc cbuf->rect= ima->ibuf->rect_float; - + /* when no alpha, we can simply copy */ if(in[1]->data==NULL) composit1_pixel_processor(node, cbuf, in[0]->data, in[0]->vec, do_copy_rgba); @@ -733,6 +741,7 @@ static bNodeSocketType cmp_node_rresult_out[]= { static void node_composit_exec_rresult(void *data, bNode *node, bNodeStack **in, bNodeStack **out) { RenderResult *rr= RE_GetResult(RE_GetRender("Render")); + if(rr) { RenderLayer *rl= BLI_findlink(&rr->layers, node->custom1); if(rl) { @@ -1815,7 +1824,7 @@ bNodeType *node_all_composit[]= { NULL }; -/* ******************* execute and parse ************ */ +/* ******************* parse ************ */ /* helper call to detect if theres a render-result node */ int ntreeCompositNeedsRender(bNodeTree *ntree) @@ -1831,23 +1840,15 @@ int ntreeCompositNeedsRender(bNodeTree *ntree) return 0; } -/* note; if called without preview, and previews exist, they get updated */ -/* render calls it without previews, works nicer for bg render */ -void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) +void ntreeCompositTagRender(bNodeTree *ntree) { - if(ntree==NULL) return; - - if(do_preview) - ntreeInitPreview(ntree, 0, 0); - - ntreeBeginExecTree(ntree); - - /* allocate composit data? */ - - ntreeExecTree(ntree, rd, 0); /* threads */ + bNode *node; - ntreeEndExecTree(ntree); + if(ntree==NULL) return; - free_unused_animimages(); + for(node= ntree->nodes.first; node; node= node->next) { + if(node->type==CMP_NODE_R_RESULT) + NodeTagChanged(ntree, node); + } } diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 1a42c299335..492c1b1c264 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -494,7 +494,8 @@ void scene_add_render_layer(Scene *sce) srl= MEM_callocN(sizeof(SceneRenderLayer), "new render layer"); sprintf(srl->name, "%d RenderLayer", tot); BLI_addtail(&sce->r.layers, srl); - + + /* note, this is also in render, pipeline.c, to make layer when scenedata doesnt have it */ srl->lay= (1<<20) -1; srl->layflag= 0x7FFF; /* solid ztra halo strand */ srl->passflag= SCE_PASS_COMBINED|SCE_PASS_Z; diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 5433d2b7ce1..1d523cbec29 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -1260,6 +1260,7 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree) ntree->init= 0; /* to set callbacks */ ntree->owntype= NULL; + ntree->timecursor= NULL; link_list(fd, &ntree->nodes); for(node= ntree->nodes.first; node; node= node->next) { @@ -1285,6 +1286,8 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree) node->lasty= 0; for(sock= node->inputs.first; sock; sock= sock->next) sock->link= newdataadr(fd, sock->link); + for(sock= node->outputs.first; sock; sock= sock->next) + sock->ns.data= NULL; } for(link= ntree->links.first; link; link= link->next) { link->fromnode= newdataadr(fd, link->fromnode); diff --git a/source/blender/include/butspace.h b/source/blender/include/butspace.h index bc6529f1d3d..930327f3489 100644 --- a/source/blender/include/butspace.h +++ b/source/blender/include/butspace.h @@ -194,9 +194,6 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la #define B_MAT_LAYERBROWSE 1220 #define B_MAT_USENODES 1221 - /* also handled in editnode.c */ -#define B_NODE_EXEC 1222 -#define B_NODE_LOADIMAGE 1223 /* *********************** */ #define B_TEXBUTS 1400 @@ -655,8 +652,21 @@ enum { #define B_MODIFIER_REDRAW 3502 /* *********************** */ -/* BUTTON BUT: > 4000 */ -/* BUTTON 4001-4032: layers */ +#define B_NODE_BUTS 4000 + /* 400 slots reserved, we want an exec event for each node */ +#define B_NODE_LOADIMAGE 3601 +#define B_NODE_TREE_EXEC 3602 + + /* exec should be last in this list */ +#define B_NODE_EXEC 3610 + + +/* *********************** */ +/* BUTTON 4001-4032: layers? (sort this out!) */ + +/* *********************** */ +/* event code 0x4000 (16384) and larger: general events (redraws, etc) */ + #endif diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 700de9531da..853857f6915 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -51,7 +51,7 @@ typedef struct bNodeStack { short hasinput; /* when input has link, tagged before executing */ short hasoutput; /* when output is linked, tagged before executing */ short datatype; /* type of data pointer */ - short pad1; + short pad; } bNodeStack; /* ns->datatype, shadetree only */ @@ -109,7 +109,7 @@ typedef struct bNode { short done, level; /* both for dependency and sorting */ short lasty, menunr; /* lasty: check preview render status, menunr: browse ID blocks */ short stack_index; /* for groupnode, offset in global caller stack */ - short pad; + short nr; /* number of this node in list, used for exec events */ ListBase inputs, outputs; struct ID *id; /* optional link to libdata */ @@ -119,7 +119,8 @@ typedef struct bNode { float locx, locy; /* root offset for drawing */ float width, miniwidth; short custom1, custom2; /* to be abused for buttons */ - int pad1; + + short need_exec, pad1; /* need_exec is set to optimize execution */ rctf totr; /* entire boundbox */ rctf butr; /* optional buttons area */ @@ -164,6 +165,9 @@ typedef struct bNodeTree { struct bNodeType **alltypes; /* type definitions, set on fileread, no read/write */ struct bNodeType *owntype; /* for groups or dynamic trees, no read/write */ + /* callbacks */ + void (*timecursor)(int nr); + } bNodeTree; /* ntree->type, index */ diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 342a69a9007..d1099891264 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -832,7 +832,7 @@ static void do_render_final(Render *re, Scene *scene) /* first check if theres nodetree with render result */ int do_render= ntreeCompositNeedsRender(scene->nodetree); /* but.. do we use nodes? */ - if(scene->use_nodes==NULL) do_render= 1; + if(scene->use_nodes==0) do_render= 1; re->scene= scene; @@ -847,6 +847,9 @@ static void do_render_final(Render *re, Scene *scene) else render_one_frame(re); } + + ntreeCompositTagRender(scene->nodetree); + if(re->r.scemode & R_DOCOMP) ntreeCompositExecTree(scene->nodetree, &re->r, 0); } diff --git a/source/blender/src/butspace.c b/source/blender/src/butspace.c index 93d97372ec5..e3f6a1d5515 100644 --- a/source/blender/src/butspace.c +++ b/source/blender/src/butspace.c @@ -42,6 +42,7 @@ #include "MEM_guardedalloc.h" #include "DNA_color_types.h" +#include "DNA_material_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" @@ -52,12 +53,14 @@ #include "BKE_colortools.h" #include "BKE_global.h" #include "BKE_main.h" +#include "BKE_material.h" #include "BKE_library.h" #include "BKE_utildefines.h" #include "BLI_blenlib.h" #include "BSE_drawview.h" // for do_viewbuttons.c .... hurms +#include "BSE_node.h" #include "BIF_gl.h" #include "BIF_graphics.h" @@ -470,6 +473,26 @@ void curvemap_buttons(uiBlock *block, CurveMapping *cumap, char labeltype, short /* --------------------------------- */ +/* nodes have button callbacks, that can draw in butspace too. need separate handling */ +static void do_node_buts(unsigned short event) +{ + Material *ma; + + /* all operations default on active material layer here */ + /* but this also gets called for lamp and world... */ + ma= G.buts->lockpoin; + if(ma && GS(ma->id.name)==ID_MA) + ma = editnode_get_active_material(ma); + else + ma= NULL; + + if(event>=B_NODE_EXEC) { + if(ma) end_render_material(ma); /// temporal... 3d preview + BIF_preview_changed(ID_MA); + allqueue(REDRAWNODE, 0); + allqueue(REDRAWBUTSSHADING, 0); + } +} void do_butspace(unsigned short event) { @@ -566,6 +589,9 @@ void do_butspace(unsigned short event) extern void do_modifier_panels(unsigned short event); do_modifier_panels(event); } + else if(event<=B_NODE_BUTS) { + do_node_buts(event); + } else if(event==REDRAWVIEW3D) allqueue(event, 1); // 1=do header too else if(event>REDRAWVIEW3D) allqueue(event, 0); } diff --git a/source/blender/src/buttons_shading.c b/source/blender/src/buttons_shading.c index 64474c7f343..a34d9d8406e 100644 --- a/source/blender/src/buttons_shading.c +++ b/source/blender/src/buttons_shading.c @@ -2548,13 +2548,6 @@ void do_matbuts(unsigned short event) allqueue(REDRAWBUTSSHADING, 0); } break; - case B_NODE_EXEC: - if(ma) end_render_material(ma); /// temporal... 3d preview - BIF_preview_changed(ID_MA); - allqueue(REDRAWNODE, 0); - allqueue(REDRAWBUTSSHADING, 0); - break; - } } diff --git a/source/blender/src/drawnode.c b/source/blender/src/drawnode.c index 467bc2fa60f..bdb3c0bf67f 100644 --- a/source/blender/src/drawnode.c +++ b/source/blender/src/drawnode.c @@ -208,7 +208,7 @@ static int node_buts_value(uiBlock *block, bNodeTree *ntree, bNode *node, rctf * if(block) { bNodeSocket *sock= node->outputs.first; /* first socket stores value */ - uiDefButF(block, NUM, B_NODE_EXEC, "", + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "", butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20, sock->ns.vec, 0.0f, 1.0f, 10, 2, ""); @@ -224,10 +224,10 @@ static int node_buts_rgb(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *bu /* enforce square box drawing */ uiBlockSetEmboss(block, UI_EMBOSSP); - uiDefButF(block, HSVCUBE, B_NODE_EXEC, "", + uiDefButF(block, HSVCUBE, B_NODE_EXEC+node->nr, "", butr->xmin, butr->ymin, butr->xmax-butr->xmin, 12, sock->ns.vec, 0.0f, 1.0f, 3, 0, ""); - uiDefButF(block, HSVCUBE, B_NODE_EXEC, "", + uiDefButF(block, HSVCUBE, B_NODE_EXEC+node->nr, "", butr->xmin, butr->ymin+15, butr->xmax-butr->xmin, butr->ymax-butr->ymin -15 -15, sock->ns.vec, 0.0f, 1.0f, 2, 0, ""); uiDefButF(block, COL, B_NOP, "", @@ -247,7 +247,7 @@ static int node_buts_mix_rgb(uiBlock *block, bNodeTree *ntree, bNode *node, rctf uiBut *bt; /* blend type */ - bt=uiDefButS(block, MENU, B_NODE_EXEC, "Mix %x0|Add %x1|Subtract %x3|Multiply %x2|Screen %x4|Divide %x5|Difference %x6|Darken %x7|Lighten %x8", + bt=uiDefButS(block, MENU, B_NODE_EXEC+node->nr, "Mix %x0|Add %x1|Subtract %x3|Multiply %x2|Screen %x4|Divide %x5|Difference %x6|Darken %x7|Lighten %x8", butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20, &node->custom1, 0, 0, 0, 0, ""); uiButSetFunc(bt, node_but_title_cb, node, bt); @@ -259,7 +259,7 @@ static int node_buts_valtorgb(uiBlock *block, bNodeTree *ntree, bNode *node, rct { if(block) { if(node->storage) { - draw_colorband_buts_small(block, node->storage, butr, B_NODE_EXEC); + draw_colorband_buts_small(block, node->storage, butr, B_NODE_EXEC+node->nr); } } return 40; @@ -268,7 +268,7 @@ static int node_buts_valtorgb(uiBlock *block, bNodeTree *ntree, bNode *node, rct static int node_buts_curvevec(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr) { if(block) { - curvemap_buttons(block, node->storage, 'v', B_NODE_EXEC, B_REDR, butr); + curvemap_buttons(block, node->storage, 'v', B_NODE_EXEC+node->nr, B_REDR, butr); } return (int)(node->width-NODE_DY); } @@ -276,7 +276,7 @@ static int node_buts_curvevec(uiBlock *block, bNodeTree *ntree, bNode *node, rct static int node_buts_curvecol(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr) { if(block) { - curvemap_buttons(block, node->storage, 'c', B_NODE_EXEC, B_REDR, butr); + curvemap_buttons(block, node->storage, 'c', B_NODE_EXEC+node->nr, B_REDR, butr); } return (int)(node->width-NODE_DY); } @@ -286,7 +286,7 @@ static int node_buts_normal(uiBlock *block, bNodeTree *ntree, bNode *node, rctf if(block) { bNodeSocket *sock= node->outputs.first; /* first socket stores normal */ - uiDefButF(block, BUT_NORMAL, B_NODE_EXEC, "", + uiDefButF(block, BUT_NORMAL, B_NODE_EXEC+node->nr, "", butr->xmin, butr->ymin, butr->xmax-butr->xmin, butr->ymax-butr->ymin, sock->ns.vec, 0.0f, 1.0f, 0, 0, ""); @@ -426,13 +426,13 @@ static int node_shader_buts_material(uiBlock *block, bNodeTree *ntree, bNode *no if(butr->ymax-butr->ymin > 21.0f) { /* node options */ uiBlockSetCol(block, TH_AUTO); - uiDefButBitS(block, TOG, SH_NODE_MAT_DIFF, B_NODE_EXEC, "Diff", + uiDefButBitS(block, TOG, SH_NODE_MAT_DIFF, B_NODE_EXEC+node->nr, "Diff", butr->xmin, butr->ymin, dx, 19, &node->custom1, 0, 0, 0, 0, "Material Node outputs Diffuse"); - uiDefButBitS(block, TOG, SH_NODE_MAT_SPEC, B_NODE_EXEC, "Spec", + uiDefButBitS(block, TOG, SH_NODE_MAT_SPEC, B_NODE_EXEC+node->nr, "Spec", butr->xmin+dx, butr->ymin, dx, 19, &node->custom1, 0, 0, 0, 0, "Material Node outputs Specular"); - uiDefButBitS(block, TOG, SH_NODE_MAT_NEG, B_NODE_EXEC, "Neg Normal", + uiDefButBitS(block, TOG, SH_NODE_MAT_NEG, B_NODE_EXEC+node->nr, "Neg Normal", butr->xmax-dx, butr->ymin, dx, 19, &node->custom1, 0, 0, 0, 0, "Material Node uses inverted Normal"); } @@ -447,7 +447,7 @@ static int node_shader_buts_texture(uiBlock *block, bNodeTree *ntree, bNode *nod if(block) { uiBut *bt; - bt= uiDefIDPoinBut(block, test_texpoin_but, ID_TE, B_NODE_EXEC, "", + bt= uiDefIDPoinBut(block, test_texpoin_but, ID_TE, B_NODE_EXEC+node->nr, "", butr->xmin, butr->ymin, butr->xmax-butr->xmin, 19, &node->id, ""); uiButSetFunc(bt, node_ID_title_cb, node, NULL); @@ -467,26 +467,26 @@ static int node_shader_buts_mapping(uiBlock *block, bNodeTree *ntree, bNode *nod uiBlockSetFunc(block, node_texmap_cb, texmap, NULL); /* all buttons get this */ uiBlockBeginAlign(block); - uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->loc, -1000.0f, 1000.0f, 10, 2, ""); - uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->loc+1, -1000.0f, 1000.0f, 10, 2, ""); - uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->loc+2, -1000.0f, 1000.0f, 10, 2, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "", butr->xmin+dx, dy, 2*dx, 19, texmap->loc, -1000.0f, 1000.0f, 10, 2, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->loc+1, -1000.0f, 1000.0f, 10, 2, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->loc+2, -1000.0f, 1000.0f, 10, 2, ""); dy-= 19; - uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->rot, -1000.0f, 1000.0f, 1000, 1, ""); - uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->rot+1, -1000.0f, 1000.0f, 1000, 1, ""); - uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->rot+2, -1000.0f, 1000.0f, 1000, 1, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "", butr->xmin+dx, dy, 2*dx, 19, texmap->rot, -1000.0f, 1000.0f, 1000, 1, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->rot+1, -1000.0f, 1000.0f, 1000, 1, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->rot+2, -1000.0f, 1000.0f, 1000, 1, ""); dy-= 19; - uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->size, -1000.0f, 1000.0f, 10, 2, ""); - uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->size+1, -1000.0f, 1000.0f, 10, 2, ""); - uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->size+2, -1000.0f, 1000.0f, 10, 2, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "", butr->xmin+dx, dy, 2*dx, 19, texmap->size, -1000.0f, 1000.0f, 10, 2, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->size+1, -1000.0f, 1000.0f, 10, 2, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->size+2, -1000.0f, 1000.0f, 10, 2, ""); dy-= 25; uiBlockBeginAlign(block); - uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->min, -10.0f, 10.0f, 100, 2, ""); - uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->min+1, -10.0f, 10.0f, 100, 2, ""); - uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->min+2, -10.0f, 10.0f, 100, 2, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "", butr->xmin+dx, dy, 2*dx, 19, texmap->min, -10.0f, 10.0f, 100, 2, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->min+1, -10.0f, 10.0f, 100, 2, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->min+2, -10.0f, 10.0f, 100, 2, ""); dy-= 19; - uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->max, -10.0f, 10.0f, 10, 2, ""); - uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->max+1, -10.0f, 10.0f, 10, 2, ""); - uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->max+2, -10.0f, 10.0f, 10, 2, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "", butr->xmin+dx, dy, 2*dx, 19, texmap->max, -10.0f, 10.0f, 10, 2, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->max+1, -10.0f, 10.0f, 10, 2, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->max+2, -10.0f, 10.0f, 10, 2, ""); uiBlockEndAlign(block); /* labels/options */ @@ -498,9 +498,9 @@ static int node_shader_buts_mapping(uiBlock *block, bNodeTree *ntree, bNode *nod dy-= 19; uiDefBut(block, LABEL, B_NOP, "Size", butr->xmin, dy, dx, 19, NULL, 0.0f, 0.0f, 0, 0, ""); dy-= 25; - uiDefButBitI(block, TOG, TEXMAP_CLIP_MIN, B_NODE_EXEC, "Min", butr->xmin, dy, dx-4, 19, &texmap->flag, 0.0f, 0.0f, 0, 0, ""); + uiDefButBitI(block, TOG, TEXMAP_CLIP_MIN, B_NODE_EXEC+node->nr, "Min", butr->xmin, dy, dx-4, 19, &texmap->flag, 0.0f, 0.0f, 0, 0, ""); dy-= 19; - uiDefButBitI(block, TOG, TEXMAP_CLIP_MAX, B_NODE_EXEC, "Max", butr->xmin, dy, dx-4, 19, &texmap->flag, 0.0f, 0.0f, 0, 0, ""); + uiDefButBitI(block, TOG, TEXMAP_CLIP_MAX, B_NODE_EXEC+node->nr, "Max", butr->xmin, dy, dx-4, 19, &texmap->flag, 0.0f, 0.0f, 0, 0, ""); } return 5*19 + 6; @@ -640,17 +640,17 @@ static int node_composit_buts_image(uiBlock *block, bNodeTree *ntree, bNode *nod short width= (short)(butr->xmax-butr->xmin)/2; dy-= 19; - uiDefButS(block, NUM, B_NODE_EXEC, "Frs:", + uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "Frs:", butr->xmin, dy, width, 19, &nia->frames, 0.0, 10000.0, 0, 0, "Amount of images used in animation"); - uiDefButS(block, NUM, B_NODE_EXEC, "SFra:", + uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "SFra:", butr->xmin+width, dy, width, 19, &nia->sfra, 1.0, 1000.0, 0, 0, "Start frame of animation"); dy-= 19; - uiDefButS(block, NUM, B_NODE_EXEC, "First:", + uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "First:", butr->xmin, dy, width, 19, &nia->nr, 0.0, 10000.0, 0, 0, "Number in image name, used as first in animation"); - uiDefButC(block, TOG, B_NODE_EXEC, "Cycl", + uiDefButC(block, TOG, B_NODE_EXEC+node->nr, "Cycl", butr->xmin+width, dy, width, 19, &nia->cyclic, 0.0, 0.0, 0, 0, "Make animation go cyclic"); @@ -687,7 +687,7 @@ static int node_composit_buts_renderresult(uiBlock *block, bNodeTree *ntree, bNo char *strp; strp= scene_layer_menu(); - bt= uiDefButS(block, MENU, B_NODE_EXEC, strp, + bt= uiDefButS(block, MENU, B_NODE_EXEC+node->nr, strp, butr->xmin, butr->ymin, (butr->xmax-butr->xmin), 19, &node->custom1, 0, 0, 0, 0, "Choose Render Layer"); uiButSetFunc(bt, node_but_title_cb, node, bt); @@ -702,10 +702,10 @@ static int node_composit_buts_blur(uiBlock *block, bNodeTree *ntree, bNode *node uiBut *bt; uiBlockBeginAlign(block); - bt=uiDefButS(block, NUM, B_NODE_EXEC, "X:", + bt=uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "X:", butr->xmin, butr->ymin, (butr->xmax-butr->xmin)/2, 19, &node->custom1, 0, 256, 0, 0, ""); - bt=uiDefButS(block, NUM, B_NODE_EXEC, "Y:", + bt=uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "Y:", butr->xmin+(butr->xmax-butr->xmin)/2, butr->ymin, (butr->xmax-butr->xmin)/2, 19, &node->custom2, 0, 256, 0, 0, ""); } @@ -718,7 +718,7 @@ static int node_composit_buts_filter(uiBlock *block, bNodeTree *ntree, bNode *no uiBut *bt; /* blend type */ - bt=uiDefButS(block, MENU, B_NODE_EXEC, "Soften %x0|Sharpen %x1|Laplace %x2|Sobel %x3|Prewitt %x4|Kirsch %x5|Shadow %x6", + bt=uiDefButS(block, MENU, B_NODE_EXEC+node->nr, "Soften %x0|Sharpen %x1|Laplace %x2|Sobel %x3|Prewitt %x4|Kirsch %x5|Shadow %x6", butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20, &node->custom1, 0, 0, 0, 0, ""); uiButSetFunc(bt, node_but_title_cb, node, bt); @@ -735,16 +735,16 @@ static int node_composit_buts_map_value(uiBlock *block, bNodeTree *ntree, bNode short dx= (short)(butr->xmax-butr->xmin)/2; uiBlockBeginAlign(block); - uiDefButF(block, NUM, B_NODE_EXEC, "Offs:", xstart, dy, 2*dx, 19, texmap->loc, -1000.0f, 1000.0f, 10, 2, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Offs:", xstart, dy, 2*dx, 19, texmap->loc, -1000.0f, 1000.0f, 10, 2, ""); dy-= 19; - uiDefButF(block, NUM, B_NODE_EXEC, "Size:", xstart, dy, 2*dx, 19, texmap->size, -1000.0f, 1000.0f, 10, 3, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Size:", xstart, dy, 2*dx, 19, texmap->size, -1000.0f, 1000.0f, 10, 3, ""); dy-= 23; uiBlockBeginAlign(block); - uiDefButBitI(block, TOG, TEXMAP_CLIP_MIN, B_NODE_EXEC, "Min", xstart, dy, dx, 19, &texmap->flag, 0.0f, 0.0f, 0, 0, ""); - uiDefButF(block, NUM, B_NODE_EXEC, "", xstart+dx, dy, dx, 19, texmap->min, -1000.0f, 1000.0f, 10, 2, ""); + uiDefButBitI(block, TOG, TEXMAP_CLIP_MIN, B_NODE_EXEC+node->nr, "Min", xstart, dy, dx, 19, &texmap->flag, 0.0f, 0.0f, 0, 0, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "", xstart+dx, dy, dx, 19, texmap->min, -1000.0f, 1000.0f, 10, 2, ""); dy-= 19; - uiDefButBitI(block, TOG, TEXMAP_CLIP_MIN, B_NODE_EXEC, "Max", xstart, dy, dx, 19, &texmap->flag, 0.0f, 0.0f, 0, 0, ""); - uiDefButF(block, NUM, B_NODE_EXEC, "", xstart+dx, dy, dx, 19, texmap->min, -1000.0f, 1000.0f, 10, 2, ""); + uiDefButBitI(block, TOG, TEXMAP_CLIP_MIN, B_NODE_EXEC+node->nr, "Max", xstart, dy, dx, 19, &texmap->flag, 0.0f, 0.0f, 0, 0, ""); + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "", xstart+dx, dy, dx, 19, texmap->min, -1000.0f, 1000.0f, 10, 2, ""); } return 80; } @@ -1315,7 +1315,7 @@ static void node_draw_basis(ScrArea *sa, SpaceNode *snode, bNode *node) butpoin= sock->tosock->ns.vec; if(sock->type==SOCK_VALUE) { - bt= uiDefButF(node->block, NUM, B_NODE_EXEC, sock->name, + bt= uiDefButF(node->block, NUM, B_NODE_EXEC+node->nr, sock->name, (short)sock->locx+NODE_DYS, (short)(sock->locy)-9, (short)node->width-NODE_DY, 17, butpoin, 0.0f, 1.0f, 10, 2, ""); uiButSetFunc(bt, node_sync_cb, snode, node); @@ -1330,7 +1330,7 @@ static void node_draw_basis(ScrArea *sa, SpaceNode *snode, bNode *node) if(labelw>0) width= 40; else width= node->width-NODE_DY; - bt= uiDefButF(node->block, COL, B_NODE_EXEC, "", + bt= uiDefButF(node->block, COL, B_NODE_EXEC+node->nr, "", (short)(sock->locx+NODE_DYS), (short)sock->locy-8, width, 15, butpoin, 0, 0, 0, 0, ""); uiButSetFunc(bt, node_sync_cb, snode, node); @@ -1539,6 +1539,7 @@ static void node_draw_nodetree(ScrArea *sa, SpaceNode *snode, bNodeTree *ntree) { bNode *node; bNodeLink *link; + int a; if(ntree==NULL) return; /* groups... */ @@ -1551,8 +1552,9 @@ static void node_draw_nodetree(ScrArea *sa, SpaceNode *snode, bNodeTree *ntree) glDisable( GL_LINE_SMOOTH ); /* not selected first */ - for(node= ntree->nodes.first; node; node= node->next) { + for(a=0, node= ntree->nodes.first; node; node= node->next, a++) { node->block= NULL; /* were freed */ + node->nr= a; /* index of node in list, used for exec event code */ if(!(node->flag & SELECT)) { if(node->flag & NODE_GROUP_EDIT); else if(node->flag & NODE_HIDDEN) diff --git a/source/blender/src/editnode.c b/source/blender/src/editnode.c index 8a90d31be57..84354859067 100644 --- a/source/blender/src/editnode.c +++ b/source/blender/src/editnode.c @@ -140,12 +140,20 @@ static void snode_handle_recalc(SpaceNode *snode) BIF_preview_changed(ID_MA); /* signals buttons windows and node editors */ } else if(snode->treetype==NTREE_COMPOSIT) { - ntreeCompositExecTree(snode->nodetree, &G.scene->r, 1); /* 1 is do_previews */ - allqueue(REDRAWNODE, 1); - allqueue(REDRAWIMAGE, 1); - if(G.scene->r.scemode & R_DOCOMP) { - BIF_redraw_render_rect(); /* seems to screwup display? */ - mywinset(curarea->win); + if(G.scene->use_nodes) { + snode->nodetree->timecursor= set_timecursor; + + ntreeCompositExecTree(snode->nodetree, &G.scene->r, 1); /* 1 is do_previews */ + + waitcursor(0); + allqueue(REDRAWNODE, 1); + allqueue(REDRAWIMAGE, 1); + if(G.scene->r.scemode & R_DOCOMP) { + BIF_redraw_render_rect(); /* seems to screwup display? */ + mywinset(curarea->win); + } + + snode->nodetree->timecursor= NULL; } } } @@ -153,19 +161,21 @@ static void snode_handle_recalc(SpaceNode *snode) static void shader_node_event(SpaceNode *snode, short event) { switch(event) { - case B_NODE_EXEC: - snode_handle_recalc(snode); - break; case B_REDR: allqueue(REDRAWNODE, 1); break; + default: + /* B_NODE_EXEC */ + snode_handle_recalc(snode); + break; + } } static void load_node_image(char *str) /* called from fileselect */ { SpaceNode *snode= curarea->spacedata.first; - bNode *node= nodeGetActive(snode->nodetree); + bNode *node= nodeGetActive(snode->edittree); Image *ima= NULL; ima= add_image(str); @@ -188,15 +198,12 @@ static void composit_node_event(SpaceNode *snode, short event) { switch(event) { - case B_NODE_EXEC: - snode_handle_recalc(snode); - break; case B_REDR: allqueue(REDRAWNODE, 1); break; case B_NODE_LOADIMAGE: { - bNode *node= nodeGetActive(snode->nodetree); + bNode *node= nodeGetActive(snode->edittree); char name[FILE_MAXDIR+FILE_MAXFILE]; if(node->id) @@ -205,6 +212,16 @@ static void composit_node_event(SpaceNode *snode, short event) activate_fileselect(FILE_SPECIAL, "SELECT IMAGE", name, load_node_image); } + case B_NODE_TREE_EXEC: + snode_handle_recalc(snode); + break; + default: + /* B_NODE_EXEC */ + { + bNode *node= BLI_findlink(&snode->edittree->nodes, event-B_NODE_EXEC); + if(node) NodeTagChanged(snode->edittree, node); + snode_handle_recalc(snode); + } } } @@ -345,7 +362,10 @@ static void node_set_active(SpaceNode *snode, bNode *node) tnode->flag &= ~NODE_DO_OUTPUT; node->flag |= NODE_DO_OUTPUT; - if(was_output==0) snode_handle_recalc(snode); + if(was_output==0) { + NodeTagChanged(snode->edittree, node); + snode_handle_recalc(snode); + } /* add node doesnt link this yet... */ if(node->id==NULL) { @@ -1283,11 +1303,17 @@ static int node_add_link_drag(SpaceNode *snode, bNode *node, bNodeSocket *sock, else BIF_wait_for_statechange(); } + /* remove link? */ if(link->tonode==NULL || link->fromnode==NULL) { nodeRemLink(snode->edittree, link); } else { bNodeLink *tlink; + + /* send changed events for original tonode and new */ + if(link->tonode) + NodeTagChanged(snode->edittree, link->tonode); + /* we might need to remove a link */ if(in_out==SOCK_OUT) { if(nodeCountSocketLinks(snode->edittree, link->tosock) > tsock->limit) { @@ -1365,6 +1391,10 @@ static int node_add_link(SpaceNode *snode) break; } if(link) { + /* send changed event to original tonode */ + if(link->tonode) + NodeTagChanged(snode->edittree, link->tonode); + node= link->fromnode; sock= link->fromsock; nodeRemLink(snode->edittree, link); @@ -1472,11 +1502,12 @@ static void node_border_link_delete(SpaceNode *snode) for(a=0; a<hits; a++) { bNodeLink *link= BLI_findlink(&snode->edittree->links, buffer[ (4 * a) + 3]); if(link) - link->tonode= NULL; /* first tag for delete, otherwise indices are wrong */ + link->fromnode= NULL; /* first tag for delete, otherwise indices are wrong */ } for(link= snode->edittree->links.first; link; link= next) { next= link->next; - if(link->tonode==NULL) { + if(link->fromnode==NULL) { + NodeTagChanged(snode->edittree, link->tonode); nodeRemLink(snode->edittree, link); } } diff --git a/source/blender/src/header_node.c b/source/blender/src/header_node.c index 18df9c084ae..b1ee0043be6 100644 --- a/source/blender/src/header_node.c +++ b/source/blender/src/header_node.c @@ -82,7 +82,11 @@ void do_node_buttons(ScrArea *sa, unsigned short event) break; case B_NODE_USESCENE: - node_composit_default(G.scene); + if(G.scene->use_nodes) { + if(G.scene->nodetree==NULL) + node_composit_default(G.scene); + addqueue(curarea->win, UI_BUT_EVENT, B_NODE_TREE_EXEC); + } snode_set_context(snode); allqueue(REDRAWNODE, 0); break; |