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:
authorGermano Cavalcante <germano.costa@ig.com.br>2021-01-30 18:55:07 +0300
committerGermano Cavalcante <germano.costa@ig.com.br>2021-01-31 16:31:15 +0300
commita9b53daf23ba8b6cb4c930e06154ffd35522b00d (patch)
treecb5796573816d514b2fbf147df147af4ac0fabed /source
parentc828a505c2e0987beed7a2a1803b05c1eb374ce2 (diff)
Fix T83092: Direction of rotation with View orientation changed in 2.91
This solution replaces {rBf9e994d0f463}. That commit created an inverted orientation matrix but the 'Align to Transform Orientation' operator doesn't work well with inverted matrices. This new solution makes the rotate operator use the negative vector of the axis.
Diffstat (limited to 'source')
-rw-r--r--source/blender/editors/transform/transform_constraints.c76
-rw-r--r--source/blender/editors/transform/transform_gizmo_3d.c8
-rw-r--r--source/blender/editors/transform/transform_mode_rotate.c7
3 files changed, 37 insertions, 54 deletions
diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c
index 54533bf43e5..78d3f213102 100644
--- a/source/blender/editors/transform/transform_constraints.c
+++ b/source/blender/editors/transform/transform_constraints.c
@@ -538,6 +538,36 @@ static void applyObjectConstraintSize(TransInfo *t,
}
}
+static void constraints_rotation_imp(TransInfo *t,
+ float axismtx[3][3],
+ float r_vec[3],
+ float *r_angle)
+{
+ BLI_assert(t->con.mode & CON_APPLY);
+ int mode = t->con.mode & (CON_AXIS0 | CON_AXIS1 | CON_AXIS2);
+
+ switch (mode) {
+ case CON_AXIS0:
+ case (CON_AXIS1 | CON_AXIS2):
+ negate_v3_v3(r_vec, axismtx[0]);
+ break;
+ case CON_AXIS1:
+ case (CON_AXIS0 | CON_AXIS2):
+ negate_v3_v3(r_vec, axismtx[1]);
+ break;
+ case CON_AXIS2:
+ case (CON_AXIS0 | CON_AXIS1):
+ negate_v3_v3(r_vec, axismtx[2]);
+ break;
+ }
+ /* don't flip axis if asked to or if num input */
+ if (r_angle && (mode & CON_NOFLIP) == 0 && hasNumInput(&t->num) == 0) {
+ if (dot_v3v3(r_vec, t->viewinv[2]) > 0.0f) {
+ *r_angle = -(*r_angle);
+ }
+ }
+}
+
/*
* Generic callback for constant spatial constraints applied to rotations
*
@@ -551,33 +581,11 @@ static void applyObjectConstraintSize(TransInfo *t,
* This insures that the rotation is always logically following the mouse.
* (ie: not doing counterclockwise rotations when the mouse moves clockwise).
*/
-
static void applyAxisConstraintRot(
TransInfo *t, TransDataContainer *UNUSED(tc), TransData *td, float vec[3], float *angle)
{
if (!td && t->con.mode & CON_APPLY) {
- int mode = t->con.mode & (CON_AXIS0 | CON_AXIS1 | CON_AXIS2);
-
- switch (mode) {
- case CON_AXIS0:
- case (CON_AXIS1 | CON_AXIS2):
- copy_v3_v3(vec, t->spacemtx[0]);
- break;
- case CON_AXIS1:
- case (CON_AXIS0 | CON_AXIS2):
- copy_v3_v3(vec, t->spacemtx[1]);
- break;
- case CON_AXIS2:
- case (CON_AXIS0 | CON_AXIS1):
- copy_v3_v3(vec, t->spacemtx[2]);
- break;
- }
- /* don't flip axis if asked to or if num input */
- if (angle && (mode & CON_NOFLIP) == 0 && hasNumInput(&t->num) == 0) {
- if (dot_v3v3(vec, t->viewinv[2]) > 0.0f) {
- *angle = -(*angle);
- }
- }
+ constraints_rotation_imp(t, t->spacemtx, vec, angle);
}
}
@@ -594,12 +602,10 @@ static void applyAxisConstraintRot(
* This insures that the rotation is always logically following the mouse.
* (ie: not doing counterclockwise rotations when the mouse moves clockwise).
*/
-
static void applyObjectConstraintRot(
TransInfo *t, TransDataContainer *tc, TransData *td, float vec[3], float *angle)
{
if (t->con.mode & CON_APPLY) {
- int mode = t->con.mode & (CON_AXIS0 | CON_AXIS1 | CON_AXIS2);
float tmp_axismtx[3][3];
float(*axismtx)[3];
@@ -618,25 +624,7 @@ static void applyObjectConstraintRot(
axismtx = td->axismtx;
}
- switch (mode) {
- case CON_AXIS0:
- case (CON_AXIS1 | CON_AXIS2):
- copy_v3_v3(vec, axismtx[0]);
- break;
- case CON_AXIS1:
- case (CON_AXIS0 | CON_AXIS2):
- copy_v3_v3(vec, axismtx[1]);
- break;
- case CON_AXIS2:
- case (CON_AXIS0 | CON_AXIS1):
- copy_v3_v3(vec, axismtx[2]);
- break;
- }
- if (angle && (mode & CON_NOFLIP) == 0 && hasNumInput(&t->num) == 0) {
- if (dot_v3v3(vec, t->viewinv[2]) > 0.0f) {
- *angle = -(*angle);
- }
- }
+ constraints_rotation_imp(t, axismtx, vec, angle);
}
}
diff --git a/source/blender/editors/transform/transform_gizmo_3d.c b/source/blender/editors/transform/transform_gizmo_3d.c
index b5399b208e2..166fded5209 100644
--- a/source/blender/editors/transform/transform_gizmo_3d.c
+++ b/source/blender/editors/transform/transform_gizmo_3d.c
@@ -1322,16 +1322,16 @@ void drawDial3d(const TransInfo *t)
if (tc->mode & CON_APPLY) {
if (tc->mode & CON_AXIS0) {
axis_idx = MAN_AXIS_ROT_X;
- negate_v3_v3(mat_basis[2], t->spacemtx[0]);
+ copy_v3_v3(mat_basis[2], t->spacemtx[0]);
}
else if (tc->mode & CON_AXIS1) {
axis_idx = MAN_AXIS_ROT_Y;
- negate_v3_v3(mat_basis[2], t->spacemtx[1]);
+ copy_v3_v3(mat_basis[2], t->spacemtx[1]);
}
else {
BLI_assert((tc->mode & CON_AXIS2) != 0);
axis_idx = MAN_AXIS_ROT_Z;
- negate_v3_v3(mat_basis[2], t->spacemtx[2]);
+ copy_v3_v3(mat_basis[2], t->spacemtx[2]);
}
}
else {
@@ -1384,7 +1384,7 @@ void drawDial3d(const TransInfo *t)
false,
&(struct Dial3dParams){
.draw_options = ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_VALUE,
- .angle_delta = t->values[0],
+ .angle_delta = t->values_final[0],
.angle_increment = increment,
});
diff --git a/source/blender/editors/transform/transform_mode_rotate.c b/source/blender/editors/transform/transform_mode_rotate.c
index e81ea8b0a0d..fa02e5382a7 100644
--- a/source/blender/editors/transform/transform_mode_rotate.c
+++ b/source/blender/editors/transform/transform_mode_rotate.c
@@ -200,12 +200,7 @@ static void applyRotation(TransInfo *t, const int UNUSED(mval[2]))
t->con.applyRot(t, NULL, NULL, axis_final, NULL);
}
else {
- copy_v3_v3(axis_final, t->spacemtx[t->orient_axis]);
- if (!(t->flag & T_INPUT_IS_VALUES_FINAL) && (dot_v3v3(axis_final, t->viewinv[2]) > 0.0f)) {
- /* The input is obtained according to the position of the mouse.
- * Flip to better match the movement. */
- final *= -1;
- }
+ negate_v3_v3(axis_final, t->spacemtx[t->orient_axis]);
}
if (applyNumInput(&t->num, &final)) {