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
path: root/source
diff options
context:
space:
mode:
authorJoshua Leung <aligorith@gmail.com>2008-04-28 11:38:06 +0400
committerJoshua Leung <aligorith@gmail.com>2008-04-28 11:38:06 +0400
commit945527549024f7ba6a1cc185b30a103e293376ce (patch)
treefb09e12e4e612282a01eb65d84fe84329cba701a /source
parentcf84cf5f211475dc72cffe0ebba85e2ad91fee6b (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.h3
-rw-r--r--source/blender/src/drawaction.c6
-rw-r--r--source/blender/src/editaction.c45
-rw-r--r--source/blender/src/header_action.c16
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);