diff options
author | Joshua Leung <aligorith@gmail.com> | 2008-04-28 11:38:06 +0400 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2008-04-28 11:38:06 +0400 |
commit | 945527549024f7ba6a1cc185b30a103e293376ce (patch) | |
tree | fb09e12e4e612282a01eb65d84fe84329cba701a /source | |
parent | cf84cf5f211475dc72cffe0ebba85e2ad91fee6b (diff) |
== Action Editor - Action Groups finishing touches ==
* Added a new tool "Synchronise with Armature" (found under Channels->Grouping), which synchronises the grouping of action-channels and the grouping of their relevant bones.
This only works when the active object is an armature, and the action isn't pinned. All of the action's action-channels are removed from their groups, and are added back into groups according to the current grouping of their corresponding bones.
A bit of testing for weird cases is needed.
* Group colours are now not drawn if the group originally was using the 'default' colour-set.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/include/BIF_editaction.h | 3 | ||||
-rw-r--r-- | source/blender/src/drawaction.c | 6 | ||||
-rw-r--r-- | source/blender/src/editaction.c | 45 | ||||
-rw-r--r-- | source/blender/src/header_action.c | 16 |
4 files changed, 65 insertions, 5 deletions
diff --git a/source/blender/include/BIF_editaction.h b/source/blender/include/BIF_editaction.h index 0bd869d2923..e2e813f35bd 100644 --- a/source/blender/include/BIF_editaction.h +++ b/source/blender/include/BIF_editaction.h @@ -141,7 +141,8 @@ void paste_actdata(void); /* Group/Channel Operations */ struct bActionGroup *get_active_actiongroup(struct bAction *act); void set_active_actiongroup(struct bAction *act, struct bActionGroup *agrp, short select); -void verify_pchan2achan_grouping(struct bAction *act, struct bPose *pose, char name[]); +void verify_pchan2achan_grouping(struct bAction *act, struct bPose *pose, char name[]); +void sync_pchan2achan_grouping(void); void action_groups_group(short add_group); void action_groups_ungroup(void); diff --git a/source/blender/src/drawaction.c b/source/blender/src/drawaction.c index eb01339c821..459a9983793 100644 --- a/source/blender/src/drawaction.c +++ b/source/blender/src/drawaction.c @@ -635,9 +635,11 @@ static void draw_channel_names(void) else { /* for normal channels * - use 3 shades of color group/standard colour for 3 indention level - * - use standard colour if enabled + * - only use group colors if allowed to, and if actually feasible */ - if ((G.saction->flag & SACTION_DRAWGCOLORS) && (grp)) { + if ( (G.saction->flag & SACTION_DRAWGCOLORS) && + (grp) && (grp->customCol) ) + { char cp[3]; if (indent == 2) { diff --git a/source/blender/src/editaction.c b/source/blender/src/editaction.c index d5bec0431e5..d0ef051b713 100644 --- a/source/blender/src/editaction.c +++ b/source/blender/src/editaction.c @@ -1178,6 +1178,7 @@ void verify_pchan2achan_grouping (bAction *act, bPose *pose, char name[]) } } } + grp->customCol= agrp->customCol; BLI_addtail(&act->groups, grp); } @@ -1188,6 +1189,50 @@ void verify_pchan2achan_grouping (bAction *act, bPose *pose, char name[]) } } +/* This function is used when the user specifically requests to sync changes of pchans + bone groups + * to achans + action groups. All achans are detached from their groups, and all groups are destroyed. + * They are then recreated when the achans are reassigned to groups. + * + * Note: This doesn't preserve hand-created groups, and will operate on ALL action-channels regardless of + * whether they were selected or active. More specific filtering can be added later. + */ +void sync_pchan2achan_grouping () +{ + void *data; + short datatype; + bAction *act; + bActionChannel *achan, *next, *last; + bPose *pose; + + /* determine what type of data we are operating on */ + data = get_action_context(&datatype); + if ((datatype != ACTCONT_ACTION) || (data==NULL)) return; + if ((G.saction->pin) || (OBACT==NULL) || (OBACT->type != OB_ARMATURE)) { + error("Action doesn't belong to active armature"); + return; + } + + /* get data */ + act= (bAction *)data; + pose= OBACT->pose; + + /* remove achan->group links, then delete all groups */ + for (achan= act->chanbase.first; achan; achan= achan->next) + achan->grp = NULL; + BLI_freelistN(&act->groups); + + /* loop through all achans, reassigning them to groups (colours are resyncronised) */ + last= act->chanbase.last; + for (achan= act->chanbase.first; achan && achan!=last; achan= next) { + next= achan->next; + verify_pchan2achan_grouping(act, pose, achan->name); + } + + /* undo and redraw */ + BIF_undo_push("Sync Armature-Data and Action"); + allqueue(REDRAWACTION, 0); +} + /* **************************************************** */ /* TRANSFORM TOOLS */ diff --git a/source/blender/src/header_action.c b/source/blender/src/header_action.c index 8405c5bf89d..503688aff69 100644 --- a/source/blender/src/header_action.c +++ b/source/blender/src/header_action.c @@ -136,7 +136,8 @@ enum { enum { ACTMENU_CHANNELS_GROUP_ADD_TOACTIVE = 0, ACTMENU_CHANNELS_GROUP_ADD_TONEW, - ACTMENU_CHANNELS_GROUP_REMOVE + ACTMENU_CHANNELS_GROUP_REMOVE, + ACTMENU_CHANNELS_GROUP_SYNCPOSE }; enum { @@ -762,6 +763,9 @@ static void do_action_channelmenu_groupmenu(void *arg, int event) case ACTMENU_CHANNELS_GROUP_REMOVE: action_groups_ungroup(); break; + case ACTMENU_CHANNELS_GROUP_SYNCPOSE: /* Syncronise Pose-data and Action-data */ + sync_pchan2achan_grouping(); + break; } } @@ -782,7 +786,7 @@ static uiBlock *action_channelmenu_groupmenu(void *arg_unused) "Add to New Group|Ctrl Shift G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_CHANNELS_GROUP_ADD_TONEW, ""); - + uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); @@ -790,6 +794,14 @@ static uiBlock *action_channelmenu_groupmenu(void *arg_unused) "Remove From Group|Alt G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_CHANNELS_GROUP_REMOVE, ""); + + uiDefBut(block, SEPR, 0, "", 0, yco-=6, + menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); + + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, + "Synchronise with Armature", 0, yco-=20, + menuwidth, 19, NULL, 0.0, 0.0, 0, + ACTMENU_CHANNELS_GROUP_SYNCPOSE, ""); uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 60); |