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
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/armature/armature_add.c')
-rw-r--r--source/blender/editors/armature/armature_add.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/source/blender/editors/armature/armature_add.c b/source/blender/editors/armature/armature_add.c
index 02ecfdb4ea6..e1d4b5fec73 100644
--- a/source/blender/editors/armature/armature_add.c
+++ b/source/blender/editors/armature/armature_add.c
@@ -15,11 +15,11 @@
*
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
- * Operators and API's for creating bones
*/
/** \file
* \ingroup edarmature
+ * Operators and API's for creating bones.
*/
#include "DNA_anim_types.h"
@@ -581,8 +581,6 @@ static void updateDuplicateLocRotConstraintSettings(Object *ob,
{
/* This code assumes that bRotLimitConstraint and bLocLimitConstraint have the same fields in
* the same memory locations. */
- BLI_assert(sizeof(bLocLimitConstraint) == sizeof(bRotLimitConstraint));
-
bRotLimitConstraint *limit = (bRotLimitConstraint *)curcon->data;
float local_mat[4][4], imat[4][4];
@@ -798,6 +796,13 @@ static void updateDuplicateTransformConstraintSettings(Object *ob,
trans->to_min_rot[i] = temp_vec[i];
}
}
+
+ if (trans->from == TRANS_ROTATION && trans->map[1] == Y) {
+ /* Y Rot to Y Rot: Flip and invert */
+ trans->to_max_rot[1] = -trans->to_min_rot[1];
+ trans->to_min_rot[1] = -temp_vec[1];
+ }
+
break;
}
/* convert back to the settings space */
@@ -854,14 +859,28 @@ static void updateDuplicateCustomBoneShapes(bContext *C, EditBone *dup_bone, Obj
Main *bmain = CTX_data_main(C);
char name_flip[MAX_ID_NAME - 2];
+ /* Invert the X location */
+ pchan->custom_translation[0] *= -1;
+ /* Invert the Y rotation */
+ pchan->custom_rotation_euler[1] *= -1;
+ /* Invert the Z rotation */
+ pchan->custom_rotation_euler[2] *= -1;
+
/* Skip the first two chars in the object name as those are used to store object type */
BLI_string_flip_side_name(name_flip, pchan->custom->id.name + 2, false, sizeof(name_flip));
Object *shape_ob = (Object *)BKE_libblock_find_name(bmain, ID_OB, name_flip);
+ /* If name_flip doesn't exist, BKE_libblock_find_name() returns pchan->custom (best match) */
+ shape_ob = shape_ob == pchan->custom ? NULL : shape_ob;
+
if (shape_ob != NULL) {
/* A flipped shape object exists, use it! */
pchan->custom = shape_ob;
}
+ else {
+ /* Flip shape */
+ pchan->custom_scale_xyz[0] *= -1;
+ }
}
}