From 77eaf5cd7a4db325e68dbe4161746ca92ebd6fb0 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 13 Sep 2017 18:19:23 +1000 Subject: [PATCH] Manipulator: Only allow negative scale w/ flag set In most cases we don't want this by default --- source/blender/editors/include/ED_manipulator_library.h | 9 +++++---- .../manipulator_types/cage2d_manipulator.c | 8 ++++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/include/ED_manipulator_library.h b/source/blender/editors/include/ED_manipulator_library.h index bde2a165ee6..f9f4e052e7c 100644 --- a/source/blender/editors/include/ED_manipulator_library.h +++ b/source/blender/editors/include/ED_manipulator_library.h @@ -90,10 +90,11 @@ void ED_manipulator_arrow3d_set_range_fac(struct wmManipulator *mpr, const float /* Cage Manipulator */ enum { - ED_MANIPULATOR_CAGE2D_XFORM_FLAG_TRANSLATE = (1 << 0), /* Manipulator translates */ - ED_MANIPULATOR_CAGE2D_XFORM_FLAG_ROTATE = (1 << 1), /* Manipulator rotates */ - ED_MANIPULATOR_CAGE2D_XFORM_FLAG_SCALE = (1 << 2), /* Manipulator scales */ - ED_MANIPULATOR_CAGE2D_XFORM_FLAG_SCALE_UNIFORM = (1 << 3), /* Manipulator scales uniformly */ + ED_MANIPULATOR_CAGE2D_XFORM_FLAG_TRANSLATE = (1 << 0), /* Translates */ + ED_MANIPULATOR_CAGE2D_XFORM_FLAG_ROTATE = (1 << 1), /* Rotates */ + ED_MANIPULATOR_CAGE2D_XFORM_FLAG_SCALE = (1 << 2), /* Scales */ + ED_MANIPULATOR_CAGE2D_XFORM_FLAG_SCALE_UNIFORM = (1 << 3), /* Scales uniformly */ + ED_MANIPULATOR_CAGE2D_XFORM_FLAG_SCALE_SIGNED = (1 << 4), /* Negative scale allowed */ }; /** #wmManipulator.highlight_part */ diff --git a/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c b/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c index 3d7195e016b..f8379c929db 100644 --- a/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c +++ b/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c @@ -760,7 +760,15 @@ static int manipulator_rect_transform_modal( delta_orig[i] *= -1.0f; delta_curr[i] *= -1.0f; } + const int sign = signum_i(scale[i]); + scale[i] = 1.0f + ((delta_curr[i] - delta_orig[i]) / len_v3(data->orig_matrix_offset[i])); + + if ((transform_flag & ED_MANIPULATOR_CAGE2D_XFORM_FLAG_SCALE_SIGNED) == 0) { + if (sign != signum_i(scale[i])) { + scale[i] = 0.0f; + } + } } }