Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2017-09-20 11:30:24 +0300
committerCampbell Barton <ideasman42@gmail.com>2017-09-20 11:33:43 +0300
commit42c174d1a5c6a45552210ca1d40018bc1a549c42 (patch)
tree5f81e7f4bdeaaaf4c7d945d745c9e06fe1cc0c9b /source/blender/editors/transform
parent31fc75ef9332566c084763307c8fa717c6165770 (diff)
Manipulator: fix visibility check w/ 2-axis planes
Diffstat (limited to 'source/blender/editors/transform')
-rw-r--r--source/blender/editors/transform/transform_manipulator.c56
1 files changed, 40 insertions, 16 deletions
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;
}