diff options
Diffstat (limited to 'source/blender/editors/space_node/node_draw.c')
-rw-r--r-- | source/blender/editors/space_node/node_draw.c | 246 |
1 files changed, 123 insertions, 123 deletions
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index c1159ccad73..92c055ed12a 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -100,7 +100,7 @@ static bNodeTree *node_tree_from_ID(ID *id) { if (id) { short idtype = GS(id->name); - + switch (idtype) { case ID_NT: return (bNodeTree *)id; @@ -118,7 +118,7 @@ static bNodeTree *node_tree_from_ID(ID *id) return ((FreestyleLineStyle *)id)->nodetree; } } - + return NULL; } @@ -137,7 +137,7 @@ void ED_node_tag_update_id(ID *id) if (ntree->type == NTREE_SHADER) { DEG_id_tag_update(id, 0); - + if (GS(id->name) == ID_MA) WM_main_add_notifier(NC_MATERIAL | ND_SHADING, id); else if (GS(id->name) == ID_LA) @@ -191,7 +191,7 @@ static bool compare_nodes(const bNode *a, const bNode *b) */ bool a_select = (a->flag & NODE_SELECT) != 0, b_select = (b->flag & NODE_SELECT) != 0; bool a_active = (a->flag & NODE_ACTIVE) != 0, b_active = (b->flag & NODE_ACTIVE) != 0; - + /* if one is an ancestor of the other */ /* XXX there might be a better sorting algorithm for stable topological sort, this is O(n^2) worst case */ for (parent = a->parent; parent; parent = parent->parent) { @@ -220,13 +220,13 @@ static bool compare_nodes(const bNode *a, const bNode *b) return 0; else if (!(a->flag & NODE_BACKGROUND) && (b->flag & NODE_BACKGROUND)) return 1; - + /* if one has a higher selection state (active > selected > nothing) */ if (!b_active && a_active) return 1; else if (!b_select && (a_active || a_select)) return 1; - + return 0; } @@ -239,11 +239,11 @@ void ED_node_sort(bNodeTree *ntree) bNode *first_a, *first_b, *node_a, *node_b, *tmp; int totnodes = BLI_listbase_count(&ntree->nodes); int k, a, b; - + k = 1; while (k < totnodes) { first_a = first_b = ntree->nodes.first; - + do { /* setup first_b pointer */ for (b = 0; b < k && first_b; ++b) { @@ -252,7 +252,7 @@ void ED_node_sort(bNodeTree *ntree) /* all batches merged? */ if (first_b == NULL) break; - + /* merge batches */ node_a = first_a; node_b = first_b; @@ -281,7 +281,7 @@ void ED_node_sort(bNodeTree *ntree) } first_a = first_b; } while (first_b); - + k = k << 1; } } @@ -300,9 +300,9 @@ static void node_uiblocks_init(const bContext *C, bNodeTree *ntree) { bNode *node; char uiblockstr[32]; - + /* add node uiBlocks in drawing order - prevents events going to overlapping nodes */ - + for (node = ntree->nodes.first; node; node = node->next) { /* ui block */ BLI_snprintf(uiblockstr, sizeof(uiblockstr), "node buttons %p", (void *)node); @@ -344,52 +344,52 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) float locx, locy; float dy; int buty; - + RNA_pointer_create(&ntree->id, &RNA_Node, node, &nodeptr); - + /* get "global" coords */ node_to_view(node, 0.0f, 0.0f, &locx, &locy); dy = locy; - + /* header */ dy -= NODE_DY; - + /* little bit space in top */ if (node->outputs.first) dy -= NODE_DYS / 2; - + /* output sockets */ bool add_output_space = false; for (nsock = node->outputs.first; nsock; nsock = nsock->next) { if (nodeSocketIsHidden(nsock)) continue; - + RNA_pointer_create(&ntree->id, &RNA_NodeSocket, nsock, &sockptr); - + layout = UI_block_layout( node->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, locx + NODE_DYS, dy, NODE_WIDTH(node) - NODE_DY, NODE_DY, 0, UI_style_get()); /* context pointers for current node and socket */ uiLayoutSetContextPointer(layout, "node", &nodeptr); uiLayoutSetContextPointer(layout, "socket", &sockptr); - + /* align output buttons to the right */ row = uiLayoutRow(layout, 1); uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_RIGHT); - + nsock->typeinfo->draw((bContext *)C, row, &sockptr, &nodeptr, IFACE_(nsock->name)); - + UI_block_align_end(node->block); UI_block_layout_resolve(node->block, NULL, &buty); - + /* ensure minimum socket height in case layout is empty */ buty = min_ii(buty, dy - NODE_DY); - + nsock->locx = locx + NODE_WIDTH(node); /* place the socket circle in the middle of the layout */ nsock->locy = 0.5f * (dy + buty); - + dy = buty; if (nsock->next) dy -= NODE_SOCKDY; @@ -407,28 +407,28 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) /* preview rect? */ if (node->flag & NODE_PREVIEW) { float aspect = 1.0f; - - if (node->preview_xsize && node->preview_ysize) + + if (node->preview_xsize && node->preview_ysize) aspect = (float)node->preview_ysize / (float)node->preview_xsize; - + dy -= NODE_DYS / 2; node->prvr.ymax = dy; - + if (aspect <= 1.0f) node->prvr.ymin = dy - aspect * (NODE_WIDTH(node) - NODE_DY); else { /* width correction of image */ /* XXX huh? (ton) */ float dx = (NODE_WIDTH(node) - NODE_DYS) - (NODE_WIDTH(node) - NODE_DYS) / aspect; - + node->prvr.ymin = dy - (NODE_WIDTH(node) - NODE_DY); - + node->prvr.xmin += 0.5f * dx; node->prvr.xmax -= 0.5f * dx; } - + dy = node->prvr.ymin - NODE_DYS / 2; - + /* make sure that maximums are bigger or equal to minimums */ if (node->prvr.xmax < node->prvr.xmin) SWAP(float, node->prvr.xmax, node->prvr.xmin); if (node->prvr.ymax < node->prvr.ymin) SWAP(float, node->prvr.ymax, node->prvr.ymin); @@ -443,18 +443,18 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) node->butr.xmax = NODE_WIDTH(node) - 2 * NODE_DYS; node->butr.ymin = 0; node->butr.ymax = 0; - - + + layout = UI_block_layout( node->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, locx + NODE_DYS, dy, node->butr.xmax, 0, 0, UI_style_get()); uiLayoutSetContextPointer(layout, "node", &nodeptr); - + node->typeinfo->draw_buttons(layout, (bContext *)C, &nodeptr); - + UI_block_align_end(node->block); UI_block_layout_resolve(node->block, NULL, &buty); - + dy = buty - NODE_DYS / 2; } @@ -462,35 +462,35 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) for (nsock = node->inputs.first; nsock; nsock = nsock->next) { if (nodeSocketIsHidden(nsock)) continue; - + RNA_pointer_create(&ntree->id, &RNA_NodeSocket, nsock, &sockptr); - + layout = UI_block_layout( node->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, locx + NODE_DYS, dy, NODE_WIDTH(node) - NODE_DY, NODE_DY, 0, UI_style_get()); /* context pointers for current node and socket */ uiLayoutSetContextPointer(layout, "node", &nodeptr); uiLayoutSetContextPointer(layout, "socket", &sockptr); - + row = uiLayoutRow(layout, 1); - + nsock->typeinfo->draw((bContext *)C, row, &sockptr, &nodeptr, IFACE_(nsock->name)); - + UI_block_align_end(node->block); UI_block_layout_resolve(node->block, NULL, &buty); - + /* ensure minimum socket height in case layout is empty */ buty = min_ii(buty, dy - NODE_DY); - + nsock->locx = locx; /* place the socket circle in the middle of the layout */ nsock->locy = 0.5f * (dy + buty); - + dy = buty; if (nsock->next) dy -= NODE_SOCKDY; } - + /* little bit space in end */ if (node->inputs.first || (node->flag & (NODE_OPTIONS | NODE_PREVIEW)) == 0) dy -= NODE_DYS / 2; @@ -499,7 +499,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) node->totr.xmax = locx + NODE_WIDTH(node); node->totr.ymax = locy; node->totr.ymin = min_ff(dy, locy - 2 * NODE_DY); - + /* Set the block bounds to clip mouse events from underlying nodes. * Add a margin for sockets on each side. */ @@ -518,7 +518,7 @@ static void node_update_hidden(bNode *node) float locx, locy; float rad, drad, hiddenrad = HIDDEN_RAD; int totin = 0, totout = 0, tot; - + /* get "global" coords */ node_to_view(node, 0.0f, 0.0f, &locx, &locy); @@ -529,20 +529,20 @@ static void node_update_hidden(bNode *node) for (nsock = node->outputs.first; nsock; nsock = nsock->next) if (!nodeSocketIsHidden(nsock)) totout++; - + tot = MAX2(totin, totout); if (tot > 4) { hiddenrad += 5.0f * (float)(tot - 4); } - + node->totr.xmin = locx; node->totr.xmax = locx + 3 * hiddenrad + node->miniwidth; node->totr.ymax = locy + (hiddenrad - 0.5f * NODE_DY); node->totr.ymin = node->totr.ymax - 2 * hiddenrad; - + /* output sockets */ rad = drad = (float)M_PI / (1.0f + (float)totout); - + for (nsock = node->outputs.first; nsock; nsock = nsock->next) { if (!nodeSocketIsHidden(nsock)) { nsock->locx = node->totr.xmax - hiddenrad + sinf(rad) * hiddenrad; @@ -550,10 +550,10 @@ static void node_update_hidden(bNode *node) rad += drad; } } - + /* input sockets */ rad = drad = -(float)M_PI / (1.0f + (float)totin); - + for (nsock = node->inputs.first; nsock; nsock = nsock->next) { if (!nodeSocketIsHidden(nsock)) { nsock->locx = node->totr.xmin + hiddenrad + sinf(rad) * hiddenrad; @@ -632,10 +632,10 @@ static void node_socket_circle_draw(const bContext *C, bNodeTree *ntree, Pointer { PointerRNA ptr; float color[4]; - + RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr); sock->typeinfo->draw_color((bContext *)C, &ptr, &node_ptr, color); - + immAttrib4fv(col, color); immVertex2f(pos, sock->locx, sock->locy); } @@ -645,7 +645,7 @@ static void node_socket_circle_draw(const bContext *C, bNodeTree *ntree, Pointer static void node_draw_preview_background(float tile, rctf *rect) { float x, y; - + Gwn_VertFormat *format = immVertexFormat(); unsigned int pos = GWN_vertformat_attr_add(format, "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); @@ -655,7 +655,7 @@ static void node_draw_preview_background(float tile, rctf *rect) immUniformColor3ub(120, 120, 120); immRectf(pos, rect->xmin, rect->ymin, rect->xmax, rect->ymax); immUniformColor3ub(160, 160, 160); - + for (y = rect->ymin; y < rect->ymax; y += tile * 2) { for (x = rect->xmin; x < rect->xmax; x += tile * 2) { float tilex = tile, tiley = tile; @@ -692,7 +692,7 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv) float yscale = yrect / ((float)preview->ysize); float scale; rctf draw_rect; - + /* uniform scale and offset */ draw_rect = *prv; if (xscale < yscale) { @@ -707,16 +707,16 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv) draw_rect.xmax -= offset; scale = yscale; } - + node_draw_preview_background(BLI_rctf_size_x(prv) / 10.0f, &draw_rect); - + glEnable(GL_BLEND); glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); /* premul graphics */ - + IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_COLOR); immDrawPixelsTex(&state, draw_rect.xmin, draw_rect.ymin, preview->xsize, preview->ysize, GL_RGBA, GL_UNSIGNED_BYTE, GL_LINEAR, preview->rect, scale, scale, NULL); - + glDisable(GL_BLEND); unsigned int pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); @@ -731,23 +731,23 @@ static void node_toggle_button_cb(struct bContext *C, void *node_argv, void *op_ { bNode *node = (bNode *)node_argv; const char *opname = (const char *)op_argv; - + /* select & activate only the button's node */ node_select_single(C, node); - + WM_operator_name_call(C, opname, WM_OP_INVOKE_DEFAULT, NULL); } void node_draw_shadow(SpaceNode *snode, bNode *node, float radius, float alpha) { rctf *rct = &node->totr; - + UI_draw_roundbox_corner_set(UI_CNR_ALL); if (node->parent == NULL) ui_draw_dropshadow(rct, radius, snode->aspect, alpha, node->flag & SELECT); else { const float margin = 3.0f; - + float color[4] = {0.0f, 0.0f, 0.0f, 0.33f}; UI_draw_roundbox_aa(true, rct->xmin - margin, rct->ymin - margin, rct->xmax + margin, rct->ymax + margin, radius + margin, color); @@ -802,7 +802,7 @@ void node_draw_sockets(View2D *v2d, const bContext *C, bNodeTree *ntree, bNode * node_socket_circle_draw(C, ntree, node_ptr, sock, pos, col); } - + /* socket outputs */ short selected_output_ct = 0; if (draw_outputs) { @@ -878,17 +878,17 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN float color[4]; char showname[128]; /* 128 used below */ View2D *v2d = &ar->v2d; - + /* skip if out of view */ if (BLI_rctf_isect(&node->totr, &v2d->cur, NULL) == false) { UI_block_end(C, node->block); node->block = NULL; return; } - + /* shadow */ node_draw_shadow(snode, node, BASIS_RAD, 1.0f); - + if (node->flag & NODE_MUTED) { UI_GetThemeColorBlendShade4fv(color_id, TH_REDALERT, 0.5f, 0, color); } @@ -907,10 +907,10 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN UI_draw_roundbox_corner_set(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT); UI_draw_roundbox_aa(true, rct->xmin, rct->ymax - NODE_DY, rct->xmax, rct->ymax, BASIS_RAD, color); - + /* show/hide icons */ iconofs = rct->xmax - 0.35f * U.widget_unit; - + /* preview */ if (node->typeinfo->flag & NODE_PREVIEW) { uiBut *but; @@ -937,7 +937,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN UI_but_func_set(but, node_toggle_button_cb, node, (void *)"NODE_OT_group_edit"); UI_block_emboss_set(node->block, UI_EMBOSS); } - + /* title */ if (node->flag & SELECT) { UI_GetThemeColor4fv(TH_SELECT, color); @@ -945,7 +945,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN else { UI_GetThemeColorBlendShade4fv(TH_SELECT, color_id, 0.4f, 10, color); } - + /* open/close entirely? */ { uiBut *but; @@ -957,16 +957,16 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN but_size, but_size, NULL, 0, 0, 0, 0, ""); UI_but_func_set(but, node_toggle_button_cb, node, (void *)"NODE_OT_hide_toggle"); UI_block_emboss_set(node->block, UI_EMBOSS); - + /* custom draw function for this button */ UI_draw_icon_tri(rct->xmin + 0.5f * U.widget_unit, rct->ymax - NODE_DY / 2.0f, 'v', color); } - + nodeLabel(ntree, node, showname, sizeof(showname)); - + //if (node->flag & NODE_MUTED) // BLI_snprintf(showname, sizeof(showname), "[%s]", showname); /* XXX - don't print into self! */ - + uiDefBut(node->block, UI_BTYPE_LABEL, 0, showname, (int)(rct->xmin + (NODE_MARGIN_X)), (int)(rct->ymax - NODE_DY), (short)(iconofs - rct->xmin - 18.0f), (short)NODE_DY, @@ -991,7 +991,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN UI_draw_roundbox_corner_set(UI_CNR_ALL); UI_draw_roundbox_aa(false, rct->xmin, rct->ymin, rct->xmax, rct->ymax, BASIS_RAD, color); } - + /* disable lines */ if (node->flag & NODE_MUTED) node_draw_mute_line(v2d, snode, node); @@ -1007,9 +1007,9 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN } } } - + UI_ThemeClearColor(color_id); - + UI_block_end(C, node->block); UI_block_draw(C, node->block); node->block = NULL; @@ -1027,7 +1027,7 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b float scale; UI_view2d_scale_get(v2d, &scale, NULL); - + /* shadow */ node_draw_shadow(snode, node, hiddenrad, 1.0f); @@ -1036,9 +1036,9 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b UI_GetThemeColorBlendShade4fv(color_id, TH_REDALERT, 0.5f, 0, color); else UI_GetThemeColor4fv(color_id, color); - + UI_draw_roundbox_aa(true, rct->xmin, rct->ymin, rct->xmax, rct->ymax, hiddenrad, color); - + /* outline active and selected emphasis */ if (node->flag & SELECT) { UI_GetThemeColorShadeAlpha4fv((node->flag & NODE_ACTIVE) ? TH_ACTIVE : TH_SELECT, 0, -40, color); @@ -1064,7 +1064,7 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b else { UI_GetThemeColorBlendShade4fv(TH_SELECT, color_id, 0.4f, 10, color); } - + /* open entirely icon */ { uiBut *but; @@ -1076,11 +1076,11 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b but_size, but_size, NULL, 0, 0, 0, 0, ""); UI_but_func_set(but, node_toggle_button_cb, node, (void *)"NODE_OT_hide_toggle"); UI_block_emboss_set(node->block, UI_EMBOSS); - + /* custom draw function for this button */ UI_draw_icon_tri(rct->xmin + 10.0f, centy, 'h', color); } - + /* disable lines */ if (node->flag & NODE_MUTED) node_draw_mute_line(&ar->v2d, snode, node); @@ -1150,7 +1150,7 @@ void node_set_cursor(wmWindow *win, SpaceNode *snode, float cursor[2]) bNode *node; bNodeSocket *sock; int wmcursor = CURSOR_STD; - + if (ntree) { if (node_find_indicated_socket(snode, &node, &sock, cursor, SOCK_IN | SOCK_OUT)) { /* pass */ @@ -1167,7 +1167,7 @@ void node_set_cursor(wmWindow *win, SpaceNode *snode, float cursor[2]) } } } - + WM_cursor_set(win, wmcursor); } @@ -1188,10 +1188,10 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node) void node_update_nodetree(const bContext *C, bNodeTree *ntree) { bNode *node; - + /* make sure socket "used" tags are correct, for displaying value buttons */ ntreeTagUsedSockets(ntree); - + /* update nodes front to back, so children sizes get updated before parents */ for (node = ntree->nodes.last; node; node = node->prev) { node_update(C, ntree, node); @@ -1211,7 +1211,7 @@ void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeT bNode *node; bNodeLink *link; int a; - + if (ntree == NULL) return; /* groups... */ #ifdef USE_DRAW_TOT_UPDATE @@ -1237,7 +1237,7 @@ void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeT node->nr = a; /* index of node in list, used for exec event code */ node_draw(C, ar, snode, ntree, node, key); } - + /* node lines */ glEnable(GL_BLEND); nodelink_batch_start(snode); @@ -1247,7 +1247,7 @@ void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeT } nodelink_batch_end(snode); glDisable(GL_BLEND); - + /* draw foreground nodes, last nodes in front */ for (a = 0, node = ntree->nodes.first; node; node = node->next, a++) { bNodeInstanceKey key; @@ -1264,9 +1264,9 @@ void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeT static void draw_tree_path(SpaceNode *snode) { char info[256]; - + ED_node_tree_path_get_fixedbuf(snode, info, sizeof(info)); - + UI_FontThemeColor(BLF_default(), TH_TEXT_HI); BLF_draw_default(1.5f * UI_UNIT_X, 1.5f * UI_UNIT_Y, 0.0f, info, sizeof(info)); } @@ -1274,11 +1274,11 @@ static void draw_tree_path(SpaceNode *snode) static void snode_setup_v2d(SpaceNode *snode, ARegion *ar, const float center[2]) { View2D *v2d = &ar->v2d; - + /* shift view to node tree center */ UI_view2d_center_set(v2d, center[0], center[1]); UI_view2d_view_ortho(v2d); - + /* aspect+font, set each time */ snode->aspect = BLI_rctf_size_x(&v2d->cur) / (float)ar->winx; // XXX snode->curfont = uiSetCurFont_ext(snode->aspect); @@ -1309,7 +1309,7 @@ static void draw_group_overlay(const bContext *C, ARegion *ar) UI_draw_roundbox_corner_set(UI_CNR_NONE); UI_draw_roundbox_4fv(true, rect.xmin, rect.ymin, rect.xmax, rect.ymax, 0, color); glDisable(GL_BLEND); - + /* set the block bounds to clip mouse events from underlying nodes */ block = UI_block_begin(C, ar, "node tree bounds block", UI_EMBOSS); UI_block_bounds_set_explicit(block, rect.xmin, rect.ymin, rect.xmax, rect.ymax); @@ -1328,21 +1328,21 @@ void drawnodespace(const bContext *C, ARegion *ar) glClear(GL_COLOR_BUFFER_BIT); UI_view2d_view_ortho(v2d); - + /* XXX snode->cursor set in coordspace for placing new nodes, used for drawing noodles too */ UI_view2d_region_to_view(&ar->v2d, win->eventstate->x - ar->winrct.xmin, win->eventstate->y - ar->winrct.ymin, &snode->cursor[0], &snode->cursor[1]); snode->cursor[0] /= UI_DPI_FAC; snode->cursor[1] /= UI_DPI_FAC; - + ED_region_draw_cb_draw(C, ar, REGION_DRAW_PRE_VIEW); /* only set once */ glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); - + /* nodes */ snode_set_context(C); - + /* draw parent node trees */ if (snode->treepath.last) { static const int max_depth = 2; @@ -1352,50 +1352,50 @@ void drawnodespace(const bContext *C, ARegion *ar) bNodeTree *ntree; bNodeLinkDrag *nldrag; LinkData *linkdata; - + path = snode->treepath.last; - + /* update tree path name (drawn in the bottom left) */ ID *name_id = (path->nodetree && path->nodetree != snode->nodetree) ? &path->nodetree->id : snode->id; if (name_id && UNLIKELY(!STREQ(path->node_name, name_id->name + 2))) { BLI_strncpy(path->node_name, name_id->name + 2, sizeof(path->node_name)); } - + /* current View2D center, will be set temporarily for parent node trees */ UI_view2d_center_get(v2d, ¢er[0], ¢er[1]); - + /* store new view center in path and current edittree */ copy_v2_v2(path->view_center, center); if (snode->edittree) copy_v2_v2(snode->edittree->view_center, center); - + depth = 0; while (path->prev && depth < max_depth) { path = path->prev; ++depth; } - + /* parent node trees in the background */ for (curdepth = depth; curdepth > 0; path = path->next, --curdepth) { ntree = path->nodetree; if (ntree) { snode_setup_v2d(snode, ar, path->view_center); - + draw_nodetree(C, ar, ntree, path->parent_key); - + draw_group_overlay(C, ar); } } - + /* top-level edit tree */ ntree = path->nodetree; if (ntree) { snode_setup_v2d(snode, ar, center); - + /* grid, uses theme color based on node path depth */ UI_view2d_multi_grid_draw(v2d, (depth > 0 ? TH_NODE_GROUP : TH_BACK), ED_node_grid_size(), NODE_GRID_STEPS, 2); - + /* backdrop */ draw_nodespace_back_pix(C, ar, snode, path->parent_key); @@ -1416,7 +1416,7 @@ void drawnodespace(const bContext *C, ARegion *ar) draw_nodetree(C, ar, ntree, path->parent_key); } - + /* temporary links */ glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH); @@ -1426,7 +1426,7 @@ void drawnodespace(const bContext *C, ARegion *ar) } glDisable(GL_LINE_SMOOTH); glDisable(GL_BLEND); - + if (snode->flag & SNODE_SHOW_GPENCIL) { /* draw grease-pencil ('canvas' strokes) */ ED_gpencil_draw_view2d(C, true); @@ -1435,16 +1435,16 @@ void drawnodespace(const bContext *C, ARegion *ar) else { /* default grid */ UI_view2d_multi_grid_draw(v2d, TH_BACK, ED_node_grid_size(), NODE_GRID_STEPS, 2); - + /* backdrop */ draw_nodespace_back_pix(C, ar, snode, NODE_INSTANCE_KEY_NONE); } - + ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_VIEW); - + /* reset view matrix */ UI_view2d_view_restore(C); - + if (snode->treepath.last) { if (snode->flag & SNODE_SHOW_GPENCIL) { /* draw grease-pencil (screen strokes, and also paintbuffer) */ @@ -1454,7 +1454,7 @@ void drawnodespace(const bContext *C, ARegion *ar) /* tree path info */ draw_tree_path(snode); - + /* scrollers */ scrollers = UI_view2d_scrollers_calc(C, v2d, 10, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY); UI_view2d_scrollers_draw(C, v2d, scrollers); |