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.
This commit is contained in:
Germano Cavalcante 2021-01-30 12:55:07 -03:00
parent acc662ea5a
commit 216ebe0b73
Notes: blender-bot 2023-02-14 06:17:14 +01:00
Referenced by commit 419c67c851, Fix error in recent commit
Referenced by issue #85734, Vector Math Bug.
Referenced by issue #83216, Potential candidates for corrective releases
Referenced by issue #83092, Rotate with "R" key or using bpy.ops.transform.rotate produces inverted rotation. Effects Object, Mesh Edit and Pose Mode
3 changed files with 37 additions and 54 deletions

View File

@ -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, t->spacemtx[0]);
break;
case CON_AXIS1:
case (CON_AXIS0 | CON_AXIS2):
negate_v3_v3(r_vec, t->spacemtx[1]);
break;
case CON_AXIS2:
case (CON_AXIS0 | CON_AXIS1):
negate_v3_v3(r_vec, t->spacemtx[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);
}
}

View File

@ -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,
});

View File

@ -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)) {