diff options
author | Ton Roosendaal <ton@blender.org> | 2006-01-28 18:21:04 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2006-01-28 18:21:04 +0300 |
commit | 45c7b2c5c2bc20296a581e1b6a1cb3908f11732f (patch) | |
tree | 3c84b86ee52f12f5ae967791182ce71e003abee4 /source/blender/src | |
parent | 80bd3a1e9897044334d3384be27b52efc6541fef (diff) |
Orange: made Compositing more interactive. It now has an event based
system tracking changes in nodes, making sure only these nodes and
the ones that depend, are executed.
Further the 'time cursor' now counts down to indicate which node is being
done.
Also: you now can disable the "use nodes" button in the header, edit all
changes, and when you press that button again it nicely executes the
changes.
Still on the todo:
- make compositing threaded
- find a way to nicely exit compositing on input events... so the UI
keeps being responsive
- idea; a 'percentage' menu in header to enforce calculations on smaller
images temporally
Diffstat (limited to 'source/blender/src')
-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 |
5 files changed, 127 insertions, 71 deletions
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; |