forked from bartvdbraak/blender
2.4x Bugfix - #18188: "Clear user transform" does not work as described
For the record, "Clear user transform" is supposed to restore selected bones to the transforms defined by Actions/NLA, not back to rest position.
This commit is contained in:
parent
b4e4ccf92d
commit
9a1e1912e1
@ -80,6 +80,7 @@ void pose_activate_flipped_bone(void);
|
|||||||
void pose_movetolayer(void);
|
void pose_movetolayer(void);
|
||||||
void pose_relax(void);
|
void pose_relax(void);
|
||||||
void pose_flipquats(void);
|
void pose_flipquats(void);
|
||||||
|
void pose_clear_user_transforms(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -4123,8 +4123,6 @@ static uiBlock *view3d_edit_armaturemenu(void *arg_unused)
|
|||||||
|
|
||||||
static void do_view3d_pose_armature_transformmenu(void *arg, int event)
|
static void do_view3d_pose_armature_transformmenu(void *arg, int event)
|
||||||
{
|
{
|
||||||
Object *ob= OBACT;
|
|
||||||
|
|
||||||
switch(event) {
|
switch(event) {
|
||||||
case 0: /* clear origin */
|
case 0: /* clear origin */
|
||||||
clear_object('o');
|
clear_object('o');
|
||||||
@ -4139,9 +4137,7 @@ static void do_view3d_pose_armature_transformmenu(void *arg, int event)
|
|||||||
clear_object('g');
|
clear_object('g');
|
||||||
break;
|
break;
|
||||||
case 4: /* clear user transform */
|
case 4: /* clear user transform */
|
||||||
rest_pose(ob->pose);
|
pose_clear_user_transforms();
|
||||||
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
|
|
||||||
BIF_undo_push("Pose, Clear User Transform");
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
allqueue(REDRAWVIEW3D, 0);
|
allqueue(REDRAWVIEW3D, 0);
|
||||||
|
@ -568,9 +568,7 @@ void pose_special_editmenu(void)
|
|||||||
pose_clear_paths(ob);
|
pose_clear_paths(ob);
|
||||||
}
|
}
|
||||||
else if(nr==5) {
|
else if(nr==5) {
|
||||||
rest_pose(ob->pose);
|
pose_clear_user_transforms();
|
||||||
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
|
|
||||||
BIF_undo_push("Clear User Transform Pose");
|
|
||||||
}
|
}
|
||||||
else if(nr==6) {
|
else if(nr==6) {
|
||||||
pose_relax();
|
pose_relax();
|
||||||
@ -1740,4 +1738,30 @@ void pose_flipquats(void)
|
|||||||
autokeyframe_pose_cb_func(ob, TFM_ROTATION, 0);
|
autokeyframe_pose_cb_func(ob, TFM_ROTATION, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Restore selected pose-bones to 'action'-defined pose */
|
||||||
|
void pose_clear_user_transforms (void)
|
||||||
|
{
|
||||||
|
Object *ob = OBACT;
|
||||||
|
bArmature *arm= ob->data;
|
||||||
|
bPoseChannel *pchan;
|
||||||
|
|
||||||
|
if (ob->pose == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* find selected bones */
|
||||||
|
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
|
||||||
|
if (pchan->bone && (pchan->bone->flag & BONE_SELECTED) && (pchan->bone->layer & arm->layer)) {
|
||||||
|
/* just clear the BONE_UNKEYED flag, allowing this bone to get overwritten by actions again */
|
||||||
|
pchan->bone->flag &= ~BONE_UNKEYED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* clear pose locking flag
|
||||||
|
* - this will only clear the user-defined pose in the selected bones, where BONE_UNKEYED has been cleared
|
||||||
|
*/
|
||||||
|
ob->pose->flag |= POSE_DO_UNLOCK;
|
||||||
|
|
||||||
|
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
|
||||||
|
BIF_undo_push("Clear User Transform");
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user