[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