diff options
-rw-r--r-- | source/blender/makesdna/DNA_action_types.h | 4 | ||||
-rw-r--r-- | source/blender/src/drawaction.c | 35 | ||||
-rw-r--r-- | source/blender/src/editaction.c | 30 | ||||
-rw-r--r-- | source/blender/src/header_action.c | 11 |
4 files changed, 76 insertions, 4 deletions
diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h index 9fef59b948f..26b7e3c1013 100644 --- a/source/blender/makesdna/DNA_action_types.h +++ b/source/blender/makesdna/DNA_action_types.h @@ -233,7 +233,9 @@ typedef enum SACTION_FLAG { /* don't include keyframes that are out of view */ SACTION_HORIZOPTIMISEON = (1<<5), /* hack for moving pose-markers (temp flag) */ - SACTION_POSEMARKERS_MOVE = (1<<6) + SACTION_POSEMARKERS_MOVE = (1<<6), + /* draw action channels using group colours (where applicable) */ + SACTION_DRAWGCOLORS = (1<<7) } SACTION_FLAG; /* SpaceAction AutoSnap Settings (also used by SpaceNLA) */ diff --git a/source/blender/src/drawaction.c b/source/blender/src/drawaction.c index 1d3ece58db7..c761bed1fec 100644 --- a/source/blender/src/drawaction.c +++ b/source/blender/src/drawaction.c @@ -462,6 +462,7 @@ static void draw_channel_names(void) if ( IN_RANGE(yminc, G.v2d->cur.ymin, G.v2d->cur.ymax) || IN_RANGE(ymaxc, G.v2d->cur.ymin, G.v2d->cur.ymax) ) { + bActionGroup *grp = NULL; short indent= 0, offset= 0, sel= 0, group=0; int expand= -1, protect = -1, special= -1, mute = -1; char name[32]; @@ -495,6 +496,8 @@ static void draw_channel_names(void) bActionChannel *achan= (bActionChannel *)ale->data; group= (ale->grp) ? 1 : 0; + grp= ale->grp; + indent = 0; special = -1; @@ -524,7 +527,9 @@ static void draw_channel_names(void) bConstraintChannel *conchan = (bConstraintChannel *)ale->data; indent = 2; + group= (ale->grp) ? 1 : 0; + grp= ale->grp; if (EDITABLE_CONCHAN(conchan)) protect = ICON_UNLOCKED; @@ -548,7 +553,9 @@ static void draw_channel_names(void) indent = 2; protect = -1; // for now, until this can be supported by others + group= (ale->grp) ? 1 : 0; + grp= ale->grp; if (icu->flag & IPO_MUTE) mute = ICON_MUTE_IPO_ON; @@ -581,7 +588,9 @@ static void draw_channel_names(void) indent = 1; special = geticon_ipo_blocktype(achan->ipo->blocktype); + group= (ale->grp) ? 1 : 0; + grp= ale->grp; if (FILTER_IPO_ACHAN(achan)) expand = ICON_TRIA_DOWN; @@ -598,7 +607,9 @@ static void draw_channel_names(void) indent = 1; special = ICON_CONSTRAINT; + group= (ale->grp) ? 1 : 0; + grp= ale->grp; if (FILTER_CON_ACHAN(achan)) expand = ICON_TRIA_DOWN; @@ -625,8 +636,28 @@ static void draw_channel_names(void) offset = 0; } else { - /* for normal channels */ - BIF_ThemeColorShade(TH_HEADER, ((indent==0)?20: (indent==1)?-20: -40)); + /* for normal channels + * - use 3 shades of color group/standard colour for 3 indention level + * - use standard colour if enabled + */ + if ((G.saction->flag & SACTION_DRAWGCOLORS) && (grp)) { + char cp[3]; + + if (indent == 2) { + VECCOPY(cp, grp->cs.solid); + } + else if (indent == 1) { + VECCOPY(cp, grp->cs.select); + } + else { + VECCOPY(cp, grp->cs.active); + } + + glColor3ub(cp[0], cp[1], cp[2]); + } + else + BIF_ThemeColorShade(TH_HEADER, ((indent==0)?20: (indent==1)?-20: -40)); + indent += group; offset = 7 * indent; glRectf(x+offset, yminc, (float)NAMEWIDTH, ymaxc); diff --git a/source/blender/src/editaction.c b/source/blender/src/editaction.c index 6a0d50826e9..b344f94b6bd 100644 --- a/source/blender/src/editaction.c +++ b/source/blender/src/editaction.c @@ -1150,8 +1150,38 @@ void verify_pchan2achan_grouping (bAction *act, bPose *pose, char name[]) grp= MEM_callocN(sizeof(bActionGroup), "bActionGroup"); grp->flag |= (AGRP_ACTIVE|AGRP_SELECTED|AGRP_EXPANDED); + + /* copy name */ sprintf(grp->name, agrp->name); + /* deal with group-color copying */ + if (agrp->customCol) { + if (agrp->customCol > 0) { + /* copy theme colors on-to group's custom color in case user tries to edit color */ + bTheme *btheme= U.themes.first; + ThemeWireColor *col_set= &btheme->tarm[(agrp->customCol - 1)]; + + memcpy(&grp->cs, col_set, sizeof(ThemeWireColor)); + } + else { + /* init custom colours with a generic multi-colour rgb set, if not initialised already */ + if (agrp->cs.solid[0] == 0) { + /* define for setting colors in theme below */ + #define SETCOL(col, r, g, b, a) col[0]=r; col[1]=g; col[2]= b; col[3]= a; + + SETCOL(grp->cs.solid, 0xff, 0x00, 0x00, 255); + SETCOL(grp->cs.select, 0x81, 0xe6, 0x14, 255); + SETCOL(grp->cs.active, 0x18, 0xb6, 0xe0, 255); + + #undef SETCOL + } + else { + /* just copy color set specified */ + memcpy(&grp->cs, &agrp->cs, sizeof(ThemeWireColor)); + } + } + } + BLI_addtail(&act->groups, grp); } diff --git a/source/blender/src/header_action.c b/source/blender/src/header_action.c index 584e68263a3..19cb8e7f343 100644 --- a/source/blender/src/header_action.c +++ b/source/blender/src/header_action.c @@ -97,7 +97,8 @@ enum { ACTMENU_VIEW_TIME, ACTMENU_VIEW_NOHIDE, ACTMENU_VIEW_TRANSDELDUPS, - ACTMENU_VIEW_HORIZOPTIMISE + ACTMENU_VIEW_HORIZOPTIMISE, + ACTMENU_VIEW_GCOLORS }; enum { @@ -347,6 +348,9 @@ static void do_action_viewmenu(void *arg, int event) case ACTMENU_VIEW_HORIZOPTIMISE: /* Include keyframes not in view (horizontally) when preparing to draw */ G.saction->flag ^= SACTION_HORIZOPTIMISEON; break; + case ACTMENU_VIEW_GCOLORS: /* Draw grouped-action channels using its group's color */ + G.saction->flag ^= SACTION_DRAWGCOLORS; + break; } allqueue(REDRAWVIEW3D, 0); } @@ -393,6 +397,11 @@ static uiBlock *action_viewmenu(void *arg_unused) menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_VIEW_NOHIDE, ""); + uiDefIconTextBut(block, BUTM, 1, (G.saction->flag & SACTION_DRAWGCOLORS)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT, + "Use Group Colors|", 0, yco-=20, + menuwidth, 19, NULL, 0.0, 0.0, 1, + ACTMENU_VIEW_GCOLORS, ""); + // this option may get removed in future uiDefIconTextBut(block, BUTM, 1, (G.saction->flag & SACTION_HORIZOPTIMISEON)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT, "Cull Out-of-View Keys (Time)|", 0, yco-=20, |