From b57e09544a430a585e8665c7064252be1b59ec57 Mon Sep 17 00:00:00 2001 From: Janne Karhu Date: Fri, 24 Sep 2010 17:49:33 +0000 Subject: [PATCH] Fix for [#21875] Copy rotation only on y axies --- source/blender/blenkernel/intern/constraint.c | 4 +++- source/blender/blenlib/BLI_math_rotation.h | 1 + source/blender/blenlib/intern/math_rotation.c | 9 +++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c index cec552b8124..59e81293c9f 100644 --- a/source/blender/blenkernel/intern/constraint.c +++ b/source/blender/blenkernel/intern/constraint.c @@ -1636,8 +1636,9 @@ static void rotlike_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta mat4_to_size(size, cob->matrix); /* to allow compatible rotations, must get both rotations in the order of the owner... */ - mat4_to_eulO(eul, cob->rotOrder, ct->matrix); mat4_to_eulO(obeul, cob->rotOrder, cob->matrix); + /* we must get compatible eulers from the beginning because some of them can be modified below (see bug #21875) */ + mat4_to_compatible_eulO(eul, obeul, cob->rotOrder, ct->matrix); if ((data->flag & ROTLIKE_X)==0) eul[0] = obeul[0]; @@ -1669,6 +1670,7 @@ static void rotlike_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta eul[2] *= -1; } + /* good to make eulers compatible again, since we don't know how much they were changed above */ compatible_eul(eul, obeul); loc_eulO_size_to_mat4(cob->matrix, loc, eul, size, cob->rotOrder); } diff --git a/source/blender/blenlib/BLI_math_rotation.h b/source/blender/blenlib/BLI_math_rotation.h index ac8ed041ebc..1b3f4dced02 100644 --- a/source/blender/blenlib/BLI_math_rotation.h +++ b/source/blender/blenlib/BLI_math_rotation.h @@ -147,6 +147,7 @@ void mat4_to_eulO(float eul[3], short order, float mat[4][4]); void axis_angle_to_eulO(float eul[3], short order, float axis[3], float angle); void mat3_to_compatible_eulO(float eul[3], float old[3], short order, float mat[3][3]); +void mat4_to_compatible_eulO(float eul[3], float old[3], short order, float mat[4][4]); void rotate_eulO(float eul[3], short order, char axis, float angle); diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c index f72269f6d7b..b8cef511293 100644 --- a/source/blender/blenlib/intern/math_rotation.c +++ b/source/blender/blenlib/intern/math_rotation.c @@ -1249,6 +1249,15 @@ void mat3_to_compatible_eulO(float eul[3], float oldrot[3], short order,float ma copy_v3_v3(eul, eul1); } +void mat4_to_compatible_eulO(float eul[3], float oldrot[3], short order,float M[4][4]) +{ + float m[3][3]; + + /* for now, we'll just do this the slow way (i.e. copying matrices) */ + copy_m3_m4(m, M); + normalize_m3(m); + mat3_to_compatible_eulO(eul, oldrot, order, m); +} /* rotate the given euler by the given angle on the specified axis */ // NOTE: is this safe to do with different axis orders? void rotate_eulO(float beul[3], short order, char axis, float ang)