diff options
author | Campbell Barton <ideasman42@gmail.com> | 2017-05-29 15:06:59 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2017-05-29 15:09:57 +0300 |
commit | 377947342e1a483d77dea0df351f20646a30ef20 (patch) | |
tree | 52abd7b752eb70df19f19562ae272ce881a8fea5 | |
parent | 1f1926e0687b1404e6bcec039237b3ce173962b3 (diff) |
Node Backdrop Manipulator
From custom-manipulator branch, usable when viewer node is selected.
This might need some changes but works on basic level.
6 files changed, 182 insertions, 5 deletions
diff --git a/source/blender/editors/space_node/CMakeLists.txt b/source/blender/editors/space_node/CMakeLists.txt index cde818333e4..41843927587 100644 --- a/source/blender/editors/space_node/CMakeLists.txt +++ b/source/blender/editors/space_node/CMakeLists.txt @@ -53,6 +53,7 @@ set(SRC node_templates.c node_toolbar.c node_view.c + node_widgets.c space_node.c node_intern.h diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index fb94ce6e252..4fc9f08ff02 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -1395,7 +1395,23 @@ void drawnodespace(const bContext *C, ARegion *ar) /* backdrop */ draw_nodespace_back_pix(C, ar, snode, path->parent_key); - + + { + float original_proj[4][4]; + gpuGetProjectionMatrix(original_proj); + + gpuPushMatrix(); + gpuLoadIdentity(); + + glaDefine2DArea(&ar->winrct); + wmOrtho2_pixelspace(ar->winx, ar->winy); + + WM_manipulatormap_draw(ar->manipulator_map, C, WM_MANIPULATORMAP_DRAWSTEP_2D); + + gpuPopMatrix(); + gpuLoadProjectionMatrix(original_proj); + } + draw_nodetree(C, ar, ntree, path->parent_key); } diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index 3b5d32a432a..b425a92f601 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -219,6 +219,10 @@ void NODE_OT_shader_script_update(struct wmOperatorType *ot); void NODE_OT_viewer_border(struct wmOperatorType *ot); void NODE_OT_clear_viewer_border(struct wmOperatorType *ot); +/* node_widgets.c */ +void NODE_WGT_backdrop_transform(struct wmManipulatorGroupType *wgt); + + extern const char *node_context_dir[]; // XXXXXX diff --git a/source/blender/editors/space_node/node_widgets.c b/source/blender/editors/space_node/node_widgets.c new file mode 100644 index 00000000000..9e7445b8566 --- /dev/null +++ b/source/blender/editors/space_node/node_widgets.c @@ -0,0 +1,114 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/editors/space_node/node_widgets.c + * \ingroup spnode + */ + +#include "BKE_context.h" +#include "BKE_image.h" + +#include "DNA_manipulator_types.h" + +#include "ED_screen.h" + +#include "IMB_imbuf_types.h" + +#include "MEM_guardedalloc.h" + +#include "RNA_access.h" + +#include "WM_api.h" +#include "WM_types.h" + +#include "node_intern.h" + + +static bool WIDGETGROUP_node_transform_poll(const bContext *C, wmManipulatorGroupType *UNUSED(wgrouptype)) +{ + SpaceNode *snode = CTX_wm_space_node(C); + + if ((snode->flag & SNODE_BACKDRAW) == 0) { + return false; + } + + if (snode && snode->edittree && snode->edittree->type == NTREE_COMPOSIT) { + bNode *node = nodeGetActive(snode->edittree); + + if (node && node->type == CMP_NODE_VIEWER) { + return true; + } + } + + return false; +} + +static void WIDGETGROUP_node_transform_init(const bContext *UNUSED(C), wmManipulatorGroup *wgroup) +{ + wmManipulatorWrapper *wwrapper = MEM_mallocN(sizeof(wmManipulatorWrapper), __func__); + + wwrapper->manipulator = MANIPULATOR_rect_transform_new( + wgroup, "backdrop_cage", + MANIPULATOR_RECT_TRANSFORM_STYLE_TRANSLATE | MANIPULATOR_RECT_TRANSFORM_STYLE_SCALE_UNIFORM); + wgroup->customdata = wwrapper; + +} + +static void WIDGETGROUP_node_transform_refresh(const bContext *C, wmManipulatorGroup *wgroup) +{ + wmManipulator *cage = ((wmManipulatorWrapper *)wgroup->customdata)->manipulator; + const ARegion *ar = CTX_wm_region(C); + /* center is always at the origin */ + const float origin[3] = {ar->winx / 2, ar->winy / 2}; + + void *lock; + Image *ima = BKE_image_verify_viewer(IMA_TYPE_COMPOSITE, "Viewer Node"); + ImBuf *ibuf = BKE_image_acquire_ibuf(ima, NULL, &lock); + + if (ibuf) { + const float w = (ibuf->x > 0) ? ibuf->x : 64.0f; + const float h = (ibuf->y > 0) ? ibuf->y : 64.0f; + + MANIPULATOR_rect_transform_set_dimensions(cage, w, h); + WM_manipulator_set_origin(cage, origin); + WM_manipulator_set_flag(cage, WM_MANIPULATOR_HIDDEN, false); + + /* need to set property here for undo. TODO would prefer to do this in _init */ + SpaceNode *snode = CTX_wm_space_node(C); + PointerRNA nodeptr; + RNA_pointer_create(snode->id, &RNA_SpaceNodeEditor, snode, &nodeptr); + WM_manipulator_set_property(cage, RECT_TRANSFORM_SLOT_OFFSET, &nodeptr, "backdrop_offset"); + WM_manipulator_set_property(cage, RECT_TRANSFORM_SLOT_SCALE, &nodeptr, "backdrop_zoom"); + } + else { + WM_manipulator_set_flag(cage, WM_MANIPULATOR_HIDDEN, true); + } + + BKE_image_release_ibuf(ima, ibuf, lock); +} + +void NODE_WGT_backdrop_transform(wmManipulatorGroupType *wgt) +{ + wgt->name = "Backdrop Transform Widgets"; + + wgt->poll = WIDGETGROUP_node_transform_poll; + wgt->init = WIDGETGROUP_node_transform_init; + wgt->refresh = WIDGETGROUP_node_transform_refresh; +} diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index 235eadd6f51..4eeb4d02d8c 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -57,6 +57,8 @@ #include "RNA_access.h" +#include "WM_api.h" + #include "node_intern.h" /* own include */ @@ -643,6 +645,14 @@ static void node_main_region_init(wmWindowManager *wm, ARegion *ar) UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy); + /* manipulators stay in the background for now - quick patchjob to make sure nodes themselves work */ + if (!ar->manipulator_map) { + ar->manipulator_map = WM_manipulatormap_new_from_type(&(const struct wmManipulatorMapType_Params) { + "Node_Canvas", SPACE_NODE, RGN_TYPE_WINDOW}); + } + + WM_manipulatormap_add_handlers(ar, ar->manipulator_map); + /* own keymaps */ keymap = WM_keymap_find(wm->defaultconf, "Node Generic", SPACE_NODE, 0); WM_event_add_keymap_handler(&ar->handlers, keymap); @@ -741,13 +751,24 @@ static void node_region_listener( bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn, const Scene *UNUSED(scene)) { + wmManipulatorMap *mmap = ar->manipulator_map; + /* context changes */ switch (wmn->category) { case NC_SPACE: - if (wmn->data == ND_SPACE_NODE) - ED_region_tag_redraw(ar); + switch (wmn->data) { + case ND_SPACE_NODE: + ED_region_tag_redraw(ar); + break; + case ND_SPACE_NODE_VIEW: + WM_manipulatormap_tag_refresh(mmap); + break; + } break; case NC_SCREEN: + if (wmn->data == ND_SCREENSET || wmn->action == NA_EDITED) { + WM_manipulatormap_tag_refresh(mmap); + } switch (wmn->data) { case ND_SCREENCAST: case ND_ANIMPLAY: @@ -756,10 +777,20 @@ static void node_region_listener( } break; case NC_SCENE: + ED_region_tag_redraw(ar); + if (wmn->data == ND_RENDER_RESULT) { + WM_manipulatormap_tag_refresh(mmap); + } + break; + case NC_NODE: + ED_region_tag_redraw(ar); + if (ELEM(wmn->action, NA_EDITED, NA_SELECTED)) { + WM_manipulatormap_tag_refresh(mmap); + } + break; case NC_MATERIAL: case NC_TEXTURE: case NC_WORLD: - case NC_NODE: case NC_LINESTYLE: ED_region_tag_redraw(ar); break; @@ -824,6 +855,14 @@ static int node_context(const bContext *C, const char *member, bContextDataResul return 0; } +static void node_widgets(void) +{ + /* create the widgetmap for the area here */ + wmManipulatorMapType *wmaptype = WM_manipulatormaptype_ensure(&(const struct wmManipulatorMapType_Params) { + "Node_Canvas", SPACE_NODE, RGN_TYPE_WINDOW}); + WM_manipulatorgrouptype_append(wmaptype, NODE_WGT_backdrop_transform); +} + static void node_id_remap(ScrArea *UNUSED(sa), SpaceLink *slink, ID *old_id, ID *new_id) { SpaceNode *snode = (SpaceNode *)slink; @@ -914,6 +953,7 @@ void ED_spacetype_node(void) st->refresh = node_area_refresh; st->context = node_context; st->dropboxes = node_dropboxes; + st->manipulators = node_widgets; st->id_remap = node_id_remap; /* regions: main window */ diff --git a/source/blender/windowmanager/manipulators/intern/manipulator_library/cage_manipulator.c b/source/blender/windowmanager/manipulators/intern/manipulator_library/cage_manipulator.c index 59ae06eb30b..45973fbf2fe 100644 --- a/source/blender/windowmanager/manipulators/intern/manipulator_library/cage_manipulator.c +++ b/source/blender/windowmanager/manipulators/intern/manipulator_library/cage_manipulator.c @@ -179,7 +179,7 @@ static void rect_transform_draw_interaction( VertexFormat *format = immVertexFormat(); unsigned int pos = VertexFormat_add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT); unsigned int color = VertexFormat_add_attrib(format, "color", COMP_F32, 3, KEEP_FLOAT); - immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR); glLineWidth(line_width + 3.0); @@ -198,6 +198,8 @@ static void rect_transform_draw_interaction( immVertex2fv(pos, verts[1]); immVertex2fv(pos, verts[2]); immEnd(); + + immUnbindProgram(); } static void manipulator_rect_transform_draw(const bContext *UNUSED(C), wmManipulator *manipulator) |