[Bf-blender-cvs] [42c174d1a5c] blender2.8: Manipulator: fix visibility check w/ 2-axis planes

Campbell Barton noreply at git.blender.org
Wed Sep 20 10:22:48 CEST 2017


Commit: 42c174d1a5c6a45552210ca1d40018bc1a549c42
Author: Campbell Barton
Date:   Wed Sep 20 18:30:24 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB42c174d1a5c6a45552210ca1d40018bc1a549c42

Manipulator: fix visibility check w/ 2-axis planes

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

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

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

diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index cd1dcde564b..500820956ca 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -191,27 +191,40 @@ static short manipulator_get_axis_type(const int axis_idx)
 	return -1;
 }
 
-/* get index within axis type, so that x == 0, y == 1 and z == 2, no matter which axis type */
-static uint manipulator_index_normalize(const int axis_idx)
+static uint manipulator_orientation_axis(const int axis_idx, bool *r_is_plane)
 {
 	switch (axis_idx) {
+		case MAN_AXIS_TRANS_YZ:
+		case MAN_AXIS_SCALE_YZ:
+			if (r_is_plane) {
+				*r_is_plane = true;
+			}
+			ATTR_FALLTHROUGH;
 		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:
 			return 0;
+
+		case MAN_AXIS_TRANS_ZX:
+		case MAN_AXIS_SCALE_ZX:
+			if (r_is_plane) {
+				*r_is_plane = true;
+			}
+			ATTR_FALLTHROUGH;
 		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:
 			return 1;
+
+		case MAN_AXIS_TRANS_XY:
+		case MAN_AXIS_SCALE_XY:
+			if (r_is_plane) {
+				*r_is_plane = true;
+			}
+			ATTR_FALLTHROUGH;
 		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:
 			return 2;
 	}
 	return 3;
@@ -221,10 +234,17 @@ static bool manipulator_is_axis_visible(
         const View3D *v3d, const RegionView3D *rv3d,
         const float idot[3], const int axis_type, const int axis_idx)
 {
-	const uint aidx_norm = manipulator_index_normalize(axis_idx);
+	bool is_plane = false;
+	const uint aidx_norm = manipulator_orientation_axis(axis_idx, &is_plane);
 	/* don't draw axis perpendicular to the view */
-	if (aidx_norm < 3 && idot[aidx_norm] < TW_AXIS_DOT_MIN) {
-		return false;
+	if (aidx_norm < 3) {
+		float idot_axis = idot[aidx_norm];
+		if (is_plane) {
+			idot_axis = 1.0f - idot_axis;
+		}
+		if (idot_axis < TW_AXIS_DOT_MIN) {
+			return false;
+		}
 	}
 
 	if ((axis_type == MAN_AXES_TRANSLATE && !(v3d->twtype & V3D_MANIP_TRANSLATE)) ||
@@ -300,10 +320,14 @@ static void manipulator_get_axis_color(
 	const float alpha_hi = 1.0f;
 	float alpha_fac;
 
-	const int axis_idx_norm = manipulator_index_normalize(axis_idx);
+	bool is_plane = false;
+	const int axis_idx_norm = manipulator_orientation_axis(axis_idx, &is_plane);
 	/* get alpha fac based on axis angle, to fade axis out when hiding it because it points towards view */
 	if (axis_idx_norm < 3) {
-		const float idot_axis = idot[axis_idx_norm];
+		float idot_axis = idot[axis_idx_norm];
+		if (is_plane) {
+			idot_axis = 1.0f - idot_axis;
+		}
 		alpha_fac = (idot_axis > TW_AXIS_DOT_MAX) ?
 		        1.0f : (idot_axis < TW_AXIS_DOT_MIN) ?
 		        0.0f : ((idot_axis - TW_AXIS_DOT_MIN) / (TW_AXIS_DOT_MAX - TW_AXIS_DOT_MIN));
@@ -1242,7 +1266,7 @@ static void WIDGETGROUP_manipulator_refresh(const bContext *C, wmManipulatorGrou
 	MAN_ITER_AXES_BEGIN(axis, axis_idx)
 	{
 		const short axis_type = manipulator_get_axis_type(axis_idx);
-		const int aidx_norm = manipulator_index_normalize(axis_idx);
+		const int aidx_norm = manipulator_orientation_axis(axis_idx, NULL);
 
 		WM_manipulator_set_matrix_location(axis, rv3d->twmat[3]);
 
@@ -1277,8 +1301,8 @@ static void WIDGETGROUP_manipulator_refresh(const bContext *C, wmManipulatorGrou
 			case MAN_AXIS_SCALE_YZ:
 			case MAN_AXIS_SCALE_ZX:
 			{
-				const float *y_axis = rv3d->twmat[aidx_norm + 1 > 2 ? 0 : aidx_norm + 1];
-				const float *z_axis = rv3d->twmat[aidx_norm - 1 < 0 ? 2 : aidx_norm - 1];
+				const float *y_axis = rv3d->twmat[aidx_norm - 1 < 0 ? 2 : aidx_norm - 1];
+				const float *z_axis = rv3d->twmat[aidx_norm];
 				WM_manipulator_set_matrix_rotation_from_yz_axis(axis, y_axis, z_axis);
 				break;
 			}



More information about the Bf-blender-cvs mailing list