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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to