[Bf-blender-cvs] [1a852d5] wiggly-widgets: New manipulator widgets for 2-axes constrained transform

Julian Eisel noreply at git.blender.org
Sun Aug 23 14:03:21 CEST 2015


Commit: 1a852d5dbe37e1f5436411a52cfa19a3ac0b6f3b
Author: Julian Eisel
Date:   Sun Aug 23 13:51:30 2015 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB1a852d5dbe37e1f5436411a52cfa19a3ac0b6f3b

New manipulator widgets for 2-axes constrained transform

Used for translate and scale manipulator. Still needs some polish but it's working :)

Looking like this right now: F227012

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

M	source/blender/editors/include/ED_transform.h
M	source/blender/editors/transform/manipulator_widget.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_generic_widgets.c

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

diff --git a/source/blender/editors/include/ED_transform.h b/source/blender/editors/include/ED_transform.h
index 3f0e9f9..6e6ba61 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -164,6 +164,9 @@ typedef struct ManipulatorGroup {
 	struct wmWidget *translate_x,
 	                *translate_y,
 	                *translate_z,
+	                *translate_xy,
+	                *translate_yz,
+	                *translate_zx,
 	                *translate_c,
 
 	                *rotate_x,
@@ -174,6 +177,9 @@ typedef struct ManipulatorGroup {
 	                *scale_x,
 	                *scale_y,
 	                *scale_z,
+	                *scale_xy,
+	                *scale_yz,
+	                *scale_zx,
 	                *scale_c;
 } ManipulatorGroup;
 
diff --git a/source/blender/editors/transform/manipulator_widget.c b/source/blender/editors/transform/manipulator_widget.c
index ac0fac5..f33b308 100644
--- a/source/blender/editors/transform/manipulator_widget.c
+++ b/source/blender/editors/transform/manipulator_widget.c
@@ -137,6 +137,15 @@ enum {
 	MAN_AXIS_SCALE_Z,
 	MAN_AXIS_SCALE_C,
 
+	/* special */
+	MAN_AXIS_TRANS_XY,
+	MAN_AXIS_TRANS_YZ,
+	MAN_AXIS_TRANS_ZX,
+
+	MAN_AXIS_SCALE_XY,
+	MAN_AXIS_SCALE_YZ,
+	MAN_AXIS_SCALE_ZX,
+
 	MAN_AXIS_LAST,
 };
 
@@ -181,6 +190,12 @@ static wmWidget *manipulator_get_axis_from_index(const ManipulatorGroup *man, co
 			return man->translate_y;
 		case MAN_AXIS_TRANS_Z:
 			return man->translate_z;
+		case MAN_AXIS_TRANS_XY:
+			return man->translate_xy;
+		case MAN_AXIS_TRANS_YZ:
+			return man->translate_yz;
+		case MAN_AXIS_TRANS_ZX:
+			return man->translate_zx;
 		case MAN_AXIS_TRANS_C:
 			return man->translate_c;
 		case MAN_AXIS_ROT_X:
@@ -197,6 +212,12 @@ static wmWidget *manipulator_get_axis_from_index(const ManipulatorGroup *man, co
 			return man->scale_y;
 		case MAN_AXIS_SCALE_Z:
 			return man->scale_z;
+		case MAN_AXIS_SCALE_XY:
+			return man->scale_xy;
+		case MAN_AXIS_SCALE_YZ:
+			return man->scale_yz;
+		case MAN_AXIS_SCALE_ZX:
+			return man->scale_zx;
 		case MAN_AXIS_SCALE_C:
 			return man->scale_c;
 	}
@@ -206,10 +227,12 @@ static wmWidget *manipulator_get_axis_from_index(const ManipulatorGroup *man, co
 
 static short manipulator_get_axis_type(const ManipulatorGroup *man, const wmWidget *axis)
 {
-	if (ELEM(axis, man->translate_x, man->translate_y, man->translate_z, man->translate_c)) {
+	if (ELEM(axis, man->translate_x, man->translate_y, man->translate_z, man->translate_c,
+	         man->translate_xy, man->translate_yz, man->translate_zx))
+	{
 		return MAN_AXES_TRANSLATE;
 	}
-	else if (ELEM(axis, man->rotate_x, man->rotate_y, man->rotate_z, man->rotate_c)){
+	else if (ELEM(axis, man->rotate_x, man->rotate_y, man->rotate_z, man->rotate_c)) {
 		return MAN_AXES_ROTATE;
 	}
 	else {
@@ -220,7 +243,20 @@ static short manipulator_get_axis_type(const ManipulatorGroup *man, const wmWidg
 /* get index within axis type, so that x == 0, y == 1 and z == 2, no matter which axis type */
 static int manipulator_index_normalize(const int axis_idx)
 {
-	return (axis_idx > MAN_AXIS_TRANS_C) ? (axis_idx > MAN_AXIS_ROT_C ? (axis_idx - 8) : (axis_idx - 4)) : axis_idx;
+	if (axis_idx > MAN_AXIS_TRANS_ZX) {
+		return axis_idx - 15;
+	}
+	else if (axis_idx > MAN_AXIS_SCALE_C) {
+		return axis_idx - 12;
+	}
+	else if (axis_idx > MAN_AXIS_ROT_C) {
+		return axis_idx - 8;
+	}
+	else if (axis_idx > MAN_AXIS_TRANS_C) {
+		return axis_idx - 4;
+	}
+
+	return axis_idx;
 }
 
 static bool manipulator_is_axis_visible(const RegionView3D *rv3d, const int axis_idx)
@@ -232,6 +268,12 @@ static bool manipulator_is_axis_visible(const RegionView3D *rv3d, const int axis
 			return (rv3d->twdrawflag & MAN_TRANS_Y);
 		case MAN_AXIS_TRANS_Z:
 			return (rv3d->twdrawflag & MAN_TRANS_Z);
+		case MAN_AXIS_TRANS_XY:
+			return (rv3d->twdrawflag & MAN_TRANS_X && rv3d->twdrawflag & MAN_TRANS_Y);
+		case MAN_AXIS_TRANS_YZ:
+			return (rv3d->twdrawflag & MAN_TRANS_Y && rv3d->twdrawflag & MAN_TRANS_Z);
+		case MAN_AXIS_TRANS_ZX:
+			return (rv3d->twdrawflag & MAN_TRANS_Z && rv3d->twdrawflag & MAN_TRANS_X);
 		case MAN_AXIS_TRANS_C:
 			return (rv3d->twdrawflag & MAN_TRANS_C);
 		case MAN_AXIS_ROT_X:
@@ -248,6 +290,12 @@ static bool manipulator_is_axis_visible(const RegionView3D *rv3d, const int axis
 			return (rv3d->twdrawflag & MAN_SCALE_Y);
 		case MAN_AXIS_SCALE_Z:
 			return (rv3d->twdrawflag & MAN_SCALE_Z);
+		case MAN_AXIS_SCALE_XY:
+			return (rv3d->twdrawflag & MAN_SCALE_X && rv3d->twdrawflag & MAN_SCALE_Y);
+		case MAN_AXIS_SCALE_YZ:
+			return (rv3d->twdrawflag & MAN_SCALE_Y && rv3d->twdrawflag & MAN_SCALE_Z);
+		case MAN_AXIS_SCALE_ZX:
+			return (rv3d->twdrawflag & MAN_SCALE_Z && rv3d->twdrawflag & MAN_SCALE_X);
 		case MAN_AXIS_SCALE_C:
 			return (rv3d->twdrawflag & MAN_SCALE_C);
 	}
@@ -266,18 +314,24 @@ static void manipulator_get_axis_color(const RegionView3D *rv3d, const int axis_
 		case MAN_AXIS_TRANS_X:
 		case MAN_AXIS_ROT_X:
 		case MAN_AXIS_SCALE_X:
+		case MAN_AXIS_TRANS_XY:
+		case MAN_AXIS_SCALE_XY:
 			UI_GetThemeColor4fv(TH_AXIS_X, r_col);
 			r_col[3] = alpha;
 			break;
 		case MAN_AXIS_TRANS_Y:
 		case MAN_AXIS_ROT_Y:
 		case MAN_AXIS_SCALE_Y:
+		case MAN_AXIS_TRANS_YZ:
+		case MAN_AXIS_SCALE_YZ:
 			UI_GetThemeColor4fv(TH_AXIS_Y, r_col);
 			r_col[3] = alpha;
 			break;
 		case MAN_AXIS_TRANS_Z:
 		case MAN_AXIS_ROT_Z:
 		case MAN_AXIS_SCALE_Z:
+		case MAN_AXIS_TRANS_ZX:
+		case MAN_AXIS_SCALE_ZX:
 			UI_GetThemeColor4fv(TH_AXIS_Z, r_col);
 			r_col[3] = alpha;
 			break;
@@ -313,6 +367,18 @@ static void manipulator_get_axis_constraint(const int axis_idx, int r_axis[3])
 		case MAN_AXIS_ROT_C:
 		case MAN_AXIS_SCALE_C:
 			break;
+		case MAN_AXIS_TRANS_XY:
+		case MAN_AXIS_SCALE_XY:
+			r_axis[0] = r_axis[1] = 1;
+			break;
+		case MAN_AXIS_TRANS_YZ:
+		case MAN_AXIS_SCALE_YZ:
+			r_axis[1] = r_axis[2] = 1;
+			break;
+		case MAN_AXIS_TRANS_ZX:
+		case MAN_AXIS_SCALE_ZX:
+			r_axis[2] = r_axis[0] = 1;
+			break;
 	}
 }
 
@@ -961,6 +1027,9 @@ static ManipulatorGroup *manipulatorgroup_init(
 		man->scale_x = WIDGET_arrow_new(wgroup, "scale_x", WIDGET_ARROW_STYLE_BOX);
 		man->scale_y = WIDGET_arrow_new(wgroup, "scale_y", WIDGET_ARROW_STYLE_BOX);
 		man->scale_z = WIDGET_arrow_new(wgroup, "scale_z", WIDGET_ARROW_STYLE_BOX);
+		man->scale_xy = WIDGET_plane_new(wgroup, "scale_xy", 0);
+		man->scale_yz = WIDGET_plane_new(wgroup, "scale_yz", 0);
+		man->scale_zx = WIDGET_plane_new(wgroup, "scale_zx", 0);
 	}
 	if (init_rot) {
 		man->rotate_x = WIDGET_dial_new(wgroup, "rotate_x", WIDGET_DIAL_STYLE_RING_CLIPPED);
@@ -974,6 +1043,9 @@ static ManipulatorGroup *manipulatorgroup_init(
 		man->translate_x = WIDGET_arrow_new(wgroup, "translate_x", WIDGET_ARROW_STYLE_NORMAL);
 		man->translate_y = WIDGET_arrow_new(wgroup, "translate_y", WIDGET_ARROW_STYLE_NORMAL);
 		man->translate_z = WIDGET_arrow_new(wgroup, "translate_z", WIDGET_ARROW_STYLE_NORMAL);
+		man->translate_xy = WIDGET_plane_new(wgroup, "translate_xy", 0);
+		man->translate_yz = WIDGET_plane_new(wgroup, "translate_yz", 0);
+		man->translate_zx = WIDGET_plane_new(wgroup, "translate_zx", 0);
 	}
 
 	return man;
@@ -1076,6 +1148,42 @@ void WIDGETGROUP_manipulator_draw(const struct bContext *C, struct wmWidgetGroup
 				WIDGET_dial_set_direction(axis, rv3d->twmat[aidx_norm]);
 				WIDGET_dial_set_color(axis, col);
 				break;
+			case MAN_AXIS_TRANS_XY:
+			case MAN_AXIS_TRANS_YZ:
+			case MAN_AXIS_TRANS_ZX:
+			case MAN_AXIS_SCALE_XY:
+			case MAN_AXIS_SCALE_YZ:
+			case MAN_AXIS_SCALE_ZX:
+			{
+				const float ofs_fac = U.tw_size * 0.7f;
+				float origin[4];
+				float px;
+
+				/* XXX hrmpf, widgets call this twice on every redraw, could use update flag */
+				ED_view3d_update_viewmat(CTX_data_scene(C), CTX_wm_view3d(C), CTX_wm_region(C), NULL, NULL);
+				px = ED_view3d_pixel_size(rv3d, origin);
+
+				copy_v4_v4(origin, rv3d->twmat[3]);
+
+				if (ELEM(axis_idx, MAN_AXIS_TRANS_XY, MAN_AXIS_SCALE_XY)) {
+					origin[0] += px * ofs_fac;
+					origin[1] += px * ofs_fac;
+				}
+				else if (ELEM(axis_idx, MAN_AXIS_TRANS_YZ, MAN_AXIS_SCALE_YZ)) {
+					origin[1] += px * ofs_fac;
+					origin[2] += px * ofs_fac;
+				}
+				else if (ELEM(axis_idx, MAN_AXIS_TRANS_ZX, MAN_AXIS_SCALE_ZX)) {
+					origin[2] += px * ofs_fac;
+					origin[0] += px * ofs_fac;
+				}
+
+				WM_widget_set_scale(axis, 0.07f);
+				WM_widget_set_origin(axis, origin);
+				WIDGET_plane_set_direction(axis, rv3d->twmat[aidx_norm - 1 > -1 ? aidx_norm - 1 : aidx_norm - 1]);
+				WIDGET_plane_set_color(axis, col);
+				break;
+			}
 			case MAN_AXIS_TRANS_C:
 			case MAN_AXIS_ROT_C:
 			case MAN_AXIS_SCALE_C:
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 081ed76..92153bb 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -584,6 +584,10 @@ struct wmWidget *WIDGET_dial_new(struct wmWidgetGroup *wgroup, const char *name,
 void WIDGET_dial_set_color(struct wmWidget *widget, const float color[4]);
 void WIDGET_dial_set_direction(struct wmWidget *widget, const float direction[3]);
 
+struct wmWidget *WIDGET_plane_new(struct wmWidgetGroup *wgroup, const char *name, const int style);
+void WIDGET_plane_set_direction(struct wmWidget *widget, const float direction[3]);
+void WIDGET_plane_set_color(struct wmWidget *widget, const float color[4]);
+
 struct wmWidget *WIDGET_rect_transform_new(
         struct wmWidgetGroup *wgroup, const char *name, const int style,
         const float width, const float height);
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index e850525..58d18e7 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -660,7 +660,7 @@ static void dial_draw_intern(DialWidget *dial, const bool select, const bool hig
 	mul_mat3_m4_fl(mat, scale);
 
 	glPushMatrix();
-	glMultMatrixf(&mat[0][0]);
+	glMultMatrixf(mat);
 
 	if (highlight)
 		glColor4fv(highlight_col);
@@ -766,6 +766,116 @@ void WIDGET_dial_set_direction(wmWidget *widget, const float direction

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list