[Bf-blender-cvs] [1340b98] wiggly-widgets: Add and use a macro to iterate over manipulater widget axes

Julian Eisel noreply at git.blender.org
Thu Apr 9 16:32:07 CEST 2015


Commit: 1340b98184fca6b78108096966dde209278ce6e9
Author: Julian Eisel
Date:   Thu Apr 9 16:21:20 2015 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB1340b98184fca6b78108096966dde209278ce6e9

Add and use a macro to iterate over manipulater widget axes

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

M	source/blender/editors/transform/manipulator_widget.c

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

diff --git a/source/blender/editors/transform/manipulator_widget.c b/source/blender/editors/transform/manipulator_widget.c
index e654ea1..6e05ba43 100644
--- a/source/blender/editors/transform/manipulator_widget.c
+++ b/source/blender/editors/transform/manipulator_widget.c
@@ -122,6 +122,24 @@ enum {
 	MAN_SEL_MAX
 };
 
+/* axes as index - XXX combine with return codes for select */
+enum {
+	MAN_AXIS_TRANS_X = 0,
+	MAN_AXIS_TRANS_Y,
+	MAN_AXIS_TRANS_Z,
+
+	MAN_AXIS_ROT_X,
+	MAN_AXIS_ROT_Y,
+	MAN_AXIS_ROT_Z,
+};
+
+/* axis types */
+enum {
+	MAN_AXES_ALL = 0,
+	MAN_AXES_TRANSLATE,
+	MAN_AXES_ROTATE,
+};
+
 /* color codes */
 
 #define MAN_RGB     0
@@ -132,6 +150,45 @@ enum {
 #define TW_AXIS_DOT_MIN 0.02f
 #define TW_AXIS_DOT_MAX 0.1f
 
+/* loop over all axes */
+#define MAN_ITER_AXES_BEGIN(axis_type) \
+	for (i = (axis_type == MAN_AXES_ROTATE ? 3 : 0); \
+	     i < (axis_type == MAN_AXES_TRANSLATE ? 3 : 6 ); \
+	     i++) { \
+		axis = manipulator_get_axis_from_index(manipulator, i);
+
+#define MAN_ITER_AXES_END }
+
+static wmWidget *manipulator_get_axis_from_index(const ManipulatorGroup *manipulator, const short index)
+{
+	wmWidget *axis;
+
+	BLI_assert(IN_RANGE_INCL(index, 0.0f, 5.0f));
+
+	switch (index) {
+		case MAN_AXIS_TRANS_X:
+			axis = manipulator->translate_x;
+			break;
+		case MAN_AXIS_TRANS_Y:
+			axis = manipulator->translate_y;
+			break;
+		case MAN_AXIS_TRANS_Z:
+			axis = manipulator->translate_z;
+			break;
+		case MAN_AXIS_ROT_X:
+			axis = manipulator->rotate_x;
+			break;
+		case MAN_AXIS_ROT_Y:
+			axis = manipulator->rotate_y;
+			break;
+		case MAN_AXIS_ROT_Z:
+			axis = manipulator->rotate_z;
+			break;
+	}
+
+	return axis;
+}
+
 /* transform widget center calc helper for below */
 static void calc_tw_center(Scene *scene, const float co[3])
 {
@@ -1698,8 +1755,10 @@ void WIDGETGROUP_manipulator_update(const struct bContext *C, struct wmWidgetGro
 	View3D *v3d = sa->spacedata.first;
 	RegionView3D *rv3d = ar->regiondata;
 	ManipulatorGroup *manipulator;
+	wmWidget *axis;
 
 	int totsel;
+	short i;
 
 	WIDGETGROUP_manipulator_create(C, wgroup);
 	manipulator = WM_widgetgroup_customdata(wgroup);
@@ -1708,13 +1767,11 @@ void WIDGETGROUP_manipulator_update(const struct bContext *C, struct wmWidgetGro
 
 	totsel = calc_manipulator_stats(C);
 	if (totsel == 0) {
-		WM_widget_flag_enable(manipulator->translate_x, WM_WIDGET_HIDDEN);
-		WM_widget_flag_enable(manipulator->translate_y, WM_WIDGET_HIDDEN);
-		WM_widget_flag_enable(manipulator->translate_z, WM_WIDGET_HIDDEN);
-
-		WM_widget_flag_enable(manipulator->rotate_x, WM_WIDGET_HIDDEN);
-		WM_widget_flag_enable(manipulator->rotate_y, WM_WIDGET_HIDDEN);
-		WM_widget_flag_enable(manipulator->rotate_z, WM_WIDGET_HIDDEN);
+		MAN_ITER_AXES_BEGIN(MAN_AXES_ALL)
+		{
+			WM_widget_flag_enable(axis, WM_WIDGET_HIDDEN);
+		}
+		MAN_ITER_AXES_END
 		return;
 	}
 	v3d->twflag |= V3D_DRAW_MANIPULATOR;
@@ -1749,13 +1806,11 @@ void WIDGETGROUP_manipulator_update(const struct bContext *C, struct wmWidgetGro
 	/* when looking through a selected camera, the manipulator can be at the
 	 * exact same position as the view, skip so we don't break selection */
 	if (fabsf(mat4_to_scale(rv3d->twmat)) < 1e-7f) {
-		WM_widget_flag_enable(manipulator->translate_x, WM_WIDGET_HIDDEN);
-		WM_widget_flag_enable(manipulator->translate_y, WM_WIDGET_HIDDEN);
-		WM_widget_flag_enable(manipulator->translate_z, WM_WIDGET_HIDDEN);
-
-		WM_widget_flag_enable(manipulator->rotate_x, WM_WIDGET_HIDDEN);
-		WM_widget_flag_enable(manipulator->rotate_y, WM_WIDGET_HIDDEN);
-		WM_widget_flag_enable(manipulator->rotate_z, WM_WIDGET_HIDDEN);
+		MAN_ITER_AXES_BEGIN(MAN_AXES_ALL)
+		{
+			WM_widget_flag_enable(axis, WM_WIDGET_HIDDEN);
+		}
+		MAN_ITER_AXES_END
 
 		return;
 	}
@@ -1763,54 +1818,53 @@ void WIDGETGROUP_manipulator_update(const struct bContext *C, struct wmWidgetGro
 	test_manipulator_axis(C);
 	drawflags = rv3d->twdrawflag;    /* set in calc_manipulator_stats */
 
-	WM_widget_operator(manipulator->translate_x, "TRANSFORM_OT_translate");
-	WM_widget_operator(manipulator->translate_y, "TRANSFORM_OT_translate");
-	WM_widget_operator(manipulator->translate_z, "TRANSFORM_OT_translate");
-	WM_widget_operator(manipulator->rotate_x, "TRANSFORM_OT_rotate");
-	WM_widget_operator(manipulator->rotate_y, "TRANSFORM_OT_rotate");
-	WM_widget_operator(manipulator->rotate_z, "TRANSFORM_OT_rotate");
+	MAN_ITER_AXES_BEGIN(MAN_AXES_TRANSLATE)
+	{
+		WM_widget_operator(axis, "TRANSFORM_OT_translate");
+	}
+	MAN_ITER_AXES_END
+	MAN_ITER_AXES_BEGIN(MAN_AXES_ROTATE)
+	{
+		WM_widget_operator(axis, "TRANSFORM_OT_rotate");
+	}
+	MAN_ITER_AXES_END
 
 	if (v3d->twtype & V3D_MANIP_TRANSLATE) {
-		/* should be added according to the order of axis */
-		WM_widget_set_origin(manipulator->translate_x, rv3d->twmat[3]);
-		WIDGET_arrow_set_direction(manipulator->translate_x, rv3d->twmat[0]);
-
-		WM_widget_set_origin(manipulator->translate_y, rv3d->twmat[3]);
-		WIDGET_arrow_set_direction(manipulator->translate_y, rv3d->twmat[1]);
-
-		WM_widget_set_origin(manipulator->translate_z, rv3d->twmat[3]);
-		WIDGET_arrow_set_direction(manipulator->translate_z, rv3d->twmat[2]);
+		MAN_ITER_AXES_BEGIN(MAN_AXES_TRANSLATE)
+		{
+			/* should be added according to the order of axis */
+			WM_widget_set_origin(axis, rv3d->twmat[3]);
+			WIDGET_arrow_set_direction(axis, rv3d->twmat[i]);
 
-		WM_widget_flag_disable(manipulator->translate_x, WM_WIDGET_HIDDEN);
-		WM_widget_flag_disable(manipulator->translate_y, WM_WIDGET_HIDDEN);
-		WM_widget_flag_disable(manipulator->translate_z, WM_WIDGET_HIDDEN);
+			WM_widget_flag_disable(axis, WM_WIDGET_HIDDEN);
+		}
+		MAN_ITER_AXES_END
 	}
 	else {
-		WM_widget_flag_enable(manipulator->translate_x, WM_WIDGET_HIDDEN);
-		WM_widget_flag_enable(manipulator->translate_y, WM_WIDGET_HIDDEN);
-		WM_widget_flag_enable(manipulator->translate_z, WM_WIDGET_HIDDEN);
+		MAN_ITER_AXES_BEGIN(MAN_AXES_TRANSLATE)
+		{
+			WM_widget_flag_enable(axis, WM_WIDGET_HIDDEN);
+		}
+		MAN_ITER_AXES_END
 	}
 
 	if (v3d->twtype & V3D_MANIP_ROTATE) {
 		/* should be added according to the order of axis */
+		MAN_ITER_AXES_BEGIN(MAN_AXES_ROTATE)
+		{
+			WM_widget_set_origin(axis, rv3d->twmat[3]);
+			WIDGET_dial_set_direction(axis, rv3d->twmat[i - 3]);
 
-		WM_widget_set_origin(manipulator->rotate_x, rv3d->twmat[3]);
-		WIDGET_dial_set_direction(manipulator->rotate_x, rv3d->twmat[0]);
-
-		WM_widget_set_origin(manipulator->rotate_y, rv3d->twmat[3]);
-		WIDGET_dial_set_direction(manipulator->rotate_y, rv3d->twmat[1]);
-
-		WM_widget_set_origin(manipulator->rotate_z, rv3d->twmat[3]);
-		WIDGET_dial_set_direction(manipulator->rotate_z, rv3d->twmat[2]);
-
-		WM_widget_flag_disable(manipulator->rotate_x, WM_WIDGET_HIDDEN);
-		WM_widget_flag_disable(manipulator->rotate_y, WM_WIDGET_HIDDEN);
-		WM_widget_flag_disable(manipulator->rotate_z, WM_WIDGET_HIDDEN);
+			WM_widget_flag_disable(axis, WM_WIDGET_HIDDEN);
+		}
+		MAN_ITER_AXES_END
 	}
 	else {
-		WM_widget_flag_enable(manipulator->rotate_x, WM_WIDGET_HIDDEN);
-		WM_widget_flag_enable(manipulator->rotate_y, WM_WIDGET_HIDDEN);
-		WM_widget_flag_enable(manipulator->rotate_z, WM_WIDGET_HIDDEN);
+		MAN_ITER_AXES_BEGIN(MAN_AXES_ROTATE)
+		{
+			WM_widget_flag_enable(axis, WM_WIDGET_HIDDEN);
+		}
+		MAN_ITER_AXES_END
 	}
 }
 
@@ -2042,15 +2096,15 @@ void WIDGETGROUP_manipulator_free(struct wmWidgetGroup *wgroup)
 	MEM_freeN(manipulator);
 }
 
-void WIDGETGROUP_manipulator_create(const struct bContext *C, struct wmWidgetGroup *wgroup)
+void WIDGETGROUP_manipulator_create(const struct bContext *UNUSED(C), struct wmWidgetGroup *wgroup)
 {
+	ManipulatorGroup *manipulator = MEM_callocN(sizeof(ManipulatorGroup), "manipulator_data");
+	wmWidget *widget, *axis;
+
 	float color_green[4] = {0.0f, 1.0f, 0.0f, 1.0f};
 	float color_red[4] = {1.0f, 0.0f, 0.0f, 1.0f};
 	float color_blue[4] = {0.0f, 0.0f, 1.0f, 1.0f};
-
-	wmWidget *widget = NULL;
-
-	ManipulatorGroup *manipulator = MEM_callocN(sizeof(ManipulatorGroup), "manipulator_data");
+	short i;
 
 	widget = WM_widget_new(WIDGET_manipulator_draw,
 	                       WIDGET_manipulator_render_3d_intersect,
@@ -2060,34 +2114,32 @@ void WIDGETGROUP_manipulator_create(const struct bContext *C, struct wmWidgetGro
 	wm_widget_register(wgroup, widget);
 
 	manipulator->translate_x = WIDGET_arrow_new(wgroup, WIDGET_ARROW_STYLE_NORMAL);
-	WIDGET_arrow_set_color(manipulator->translate_x, color_red);
-	manipulator->translate_x->render_3d_intersection = widget->render_3d_intersection;
-	wm_widget_register(wgroup, manipulator->translate_x);
-
 	manipulator->translate_y = WIDGET_arrow_new(wgroup, WIDGET_ARROW_STYLE_NORMAL);
-	WIDGET_arrow_set_color(manipulator->translate_y, color_green);
-	manipulator->translate_y->render_3d_intersection = widget->render_3d_intersection;
-	wm_widget_register(wgroup, manipulator->translate_y);
-
 	manipulator->translate_z = WIDGET_arrow_new(wgroup, WIDGET_ARROW_STYLE_NORMAL);
-	WIDGET_arrow_set_color(manipulator->translate_z, color_blue);
-	manipulator->translate_z->render_3d_intersection = widget->render_3d_intersection;
-	wm_widget_register(wgroup, manipulator->translate_z);
-
 	manipulator->rotate_x = WIDGET_dial_new(WIDGET_DIAL_STYLE_RING_CLIPPED);
-	WIDGET_dial_set_color(manipulator->rotate_x, color_red);
-	manipulator->rotate_x->render_3d_intersection = widget->render_3d_intersection;
-	wm_widget_register(wgroup, manipulator->rotate_x);
-
 	manipulator->rotate_y = WIDGET_dial_new(WIDGET_DIAL_STYLE_RING_CLIPPED);
-	WIDGET_dial_set_color(manipulator->rotate_y, color_green);
-	manipulator->rotate_y->render_3d_intersection = widget->render_3d_intersection;
-	wm_widget_register(wgroup, manipulator->rotate_y);
-
 	manipulator->rotate_z = WIDGET_dial_new(WIDGET_DIAL_STYLE_RING_CLIPPED);
-	WIDGET_dial_set_color(manipulator->rotate_z, color_blue);
-	manipulator->rotate_z->render_3d_intersection = widget->render_3d_intersection;
-	wm_widget_register(wgroup, manipulator->rotate_z);
+
+	MAN_ITER_AXES_BEGIN(MAN_AXES_ALL)
+	{
+		switch (i) {
+			case MAN_AXIS_TRANS_X:
+			case MAN_AXIS_ROT_X:
+				WIDGET_arrow_set_color(axis, color_red);
+				break;
+			case MAN_AXIS_TRANS_Y:
+			case MAN_AXIS_ROT_Y:
+				WIDGET_arrow_set_color(axis, color_green);
+				

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list