[Bf-blender-cvs] [fe8fcb4343a] blender2.8: Manipulator: render border widget
Campbell Barton
noreply at git.blender.org
Thu Aug 3 09:42:17 CEST 2017
Commit: fe8fcb4343a5da4ec97db697a70afe423898e833
Author: Campbell Barton
Date: Thu Aug 3 17:55:16 2017 +1000
Branches: blender2.8
https://developer.blender.org/rBfe8fcb4343a5da4ec97db697a70afe423898e833
Manipulator: render border widget
Note there are issues clamping & updating,
will resolve as part of changes to cage2d widget.
===================================================================
M source/blender/draw/intern/draw_manager.c
M source/blender/editors/manipulator_library/manipulator_library_utils.c
M source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c
M source/blender/editors/manipulator_library/manipulator_types/grab3d_manipulator.c
M source/blender/editors/space_view3d/space_view3d.c
M source/blender/editors/space_view3d/view3d_intern.h
M source/blender/editors/space_view3d/view3d_manipulator_camera.c
M source/blender/editors/space_view3d/view3d_manipulator_lamp.c
M source/blender/windowmanager/manipulators/WM_manipulator_api.h
M source/blender/windowmanager/manipulators/intern/wm_manipulator_target_props.c
===================================================================
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) {
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list