From 3daa641d7f56109741ebe59416875a0162ac19a0 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 19 Jul 2017 14:32:31 +1000 Subject: Fix T52092: Crash un-grouping nodes --- source/blender/editors/space_node/node_group.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/node_group.c b/source/blender/editors/space_node/node_group.c index 914f8ffbe10..9d750bfe348 100644 --- a/source/blender/editors/space_node/node_group.c +++ b/source/blender/editors/space_node/node_group.c @@ -37,6 +37,7 @@ #include "DNA_anim_types.h" #include "BLI_listbase.h" +#include "BLI_linklist.h" #include "BLI_math.h" #include "BLT_translation.h" @@ -186,6 +187,7 @@ static int node_group_ungroup(bNodeTree *ntree, bNode *gnode) bNode *node, *nextnode; bNodeTree *ngroup, *wgroup; ListBase anim_basepaths = {NULL, NULL}; + LinkNode *nodes_delayed_free = NULL; ngroup = (bNodeTree *)gnode->id; @@ -208,8 +210,8 @@ static int node_group_ungroup(bNodeTree *ntree, bNode *gnode) * This also removes remaining links to and from interface nodes. */ if (ELEM(node->type, NODE_GROUP_INPUT, NODE_GROUP_OUTPUT)) { - nodeFreeNode(wgroup, node); - continue; + /* We must delay removal since sockets will reference this node. see: T52092 */ + BLI_linklist_prepend(&nodes_delayed_free, node); } /* keep track of this node's RNA "base" path (the part of the path identifying the node) @@ -336,6 +338,11 @@ static int node_group_ungroup(bNodeTree *ntree, bNode *gnode) } } + while (nodes_delayed_free) { + node = BLI_linklist_pop(&nodes_delayed_free); + nodeFreeNode(ntree, node); + } + /* delete the group instance */ nodeFreeNode(ntree, gnode); -- cgit v1.2.3 From 122706db9cd23c88775474750e99b57e74a3b9e5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 22 Jul 2017 01:25:45 +1000 Subject: Fix manipulator handles getting added each refresh The same manipulator map handler would accumulate, slowing down interactions. --- source/blender/editors/space_node/space_node.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index c1099f38d92..c070495e565 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -649,9 +649,9 @@ static void node_main_region_init(wmWindowManager *wm, ARegion *ar) if (ar->manipulator_map == NULL) { ar->manipulator_map = WM_manipulatormap_new_from_type( &(const struct wmManipulatorMapType_Params){SPACE_NODE, RGN_TYPE_WINDOW}); - } - WM_manipulatormap_add_handlers(ar, ar->manipulator_map); + WM_manipulatormap_add_handlers(ar, ar->manipulator_map); + } /* own keymaps */ keymap = WM_keymap_find(wm->defaultconf, "Node Generic", SPACE_NODE, 0); -- cgit v1.2.3 From b01d38ef7d4ddbfcb635f025bd6b4aea98d28cdb Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 27 Jul 2017 07:43:15 +1000 Subject: Manipulator: remove names They weren't used anywhere, both C & Py manipulators better assign to vars (no lookup needed). --- source/blender/editors/space_node/node_manipulators.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/node_manipulators.c b/source/blender/editors/space_node/node_manipulators.c index 8b4ebd70874..7bc029ea660 100644 --- a/source/blender/editors/space_node/node_manipulators.c +++ b/source/blender/editors/space_node/node_manipulators.c @@ -63,7 +63,7 @@ static void WIDGETGROUP_node_transform_setup(const bContext *UNUSED(C), wmManipu { wmManipulatorWrapper *wwrapper = MEM_mallocN(sizeof(wmManipulatorWrapper), __func__); - wwrapper->manipulator = WM_manipulator_new("MANIPULATOR_WT_cage_2d", mgroup, "backdrop_cage", NULL); + wwrapper->manipulator = WM_manipulator_new("MANIPULATOR_WT_cage_2d", mgroup, NULL); RNA_enum_set(wwrapper->manipulator->ptr, "transform", ED_MANIPULATOR_RECT_TRANSFORM_FLAG_TRANSLATE | ED_MANIPULATOR_RECT_TRANSFORM_FLAG_SCALE_UNIFORM); -- cgit v1.2.3 From 49c0ad1188b008a2238845db61486b27a956091e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 30 Jul 2017 15:38:32 +1000 Subject: Revert "Fix manipulator handles getting added each refresh" This reverts commit 122706db9cd23c88775474750e99b57e74a3b9e5. Would loose manipulators, will check for duplicates instead. --- source/blender/editors/space_node/space_node.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index c070495e565..c1099f38d92 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -649,10 +649,10 @@ static void node_main_region_init(wmWindowManager *wm, ARegion *ar) if (ar->manipulator_map == NULL) { ar->manipulator_map = WM_manipulatormap_new_from_type( &(const struct wmManipulatorMapType_Params){SPACE_NODE, RGN_TYPE_WINDOW}); - - WM_manipulatormap_add_handlers(ar, ar->manipulator_map); } + 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); -- cgit v1.2.3 From d7905dab6a858570258daf4a502820b340a52dbc Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 4 Aug 2017 16:45:33 +1000 Subject: Manipulator: add compositor crop manipulator --- source/blender/editors/space_node/node_intern.h | 1 + .../blender/editors/space_node/node_manipulators.c | 260 ++++++++++++++++++++- source/blender/editors/space_node/space_node.c | 1 + 3 files changed, 260 insertions(+), 2 deletions(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index b425a92f601..7e8d092cdbe 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -221,6 +221,7 @@ void NODE_OT_clear_viewer_border(struct wmOperatorType *ot); /* node_widgets.c */ void NODE_WGT_backdrop_transform(struct wmManipulatorGroupType *wgt); +void NODE_WGT_backdrop_crop(struct wmManipulatorGroupType *wgt); extern const char *node_context_dir[]; diff --git a/source/blender/editors/space_node/node_manipulators.c b/source/blender/editors/space_node/node_manipulators.c index 7bc029ea660..8f614137a84 100644 --- a/source/blender/editors/space_node/node_manipulators.c +++ b/source/blender/editors/space_node/node_manipulators.c @@ -22,9 +22,14 @@ * \ingroup spnode */ +#include + #include "BKE_context.h" #include "BKE_image.h" +#include "BLI_math_matrix.h" +#include "BLI_math_vector.h" + #include "ED_screen.h" #include "ED_manipulator_library.h" @@ -40,6 +45,11 @@ #include "node_intern.h" +/* -------------------------------------------------------------------- */ + +/** \name Backdrop Manipulator + * \{ */ + static bool WIDGETGROUP_node_transform_poll(const bContext *C, wmManipulatorGroupType *UNUSED(wgt)) { SpaceNode *snode = CTX_wm_space_node(C); @@ -51,7 +61,7 @@ static bool WIDGETGROUP_node_transform_poll(const bContext *C, wmManipulatorGrou if (snode && snode->edittree && snode->edittree->type == NTREE_COMPOSIT) { bNode *node = nodeGetActive(snode->edittree); - if (node && node->type == CMP_NODE_VIEWER) { + if (node && ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) { return true; } } @@ -108,7 +118,7 @@ static void WIDGETGROUP_node_transform_refresh(const bContext *C, wmManipulatorG void NODE_WGT_backdrop_transform(wmManipulatorGroupType *wgt) { - wgt->name = "Backdrop Transform Widgets"; + wgt->name = "Backdrop Transform Widget"; wgt->idname = "NODE_WGT_backdrop_transform"; wgt->flag |= WM_MANIPULATORGROUPTYPE_PERSISTENT; @@ -117,3 +127,249 @@ void NODE_WGT_backdrop_transform(wmManipulatorGroupType *wgt) wgt->setup = WIDGETGROUP_node_transform_setup; wgt->refresh = WIDGETGROUP_node_transform_refresh; } + +/** \} */ + +/* -------------------------------------------------------------------- */ + +/** \name Crop Manipulator + * \{ */ + +struct NodeCropWidgetGroup { + wmManipulator *border; + + struct { + float dims[2]; + } state; + + struct { + PointerRNA ptr; + PropertyRNA *prop; + bContext *context; + } update_data; +}; + +static void manipulator_node_crop_update(struct NodeCropWidgetGroup *crop_group) +{ + RNA_property_update(crop_group->update_data.context, &crop_group->update_data.ptr, crop_group->update_data.prop); +} + +static void two_xy_to_rect(const NodeTwoXYs *nxy, rctf *rect, const float dims[2], bool is_relative) +{ + if (is_relative) { + rect->xmin = nxy->fac_x1; + rect->xmax = nxy->fac_x2; + rect->ymin = nxy->fac_y1; + rect->ymax = nxy->fac_y2; + } + else { + rect->xmin = nxy->x1 / dims[0]; + rect->xmax = nxy->x2 / dims[0]; + rect->ymin = nxy->y1 / dims[1]; + rect->ymax = nxy->y2 / dims[1]; + } +} + +static void two_xy_from_rect(NodeTwoXYs *nxy, const rctf *rect, const float dims[2], bool is_relative) +{ + if (is_relative) { + nxy->fac_x1 = rect->xmin; + nxy->fac_x2 = rect->xmax; + nxy->fac_y1 = rect->ymin; + nxy->fac_y2 = rect->ymax; + } + else { + nxy->x1 = rect->xmin * dims[0]; + nxy->x2 = rect->xmax * dims[0]; + nxy->y1 = rect->ymin * dims[1]; + nxy->y2 = rect->ymax * dims[1]; + } +} + +/* scale callbacks */ +static void manipulator_node_crop_prop_size_get( + const wmManipulator *mpr, wmManipulatorProperty *mpr_prop, + void *value_p) +{ + float *value = value_p; + struct NodeCropWidgetGroup *crop_group = mpr->parent_mgroup->customdata; + const float *dims = crop_group->state.dims; + BLI_assert(mpr_prop->type->array_length == 2); + const bNode *node = mpr_prop->custom_func.user_data; + const NodeTwoXYs *nxy = node->storage; + bool is_relative = (bool)node->custom2; + rctf rct; + two_xy_to_rect(nxy, &rct, dims, is_relative); + value[0] = BLI_rctf_size_x(&rct); + value[1] = BLI_rctf_size_y(&rct); +} + +static void manipulator_node_crop_prop_size_set( + const wmManipulator *mpr, wmManipulatorProperty *mpr_prop, + const void *value_p) +{ + const float *value = value_p; + struct NodeCropWidgetGroup *crop_group = mpr->parent_mgroup->customdata; + const float *dims = crop_group->state.dims; + bNode *node = mpr_prop->custom_func.user_data; + NodeTwoXYs *nxy = node->storage; + bool is_relative = (bool)node->custom2; + BLI_assert(mpr_prop->type->array_length == 2); + rctf rct; + two_xy_to_rect(nxy, &rct, dims, is_relative); + BLI_rctf_resize(&rct, value[0], value[1]); + BLI_rctf_isect(&(rctf){.xmin = 0, .ymin = 0, .xmax = 1, .ymax = 1}, &rct, &rct); + two_xy_from_rect(nxy, &rct, dims, is_relative); + + manipulator_node_crop_update(crop_group); +} + +/* offset callbacks */ +static void manipulator_node_crop_prop_offset_get( + const wmManipulator *mpr, wmManipulatorProperty *mpr_prop, + void *value_p) +{ + float *value = value_p; + struct NodeCropWidgetGroup *crop_group = mpr->parent_mgroup->customdata; + const float *dims = crop_group->state.dims; + BLI_assert(mpr_prop->type->array_length == 2); + const bNode *node = mpr_prop->custom_func.user_data; + const NodeTwoXYs *nxy = node->storage; + bool is_relative = (bool)node->custom2; + rctf rct; + two_xy_to_rect(nxy, &rct, dims, is_relative); + value[0] = (BLI_rctf_cent_x(&rct) - 0.5f) * dims[0]; + value[1] = (BLI_rctf_cent_y(&rct) - 0.5f) * dims[1]; +} + +static void manipulator_node_crop_prop_offset_set( + const wmManipulator *mpr, wmManipulatorProperty *mpr_prop, + const void *value_p) +{ + const float *value = value_p; + struct NodeCropWidgetGroup *crop_group = mpr->parent_mgroup->customdata; + const float *dims = crop_group->state.dims; + bNode *node = mpr_prop->custom_func.user_data; + NodeTwoXYs *nxy = node->storage; + bool is_relative = (bool)node->custom2; + BLI_assert(mpr_prop->type->array_length == 2); + rctf rct; + two_xy_to_rect(nxy, &rct, dims, is_relative); + BLI_rctf_recenter(&rct, (value[0] / dims[0]) + 0.5f, (value[1] / dims[1]) + 0.5f); + BLI_rctf_isect(&(rctf){.xmin = 0, .ymin = 0, .xmax = 1, .ymax = 1}, &rct, &rct); + two_xy_from_rect(nxy, &rct, dims, is_relative); + + manipulator_node_crop_update(crop_group); +} + + +static bool WIDGETGROUP_node_crop_poll(const bContext *C, wmManipulatorGroupType *UNUSED(wgt)) +{ + 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 && ELEM(node->type, CMP_NODE_CROP)) { + /* ignore 'use_crop_size', we can't usefully edit the crop in this case. */ + if ((node->custom1 & (0 << 1)) == 0) { + return true; + } + } + } + + return false; +} + +static void WIDGETGROUP_node_crop_setup(const bContext *UNUSED(C), wmManipulatorGroup *mgroup) +{ + struct NodeCropWidgetGroup *crop_group = MEM_mallocN(sizeof(struct NodeCropWidgetGroup), __func__); + + crop_group->border = WM_manipulator_new("MANIPULATOR_WT_cage_2d", mgroup, NULL); + + RNA_enum_set(crop_group->border->ptr, "transform", + ED_MANIPULATOR_RECT_TRANSFORM_FLAG_TRANSLATE | ED_MANIPULATOR_RECT_TRANSFORM_FLAG_SCALE); + + mgroup->customdata = crop_group; +} + +static void WIDGETGROUP_node_crop_draw_prepare(const bContext *C, wmManipulatorGroup *mgroup) +{ + ARegion *ar = CTX_wm_region(C); + wmManipulator *mpr = mgroup->manipulators.first; + + SpaceNode *snode = CTX_wm_space_node(C); + + unit_m4(mpr->matrix_space); + mul_v3_fl(mpr->matrix_space[0], snode->zoom); + mul_v3_fl(mpr->matrix_space[1], snode->zoom); + mpr->matrix_space[3][0] = (ar->winx / 2) + snode->xof; + mpr->matrix_space[3][1] = (ar->winy / 2) + snode->yof; +} + +static void WIDGETGROUP_node_crop_refresh(const bContext *C, wmManipulatorGroup *mgroup) +{ + struct NodeCropWidgetGroup *crop_group = mgroup->customdata; + wmManipulator *mpr = crop_group->border; + + void *lock; + Image *ima = BKE_image_verify_viewer(IMA_TYPE_COMPOSITE, "Viewer Node"); + ImBuf *ibuf = BKE_image_acquire_ibuf(ima, NULL, &lock); + + if (ibuf) { + crop_group->state.dims[0] = (ibuf->x > 0) ? ibuf->x : 64.0f; + crop_group->state.dims[1] = (ibuf->y > 0) ? ibuf->y : 64.0f; + + RNA_float_set_array(mpr->ptr, "dimensions", crop_group->state.dims); + WM_manipulator_set_flag(mpr, WM_MANIPULATOR_HIDDEN, false); + + SpaceNode *snode = CTX_wm_space_node(C); + bNode *node = nodeGetActive(snode->edittree); + + crop_group->update_data.context = (bContext *)C; + RNA_pointer_create((ID *)snode->edittree, &RNA_CompositorNodeCrop, node, &crop_group->update_data.ptr); + crop_group->update_data.prop = RNA_struct_find_property(&crop_group->update_data.ptr, "relative"); + + WM_manipulator_target_property_def_func( + mpr, "offset", + &(const struct wmManipulatorPropertyFnParams) { + .value_get_fn = manipulator_node_crop_prop_offset_get, + .value_set_fn = manipulator_node_crop_prop_offset_set, + .range_get_fn = NULL, + .user_data = node, + }); + + WM_manipulator_target_property_def_func( + mpr, "scale", + &(const struct wmManipulatorPropertyFnParams) { + .value_get_fn = manipulator_node_crop_prop_size_get, + .value_set_fn = manipulator_node_crop_prop_size_set, + .range_get_fn = NULL, + .user_data = node, + }); + } + else { + WM_manipulator_set_flag(mpr, WM_MANIPULATOR_HIDDEN, true); + } + + BKE_image_release_ibuf(ima, ibuf, lock); +} + +void NODE_WGT_backdrop_crop(wmManipulatorGroupType *wgt) +{ + wgt->name = "Backdrop Crop Widget"; + wgt->idname = "NODE_WGT_backdrop_crop"; + + wgt->flag |= WM_MANIPULATORGROUPTYPE_PERSISTENT; + + wgt->poll = WIDGETGROUP_node_crop_poll; + wgt->setup = WIDGETGROUP_node_crop_setup; + wgt->draw_prepare = WIDGETGROUP_node_crop_draw_prepare; + wgt->refresh = WIDGETGROUP_node_crop_refresh; +} + +/** \} */ diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index c1099f38d92..bc4918430ef 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -866,6 +866,7 @@ static void node_widgets(void) wmManipulatorMapType *mmap_type = WM_manipulatormaptype_ensure( &(const struct wmManipulatorMapType_Params){SPACE_NODE, RGN_TYPE_WINDOW}); WM_manipulatorgrouptype_append_and_link(mmap_type, NODE_WGT_backdrop_transform); + WM_manipulatorgrouptype_append_and_link(mmap_type, NODE_WGT_backdrop_crop); } static void node_id_remap(ScrArea *UNUSED(sa), SpaceLink *slink, ID *old_id, ID *new_id) -- cgit v1.2.3 From 3f644682b01490667fbbc3760304749199ce0ab8 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 9 Aug 2017 15:36:42 +1000 Subject: Manipulator: add sun-beam node manipulator --- source/blender/editors/space_node/node_intern.h | 1 + .../blender/editors/space_node/node_manipulators.c | 106 +++++++++++++++++++++ source/blender/editors/space_node/space_node.c | 1 + 3 files changed, 108 insertions(+) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index 7e8d092cdbe..449e28498a0 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -222,6 +222,7 @@ void NODE_OT_clear_viewer_border(struct wmOperatorType *ot); /* node_widgets.c */ void NODE_WGT_backdrop_transform(struct wmManipulatorGroupType *wgt); void NODE_WGT_backdrop_crop(struct wmManipulatorGroupType *wgt); +void NODE_WGT_backdrop_sun_beams(struct wmManipulatorGroupType *wgt); extern const char *node_context_dir[]; diff --git a/source/blender/editors/space_node/node_manipulators.c b/source/blender/editors/space_node/node_manipulators.c index 8f614137a84..0435e109922 100644 --- a/source/blender/editors/space_node/node_manipulators.c +++ b/source/blender/editors/space_node/node_manipulators.c @@ -373,3 +373,109 @@ void NODE_WGT_backdrop_crop(wmManipulatorGroupType *wgt) } /** \} */ + +/* -------------------------------------------------------------------- */ + +/** \name Sun Beams + * \{ */ + +struct NodeSunBeamsWidgetGroup { + wmManipulator *manipulator; + + struct { + float dims[2]; + } state; +}; + +static bool WIDGETGROUP_node_sbeam_poll(const bContext *C, wmManipulatorGroupType *UNUSED(wgt)) +{ + 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 && ELEM(node->type, CMP_NODE_SUNBEAMS)) { + return true; + } + } + + return false; +} + +static void WIDGETGROUP_node_sbeam_setup(const bContext *UNUSED(C), wmManipulatorGroup *mgroup) +{ + struct NodeSunBeamsWidgetGroup *sbeam_group = MEM_mallocN(sizeof(struct NodeSunBeamsWidgetGroup), __func__); + + sbeam_group->manipulator = WM_manipulator_new("MANIPULATOR_WT_grab_3d", mgroup, NULL); + wmManipulator *mpr = sbeam_group->manipulator; + + RNA_enum_set(mpr->ptr, "draw_style", ED_MANIPULATOR_GRAB_STYLE_CROSS); + + mpr->scale_basis = 0.05f; + + mgroup->customdata = sbeam_group; +} + +static void WIDGETGROUP_node_sbeam_draw_prepare(const bContext *C, wmManipulatorGroup *mgroup) +{ + struct NodeSunBeamsWidgetGroup *sbeam_group = mgroup->customdata; + ARegion *ar = CTX_wm_region(C); + wmManipulator *mpr = mgroup->manipulators.first; + + SpaceNode *snode = CTX_wm_space_node(C); + + unit_m4(mpr->matrix_space); + mul_v3_fl(mpr->matrix_space[0], snode->zoom * sbeam_group->state.dims[0]); + mul_v3_fl(mpr->matrix_space[1], snode->zoom * sbeam_group->state.dims[1]); + mpr->matrix_space[3][0] = ((ar->winx / 2) + snode->xof) - ((sbeam_group->state.dims[0] / 2.0f) * snode->zoom); + mpr->matrix_space[3][1] = ((ar->winy / 2) + snode->yof) - ((sbeam_group->state.dims[1] / 2.0f) * snode->zoom); +} + +static void WIDGETGROUP_node_sbeam_refresh(const bContext *C, wmManipulatorGroup *mgroup) +{ + struct NodeSunBeamsWidgetGroup *sbeam_group = mgroup->customdata; + wmManipulator *mpr = sbeam_group->manipulator; + + void *lock; + Image *ima = BKE_image_verify_viewer(IMA_TYPE_COMPOSITE, "Viewer Node"); + ImBuf *ibuf = BKE_image_acquire_ibuf(ima, NULL, &lock); + + if (ibuf) { + sbeam_group->state.dims[0] = (ibuf->x > 0) ? ibuf->x : 64.0f; + sbeam_group->state.dims[1] = (ibuf->y > 0) ? ibuf->y : 64.0f; + + SpaceNode *snode = CTX_wm_space_node(C); + bNode *node = nodeGetActive(snode->edittree); + + /* need to set property here for undo. TODO would prefer to do this in _init */ + PointerRNA nodeptr; + RNA_pointer_create((ID *)snode->edittree, &RNA_CompositorNodeSunBeams, node, &nodeptr); + WM_manipulator_target_property_def_rna(mpr, "offset", &nodeptr, "source", -1); + + WM_manipulator_set_flag(mpr, WM_MANIPULATOR_DRAW_MODAL, true); + } + else { + WM_manipulator_set_flag(mpr, WM_MANIPULATOR_HIDDEN, true); + } + + BKE_image_release_ibuf(ima, ibuf, lock); +} + +void NODE_WGT_backdrop_sun_beams(wmManipulatorGroupType *wgt) +{ + wgt->name = "Sun Beams Widget"; + wgt->idname = "NODE_WGT_sbeam"; + + wgt->flag |= WM_MANIPULATORGROUPTYPE_PERSISTENT; + + wgt->poll = WIDGETGROUP_node_sbeam_poll; + wgt->setup = WIDGETGROUP_node_sbeam_setup; + wgt->draw_prepare = WIDGETGROUP_node_sbeam_draw_prepare; + wgt->refresh = WIDGETGROUP_node_sbeam_refresh; +} + +/** \} */ diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index bc4918430ef..cf1c975db2f 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -867,6 +867,7 @@ static void node_widgets(void) &(const struct wmManipulatorMapType_Params){SPACE_NODE, RGN_TYPE_WINDOW}); WM_manipulatorgrouptype_append_and_link(mmap_type, NODE_WGT_backdrop_transform); WM_manipulatorgrouptype_append_and_link(mmap_type, NODE_WGT_backdrop_crop); + WM_manipulatorgrouptype_append_and_link(mmap_type, NODE_WGT_backdrop_sun_beams); } static void node_id_remap(ScrArea *UNUSED(sa), SpaceLink *slink, ID *old_id, ID *new_id) -- cgit v1.2.3 From 7cb65cc03833f1bda969a55f68983c542691be02 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 10 Aug 2017 09:44:42 +1000 Subject: Manipulator: rename grab enum We'll want some 3D shapes, so name existing shapes 2D --- source/blender/editors/space_node/node_manipulators.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/node_manipulators.c b/source/blender/editors/space_node/node_manipulators.c index 0435e109922..2064de11c51 100644 --- a/source/blender/editors/space_node/node_manipulators.c +++ b/source/blender/editors/space_node/node_manipulators.c @@ -413,7 +413,7 @@ static void WIDGETGROUP_node_sbeam_setup(const bContext *UNUSED(C), wmManipulato sbeam_group->manipulator = WM_manipulator_new("MANIPULATOR_WT_grab_3d", mgroup, NULL); wmManipulator *mpr = sbeam_group->manipulator; - RNA_enum_set(mpr->ptr, "draw_style", ED_MANIPULATOR_GRAB_STYLE_CROSS); + RNA_enum_set(mpr->ptr, "draw_style", ED_MANIPULATOR_GRAB_STYLE_CROSS_2D); mpr->scale_basis = 0.05f; -- cgit v1.2.3 From ba4ffe90cd62dd84fdc4be8bbf3f6de1c7b696b2 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 10 Aug 2017 21:01:03 +1000 Subject: Manipulator: add compositor corner-pin widgets --- source/blender/editors/space_node/node_intern.h | 1 + .../blender/editors/space_node/node_manipulators.c | 162 +++++++++++++++++++-- source/blender/editors/space_node/space_node.c | 1 + 3 files changed, 154 insertions(+), 10 deletions(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index 449e28498a0..12e3c33007e 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -223,6 +223,7 @@ void NODE_OT_clear_viewer_border(struct wmOperatorType *ot); void NODE_WGT_backdrop_transform(struct wmManipulatorGroupType *wgt); void NODE_WGT_backdrop_crop(struct wmManipulatorGroupType *wgt); void NODE_WGT_backdrop_sun_beams(struct wmManipulatorGroupType *wgt); +void NODE_WGT_backdrop_corner_pin(struct wmManipulatorGroupType *wgt); extern const char *node_context_dir[]; diff --git a/source/blender/editors/space_node/node_manipulators.c b/source/blender/editors/space_node/node_manipulators.c index 2064de11c51..61006597da8 100644 --- a/source/blender/editors/space_node/node_manipulators.c +++ b/source/blender/editors/space_node/node_manipulators.c @@ -45,6 +45,35 @@ #include "node_intern.h" +/* -------------------------------------------------------------------- */ + +/** \name Local Utilities + * \{ */ + +static void node_manipulator_calc_matrix_space( + const SpaceNode *snode, const ARegion *ar, float matrix_space[4][4]) +{ + unit_m4(matrix_space); + mul_v3_fl(matrix_space[0], snode->zoom); + mul_v3_fl(matrix_space[1], snode->zoom); + matrix_space[3][0] = (ar->winx / 2) + snode->xof; + matrix_space[3][1] = (ar->winy / 2) + snode->yof; +} + +static void node_manipulator_calc_matrix_space_with_image_dims( + const SpaceNode *snode, const ARegion *ar, const float image_dims[2], float matrix_space[4][4]) +{ + unit_m4(matrix_space); + mul_v3_fl(matrix_space[0], snode->zoom * image_dims[0]); + mul_v3_fl(matrix_space[1], snode->zoom * image_dims[1]); + matrix_space[3][0] = ((ar->winx / 2) + snode->xof) - ((image_dims[0] / 2.0f) * snode->zoom); + matrix_space[3][1] = ((ar->winy / 2) + snode->yof) - ((image_dims[1] / 2.0f) * snode->zoom); +} + +/** \} */ + + + /* -------------------------------------------------------------------- */ /** \name Backdrop Manipulator @@ -304,11 +333,7 @@ static void WIDGETGROUP_node_crop_draw_prepare(const bContext *C, wmManipulatorG SpaceNode *snode = CTX_wm_space_node(C); - unit_m4(mpr->matrix_space); - mul_v3_fl(mpr->matrix_space[0], snode->zoom); - mul_v3_fl(mpr->matrix_space[1], snode->zoom); - mpr->matrix_space[3][0] = (ar->winx / 2) + snode->xof; - mpr->matrix_space[3][1] = (ar->winy / 2) + snode->yof; + node_manipulator_calc_matrix_space(snode, ar, mpr->matrix_space); } static void WIDGETGROUP_node_crop_refresh(const bContext *C, wmManipulatorGroup *mgroup) @@ -428,11 +453,7 @@ static void WIDGETGROUP_node_sbeam_draw_prepare(const bContext *C, wmManipulator SpaceNode *snode = CTX_wm_space_node(C); - unit_m4(mpr->matrix_space); - mul_v3_fl(mpr->matrix_space[0], snode->zoom * sbeam_group->state.dims[0]); - mul_v3_fl(mpr->matrix_space[1], snode->zoom * sbeam_group->state.dims[1]); - mpr->matrix_space[3][0] = ((ar->winx / 2) + snode->xof) - ((sbeam_group->state.dims[0] / 2.0f) * snode->zoom); - mpr->matrix_space[3][1] = ((ar->winy / 2) + snode->yof) - ((sbeam_group->state.dims[1] / 2.0f) * snode->zoom); + node_manipulator_calc_matrix_space_with_image_dims(snode, ar, sbeam_group->state.dims, mpr->matrix_space); } static void WIDGETGROUP_node_sbeam_refresh(const bContext *C, wmManipulatorGroup *mgroup) @@ -479,3 +500,124 @@ void NODE_WGT_backdrop_sun_beams(wmManipulatorGroupType *wgt) } /** \} */ + + + +/* -------------------------------------------------------------------- */ + +/** \name Corner Pin + * \{ */ + +struct NodeCornerPinWidgetGroup { + wmManipulator *manipulators[4]; + + struct { + float dims[2]; + } state; +}; + +static bool WIDGETGROUP_node_corner_pin_poll(const bContext *C, wmManipulatorGroupType *UNUSED(wgt)) +{ + 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 && ELEM(node->type, CMP_NODE_CORNERPIN)) { + return true; + } + } + + return false; +} + +static void WIDGETGROUP_node_corner_pin_setup(const bContext *UNUSED(C), wmManipulatorGroup *mgroup) +{ + struct NodeCornerPinWidgetGroup *cpin_group = MEM_mallocN(sizeof(struct NodeCornerPinWidgetGroup), __func__); + const wmManipulatorType *wt_grab_3d = WM_manipulatortype_find("MANIPULATOR_WT_grab_3d", false); + + for (int i = 0; i < 4; i++) { + cpin_group->manipulators[i] = WM_manipulator_new_ptr(wt_grab_3d, mgroup, NULL); + wmManipulator *mpr = cpin_group->manipulators[i]; + + RNA_enum_set(mpr->ptr, "draw_style", ED_MANIPULATOR_GRAB_STYLE_CROSS_2D); + + mpr->scale_basis = 0.01f; + } + + mgroup->customdata = cpin_group; +} + +static void WIDGETGROUP_node_corner_pin_draw_prepare(const bContext *C, wmManipulatorGroup *mgroup) +{ + struct NodeCornerPinWidgetGroup *cpin_group = mgroup->customdata; + ARegion *ar = CTX_wm_region(C); + + SpaceNode *snode = CTX_wm_space_node(C); + + float matrix_space[4][4]; + node_manipulator_calc_matrix_space_with_image_dims(snode, ar, cpin_group->state.dims, matrix_space); + + for (int i = 0; i < 4; i++) { + wmManipulator *mpr = cpin_group->manipulators[i]; + copy_m4_m4(mpr->matrix_space, matrix_space); + } +} + +static void WIDGETGROUP_node_corner_pin_refresh(const bContext *C, wmManipulatorGroup *mgroup) +{ + struct NodeCornerPinWidgetGroup *cpin_group = mgroup->customdata; + + void *lock; + Image *ima = BKE_image_verify_viewer(IMA_TYPE_COMPOSITE, "Viewer Node"); + ImBuf *ibuf = BKE_image_acquire_ibuf(ima, NULL, &lock); + + if (ibuf) { + cpin_group->state.dims[0] = (ibuf->x > 0) ? ibuf->x : 64.0f; + cpin_group->state.dims[1] = (ibuf->y > 0) ? ibuf->y : 64.0f; + + SpaceNode *snode = CTX_wm_space_node(C); + bNode *node = nodeGetActive(snode->edittree); + + /* need to set property here for undo. TODO would prefer to do this in _init */ + int i = 0; + for (bNodeSocket *sock = node->inputs.first; sock && i < 4; sock = sock->next) { + if (sock->type == SOCK_VECTOR) { + wmManipulator *mpr = cpin_group->manipulators[i++]; + + PointerRNA sockptr; + RNA_pointer_create((ID *)snode->edittree, &RNA_NodeSocket, sock, &sockptr); + WM_manipulator_target_property_def_rna(mpr, "offset", &sockptr, "default_value", -1); + + WM_manipulator_set_flag(mpr, WM_MANIPULATOR_DRAW_MODAL, true); + } + } + } + else { + for (int i = 0; i < 4; i++) { + wmManipulator *mpr = cpin_group->manipulators[i]; + WM_manipulator_set_flag(mpr, WM_MANIPULATOR_HIDDEN, true); + } + } + + BKE_image_release_ibuf(ima, ibuf, lock); +} + +void NODE_WGT_backdrop_corner_pin(wmManipulatorGroupType *wgt) +{ + wgt->name = "Corner Pin Widget"; + wgt->idname = "NODE_WGT_backdrop_corner_pin"; + + wgt->flag |= WM_MANIPULATORGROUPTYPE_PERSISTENT; + + wgt->poll = WIDGETGROUP_node_corner_pin_poll; + wgt->setup = WIDGETGROUP_node_corner_pin_setup; + wgt->draw_prepare = WIDGETGROUP_node_corner_pin_draw_prepare; + wgt->refresh = WIDGETGROUP_node_corner_pin_refresh; +} + +/** \} */ diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index cf1c975db2f..af71851cf64 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -868,6 +868,7 @@ static void node_widgets(void) WM_manipulatorgrouptype_append_and_link(mmap_type, NODE_WGT_backdrop_transform); WM_manipulatorgrouptype_append_and_link(mmap_type, NODE_WGT_backdrop_crop); WM_manipulatorgrouptype_append_and_link(mmap_type, NODE_WGT_backdrop_sun_beams); + WM_manipulatorgrouptype_append_and_link(mmap_type, NODE_WGT_backdrop_corner_pin); } static void node_id_remap(ScrArea *UNUSED(sa), SpaceLink *slink, ID *old_id, ID *new_id) -- cgit v1.2.3 From e8f0ee157b290e41258bf704d63c00cb2d4d2a90 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Thu, 17 Aug 2017 15:54:05 +0200 Subject: Swap Eevee material output with (Cycles) Material Output Since we started supporting the (Cycles) Material Output old files stopped working. There is no reason to keep the original Eevee material otuput anymore. It includes doversion for old files. --- source/blender/editors/space_node/node_edit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 33382af9087..b5d6104432f 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -399,7 +399,7 @@ void ED_node_shader_default(const bContext *C, ID *id) ma->nodetree = ntree; if (BKE_scene_uses_blender_eevee(scene)) { - output_type = SH_NODE_OUTPUT_EEVEE_MATERIAL; + output_type = SH_NODE_OUTPUT_MATERIAL; shader_type = SH_NODE_EEVEE_METALLIC; } else if (BKE_scene_use_new_shading_nodes(scene)) { -- cgit v1.2.3 From 036f43f3cde472867de87032297d74390aa2815e Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Fri, 18 Aug 2017 16:40:04 +0200 Subject: Eevee: Convert metallic nodes into princinpled nodes And wipe metallic out of the map. --- source/blender/editors/space_node/node_edit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index b5d6104432f..fa3508ecfd1 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -400,7 +400,7 @@ void ED_node_shader_default(const bContext *C, ID *id) if (BKE_scene_uses_blender_eevee(scene)) { output_type = SH_NODE_OUTPUT_MATERIAL; - shader_type = SH_NODE_EEVEE_METALLIC; + shader_type = SH_NODE_BSDF_PRINCIPLED; } else if (BKE_scene_use_new_shading_nodes(scene)) { output_type = SH_NODE_OUTPUT_MATERIAL; -- cgit v1.2.3 From 1a76bc7aeb8ccdffde2d52b9ef66c8af24920aba Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 23 Aug 2017 11:47:47 +0200 Subject: Fix T52218: Missing update when reconnecting node If node was connected to output, we tag tree for update no matter where the node was re-plugged to. Should be safe for 2.79. --- source/blender/editors/space_node/node_relationships.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/node_relationships.c b/source/blender/editors/space_node/node_relationships.c index 5f592431558..3b03399a5e7 100644 --- a/source/blender/editors/space_node/node_relationships.c +++ b/source/blender/editors/space_node/node_relationships.c @@ -567,7 +567,13 @@ static void node_link_exit(bContext *C, wmOperator *op, bool apply_links) ntree->is_updating = true; for (linkdata = nldrag->links.first; linkdata; linkdata = linkdata->next) { bNodeLink *link = linkdata->data; - + + /* See note below, but basically TEST flag means that the link + * was connected to output (or to a node which affects the + * output). + */ + do_tag_update |= (link->flag & NODE_LINK_TEST) != 0; + if (apply_links && link->tosock && link->fromsock) { /* before actually adding the link, * let nodes perform special link insertion handling @@ -593,11 +599,6 @@ static void node_link_exit(bContext *C, wmOperator *op, bool apply_links) } } else { - /* See note below, but basically TEST flag means that the link - * was connected to output (or to a node which affects the - * output). - */ - do_tag_update |= (link->flag & NODE_LINK_TEST) != 0; nodeRemLink(ntree, link); } } -- cgit v1.2.3 From db1ffe11b66c235662b32177c00c537b44e331a4 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Aug 2017 12:51:44 +1000 Subject: Cleanup: naming (RECT -> CAGE2D) Make cage2d 'part' defines public (needed to assign operator actions). --- source/blender/editors/space_node/node_manipulators.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/node_manipulators.c b/source/blender/editors/space_node/node_manipulators.c index 61006597da8..1c6aad549ec 100644 --- a/source/blender/editors/space_node/node_manipulators.c +++ b/source/blender/editors/space_node/node_manipulators.c @@ -105,7 +105,7 @@ static void WIDGETGROUP_node_transform_setup(const bContext *UNUSED(C), wmManipu wwrapper->manipulator = WM_manipulator_new("MANIPULATOR_WT_cage_2d", mgroup, NULL); RNA_enum_set(wwrapper->manipulator->ptr, "transform", - ED_MANIPULATOR_RECT_TRANSFORM_FLAG_TRANSLATE | ED_MANIPULATOR_RECT_TRANSFORM_FLAG_SCALE_UNIFORM); + ED_MANIPULATOR_CAGE2D_XFORM_FLAG_TRANSLATE | ED_MANIPULATOR_CAGE2D_XFORM_FLAG_SCALE_UNIFORM); mgroup->customdata = wwrapper; } @@ -321,7 +321,7 @@ static void WIDGETGROUP_node_crop_setup(const bContext *UNUSED(C), wmManipulator crop_group->border = WM_manipulator_new("MANIPULATOR_WT_cage_2d", mgroup, NULL); RNA_enum_set(crop_group->border->ptr, "transform", - ED_MANIPULATOR_RECT_TRANSFORM_FLAG_TRANSLATE | ED_MANIPULATOR_RECT_TRANSFORM_FLAG_SCALE); + ED_MANIPULATOR_CAGE2D_XFORM_FLAG_TRANSLATE | ED_MANIPULATOR_CAGE2D_XFORM_FLAG_SCALE); mgroup->customdata = crop_group; } -- cgit v1.2.3 From 00ba48a6997d5421a899101b696e5f86c0bdef0a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 Aug 2017 01:38:51 +1000 Subject: Manipulator: replace old cage2d manipulator Mostly internal changes, keeping both manipulators could have worked but there was no point long term. There are still some glitches to resolve, will work on those next. --- .../blender/editors/space_node/node_manipulators.c | 113 ++++++++++----------- 1 file changed, 52 insertions(+), 61 deletions(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/node_manipulators.c b/source/blender/editors/space_node/node_manipulators.c index 1c6aad549ec..8e736e47963 100644 --- a/source/blender/editors/space_node/node_manipulators.c +++ b/source/blender/editors/space_node/node_manipulators.c @@ -79,6 +79,32 @@ static void node_manipulator_calc_matrix_space_with_image_dims( /** \name Backdrop Manipulator * \{ */ +static void manipulator_node_backdrop_prop_matrix_get( + const wmManipulator *UNUSED(mpr), wmManipulatorProperty *mpr_prop, + void *value_p) +{ + float (*matrix)[4] = value_p; + BLI_assert(mpr_prop->type->array_length == 16); + const SpaceNode *snode = mpr_prop->custom_func.user_data; + matrix[0][0] = snode->zoom; + matrix[1][1] = snode->zoom; + matrix[3][0] = snode->xof; + matrix[3][1] = snode->yof; +} + +static void manipulator_node_backdrop_prop_matrix_set( + const wmManipulator *UNUSED(mpr), wmManipulatorProperty *mpr_prop, + const void *value_p) +{ + const float (*matrix)[4] = value_p; + BLI_assert(mpr_prop->type->array_length == 16); + SpaceNode *snode = mpr_prop->custom_func.user_data; + snode->zoom = matrix[0][0]; + snode->zoom = matrix[1][1]; + snode->xof = matrix[3][0]; + snode->yof = matrix[3][1]; +} + static bool WIDGETGROUP_node_transform_poll(const bContext *C, wmManipulatorGroupType *UNUSED(wgt)) { SpaceNode *snode = CTX_wm_space_node(C); @@ -133,10 +159,21 @@ static void WIDGETGROUP_node_transform_refresh(const bContext *C, wmManipulatorG /* need to set property here for undo. TODO would prefer to do this in _init */ SpaceNode *snode = CTX_wm_space_node(C); +#if 0 PointerRNA nodeptr; RNA_pointer_create(snode->id, &RNA_SpaceNodeEditor, snode, &nodeptr); WM_manipulator_target_property_def_rna(cage, "offset", &nodeptr, "backdrop_offset", -1); WM_manipulator_target_property_def_rna(cage, "scale", &nodeptr, "backdrop_zoom", -1); +#endif + + WM_manipulator_target_property_def_func( + cage, "matrix", + &(const struct wmManipulatorPropertyFnParams) { + .value_get_fn = manipulator_node_backdrop_prop_matrix_get, + .value_set_fn = manipulator_node_backdrop_prop_matrix_set, + .range_get_fn = NULL, + .user_data = snode, + }); } else { WM_manipulator_set_flag(cage, WM_MANIPULATOR_HIDDEN, true); @@ -216,82 +253,45 @@ static void two_xy_from_rect(NodeTwoXYs *nxy, const rctf *rect, const float dims } /* scale callbacks */ -static void manipulator_node_crop_prop_size_get( +static void manipulator_node_crop_prop_matrix_get( const wmManipulator *mpr, wmManipulatorProperty *mpr_prop, void *value_p) { - float *value = value_p; + float (*matrix)[4] = value_p; + BLI_assert(mpr_prop->type->array_length == 16); struct NodeCropWidgetGroup *crop_group = mpr->parent_mgroup->customdata; const float *dims = crop_group->state.dims; - BLI_assert(mpr_prop->type->array_length == 2); const bNode *node = mpr_prop->custom_func.user_data; const NodeTwoXYs *nxy = node->storage; bool is_relative = (bool)node->custom2; rctf rct; two_xy_to_rect(nxy, &rct, dims, is_relative); - value[0] = BLI_rctf_size_x(&rct); - value[1] = BLI_rctf_size_y(&rct); + matrix[0][0] = BLI_rctf_size_x(&rct); + matrix[1][1] = BLI_rctf_size_y(&rct); + matrix[3][0] = (BLI_rctf_cent_x(&rct) - 0.5f) * dims[0]; + matrix[3][1] = (BLI_rctf_cent_y(&rct) - 0.5f) * dims[1]; } -static void manipulator_node_crop_prop_size_set( +static void manipulator_node_crop_prop_matrix_set( const wmManipulator *mpr, wmManipulatorProperty *mpr_prop, const void *value_p) { - const float *value = value_p; + const float (*matrix)[4] = value_p; + BLI_assert(mpr_prop->type->array_length == 16); struct NodeCropWidgetGroup *crop_group = mpr->parent_mgroup->customdata; const float *dims = crop_group->state.dims; bNode *node = mpr_prop->custom_func.user_data; NodeTwoXYs *nxy = node->storage; bool is_relative = (bool)node->custom2; - BLI_assert(mpr_prop->type->array_length == 2); rctf rct; two_xy_to_rect(nxy, &rct, dims, is_relative); - BLI_rctf_resize(&rct, value[0], value[1]); + BLI_rctf_resize(&rct, matrix[0][0], matrix[1][1]); + BLI_rctf_recenter(&rct, (matrix[3][0] / dims[0]) + 0.5f, (matrix[3][1] / dims[1]) + 0.5f); BLI_rctf_isect(&(rctf){.xmin = 0, .ymin = 0, .xmax = 1, .ymax = 1}, &rct, &rct); two_xy_from_rect(nxy, &rct, dims, is_relative); - manipulator_node_crop_update(crop_group); } -/* offset callbacks */ -static void manipulator_node_crop_prop_offset_get( - const wmManipulator *mpr, wmManipulatorProperty *mpr_prop, - void *value_p) -{ - float *value = value_p; - struct NodeCropWidgetGroup *crop_group = mpr->parent_mgroup->customdata; - const float *dims = crop_group->state.dims; - BLI_assert(mpr_prop->type->array_length == 2); - const bNode *node = mpr_prop->custom_func.user_data; - const NodeTwoXYs *nxy = node->storage; - bool is_relative = (bool)node->custom2; - rctf rct; - two_xy_to_rect(nxy, &rct, dims, is_relative); - value[0] = (BLI_rctf_cent_x(&rct) - 0.5f) * dims[0]; - value[1] = (BLI_rctf_cent_y(&rct) - 0.5f) * dims[1]; -} - -static void manipulator_node_crop_prop_offset_set( - const wmManipulator *mpr, wmManipulatorProperty *mpr_prop, - const void *value_p) -{ - const float *value = value_p; - struct NodeCropWidgetGroup *crop_group = mpr->parent_mgroup->customdata; - const float *dims = crop_group->state.dims; - bNode *node = mpr_prop->custom_func.user_data; - NodeTwoXYs *nxy = node->storage; - bool is_relative = (bool)node->custom2; - BLI_assert(mpr_prop->type->array_length == 2); - rctf rct; - two_xy_to_rect(nxy, &rct, dims, is_relative); - BLI_rctf_recenter(&rct, (value[0] / dims[0]) + 0.5f, (value[1] / dims[1]) + 0.5f); - BLI_rctf_isect(&(rctf){.xmin = 0, .ymin = 0, .xmax = 1, .ymax = 1}, &rct, &rct); - two_xy_from_rect(nxy, &rct, dims, is_relative); - - manipulator_node_crop_update(crop_group); -} - - static bool WIDGETGROUP_node_crop_poll(const bContext *C, wmManipulatorGroupType *UNUSED(wgt)) { SpaceNode *snode = CTX_wm_space_node(C); @@ -360,19 +360,10 @@ static void WIDGETGROUP_node_crop_refresh(const bContext *C, wmManipulatorGroup crop_group->update_data.prop = RNA_struct_find_property(&crop_group->update_data.ptr, "relative"); WM_manipulator_target_property_def_func( - mpr, "offset", - &(const struct wmManipulatorPropertyFnParams) { - .value_get_fn = manipulator_node_crop_prop_offset_get, - .value_set_fn = manipulator_node_crop_prop_offset_set, - .range_get_fn = NULL, - .user_data = node, - }); - - WM_manipulator_target_property_def_func( - mpr, "scale", + mpr, "matrix", &(const struct wmManipulatorPropertyFnParams) { - .value_get_fn = manipulator_node_crop_prop_size_get, - .value_set_fn = manipulator_node_crop_prop_size_set, + .value_get_fn = manipulator_node_crop_prop_matrix_get, + .value_set_fn = manipulator_node_crop_prop_matrix_set, .range_get_fn = NULL, .user_data = node, }); -- cgit v1.2.3 From 8172e8e528f9f19d566cdbd229e8ef7c7170acc2 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 7 Sep 2017 04:45:38 +1000 Subject: Node UI: Add square and diamond socked draw styles Currently not used by Blender's node trees D2814 by @charlie --- source/blender/editors/space_node/drawnode.c | 2 +- source/blender/editors/space_node/node_draw.c | 107 +++++++++++++++++------- source/blender/editors/space_node/node_intern.h | 5 +- 3 files changed, 80 insertions(+), 34 deletions(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index f58b4050834..6185f4afbe2 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -638,7 +638,7 @@ static void node_draw_reroute(const bContext *C, ARegion *ar, SpaceNode *UNUSED( * highlight also if node itself is selected, since we don't display the node body separately! */ for (sock = node->inputs.first; sock; sock = sock->next) { - node_socket_circle_draw(C, ntree, node, sock, socket_size, (sock->flag & SELECT) || (node->flag & SELECT)); + node_socket_draw(C, ntree, node, sock, socket_size, (sock->flag & SELECT) || (node->flag & SELECT)); } UI_block_end(C, node->block); diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index 6e25c87d274..213e326b1a6 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -617,34 +617,22 @@ static void node_draw_mute_line(View2D *v2d, SpaceNode *snode, bNode *node) glDisable(GL_LINE_SMOOTH); } -/* this might have some more generic use */ -static void node_circle_draw(float x, float y, float size, const float col[4], int highlight) +static void node_socket_shape_draw( + float x, float y, float size, const float col[4], bool highlight, + const float coords[][2], int coords_len) { - /* 16 values of sin function */ - static const float si[16] = { - 0.00000000f, 0.39435585f, 0.72479278f, 0.93775213f, - 0.99871650f, 0.89780453f, 0.65137248f, 0.29936312f, - -0.10116832f, -0.48530196f, -0.79077573f, -0.96807711f, - -0.98846832f, -0.84864425f, -0.57126821f, -0.20129852f - }; - /* 16 values of cos function */ - static const float co[16] = { - 1.00000000f, 0.91895781f, 0.68896691f, 0.34730525f, - -0.05064916f, -0.44039415f, -0.75875812f, -0.95413925f, - -0.99486932f, -0.87434661f, -0.61210598f, -0.25065253f, - 0.15142777f, 0.52896401f, 0.82076344f, 0.97952994f, - }; int a; - + glColor4fv(col); - + glEnable(GL_BLEND); glBegin(GL_POLYGON); - for (a = 0; a < 16; a++) - glVertex2f(x + size * si[a], y + size * co[a]); + for (a = 0; a < coords_len; a++) { + glVertex2f(x + size * coords[a][0], y + size * coords[a][1]); + } glEnd(); glDisable(GL_BLEND); - + if (highlight) { UI_ThemeColor(TH_TEXT_HI); glLineWidth(1.5f); @@ -655,14 +643,16 @@ static void node_circle_draw(float x, float y, float size, const float col[4], i glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH); glBegin(GL_LINE_LOOP); - for (a = 0; a < 16; a++) - glVertex2f(x + size * si[a], y + size * co[a]); + for (a = 0; a < coords_len; a++) { + glVertex2f(x + size * coords[a][0], y + size * coords[a][1]); + } glEnd(); glDisable(GL_LINE_SMOOTH); glDisable(GL_BLEND); } -void node_socket_circle_draw(const bContext *C, bNodeTree *ntree, bNode *node, bNodeSocket *sock, float size, int highlight) + +void node_socket_draw(const bContext *C, bNodeTree *ntree, bNode *node, bNodeSocket *sock, float size, bool highlight) { PointerRNA ptr, node_ptr; float color[4]; @@ -670,7 +660,60 @@ void node_socket_circle_draw(const bContext *C, bNodeTree *ntree, bNode *node, b RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr); RNA_pointer_create((ID *)ntree, &RNA_Node, node, &node_ptr); sock->typeinfo->draw_color((bContext *)C, &ptr, &node_ptr, color); - node_circle_draw(sock->locx, sock->locy, size, color, highlight); + + /* 16 values of {sin, cos} function */ + const float shape_circle[16][2] = { + {0.00000000f, 1.00000000f}, + {0.39435585f, 0.91895781f}, + {0.72479278f, 0.68896691f}, + {0.93775213f, 0.34730525f}, + {0.99871650f, -0.05064916f}, + {0.89780453f, -0.44039415f}, + {0.65137248f, -0.75875812f}, + {0.29936312f, -0.95413925f}, + {-0.10116832f, -0.99486932f}, + {-0.48530196f, -0.87434661f}, + {-0.79077573f, -0.61210598f}, + {-0.96807711f, -0.25065253f}, + {-0.98846832f, 0.15142777f}, + {-0.84864425f, 0.52896401f}, + {-0.57126821f, 0.82076344f}, + {-0.20129852f, 0.97952994f } + }; + + const float shape_diamond[4][2] = { + {0.0f, 1.2f}, + {1.2f, 0.0f}, + {0.0f, -1.2f}, + {-1.2f, 0.0f}, + }; + + const float shape_square[4][2] = { + {-0.9f, 0.9f}, + {0.9f, 0.9f}, + {0.9f, -0.9f}, + {-0.9f, -0.9f}, + }; + + const float (*shape)[2]; + int shape_len; + switch (sock->draw_shape) { + default: + case SOCK_DRAW_SHAPE_CIRCLE: + shape = shape_circle; + shape_len = ARRAY_SIZE(shape_circle); + break; + case SOCK_DRAW_SHAPE_DIAMOND: + shape = shape_diamond; + shape_len = ARRAY_SIZE(shape_diamond); + break; + case SOCK_DRAW_SHAPE_SQUARE: + shape = shape_square; + shape_len = ARRAY_SIZE(shape_square); + break; + } + + node_socket_shape_draw(sock->locx, sock->locy, size, color, highlight, shape, shape_len); } /* ************** Socket callbacks *********** */ @@ -935,7 +978,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN if (nodeSocketIsHidden(sock)) continue; - node_socket_circle_draw(C, ntree, node, sock, NODE_SOCKSIZE, sock->flag & SELECT); + node_socket_draw(C, ntree, node, sock, NODE_SOCKSIZE, sock->flag & SELECT); } /* socket outputs */ @@ -943,7 +986,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN if (nodeSocketIsHidden(sock)) continue; - node_socket_circle_draw(C, ntree, node, sock, NODE_SOCKSIZE, sock->flag & SELECT); + node_socket_draw(C, ntree, node, sock, NODE_SOCKSIZE, sock->flag & SELECT); } /* preview */ @@ -1066,13 +1109,15 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b /* sockets */ for (sock = node->inputs.first; sock; sock = sock->next) { - if (!nodeSocketIsHidden(sock)) - node_socket_circle_draw(C, ntree, node, sock, socket_size, sock->flag & SELECT); + if (!nodeSocketIsHidden(sock)) { + node_socket_draw(C, ntree, node, sock, socket_size, sock->flag & SELECT); + } } for (sock = node->outputs.first; sock; sock = sock->next) { - if (!nodeSocketIsHidden(sock)) - node_socket_circle_draw(C, ntree, node, sock, socket_size, sock->flag & SELECT); + if (!nodeSocketIsHidden(sock)) { + node_socket_draw(C, ntree, node, sock, socket_size, sock->flag & SELECT); + } } UI_block_end(C, node->block); diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index 6b8fa0b88fe..352f9e51012 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -67,8 +67,9 @@ void snode_group_offset(struct SpaceNode *snode, float *x, float *y); /* transfo /* node_draw.c */ int node_get_colorid(struct bNode *node); -void node_socket_circle_draw(const struct bContext *C, struct bNodeTree *ntree, struct bNode *node, - struct bNodeSocket *sock, float size, int highlight); +void node_socket_draw( + const struct bContext *C, struct bNodeTree *ntree, struct bNode *node, + struct bNodeSocket *sock, float size, bool highlight); int node_get_resize_cursor(int directions); void node_draw_shadow(struct SpaceNode *snode, struct bNode *node, float radius, float alpha); void node_draw_default(const struct bContext *C, struct ARegion *ar, struct SpaceNode *snode, -- cgit v1.2.3 From 29a7ad8b1a76735ae7f41566fa3361f18346e5ec Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 13 Sep 2017 21:46:43 +1000 Subject: Node UI: scale cross by pixelsize Draws a little smaller to fit with 2.8x manipulator. --- source/blender/editors/space_node/drawnode.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 6185f4afbe2..7ef34669ee2 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -2204,16 +2204,17 @@ static void node_composit_backdrop_viewer(SpaceNode *snode, ImBuf *backdrop, bNo if (node->custom1 == 0) { const float backdropWidth = backdrop->x; const float backdropHeight = backdrop->y; - const float cx = x + snode->zoom * backdropWidth * node->custom3; + const float cx = x + snode->zoom * backdropWidth * node->custom3; const float cy = y + snode->zoom * backdropHeight * node->custom4; + const float cross_size = 12 * U.pixelsize; glColor3f(1.0, 1.0, 1.0); glBegin(GL_LINES); - glVertex2f(cx - 25, cy - 25); - glVertex2f(cx + 25, cy + 25); - glVertex2f(cx + 25, cy - 25); - glVertex2f(cx - 25, cy + 25); + glVertex2f(cx - cross_size, cy - cross_size); + glVertex2f(cx + cross_size, cy + cross_size); + glVertex2f(cx + cross_size, cy - cross_size); + glVertex2f(cx - cross_size, cy + cross_size); glEnd(); } } -- cgit v1.2.3 From 6d359e4498848d795b8043e923850d0a0da7f4ed Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 14 Sep 2017 00:39:28 +1000 Subject: Cleanup: use explicit 2d suffix for imm utils Avoid ambiguity between 2d/3d (which were already named). --- source/blender/editors/space_node/node_draw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index d99d1c97653..09380977705 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -716,7 +716,7 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv) unsigned int pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); immUniformThemeColorShadeAlpha(TH_BACK, -15, +100); - imm_draw_line_box(pos, draw_rect.xmin, draw_rect.ymin, draw_rect.xmax, draw_rect.ymax); + imm_draw_line_box_2d(pos, draw_rect.xmin, draw_rect.ymin, draw_rect.xmax, draw_rect.ymax); immUnbindProgram(); } -- cgit v1.2.3 From ff7940640433d65ef3fc9e4662ffc8a171b4a07b Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 12 Sep 2017 11:27:22 +0500 Subject: Fix T52653: Render output of linked scenes conflicts with other scenes with the same name The issue was caused by render result identifier only consist of scene name, which could indeed cause conflicts. On the one hand, there are quite some areas in Blender where we need identifier to be unique to properly address things. Usually this is required for sub-data of IDs, like bones. On another hand, it's not that hard to support this particular case and avoid possible frustration. The idea is, we add library name to render identifier for linked scenes. We use library name and not pointer so we preserve render results through undo stack. Reviewers: campbellbarton, mont29, brecht Reviewed By: mont29 Differential Revision: https://developer.blender.org/D2836 --- source/blender/editors/space_node/node_edit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 5f8f839025f..e91fd1ee575 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -1321,7 +1321,7 @@ static int node_read_fullsamplelayers_exec(bContext *C, wmOperator *UNUSED(op)) Main *bmain = CTX_data_main(C); SpaceNode *snode = CTX_wm_space_node(C); Scene *curscene = CTX_data_scene(C); - Render *re = RE_NewRender(curscene->id.name); + Render *re = RE_NewSceneRender(curscene); WM_cursor_wait(1); RE_MergeFullSample(re, bmain, curscene, snode->nodetree); -- cgit v1.2.3 From 63dfb5bb97b1a320a0f5e51eaca51d7b25902aa4 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 26 Sep 2017 15:21:01 +1000 Subject: Cleanup: naming (GPU immediate util) --- source/blender/editors/space_node/node_draw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index 09380977705..4549809d481 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -716,7 +716,7 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv) unsigned int pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); immUniformThemeColorShadeAlpha(TH_BACK, -15, +100); - imm_draw_line_box_2d(pos, draw_rect.xmin, draw_rect.ymin, draw_rect.xmax, draw_rect.ymax); + imm_draw_box_wire_2d(pos, draw_rect.xmin, draw_rect.ymin, draw_rect.xmax, draw_rect.ymax); immUnbindProgram(); } -- cgit v1.2.3 From 43b49130516db974c125d89919fe8ddc25cf4405 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 27 Sep 2017 11:13:03 +1000 Subject: Math Lib: Add non-clamped round_* functions Replace iroundf with round_fl_to_int, add other types --- source/blender/editors/space_node/node_draw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index 213e326b1a6..d7119302611 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -1091,7 +1091,7 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b // BLI_snprintf(showname, sizeof(showname), "[%s]", showname); /* XXX - don't print into self! */ uiDefBut(node->block, UI_BTYPE_LABEL, 0, showname, - iroundf(rct->xmin + NODE_MARGIN_X), iroundf(centy - NODE_DY * 0.5f), + round_fl_to_int(rct->xmin + NODE_MARGIN_X), round_fl_to_int(centy - NODE_DY * 0.5f), (short)(BLI_rctf_size_x(rct) - 18.0f - 12.0f), (short)NODE_DY, NULL, 0, 0, 0, 0, ""); } -- cgit v1.2.3 From d27ca066e73bfc4168830292643dc1caee510ba4 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 5 Oct 2017 10:47:08 +1100 Subject: Fix passing the same argument twice to BLI_strncpy --- source/blender/editors/space_node/node_templates.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/node_templates.c b/source/blender/editors/space_node/node_templates.c index ec525e684b0..5d0877a1eff 100644 --- a/source/blender/editors/space_node/node_templates.c +++ b/source/blender/editors/space_node/node_templates.c @@ -683,10 +683,11 @@ static void ui_node_draw_input(uiLayout *layout, bContext *C, bNodeTree *ntree, RNA_pointer_create(&ntree->id, &RNA_Node, node, &nodeptr); /* indented label */ - for (i = 0; i < indent; i++) + for (i = 0; i < indent; i++) { label[i] = ' '; + } label[indent] = '\0'; - BLI_snprintf(label, UI_MAX_NAME_STR, "%s%s:", label, IFACE_(input->name)); + BLI_snprintf(label + indent, UI_MAX_NAME_STR - indent, "%s:", IFACE_(input->name)); /* split in label and value */ split = uiLayoutSplit(layout, 0.35f, false); -- cgit v1.2.3 From adfbf276a15346c38cc6b7652191c005b9a3ae9b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 7 Oct 2017 15:57:14 +1100 Subject: Cleanup: style, duplicate includes --- source/blender/editors/space_node/space_node.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'source/blender/editors/space_node') diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index af71851cf64..7cb22dcc570 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -49,8 +49,6 @@ #include "ED_node.h" #include "ED_render.h" #include "ED_screen.h" -#include "WM_api.h" -#include "WM_types.h" #include "UI_resources.h" #include "UI_view2d.h" @@ -58,6 +56,7 @@ #include "RNA_access.h" #include "WM_api.h" +#include "WM_types.h" #include "node_intern.h" /* own include */ -- cgit v1.2.3