[Bf-blender-cvs] [2baee18] wiggly-widgets: Fade manipulator widgets out when hiding them because of angle to view

Julian Eisel noreply at git.blender.org
Tue Aug 18 07:45:39 CEST 2015


Commit: 2baee1808112c01fdc4f33f0e722813fb59e302c
Author: Julian Eisel
Date:   Tue Aug 18 07:44:21 2015 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB2baee1808112c01fdc4f33f0e722813fb59e302c

Fade manipulator widgets out when hiding them because of angle to view

Aaaaand minor cleanup.

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

M	source/blender/editors/transform/manipulator_widget.c
M	source/blender/windowmanager/intern/wm_generic_widgets.c

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

diff --git a/source/blender/editors/transform/manipulator_widget.c b/source/blender/editors/transform/manipulator_widget.c
index 3bf15df..ea4c6a1 100644
--- a/source/blender/editors/transform/manipulator_widget.c
+++ b/source/blender/editors/transform/manipulator_widget.c
@@ -141,12 +141,6 @@ enum {
 	MAN_AXES_ROTATE,
 };
 
-/* color codes */
-
-#define MAN_RGB     0
-#define MAN_GHOST   1
-#define MAN_MOVECOL 2
-
 /* threshold for testing view aligned manipulator axis */
 #define TW_AXIS_DOT_MIN 0.02f
 #define TW_AXIS_DOT_MAX 0.1f
@@ -158,23 +152,23 @@ enum {
 #define MAN_ITER_AXES_BEGIN(axis_type) \
 	{ \
 		wmWidget *axis; \
-		int i; \
-		for (i = (axis_type == MAN_AXES_ROTATE ? MAN_AXIS_ROT_X : MAN_AXIS_TRANS_X); \
-		     i < (axis_type == MAN_AXES_TRANSLATE ? MAN_AXIS_TRANS_Z + 1 : MAN_AXIS_ROT_Z + 1); \
-		     i++) \
+		int axis_idx; \
+		for (axis_idx = (axis_type == MAN_AXES_ROTATE ? MAN_AXIS_ROT_X : MAN_AXIS_TRANS_X); \
+		     axis_idx < (axis_type == MAN_AXES_TRANSLATE ? MAN_AXIS_TRANS_Z + 1 : MAN_AXIS_ROT_Z + 1); \
+		     axis_idx++) \
 		{ \
-			axis = manipulator_get_axis_from_index(man, i); \
+			axis = manipulator_get_axis_from_index(man, axis_idx); \
 			if (!axis) continue;
 
 #define MAN_ITER_AXES_END \
 		} \
 	} ((void)0)
 
-static wmWidget *manipulator_get_axis_from_index(const ManipulatorGroup *man, const short index)
+static wmWidget *manipulator_get_axis_from_index(const ManipulatorGroup *man, const short axis_idx)
 {
-	BLI_assert(IN_RANGE_INCL(index, 0.0f, 5.0f));
+	BLI_assert(IN_RANGE_INCL(axis_idx, 0.0f, 5.0f));
 
-	switch (index) {
+	switch (axis_idx) {
 		case MAN_AXIS_TRANS_X:
 			return man->translate_x;
 		case MAN_AXIS_TRANS_Y:
@@ -202,6 +196,12 @@ 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 > 2) ? (axis_idx - 3) : axis_idx;
+}
+
 static bool manipulator_is_axis_visible(const RegionView3D *rv3d, const int axis_idx)
 {
 	switch (axis_idx) {
@@ -221,8 +221,10 @@ static bool manipulator_is_axis_visible(const RegionView3D *rv3d, const int axis
 	return false;
 }
 
-static void manipulator_get_axis_color(const int axis_idx, float r_col[4])
+static void manipulator_get_axis_color(const RegionView3D *rv3d, const int axis_idx, float r_col[4])
 {
+	const float idot = rv3d->tw_idot[manipulator_index_normalize(axis_idx)];
+
 	switch (axis_idx) {
 		case MAN_AXIS_TRANS_X:
 		case MAN_AXIS_ROT_X:
@@ -237,6 +239,11 @@ static void manipulator_get_axis_color(const int axis_idx, float r_col[4])
 			UI_GetThemeColor4fv(TH_AXIS_Z, r_col);
 			break;
 	}
+
+	/* get alpha fac based on axis angle, to fade axis out when hiding it because it points towards view */
+	r_col[3] = (idot > TW_AXIS_DOT_MAX) ?
+	            1.0f : (idot < TW_AXIS_DOT_MIN) ?
+	            0.0f : ((idot - TW_AXIS_DOT_MIN) / (TW_AXIS_DOT_MAX - TW_AXIS_DOT_MIN));
 }
 
 
@@ -908,21 +915,21 @@ void WIDGETGROUP_manipulator_draw(const struct bContext *C, struct wmWidgetGroup
 		const bool is_trans = (atype == MAN_AXES_TRANSLATE);
 		float col[4];
 
-		if (manipulator_is_axis_visible(rv3d, i) == false) {
+		if (manipulator_is_axis_visible(rv3d, axis_idx) == false) {
 			WM_widget_flag_set(axis, WM_WIDGET_HIDDEN, true);
 			continue;
 		}
 
-		manipulator_get_axis_color(i, col);
+		manipulator_get_axis_color(rv3d, axis_idx, col);
 
 		/* should be added according to the order of axis */
 		WM_widget_set_origin(axis, rv3d->twmat[3]);
 		if (is_trans) {
-			WIDGET_arrow_set_direction(axis, rv3d->twmat[i]);
+			WIDGET_arrow_set_direction(axis, rv3d->twmat[axis_idx]);
 			WIDGET_arrow_set_color(axis, col);
 		}
 		else {
-			WIDGET_dial_set_direction(axis, rv3d->twmat[i - 3]);
+			WIDGET_dial_set_direction(axis, rv3d->twmat[axis_idx - 3]);
 			WIDGET_dial_set_color(axis, col);
 		}
 
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 66841a6..b2c08ef 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -262,7 +262,9 @@ static void arrow_draw_intern(ArrowWidget *arrow, const bool select, const bool
 		glColor4fv(arrow->color);
 	}
 
+	glEnable(GL_BLEND);
 	arrow_draw_geom(arrow, select);
+	glDisable(GL_BLEND);
 
 	glPopMatrix();
 
@@ -643,7 +645,9 @@ static void widget_dial_draw(const bContext *C, wmWidget *widget)
 		glEnable(GL_CLIP_PLANE0);
 	}
 
+	glEnable(GL_BLEND);
 	dial_draw_intern(dial, false, (widget->flag & WM_WIDGET_HIGHLIGHT) != 0, widget->scale);
+	glDisable(GL_BLEND);
 
 	if (dial->style == WIDGET_DIAL_STYLE_RING_CLIPPED) {
 		glDisable(GL_CLIP_PLANE0);




More information about the Bf-blender-cvs mailing list