Bugfix [#36687] Animation channels can't be grouped in action editor

Internal filtering flags used to obtain AnimData blocks as result were not
working correctly in Action and ShapeKey modes. Instead, in these modes, they
were often returning F-Curves instead, which lead to the grouping operating
failing (and perhaps other unidentified bugs)
This commit is contained in:
Joshua Leung 2013-11-02 13:11:06 +00:00
parent 5c0a8ca73f
commit a8a4431fcf

@ -2624,24 +2624,50 @@ size_t ANIM_animdata_filter(bAnimContext *ac, ListBase *anim_data, int filter_mo
/* firstly filter the data */ /* firstly filter the data */
switch (datatype) { switch (datatype) {
/* Action-Editing Modes */
case ANIMCONT_ACTION: /* 'Action Editor' */ case ANIMCONT_ACTION: /* 'Action Editor' */
{ {
Object *obact = ac->obact; Object *obact = ac->obact;
SpaceAction *saction = (SpaceAction *)ac->sl; SpaceAction *saction = (SpaceAction *)ac->sl;
bDopeSheet *ads = (saction) ? &saction->ads : NULL; bDopeSheet *ads = (saction) ? &saction->ads : NULL;
/* the check for the DopeSheet summary is included here since the summary works here too */ /* specially check for AnimData filter... [#36687] */
if (animdata_filter_dopesheet_summary(ac, anim_data, filter_mode, &items)) if (UNLIKELY(filter_mode & ANIMFILTER_ANIMDATA)) {
items += animfilter_action(ac, anim_data, ads, data, filter_mode, (ID *)obact); /* all channels here are within the same AnimData block, hence this special case */
if (LIKELY(obact->adt)) {
ANIMCHANNEL_NEW_CHANNEL(obact->adt, ANIMTYPE_ANIMDATA, (ID *)obact);
}
}
else {
/* the check for the DopeSheet summary is included here since the summary works here too */
if (animdata_filter_dopesheet_summary(ac, anim_data, filter_mode, &items))
items += animfilter_action(ac, anim_data, ads, data, filter_mode, (ID *)obact);
}
break; break;
} }
case ANIMCONT_SHAPEKEY: /* 'ShapeKey Editor' */ case ANIMCONT_SHAPEKEY: /* 'ShapeKey Editor' */
{ {
/* the check for the DopeSheet summary is included here since the summary works here too */ Key *key = (Key *)data;
if (animdata_filter_dopesheet_summary(ac, anim_data, filter_mode, &items))
items = animdata_filter_shapekey(ac, anim_data, data, filter_mode); /* specially check for AnimData filter... [#36687] */
if (UNLIKELY(filter_mode & ANIMFILTER_ANIMDATA)) {
/* all channels here are within the same AnimData block, hence this special case */
if (LIKELY(key->adt)) {
ANIMCHANNEL_NEW_CHANNEL(key->adt, ANIMTYPE_ANIMDATA, (ID *)key);
}
}
else {
/* the check for the DopeSheet summary is included here since the summary works here too */
if (animdata_filter_dopesheet_summary(ac, anim_data, filter_mode, &items))
items = animdata_filter_shapekey(ac, anim_data, key, filter_mode);
}
break; break;
} }
/* Modes for Specialty Data Types (i.e. not keyframes) */
case ANIMCONT_GPENCIL: case ANIMCONT_GPENCIL:
{ {
if (animdata_filter_dopesheet_summary(ac, anim_data, filter_mode, &items)) if (animdata_filter_dopesheet_summary(ac, anim_data, filter_mode, &items))
@ -2654,6 +2680,9 @@ size_t ANIM_animdata_filter(bAnimContext *ac, ListBase *anim_data, int filter_mo
items = animdata_filter_mask(anim_data, data, filter_mode); items = animdata_filter_mask(anim_data, data, filter_mode);
break; break;
} }
/* DopeSheet Based Modes */
case ANIMCONT_DOPESHEET: /* 'DopeSheet Editor' */ case ANIMCONT_DOPESHEET: /* 'DopeSheet Editor' */
{ {
/* the DopeSheet editor is the primary place where the DopeSheet summaries are useful */ /* the DopeSheet editor is the primary place where the DopeSheet summaries are useful */
@ -2669,6 +2698,9 @@ size_t ANIM_animdata_filter(bAnimContext *ac, ListBase *anim_data, int filter_mo
items = animdata_filter_dopesheet(ac, anim_data, data, filter_mode); items = animdata_filter_dopesheet(ac, anim_data, data, filter_mode);
break; break;
} }
/* Special/Internal Use */
case ANIMCONT_CHANNEL: /* animation channel */ case ANIMCONT_CHANNEL: /* animation channel */
{ {
bDopeSheet *ads = ac->ads; bDopeSheet *ads = ac->ads;