diff options
author | Campbell Barton <ideasman42@gmail.com> | 2017-08-03 10:55:16 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2017-08-03 10:57:00 +0300 |
commit | fe8fcb4343a5da4ec97db697a70afe423898e833 (patch) | |
tree | 76ffea09718b7d3d62af922ee83a94545448ca24 /source | |
parent | c27446b5a0077cd7c69a27b88a3efdc93920dfb9 (diff) |
Manipulator: render border widget
Note there are issues clamping & updating,
will resolve as part of changes to cage2d widget.
Diffstat (limited to 'source')
10 files changed, 208 insertions, 12 deletions
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index d98be8b7835..81aedfa07d0 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -3200,7 +3200,6 @@ void DRW_draw_render_loop_ex( if (DST.draw_ctx.evil_C) { /* needed so manipulator isn't obscured */ glDisable(GL_DEPTH_TEST); - DRW_draw_manipulator(); glEnable(GL_DEPTH_TEST); diff --git a/source/blender/editors/manipulator_library/manipulator_library_utils.c b/source/blender/editors/manipulator_library/manipulator_library_utils.c index f49b0044273..e0e326a2b2f 100644 --- a/source/blender/editors/manipulator_library/manipulator_library_utils.c +++ b/source/blender/editors/manipulator_library/manipulator_library_utils.c @@ -126,9 +126,13 @@ void manipulator_property_data_update( if (constrained) { if ((data->flag & MANIPULATOR_CUSTOM_RANGE_SET) == 0) { float range[2]; - WM_manipulator_target_property_range_get(mpr, mpr_prop, range); - data->range = range[1] - range[0]; - data->min = range[0]; + if (WM_manipulator_target_property_range_get(mpr, mpr_prop, range)) { + data->range = range[1] - range[0]; + data->min = range[0]; + } + else { + BLI_assert(0); + } } data->offset = manipulator_offset_from_value_constr(data->range_fac, data->min, data->range, value, inverted); } diff --git a/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c b/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c index 0f33a6abe09..dbfac595fc1 100644 --- a/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c +++ b/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c @@ -579,9 +579,10 @@ static void manipulator_rect_transform_modal( wmManipulatorProperty *mpr_prop = WM_manipulator_target_property_find(mpr, "scale"); if (mpr_prop->type != NULL) { float range[2]; - WM_manipulator_target_property_range_get(mpr, mpr_prop, range); - CLAMP(scale[0], range[0], range[1]); - CLAMP(scale[1], range[0], range[1]); + if (WM_manipulator_target_property_range_get(mpr, mpr_prop, range)) { + CLAMP(scale[0], range[0], range[1]); + CLAMP(scale[1], range[0], range[1]); + } } } diff --git a/source/blender/editors/manipulator_library/manipulator_types/grab3d_manipulator.c b/source/blender/editors/manipulator_library/manipulator_types/grab3d_manipulator.c index 152595eea38..2b7864b0a4c 100644 --- a/source/blender/editors/manipulator_library/manipulator_types/grab3d_manipulator.c +++ b/source/blender/editors/manipulator_library/manipulator_types/grab3d_manipulator.c @@ -141,6 +141,7 @@ static void grab3d_draw_intern( float col[4]; BLI_assert(CTX_wm_area(C)->spacetype == SPACE_VIEW3D); + UNUSED_VARS_NDEBUG(C); manipulator_color_get(mpr, highlight, col); diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index 30cdafe9369..f67684295a6 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -739,6 +739,7 @@ static void view3d_widgets(void) WM_manipulatorgrouptype_append_and_link(mmap_type, VIEW3D_WGT_lamp_area); WM_manipulatorgrouptype_append_and_link(mmap_type, VIEW3D_WGT_force_field); WM_manipulatorgrouptype_append_and_link(mmap_type, VIEW3D_WGT_camera); + WM_manipulatorgrouptype_append_and_link(mmap_type, VIEW3D_WGT_camera_view); } diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h index f3bae2370b0..c9f48e137f5 100644 --- a/source/blender/editors/space_view3d/view3d_intern.h +++ b/source/blender/editors/space_view3d/view3d_intern.h @@ -322,6 +322,7 @@ extern const char *view3d_context_dir[]; /* doc access */ void VIEW3D_WGT_lamp_spot (struct wmManipulatorGroupType *wgt); void VIEW3D_WGT_lamp_area (struct wmManipulatorGroupType *wgt); void VIEW3D_WGT_camera (struct wmManipulatorGroupType *wgt); +void VIEW3D_WGT_camera_view (struct wmManipulatorGroupType *wgt); void VIEW3D_WGT_force_field (struct wmManipulatorGroupType *wgt); void VIEW3D_WGT_armature_facemaps(struct wmManipulatorGroupType *wgt); diff --git a/source/blender/editors/space_view3d/view3d_manipulator_camera.c b/source/blender/editors/space_view3d/view3d_manipulator_camera.c index a56e4b50c8b..5281b212e4c 100644 --- a/source/blender/editors/space_view3d/view3d_manipulator_camera.c +++ b/source/blender/editors/space_view3d/view3d_manipulator_camera.c @@ -227,3 +227,184 @@ void VIEW3D_WGT_camera(wmManipulatorGroupType *wgt) } /** \} */ + +/* -------------------------------------------------------------------- */ + +/** \name CameraView Manipulators + * \{ */ + +struct CameraViewWidgetGroup { + wmManipulator *border; + + struct { + rctf *edit_border; + rctf view_border; + } state; +}; + +/* scale callbacks */ +static void manipulator_render_border_prop_size_get( + const wmManipulator *UNUSED(mpr), wmManipulatorProperty *mpr_prop, + void *value_p) +{ + float *value = value_p; + BLI_assert(mpr_prop->type->array_length == 2); + struct CameraViewWidgetGroup *viewgroup = mpr_prop->custom_func.user_data; + const rctf *view_border = &viewgroup->state.view_border; + const rctf *border = viewgroup->state.edit_border; + + value[0] = BLI_rctf_size_x(border) * BLI_rctf_size_x(view_border); + value[1] = BLI_rctf_size_y(border) * BLI_rctf_size_y(view_border); +} + +static void manipulator_render_border_prop_size_set( + const wmManipulator *UNUSED(mpr), wmManipulatorProperty *mpr_prop, + const void *value_p) +{ + const float *value = value_p; + struct CameraViewWidgetGroup *viewgroup = mpr_prop->custom_func.user_data; + const rctf *view_border = &viewgroup->state.view_border; + rctf *border = viewgroup->state.edit_border; + BLI_assert(mpr_prop->type->array_length == 2); + + BLI_rctf_resize( + border, + value[0] / BLI_rctf_size_x(view_border), + value[1] / BLI_rctf_size_y(view_border)); + BLI_rctf_isect(&(rctf){.xmin = 0, .ymin = 0, .xmax = 1, .ymax = 1}, border, border); +} + +/* offset callbacks */ +static void manipulator_render_border_prop_offset_get( + const wmManipulator *UNUSED(mpr), wmManipulatorProperty *mpr_prop, + void *value_p) +{ + float *value = value_p; + BLI_assert(mpr_prop->type->array_length == 2); + struct CameraViewWidgetGroup *viewgroup = mpr_prop->custom_func.user_data; + const rctf *view_border = &viewgroup->state.view_border; + const rctf *border = viewgroup->state.edit_border; + + value[0] = (BLI_rctf_cent_x(border) * BLI_rctf_size_x(view_border)) + view_border->xmin; + value[1] = (BLI_rctf_cent_y(border) * BLI_rctf_size_y(view_border)) + view_border->ymin; +} + +static void manipulator_render_border_prop_offset_set( + const wmManipulator *UNUSED(mpr), wmManipulatorProperty *mpr_prop, + const void *value_p) +{ + const float *value = value_p; + struct CameraViewWidgetGroup *viewgroup = mpr_prop->custom_func.user_data; + const rctf *view_border = &viewgroup->state.view_border; + rctf *border = viewgroup->state.edit_border; + + BLI_assert(mpr_prop->type->array_length == 2); + + BLI_rctf_recenter( + border, + (value[0] - view_border->xmin) / BLI_rctf_size_x(view_border), + (value[1] - view_border->ymin) / BLI_rctf_size_y(view_border)); + BLI_rctf_isect(&(rctf){.xmin = 0, .ymin = 0, .xmax = 1, .ymax = 1}, border, border); +} + +static bool WIDGETGROUP_camera_view_poll(const bContext *C, wmManipulatorGroupType *UNUSED(wgt)) +{ + ARegion *ar = CTX_wm_region(C); + RegionView3D *rv3d = ar->regiondata; + Scene *scene = CTX_data_scene(C); + View3D *v3d = CTX_wm_view3d(C); + + if (rv3d->persp == RV3D_CAMOB) { + if (scene->r.mode & R_BORDER) { + return true; + } + } + else if (v3d->flag2 & V3D_RENDER_BORDER) { + return true; + } + return false; +} + +static void WIDGETGROUP_camera_view_setup(const bContext *UNUSED(C), wmManipulatorGroup *mgroup) +{ + struct CameraViewWidgetGroup *viewgroup = MEM_mallocN(sizeof(struct CameraViewWidgetGroup), __func__); + + viewgroup->border = WM_manipulator_new("MANIPULATOR_WT_cage_2d", mgroup, NULL); + + RNA_enum_set(viewgroup->border->ptr, "transform", + ED_MANIPULATOR_RECT_TRANSFORM_FLAG_TRANSLATE | ED_MANIPULATOR_RECT_TRANSFORM_FLAG_SCALE); + + mgroup->customdata = viewgroup; +} + +static void WIDGETGROUP_camera_view_draw_prepare(const bContext *C, wmManipulatorGroup *mgroup) +{ + struct CameraViewWidgetGroup *viewgroup = mgroup->customdata; + + ARegion *ar = CTX_wm_region(C); + RegionView3D *rv3d = ar->regiondata; + Scene *scene = CTX_data_scene(C); + View3D *v3d = CTX_wm_view3d(C); + ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &viewgroup->state.view_border, false); +} + +static void WIDGETGROUP_camera_view_refresh(const bContext *C, wmManipulatorGroup *mgroup) +{ + struct CameraViewWidgetGroup *viewgroup = mgroup->customdata; + + View3D *v3d = CTX_wm_view3d(C); + ARegion *ar = CTX_wm_region(C); + RegionView3D *rv3d = ar->regiondata; + Scene *scene = CTX_data_scene(C); + + { + wmManipulator *mpr = viewgroup->border; + WM_manipulator_set_flag(mpr, WM_MANIPULATOR_HIDDEN, false); + WM_manipulator_set_flag(mpr, WM_MANIPULATOR_DRAW_HOVER, true); + + RNA_enum_set(viewgroup->border->ptr, "transform", + ED_MANIPULATOR_RECT_TRANSFORM_FLAG_TRANSLATE | ED_MANIPULATOR_RECT_TRANSFORM_FLAG_SCALE); + + if (rv3d->persp == RV3D_CAMOB) { + viewgroup->state.edit_border = &scene->r.border; + } + else { + viewgroup->state.edit_border = &v3d->render_border; + } + + WM_manipulator_target_property_def_func( + mpr, "offset", + &(const struct wmManipulatorPropertyFnParams) { + .value_get_fn = manipulator_render_border_prop_offset_get, + .value_set_fn = manipulator_render_border_prop_offset_set, + .range_get_fn = NULL, + .user_data = viewgroup, + }); + + WM_manipulator_target_property_def_func( + mpr, "scale", + &(const struct wmManipulatorPropertyFnParams) { + .value_get_fn = manipulator_render_border_prop_size_get, + .value_set_fn = manipulator_render_border_prop_size_set, + .range_get_fn = NULL, + .user_data = viewgroup, + }); + } + +} + +void VIEW3D_WGT_camera_view(wmManipulatorGroupType *wgt) +{ + wgt->name = "Camera View Widgets"; + wgt->idname = "VIEW3D_WGT_camera_view"; + + wgt->flag = (WM_MANIPULATORGROUPTYPE_PERSISTENT | + WM_MANIPULATORGROUPTYPE_SCALE); + + wgt->poll = WIDGETGROUP_camera_view_poll; + wgt->setup = WIDGETGROUP_camera_view_setup; + wgt->draw_prepare = WIDGETGROUP_camera_view_draw_prepare; + wgt->refresh = WIDGETGROUP_camera_view_refresh; +} + +/** \} */
\ No newline at end of file diff --git a/source/blender/editors/space_view3d/view3d_manipulator_lamp.c b/source/blender/editors/space_view3d/view3d_manipulator_lamp.c index 7a8b77824ff..451addaaeae 100644 --- a/source/blender/editors/space_view3d/view3d_manipulator_lamp.c +++ b/source/blender/editors/space_view3d/view3d_manipulator_lamp.c @@ -187,6 +187,7 @@ static void WIDGETGROUP_lamp_area_setup(const bContext *UNUSED(C), wmManipulator mgroup->customdata = wwrapper; + WM_manipulator_set_flag(mpr, WM_MANIPULATOR_DRAW_HOVER, true); WM_manipulator_set_color(mpr, color); WM_manipulator_set_color_highlight(mpr, color_hi); } diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_api.h b/source/blender/windowmanager/manipulators/WM_manipulator_api.h index 7c260f19d7b..a29e31985a0 100644 --- a/source/blender/windowmanager/manipulators/WM_manipulator_api.h +++ b/source/blender/windowmanager/manipulators/WM_manipulator_api.h @@ -178,7 +178,7 @@ void WM_manipulator_target_property_value_set_array( struct bContext *C, const struct wmManipulator *mpr, struct wmManipulatorProperty *mpr_prop, const float *value); -void WM_manipulator_target_property_range_get( +bool WM_manipulator_target_property_range_get( const struct wmManipulator *mpr, struct wmManipulatorProperty *mpr_prop, float range[2]); diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_target_props.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator_target_props.c index 1317af530b7..461e10b6d4c 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_target_props.c +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_target_props.c @@ -227,17 +227,24 @@ void WM_manipulator_target_property_value_set_array( RNA_property_update(C, &mpr_prop->ptr, mpr_prop->prop); } -void WM_manipulator_target_property_range_get( +bool WM_manipulator_target_property_range_get( const wmManipulator *mpr, wmManipulatorProperty *mpr_prop, float range[2]) { - if (mpr_prop->custom_func.range_get_fn) { - mpr_prop->custom_func.range_get_fn(mpr, mpr_prop, range); - return; + if (mpr_prop->custom_func.value_get_fn) { + if (mpr_prop->custom_func.range_get_fn) { + mpr_prop->custom_func.range_get_fn(mpr, mpr_prop, range); + return true; + } + else{ + return false; + + } } float step, precision; RNA_property_float_ui_range(&mpr_prop->ptr, mpr_prop->prop, &range[0], &range[1], &step, &precision); + return true; } int WM_manipulator_target_property_array_length( |