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
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2018-10-17 08:30:15 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-10-17 09:18:30 +0300
commit80fb943e4f5326aa5cdebb7be1c54044bcc6da92 (patch)
tree37615bf13797eb69d03a2e4245d102c116ba7a03 /source
parent9273b91eefdd0f58679470735e84d95fd59ea44c (diff)
Transform: map mouse input to shear direction
Diffstat (limited to 'source')
-rw-r--r--source/blender/editors/transform/transform.c47
-rw-r--r--source/blender/editors/transform/transform.h1
-rw-r--r--source/blender/editors/transform/transform_input.c12
3 files changed, 46 insertions, 14 deletions
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index 989e7e9c924..ec689808ce3 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -3341,13 +3341,42 @@ static void Bend(TransInfo *t, const int UNUSED(mval[2]))
/** \name Transform Shear
* \{ */
+static void initShear_mouseInputMode(TransInfo *t)
+{
+ float dir[3];
+
+ if (t->custom.mode.data == NULL) {
+ copy_v3_v3(dir, t->axis_ortho);
+ }
+ else {
+ cross_v3_v3v3(dir, t->axis_ortho, t->axis);
+ }
+
+ mul_mat3_m4_v3(t->viewmat, dir);
+ if (normalize_v2(dir) == 0.0f) {
+ dir[0] = 1.0f;
+ }
+ setCustomPointsFromDirection(t, &t->mouse, dir);
+
+ initMouseInputMode(t, &t->mouse, INPUT_CUSTOM_RATIO);
+}
+
static void initShear(TransInfo *t)
{
t->mode = TFM_SHEAR;
t->transform = applyShear;
t->handleEvent = handleEventShear;
- initMouseInputMode(t, &t->mouse, INPUT_HORIZONTAL_RATIO);
+ if (is_zero_v3(t->axis)) {
+ negate_v3_v3(t->axis, t->viewinv[2]);
+ normalize_v3(t->axis);
+ }
+ if (is_zero_v3(t->axis_ortho)) {
+ copy_v3_v3(t->axis_ortho, t->viewinv[0]);
+ normalize_v3(t->axis_ortho);
+ }
+
+ initShear_mouseInputMode(t);
t->idx_max = 0;
t->num.idx_max = 0;
@@ -3360,15 +3389,6 @@ static void initShear(TransInfo *t)
t->num.unit_type[0] = B_UNIT_NONE; /* Don't think we have any unit here? */
t->flag |= T_NO_CONSTRAINT;
-
- if (is_zero_v3(t->axis)) {
- negate_v3_v3(t->axis, t->viewinv[2]);
- normalize_v3(t->axis);
- }
- if (is_zero_v3(t->axis_ortho)) {
- copy_v3_v3(t->axis_ortho, t->viewinv[0]);
- normalize_v3(t->axis_ortho);
- }
}
static eRedrawFlag handleEventShear(TransInfo *t, const wmEvent *event)
@@ -3378,25 +3398,24 @@ static eRedrawFlag handleEventShear(TransInfo *t, const wmEvent *event)
if (event->type == MIDDLEMOUSE && event->val == KM_PRESS) {
/* Use custom.mode.data pointer to signal Shear direction */
if (t->custom.mode.data == NULL) {
- initMouseInputMode(t, &t->mouse, INPUT_VERTICAL_RATIO);
t->custom.mode.data = (void *)1;
}
else {
- initMouseInputMode(t, &t->mouse, INPUT_HORIZONTAL_RATIO);
t->custom.mode.data = NULL;
}
+ initShear_mouseInputMode(t);
status = TREDRAW_HARD;
}
else if (event->type == XKEY && event->val == KM_PRESS) {
- initMouseInputMode(t, &t->mouse, INPUT_HORIZONTAL_RATIO);
t->custom.mode.data = NULL;
+ initShear_mouseInputMode(t);
status = TREDRAW_HARD;
}
else if (event->type == YKEY && event->val == KM_PRESS) {
- initMouseInputMode(t, &t->mouse, INPUT_VERTICAL_RATIO);
t->custom.mode.data = (void *)1;
+ initShear_mouseInputMode(t);
status = TREDRAW_HARD;
}
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index 7d981f86e38..d777b034e76 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -825,6 +825,7 @@ eRedrawFlag handleMouseInput(struct TransInfo *t, struct MouseInput *mi, const s
void applyMouseInput(struct TransInfo *t, struct MouseInput *mi, const int mval[2], float output[3]);
void setCustomPoints(TransInfo *t, MouseInput *mi, const int start[2], const int end[2]);
+void setCustomPointsFromDirection(TransInfo *t, MouseInput *mi, const float dir[2]);
void setInputPostFct(MouseInput *mi, void (*post)(struct TransInfo *t, float values[3]));
/*********************** Generics ********************************/
diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c
index 971b9f74c65..cdac18f7584 100644
--- a/source/blender/editors/transform/transform_input.c
+++ b/source/blender/editors/transform/transform_input.c
@@ -137,6 +137,18 @@ void setCustomPoints(TransInfo *UNUSED(t), MouseInput *mi, const int mval_start[
data[3] = mval_end[1];
}
+void setCustomPointsFromDirection(TransInfo *t, MouseInput *mi, const float dir[2])
+{
+ BLI_ASSERT_UNIT_V2(dir);
+ const int win_axis = t->ar ? ((abs(t->ar->winx * dir[0]) + abs(t->ar->winy * dir[1])) / 2) : 1;
+ const int mval_start[2] = {
+ mi->imval[0] + dir[0] * win_axis,
+ mi->imval[1] + dir[1] * win_axis,
+ };
+ const int mval_end[2] = {mi->imval[0], mi->imval[1]};
+ setCustomPoints(t, mi, mval_start, mval_end);
+}
+
static void InputCustomRatioFlip(TransInfo *UNUSED(t), MouseInput *mi, const double mval[2], float output[3])
{
double length;