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
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2021-09-27 13:43:20 +0300
committerCampbell Barton <ideasman42@gmail.com>2021-09-27 14:04:34 +0300
commit2c2e1b3d612d87b54ce3c3f1e52b7c89ee88a5c3 (patch)
treef4bc56c5ba9fe0675118ef6200039d31122a1ab4 /source/blender/editors/animation
parent32ffb858d6da920926fcd37a6720d2a7b408e04b (diff)
Fix T81922: Pose bones F-Curves hidden for unselected objects
Whilst in pose-mode, the selection filter only includes other objects in pose-mode instead of the object selection. This makes sense as the selection of the pose bones what the user as acting on in the 3D view. The object selection only makes sense to use in object mode. Reviewed By: sybren Maniphest Tasks: T81922 Ref D12494
Diffstat (limited to 'source/blender/editors/animation')
-rw-r--r--source/blender/editors/animation/anim_filter.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c
index b12e0ae5cab..e1d046428a8 100644
--- a/source/blender/editors/animation/anim_filter.c
+++ b/source/blender/editors/animation/anim_filter.c
@@ -3087,7 +3087,10 @@ static size_t animdata_filter_dopesheet_movieclips(bAnimContext *ac,
}
/* Helper for animdata_filter_dopesheet() - For checking if an object should be included or not */
-static bool animdata_filter_base_is_ok(bDopeSheet *ads, Base *base, int filter_mode)
+static bool animdata_filter_base_is_ok(bDopeSheet *ads,
+ Base *base,
+ const eObjectMode object_mode,
+ int filter_mode)
{
Object *ob = base->object;
@@ -3144,10 +3147,21 @@ static bool animdata_filter_base_is_ok(bDopeSheet *ads, Base *base, int filter_m
}
/* check selection and object type filters */
- if ((ads->filterflag & ADS_FILTER_ONLYSEL) &&
- !((base->flag & BASE_SELECTED) /*|| (base == sce->basact) */)) {
- /* only selected should be shown */
- return false;
+ if (ads->filterflag & ADS_FILTER_ONLYSEL) {
+ if (object_mode & OB_MODE_POSE) {
+ /* When in pose-mode handle all pose-mode objects.
+ * This avoids problems with pose-mode where objects may be unselected,
+ * where a selected bone of an unselected object would be hidden. see: T81922. */
+ if (!(base->object->mode & object_mode)) {
+ return false;
+ }
+ }
+ else {
+ /* only selected should be shown (ignore active) */
+ if (!(base->flag & BASE_SELECTED)) {
+ return false;
+ }
+ }
}
/* check if object belongs to the filtering group if option to filter
@@ -3185,7 +3199,7 @@ static Base **animdata_filter_ds_sorted_bases(bDopeSheet *ads,
Base **sorted_bases = MEM_mallocN(sizeof(Base *) * tot_bases, "Dopesheet Usable Sorted Bases");
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
- if (animdata_filter_base_is_ok(ads, base, filter_mode)) {
+ if (animdata_filter_base_is_ok(ads, base, OB_MODE_OBJECT, filter_mode)) {
sorted_bases[num_bases++] = base;
}
}
@@ -3278,8 +3292,10 @@ static size_t animdata_filter_dopesheet(bAnimContext *ac,
/* Filter and add contents of each base (i.e. object) without them sorting first
* NOTE: This saves performance in cases where order doesn't matter
*/
+ Object *obact = OBACT(view_layer);
+ const eObjectMode object_mode = obact ? obact->mode : OB_MODE_OBJECT;
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
- if (animdata_filter_base_is_ok(ads, base, filter_mode)) {
+ if (animdata_filter_base_is_ok(ads, base, object_mode, filter_mode)) {
/* since we're still here, this object should be usable */
items += animdata_filter_dopesheet_ob(ac, anim_data, ads, base, filter_mode);
}