[Bf-blender-cvs] [71c1bd1bd87] blender2.8: Manipulator: cage2d option to grab w/ a center handle

Campbell Barton noreply at git.blender.org
Wed Sep 13 13:33:45 CEST 2017


Commit: 71c1bd1bd870712e27d0d56ca525cf2dbc848639
Author: Campbell Barton
Date:   Wed Sep 13 21:42:13 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB71c1bd1bd870712e27d0d56ca525cf2dbc848639

Manipulator: cage2d option to grab w/ a center handle

===================================================================

M	source/blender/editors/include/ED_manipulator_library.h
M	source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c

===================================================================

diff --git a/source/blender/editors/include/ED_manipulator_library.h b/source/blender/editors/include/ED_manipulator_library.h
index f9f4e052e7c..9a74a9f50ed 100644
--- a/source/blender/editors/include/ED_manipulator_library.h
+++ b/source/blender/editors/include/ED_manipulator_library.h
@@ -97,6 +97,13 @@ enum {
 	ED_MANIPULATOR_CAGE2D_XFORM_FLAG_SCALE_SIGNED     = (1 << 4), /* Negative scale allowed */
 };
 
+/* draw_options */
+enum {
+	/** Draw a central handle (instead of having the entire area selectable)
+	 * Needed for large rectangles that we don't want to swallow all events. */
+	ED_MANIPULATOR_CAGE2D_STYLE_FLAG_XFORM_CENTER_HANDLE = (1 << 0),
+};
+
 /** #wmManipulator.highlight_part */
 enum {
 	ED_MANIPULATOR_CAGE2D_PART_TRANSLATE     = 0,
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 f8379c929db..c13fe1d0ff0 100644
--- a/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c
+++ b/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c
@@ -172,11 +172,12 @@ static void rect_transform_draw_corners(
 static void rect_transform_draw_interaction(
         const float color[4], const int highlighted,
         const float size[2], const float margin[2],
-        const float line_width, const bool is_solid)
+        const float line_width, const bool is_solid, const int draw_options)
 {
 	/* 4 verts for translate, otherwise only 3 are used. */
 	float verts[4][2];
 	uint verts_len = 0;
+	Gwn_PrimType prim_type = GWN_PRIM_NONE;
 
 	switch (highlighted) {
 		case ED_MANIPULATOR_CAGE2D_PART_SCALE_MIN_X:
@@ -192,6 +193,10 @@ static void rect_transform_draw_interaction(
 				ARRAY_SET_ITEMS(verts[2], r.xmax, r.ymax);
 				ARRAY_SET_ITEMS(verts[3], r.xmax, r.ymin);
 				verts_len += 2;
+				prim_type = GWN_PRIM_TRI_FAN;
+			}
+			else {
+				prim_type = GWN_PRIM_LINE_STRIP;
 			}
 			break;
 		}
@@ -208,6 +213,10 @@ static void rect_transform_draw_interaction(
 				ARRAY_SET_ITEMS(verts[2], r.xmin, r.ymax);
 				ARRAY_SET_ITEMS(verts[3], r.xmin, r.ymin);
 				verts_len += 2;
+				prim_type = GWN_PRIM_TRI_FAN;
+			}
+			else {
+				prim_type = GWN_PRIM_LINE_STRIP;
 			}
 			break;
 		}
@@ -224,6 +233,10 @@ static void rect_transform_draw_interaction(
 				ARRAY_SET_ITEMS(verts[2], r.xmax, r.ymax);
 				ARRAY_SET_ITEMS(verts[3], r.xmin, r.ymax);
 				verts_len += 2;
+				prim_type = GWN_PRIM_TRI_FAN;
+			}
+			else {
+				prim_type = GWN_PRIM_LINE_STRIP;
 			}
 			break;
 		}
@@ -240,6 +253,10 @@ static void rect_transform_draw_interaction(
 				ARRAY_SET_ITEMS(verts[2], r.xmax, r.ymin);
 				ARRAY_SET_ITEMS(verts[3], r.xmin, r.ymin);
 				verts_len += 2;
+				prim_type = GWN_PRIM_TRI_FAN;
+			}
+			else {
+				prim_type = GWN_PRIM_LINE_STRIP;
 			}
 			break;
 		}
@@ -256,6 +273,10 @@ static void rect_transform_draw_interaction(
 			if (is_solid) {
 				ARRAY_SET_ITEMS(verts[3], r.xmin, r.ymin);
 				verts_len += 1;
+				prim_type = GWN_PRIM_TRI_FAN;
+			}
+			else {
+				prim_type = GWN_PRIM_LINE_STRIP;
 			}
 			break;
 		}
@@ -272,6 +293,10 @@ static void rect_transform_draw_interaction(
 			if (is_solid) {
 				ARRAY_SET_ITEMS(verts[3], r.xmin, r.ymax);
 				verts_len += 1;
+				prim_type = GWN_PRIM_TRI_FAN;
+			}
+			else {
+				prim_type = GWN_PRIM_LINE_STRIP;
 			}
 			break;
 		}
@@ -288,6 +313,10 @@ static void rect_transform_draw_interaction(
 			if (is_solid) {
 				ARRAY_SET_ITEMS(verts[3], r.xmax, r.ymin);
 				verts_len += 1;
+				prim_type = GWN_PRIM_TRI_FAN;
+			}
+			else {
+				prim_type = GWN_PRIM_LINE_STRIP;
 			}
 			break;
 		}
@@ -304,6 +333,10 @@ static void rect_transform_draw_interaction(
 			if (is_solid) {
 				ARRAY_SET_ITEMS(verts[3], r.xmax, r.ymax);
 				verts_len += 1;
+				prim_type = GWN_PRIM_TRI_FAN;
+			}
+			else {
+				prim_type = GWN_PRIM_LINE_STRIP;
 			}
 			break;
 		}
@@ -322,21 +355,52 @@ static void rect_transform_draw_interaction(
 			ARRAY_SET_ITEMS(verts[2], r_rotate.xmax, r_rotate.ymax);
 			ARRAY_SET_ITEMS(verts[3], r_rotate.xmax, r_rotate.ymin);
 			verts_len = 4;
+			if (is_solid) {
+				prim_type = GWN_PRIM_TRI_FAN;
+			}
+			else {
+				prim_type = GWN_PRIM_LINE_STRIP;
+			}
 			break;
 		}
 
-		/* Only used for 3D view selection, never displayed to the user. */
 		case ED_MANIPULATOR_CAGE2D_PART_TRANSLATE:
-			ARRAY_SET_ITEMS(verts[0], -size[0], -size[1]);
-			ARRAY_SET_ITEMS(verts[1], -size[0],  size[1]);
-			ARRAY_SET_ITEMS(verts[2], size[0],   size[1]);
-			ARRAY_SET_ITEMS(verts[3], size[0],  -size[1]);
-			verts_len = 4;
+			if (draw_options & ED_MANIPULATOR_CAGE2D_STYLE_FLAG_XFORM_CENTER_HANDLE) {
+				ARRAY_SET_ITEMS(verts[0], -margin[0] / 2, -margin[1] / 2);
+				ARRAY_SET_ITEMS(verts[1],  margin[0] / 2,  margin[1] / 2);
+				ARRAY_SET_ITEMS(verts[2], -margin[0] / 2,  margin[1] / 2);
+				ARRAY_SET_ITEMS(verts[3],  margin[0] / 2, -margin[1] / 2);
+				verts_len = 4;
+				if (is_solid) {
+					prim_type = GWN_PRIM_TRI_FAN;
+				}
+				else {
+					prim_type = GWN_PRIM_LINES;
+				}
+			}
+			else {
+				/* Only used for 3D view selection, never displayed to the user. */
+				ARRAY_SET_ITEMS(verts[0], -size[0], -size[1]);
+				ARRAY_SET_ITEMS(verts[1], -size[0],  size[1]);
+				ARRAY_SET_ITEMS(verts[2], size[0],   size[1]);
+				ARRAY_SET_ITEMS(verts[3], size[0],  -size[1]);
+				verts_len = 4;
+				if (is_solid) {
+					prim_type = GWN_PRIM_TRI_FAN;
+				}
+				else {
+					/* unreachable */
+					BLI_assert(0);
+					prim_type = GWN_PRIM_LINE_STRIP;
+				}
+			}
 			break;
 		default:
 			return;
 	}
 
+	BLI_assert(prim_type != GWN_PRIM_NONE);
+
 	Gwn_VertFormat *format = immVertexFormat();
 	struct {
 		uint pos, col;
@@ -346,17 +410,10 @@ static void rect_transform_draw_interaction(
 	};
 	immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR);
 
-	if (highlighted == ED_MANIPULATOR_CAGE2D_PART_TRANSLATE) {
-		immBegin(GWN_PRIM_TRI_FAN, 4);
-		immAttrib3f(attr_id.col, 0.0f, 0.0f, 0.0f);
-		for (uint i = 0; i < verts_len; i++) {
-			immVertex2fv(attr_id.pos, verts[i]);
-		}
-		immEnd();
-	}
-	else {
+	{
 		if (is_solid) {
-			immBegin(GWN_PRIM_TRI_FAN, verts_len);
+			BLI_assert(ELEM(prim_type, GWN_PRIM_TRI_FAN));
+			immBegin(prim_type, verts_len);
 			immAttrib3f(attr_id.col, 0.0f, 0.0f, 0.0f);
 			for (uint i = 0; i < verts_len; i++) {
 				immVertex2fv(attr_id.pos, verts[i]);
@@ -364,9 +421,10 @@ static void rect_transform_draw_interaction(
 			immEnd();
 		}
 		else {
+			BLI_assert(ELEM(prim_type, GWN_PRIM_LINE_STRIP, GWN_PRIM_LINES));
 			glLineWidth(line_width + 3.0f);
 
-			immBegin(GWN_PRIM_LINE_STRIP, verts_len);
+			immBegin(prim_type, verts_len);
 			immAttrib3f(attr_id.col, 0.0f, 0.0f, 0.0f);
 			for (uint i = 0; i < verts_len; i++) {
 				immVertex2fv(attr_id.pos, verts[i]);
@@ -375,7 +433,7 @@ static void rect_transform_draw_interaction(
 
 			glLineWidth(line_width);
 
-			immBegin(GWN_PRIM_LINE_STRIP, verts_len);
+			immBegin(prim_type, verts_len);
 			immAttrib3fv(attr_id.col, color);
 			for (uint i = 0; i < verts_len; i++) {
 				immVertex2fv(attr_id.pos, verts[i]);
@@ -399,6 +457,7 @@ static void manipulator_rect_transform_draw_intern(
 	float matrix_final[4][4];
 
 	const int transform_flag = RNA_enum_get(mpr->ptr, "transform");
+	const int draw_options = RNA_enum_get(mpr->ptr, "draw_options");
 
 	const float size[2] = {w / 2.0f, h / 2.0f};
 	const rctf r = {
@@ -455,27 +514,43 @@ static void manipulator_rect_transform_draw_intern(
 			};
 			for (int i = 0; i < ARRAY_SIZE(scale_parts); i++) {
 				GPU_select_load_id(select_id | scale_parts[i]);
-				rect_transform_draw_interaction(mpr->color, scale_parts[i], size, margin, mpr->line_width, true);
+				rect_transform_draw_interaction(
+				        mpr->color, scale_parts[i], size, margin, mpr->line_width, true, draw_options);
 			}
 		}
 		if (transform_flag & ED_MANIPULATOR_CAGE2D_XFORM_FLAG_TRANSLATE) {
 			const int transform_part = ED_MANIPULATOR_CAGE2D_PART_TRANSLATE;
 			GPU_select_load_id(select_id | transform_part);
-			rect_transform_draw_interaction(mpr->color, transform_part, size, margin, mpr->line_width, true);
+			rect_transform_draw_interaction(
+			        mpr->color, transform_part, size, margin, mpr->line_width, true, draw_options);
 		}
 		if (transform_flag & ED_MANIPULATOR_CAGE2D_XFORM_FLAG_ROTATE) {
 			rect_transform_draw_interaction(
-			        mpr->color, ED_MANIPULATOR_CAGE2D_PART_ROTATE, size, margin, mpr->line_width, true);
+			        mpr->color, ED_MANIPULATOR_CAGE2D_PART_ROTATE, size, margin, mpr->line_width, true, draw_options);
 		}
 	}
 	else {
 		/* Don't draw translate (only for selection). */
-		if (mpr->highlight_part != ED_MANIPULATOR_CAGE2D_PART_TRANSLATE) {
-			rect_transform_draw_interaction(mpr->color, mpr->highlight_part, size, margin, mpr->line_width, false);
+		bool show = false;
+		if (mpr->highlight_part == ED_MANIPULATOR_CAGE2D_PART_TRANSLATE) {
+			/* Only show if we're drawing the center handle
+			 * otherwise the entire rectangle is the hotspot. */
+			if (draw_options & ED_MANIPULATOR_CAGE2D_STYLE_FLAG_XFORM_CENTER_HANDLE) {
+				show = true;
+			}
+		}
+		else {
+			show = true;
+		}
+
+		if (show) {
+			rect_transform_draw_interaction(
+			        mpr->color, mpr->highlight_part, size, margin, mpr->line_width, false, draw_options);
 		}
+
 		if (transform_flag & ED_MANIPULATOR_CAGE2D_XFORM_FLAG_ROTATE) {
 			rect_transform_draw_interaction(
-			        mpr->color, ED_MANIPULATOR_CAGE2D_PART_ROTATE, size, margin, mpr->line_width, false);
+			        mpr->color, ED_MANIPULATOR_CAGE2D_PART_ROTATE, size, margin, mpr->line_width, false, draw_options);
 		}
 	}
 
@@ -549,13 +624,21 @@ static int manipulator_rect_transform_test_select(
 	manipulator_calc_rect_view_margin(mpr, dims, margin);
 
 	const int transform_flag = RNA_enum_get(mpr->ptr, "transform");
+	const int draw_options = RNA_enum_get(mpr->ptr, "draw_options");
 
 	if (transform_flag & ED_MANIPULATOR_CAGE2D_XFORM_FLAG_TRANSLATE) {
-		const rctf r = {
-			.xmin = -size[0] + margin[0],
-			.ymin = -size[1] + margin[1],
-			.xmax =  size[0] - margin[0],
-			.ymax =  size[1] - margin[1],
+		rctf r;
+		if (draw_options & ED

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list