From f760e3d44354094a9b8eb2fac28c945ecae08dbd Mon Sep 17 00:00:00 2001 From: Nate Rupsis Date: Sat, 18 Feb 2023 15:18:52 -0500 Subject: [PATCH 1/6] Cleanup: Refactor BKE_nlatrack_add to multiple methods to handle adding a new NLA track to the track list. Insert before, after, head, and tail --- source/blender/blenkernel/BKE_nla.h | 54 ++++++- source/blender/blenkernel/intern/ipo.c | 2 +- source/blender/blenkernel/intern/nla.c | 134 ++++++++++++++---- source/blender/blenkernel/intern/nla_test.cc | 40 +++++- source/blender/editors/object/object_add.cc | 2 +- .../blender/editors/space_nla/nla_channels.c | 6 +- source/blender/editors/space_nla/nla_edit.c | 13 +- .../blender/makesrna/intern/rna_animation.c | 10 +- 8 files changed, 209 insertions(+), 52 deletions(-) diff --git a/source/blender/blenkernel/BKE_nla.h b/source/blender/blenkernel/BKE_nla.h index a58b4166ba5..d75a32c7857 100644 --- a/source/blender/blenkernel/BKE_nla.h +++ b/source/blender/blenkernel/BKE_nla.h @@ -35,6 +35,11 @@ struct PropertyRNA; /* ----------------------------- */ /* Data Management */ +/** + * Create new NLA Track. + */ +struct NlaTrack *BKE_nlatrack_new(void); + /** * Frees the given NLA strip, and calls #BKE_nlastrip_remove_and_free to * remove and free all children strips. @@ -88,12 +93,51 @@ void BKE_nla_tracks_copy_from_adt(struct Main *bmain, int flag); /** - * Add a NLA Track to the given AnimData. - * \param prev: NLA-Track to add the new one after. + * Inserts a given NLA track before a specified NLA track within the + * passed NLA track list. */ -struct NlaTrack *BKE_nlatrack_add(struct AnimData *adt, - struct NlaTrack *prev, - bool is_liboverride); +void BKE_nlatrack_insert_before(ListBase *nla_tracks, + struct NlaTrack *next, + struct NlaTrack *new_track, + bool is_liboverride); + +/** + * Inserts a given NLA track after a specified NLA track within the + * passed NLA track list. + */ +void BKE_nlatrack_insert_after(ListBase *nla_tracks, + struct NlaTrack *prev, + struct NlaTrack *new_track, + bool is_liboverride); + +/** + * Calls #BKE_nlatrack_new to create a new NLA track, inserts it before the + * given NLA track with #BKE_nlatrack_insert_before, and sets it as active. + */ +struct NlaTrack *BKE_nlatrack_new_before_and_set_active(ListBase *nla_tracks, + struct NlaTrack *next, + bool is_liboverride); + +/** + * Calls #BKE_nlatrack_new to create a new NLA track, inserts it after the + * given NLA track with #BKE_nlatrack_insert_after, and sets it as active. + */ +struct NlaTrack *BKE_nlatrack_new_after_and_set_active(ListBase *nla_tracks, + struct NlaTrack *prev, + bool is_liboverride); + +/** + * Calls #BKE_nlatrack_new to create a new NLA track, inserts it as the head of the + * NLA track list with #BKE_nlatrack_new_before_and_set_active, and sets it as active. + */ +struct NlaTrack *BKE_nlatrack_new_head_and_set_active(ListBase *nla_tracks, bool is_liboverride); + +/** + * Calls #BKE_nlatrack_new to create a new NLA track, inserts it as the tail of the + * NLA track list with #BKE_nlatrack_new_after_and_set_active, and sets it as active. + */ +struct NlaTrack *BKE_nlatrack_new_tail_and_set_active(ListBase *nla_tracks, + const bool is_liboverride); /** * Removes the given NLA track from the list of tracks provided. diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c index a21033a8b91..6a1a24ea341 100644 --- a/source/blender/blenkernel/intern/ipo.c +++ b/source/blender/blenkernel/intern/ipo.c @@ -2005,7 +2005,7 @@ static void nlastrips_to_animdata(ID *id, ListBase *strips) /* trying to add to the current failed (no space), * so add a new track to the stack, and add to that... */ - nlt = BKE_nlatrack_add(adt, NULL, false); + nlt = BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, false); BKE_nlatrack_add_strip(nlt, strip, false); } diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c index 2dbab08ef20..da32bc0b8d3 100644 --- a/source/blender/blenkernel/intern/nla.c +++ b/source/blender/blenkernel/intern/nla.c @@ -336,21 +336,61 @@ void BKE_nla_tracks_copy_from_adt(Main *bmain, /* Adding ------------------------------------------- */ -NlaTrack *BKE_nlatrack_add(AnimData *adt, NlaTrack *prev, const bool is_liboverride) +NlaTrack *BKE_nlatrack_new(void) { - NlaTrack *nlt; - - /* sanity checks */ - if (adt == NULL) { - return NULL; - } - /* allocate new track */ - nlt = MEM_callocN(sizeof(NlaTrack), "NlaTrack"); + NlaTrack *nlt = MEM_callocN(sizeof(NlaTrack), "NlaTrack"); /* set settings requiring the track to not be part of the stack yet */ nlt->flag = NLATRACK_SELECTED | NLATRACK_OVERRIDELIBRARY_LOCAL; - nlt->index = BLI_listbase_count(&adt->nla_tracks); + + return nlt; +} + +void BKE_nlatrack_insert_before(ListBase *nla_tracks, + struct NlaTrack *next, + struct NlaTrack *new_track, + bool is_liboverride) +{ + if (is_liboverride) { + + /** Currently, all library override tracks are assumed to be grouped together at the start of + * the list. So we can only add the new track after the last library track. */ + if (next != NULL && (next->flag & NLATRACK_OVERRIDELIBRARY_LOCAL) == 0) { + BKE_nlatrack_insert_after(nla_tracks, next, new_track, is_liboverride); + return; + } + } + + BLI_insertlinkbefore(nla_tracks, next, new_track); + new_track->index = BLI_findindex(nla_tracks, new_track); + + /* Must have unique name, but we need to seed this. */ + strcpy(new_track->name, "NlaTrack"); + + BLI_uniquename(nla_tracks, + new_track, + DATA_("NlaTrack"), + '.', + offsetof(NlaTrack, name), + sizeof(new_track->name)); +} + +void BKE_nlatrack_insert_after(ListBase *nla_tracks, + struct NlaTrack *prev, + struct NlaTrack *new_track, + bool is_liboverride) +{ + BLI_assert(!ELEM(NULL, nla_tracks, new_track)); + + /** If NULL, then caller intends to insert a new head. But, tracks are not allowed to be placed + * before library overrides. So it must inserted after the last override. */ + if (prev == NULL) { + NlaTrack *first_track = (NlaTrack *)nla_tracks->first; + if (first_track != NULL && (first_track->flag & NLATRACK_OVERRIDELIBRARY_LOCAL) == 0) { + prev = first_track; + } + } /* In liboverride case, we only add local tracks after all those coming from the linked data, * so we need to find the first local track. */ @@ -361,22 +401,54 @@ NlaTrack *BKE_nlatrack_add(AnimData *adt, NlaTrack *prev, const bool is_liboverr } prev = first_local != NULL ? first_local->prev : NULL; } + /* Add track to stack, and make it the active one. */ - if (prev != NULL) { - BLI_insertlinkafter(&adt->nla_tracks, prev, nlt); - } - else { - BLI_addtail(&adt->nla_tracks, nlt); - } - BKE_nlatrack_set_active(&adt->nla_tracks, nlt); + BLI_insertlinkafter(nla_tracks, prev, new_track); + new_track->index = BLI_findindex(nla_tracks, new_track); /* must have unique name, but we need to seed this */ - strcpy(nlt->name, "NlaTrack"); - BLI_uniquename( - &adt->nla_tracks, nlt, DATA_("NlaTrack"), '.', offsetof(NlaTrack, name), sizeof(nlt->name)); + BLI_uniquename(nla_tracks, + new_track, + DATA_("NlaTrack"), + '.', + offsetof(NlaTrack, name), + sizeof(new_track->name)); +} - /* return the new track */ - return nlt; +NlaTrack *BKE_nlatrack_new_before_and_set_active(ListBase *nla_tracks, + struct NlaTrack *next, + bool is_liboverride) +{ + NlaTrack *new_track = BKE_nlatrack_new(); + + BKE_nlatrack_insert_before(nla_tracks, next, new_track, is_liboverride); + BKE_nlatrack_set_active(nla_tracks, new_track); + + return new_track; +} + +NlaTrack *BKE_nlatrack_new_after_and_set_active(ListBase *nla_tracks, + struct NlaTrack *prev, + bool is_liboverride) +{ + NlaTrack *new_track = BKE_nlatrack_new(); + + BKE_nlatrack_insert_after(nla_tracks, prev, new_track, is_liboverride); + BKE_nlatrack_set_active(nla_tracks, new_track); + + return new_track; +} + +NlaTrack *BKE_nlatrack_new_head_and_set_active(ListBase *nla_tracks, bool is_liboverride) +{ + return BKE_nlatrack_new_before_and_set_active( + nla_tracks, (NlaTrack *)nla_tracks->first, is_liboverride); +} + +NlaTrack *BKE_nlatrack_new_tail_and_set_active(ListBase *nla_tracks, const bool is_liboverride) +{ + return BKE_nlatrack_new_after_and_set_active( + nla_tracks, (NlaTrack *)nla_tracks->last, is_liboverride); } NlaStrip *BKE_nlastrip_new(bAction *act) @@ -448,7 +520,7 @@ NlaStrip *BKE_nlastack_add_strip(AnimData *adt, bAction *act, const bool is_libo /* trying to add to the last track failed (no track or no space), * so add a new track to the stack, and add to that... */ - nlt = BKE_nlatrack_add(adt, NULL, is_liboverride); + nlt = BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, is_liboverride); BKE_nlatrack_add_strip(nlt, strip, is_liboverride); BLI_strncpy(nlt->name, act->id.name + 2, sizeof(nlt->name)); } @@ -848,8 +920,8 @@ void BKE_nlastrips_make_metas(ListBase *strips, bool is_temp) mstrip->end = strip->end; } else { - /* current strip wasn't selected, so the end of 'island' of selected strips has been reached, - * so stop adding strips to the current meta + /* current strip wasn't selected, so the end of 'island' of selected strips has been + * reached, so stop adding strips to the current meta. */ mstrip = NULL; } @@ -1180,7 +1252,9 @@ bool BKE_nlatrack_add_strip(NlaTrack *nlt, NlaStrip *strip, const bool is_libove return false; } - /* Do not allow adding strips if this track is locked, or not a local one in liboverride case. */ + /* + * Do not allow adding strips if this track is locked, or not a local one in liboverride case. + */ if (nlt->flag & NLATRACK_PROTECTED || (is_liboverride && (nlt->flag & NLATRACK_OVERRIDELIBRARY_LOCAL) == 0)) { return false; @@ -1952,7 +2026,7 @@ bool BKE_nla_action_stash(AnimData *adt, const bool is_liboverride) } } - nlt = BKE_nlatrack_add(adt, prev_track, is_liboverride); + nlt = BKE_nlatrack_new_after_and_set_active(&adt->nla_tracks, prev_track, is_liboverride); BLI_assert(nlt != NULL); /* We need to ensure that if there wasn't any previous instance, @@ -2075,7 +2149,8 @@ static void nla_tweakmode_find_active(const ListBase /* NlaTrack */ *nla_tracks, /* There are situations where we may have multiple strips selected and we want to enter * tweak-mode on all of those at once. Usually in those cases, * it will usually just be a single strip per AnimData. - * In such cases, compromise and take the last selected track and/or last selected strip, #28468. + * In such cases, compromise and take the last selected track and/or last selected strip, + * #28468. */ if (activeTrack == NULL) { /* try last selected track for active strip */ @@ -2150,7 +2225,8 @@ bool BKE_nla_tweakmode_enter(AnimData *adt) activeStrip->flag &= ~NLASTRIP_FLAG_TWEAKUSER; /* go over all the tracks after AND INCLUDING the active one, tagging them as being disabled - * - the active track needs to also be tagged, otherwise, it'll overlap with the tweaks going on + * - the active track needs to also be tagged, otherwise, it'll overlap with the tweaks going + * on. */ activeTrack->flag |= NLATRACK_DISABLED; if ((adt->flag & ADT_NLA_EVAL_UPPER_TRACKS) == 0) { diff --git a/source/blender/blenkernel/intern/nla_test.cc b/source/blender/blenkernel/intern/nla_test.cc index 0520a3b270e..5fce99eb2ff 100644 --- a/source/blender/blenkernel/intern/nla_test.cc +++ b/source/blender/blenkernel/intern/nla_test.cc @@ -94,12 +94,10 @@ TEST(nla_track, BKE_nlatrack_remove_strip) TEST(nla_track, BKE_nlatrack_remove_and_free) { AnimData adt{}; - NlaTrack *track1; - NlaTrack *track2; /* Add NLA tracks to the Animation Data. */ - track1 = BKE_nlatrack_add(&adt, NULL, false); - track2 = BKE_nlatrack_add(&adt, track1, false); + NlaTrack *track1 = BKE_nlatrack_new_tail_and_set_active(&adt.nla_tracks, false); + NlaTrack *track2 = BKE_nlatrack_new_tail_and_set_active(&adt.nla_tracks, false); /* Ensure we have 2 tracks in the track. */ EXPECT_EQ(2, BLI_listbase_count(&adt.nla_tracks)); @@ -116,4 +114,38 @@ TEST(nla_track, BKE_nlatrack_remove_and_free) EXPECT_EQ(-1, BLI_findindex(&adt.nla_tracks, track1)); } +TEST(nla_track, BKE_nlatrack_new_tail_and_set_active) +{ + AnimData adt{}; + NlaTrack *trackB = BKE_nlatrack_new_tail_and_set_active(&adt.nla_tracks, false); + NlaTrack *trackA = BKE_nlatrack_new_tail_and_set_active(&adt.nla_tracks, false); + + // Expect that Track B was added before track A + EXPECT_EQ(1, BLI_findindex(&adt.nla_tracks, trackA)); + EXPECT_EQ(0, BLI_findindex(&adt.nla_tracks, trackB)); + + // Free the tracks + BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackA, false); + BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackB, false); +} + +TEST(nla_track, BKE_nlatrack_new_head_and_set_active) +{ + AnimData adt{}; + NlaTrack *trackB = BKE_nlatrack_new_head_and_set_active(&adt.nla_tracks, false); + NlaTrack *trackA = BKE_nlatrack_new_head_and_set_active(&adt.nla_tracks, false); + + // Expect that Track A was added before track B + EXPECT_EQ(0, BLI_findindex(&adt.nla_tracks, trackA)); + EXPECT_EQ(1, BLI_findindex(&adt.nla_tracks, trackB)); + + // Free the tracks + BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackA, false); + BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackB, false); +} + } // namespace blender::bke::tests + + + + diff --git a/source/blender/editors/object/object_add.cc b/source/blender/editors/object/object_add.cc index 3d24e09b53c..fa81e31ac0e 100644 --- a/source/blender/editors/object/object_add.cc +++ b/source/blender/editors/object/object_add.cc @@ -1993,7 +1993,7 @@ static int object_speaker_add_exec(bContext *C, wmOperator *op) { /* create new data for NLA hierarchy */ AnimData *adt = BKE_animdata_ensure_id(&ob->id); - NlaTrack *nlt = BKE_nlatrack_add(adt, nullptr, is_liboverride); + NlaTrack *nlt = BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, is_liboverride); NlaStrip *strip = BKE_nla_add_soundstrip(bmain, scene, static_cast(ob->data)); strip->start = scene->r.cfra; strip->end += strip->start; diff --git a/source/blender/editors/space_nla/nla_channels.c b/source/blender/editors/space_nla/nla_channels.c index 1d7645d4e67..2786cd7e187 100644 --- a/source/blender/editors/space_nla/nla_channels.c +++ b/source/blender/editors/space_nla/nla_channels.c @@ -581,14 +581,14 @@ bool nlaedit_add_tracks_existing(bAnimContext *ac, bool above_sel) */ if (above_sel) { /* just add a new one above this one */ - BKE_nlatrack_add(adt, nlt, is_liboverride); + BKE_nlatrack_new_after_and_set_active(&adt->nla_tracks, nlt, is_liboverride); ale->update = ANIM_UPDATE_DEPS; added = true; } else if ((lastAdt == NULL) || (adt != lastAdt)) { /* add one track to the top of the owning AnimData's stack, * then don't add anymore to this stack */ - BKE_nlatrack_add(adt, NULL, is_liboverride); + BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, is_liboverride); lastAdt = adt; ale->update = ANIM_UPDATE_DEPS; added = true; @@ -625,7 +625,7 @@ bool nlaedit_add_tracks_empty(bAnimContext *ac) /* ensure it is empty */ if (BLI_listbase_is_empty(&adt->nla_tracks)) { /* add new track to this AnimData block then */ - BKE_nlatrack_add(adt, NULL, ID_IS_OVERRIDE_LIBRARY(ale->id)); + BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, ID_IS_OVERRIDE_LIBRARY(ale->id)); ale->update = ANIM_UPDATE_DEPS; added = true; } diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c index b61b5d8e63b..2e61d12ad23 100644 --- a/source/blender/editors/space_nla/nla_edit.c +++ b/source/blender/editors/space_nla/nla_edit.c @@ -717,7 +717,7 @@ static int nlaedit_add_actionclip_exec(bContext *C, wmOperator *op) /* trying to add to the current failed (no space), * so add a new track to the stack, and add to that... */ - nlt = BKE_nlatrack_add(adt, NULL, is_liboverride); + nlt = BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, is_liboverride); BKE_nlatrack_add_strip(nlt, strip, is_liboverride); } @@ -955,7 +955,7 @@ static int nlaedit_add_sound_exec(bContext *C, wmOperator *UNUSED(op)) /* trying to add to the current failed (no space), * so add a new track to the stack, and add to that... */ - nlt = BKE_nlatrack_add(adt, NULL, is_liboverride); + nlt = BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, is_liboverride); BKE_nlatrack_add_strip(nlt, strip, is_liboverride); } @@ -1191,11 +1191,8 @@ static int nlaedit_duplicate_exec(bContext *C, wmOperator *op) /* in case there's no space in the track above, * or we haven't got a reference to it yet, try adding */ if (BKE_nlatrack_add_strip(nlt->next, nstrip, is_liboverride) == 0) { - /* need to add a new track above the one above the current one - * - if the current one is the last one, nlt->next will be NULL, which defaults to adding - * at the top of the stack anyway... - */ - track = BKE_nlatrack_add(adt, nlt->next, is_liboverride); + track = BKE_nlatrack_new_after_and_set_active( + &adt->nla_tracks, nlt->next, is_liboverride); BKE_nlatrack_add_strip(track, nstrip, is_liboverride); } @@ -2459,7 +2456,7 @@ static int nlaedit_snap_exec(bContext *C, wmOperator *op) /* in case there's no space in the current track, try adding */ if (BKE_nlatrack_add_strip(nlt, strip, is_liboverride) == 0) { /* need to add a new track above the current one */ - track = BKE_nlatrack_add(adt, nlt, is_liboverride); + track = BKE_nlatrack_new_after_and_set_active(&adt->nla_tracks, nlt, is_liboverride); BKE_nlatrack_add_strip(track, strip, is_liboverride); /* clear temp meta-strips on this new track, diff --git a/source/blender/makesrna/intern/rna_animation.c b/source/blender/makesrna/intern/rna_animation.c index 43560c5ecba..91a6f230619 100644 --- a/source/blender/makesrna/intern/rna_animation.c +++ b/source/blender/makesrna/intern/rna_animation.c @@ -573,7 +573,15 @@ static void rna_KeyingSet_paths_clear(KeyingSet *keyingset, ReportList *reports) /* needs wrapper function to push notifier */ static NlaTrack *rna_NlaTrack_new(ID *id, AnimData *adt, Main *bmain, bContext *C, NlaTrack *track) { - NlaTrack *new_track = BKE_nlatrack_add(adt, track, ID_IS_OVERRIDE_LIBRARY(id)); + NlaTrack *new_track; + + if (track != NULL) { + new_track = BKE_nlatrack_new_after_and_set_active( + &adt->nla_tracks, track, ID_IS_OVERRIDE_LIBRARY(id)); + } + else { + new_track = BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, ID_IS_OVERRIDE_LIBRARY(id)); + } WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_ADDED, NULL); -- 2.30.2 From 5024910a2bdf46a38771a041007b7e02177c55b3 Mon Sep 17 00:00:00 2001 From: Nate Rupsis Date: Sat, 18 Feb 2023 15:18:52 -0500 Subject: [PATCH 2/6] Cleanup: Refactor BKE_nlatrack_add to multiple methods to handle adding a new NLA track to the track list. Insert before, after, head, and tail --- source/blender/blenkernel/BKE_nla.h | 54 ++++++- source/blender/blenkernel/intern/ipo.c | 2 +- source/blender/blenkernel/intern/nla.c | 134 ++++++++++++++---- source/blender/blenkernel/intern/nla_test.cc | 40 +++++- source/blender/editors/object/object_add.cc | 2 +- .../blender/editors/space_nla/nla_channels.c | 6 +- source/blender/editors/space_nla/nla_edit.c | 13 +- .../blender/makesrna/intern/rna_animation.c | 10 +- 8 files changed, 209 insertions(+), 52 deletions(-) diff --git a/source/blender/blenkernel/BKE_nla.h b/source/blender/blenkernel/BKE_nla.h index 2d76dfb9b30..b7618bc6688 100644 --- a/source/blender/blenkernel/BKE_nla.h +++ b/source/blender/blenkernel/BKE_nla.h @@ -35,6 +35,11 @@ struct PropertyRNA; /* ----------------------------- */ /* Data Management */ +/** + * Create new NLA Track. + */ +struct NlaTrack *BKE_nlatrack_new(void); + /** * Frees the given NLA strip, and calls #BKE_nlastrip_remove_and_free to * remove and free all children strips. @@ -88,12 +93,51 @@ void BKE_nla_tracks_copy_from_adt(struct Main *bmain, int flag); /** - * Add a NLA Track to the given AnimData. - * \param prev: NLA-Track to add the new one after. + * Inserts a given NLA track before a specified NLA track within the + * passed NLA track list. */ -struct NlaTrack *BKE_nlatrack_add(struct AnimData *adt, - struct NlaTrack *prev, - bool is_liboverride); +void BKE_nlatrack_insert_before(ListBase *nla_tracks, + struct NlaTrack *next, + struct NlaTrack *new_track, + bool is_liboverride); + +/** + * Inserts a given NLA track after a specified NLA track within the + * passed NLA track list. + */ +void BKE_nlatrack_insert_after(ListBase *nla_tracks, + struct NlaTrack *prev, + struct NlaTrack *new_track, + bool is_liboverride); + +/** + * Calls #BKE_nlatrack_new to create a new NLA track, inserts it before the + * given NLA track with #BKE_nlatrack_insert_before, and sets it as active. + */ +struct NlaTrack *BKE_nlatrack_new_before_and_set_active(ListBase *nla_tracks, + struct NlaTrack *next, + bool is_liboverride); + +/** + * Calls #BKE_nlatrack_new to create a new NLA track, inserts it after the + * given NLA track with #BKE_nlatrack_insert_after, and sets it as active. + */ +struct NlaTrack *BKE_nlatrack_new_after_and_set_active(ListBase *nla_tracks, + struct NlaTrack *prev, + bool is_liboverride); + +/** + * Calls #BKE_nlatrack_new to create a new NLA track, inserts it as the head of the + * NLA track list with #BKE_nlatrack_new_before_and_set_active, and sets it as active. + */ +struct NlaTrack *BKE_nlatrack_new_head_and_set_active(ListBase *nla_tracks, bool is_liboverride); + +/** + * Calls #BKE_nlatrack_new to create a new NLA track, inserts it as the tail of the + * NLA track list with #BKE_nlatrack_new_after_and_set_active, and sets it as active. + */ +struct NlaTrack *BKE_nlatrack_new_tail_and_set_active(ListBase *nla_tracks, + const bool is_liboverride); /** * Removes the given NLA track from the list of tracks provided. diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c index a21033a8b91..6a1a24ea341 100644 --- a/source/blender/blenkernel/intern/ipo.c +++ b/source/blender/blenkernel/intern/ipo.c @@ -2005,7 +2005,7 @@ static void nlastrips_to_animdata(ID *id, ListBase *strips) /* trying to add to the current failed (no space), * so add a new track to the stack, and add to that... */ - nlt = BKE_nlatrack_add(adt, NULL, false); + nlt = BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, false); BKE_nlatrack_add_strip(nlt, strip, false); } diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c index 2dbab08ef20..da32bc0b8d3 100644 --- a/source/blender/blenkernel/intern/nla.c +++ b/source/blender/blenkernel/intern/nla.c @@ -336,21 +336,61 @@ void BKE_nla_tracks_copy_from_adt(Main *bmain, /* Adding ------------------------------------------- */ -NlaTrack *BKE_nlatrack_add(AnimData *adt, NlaTrack *prev, const bool is_liboverride) +NlaTrack *BKE_nlatrack_new(void) { - NlaTrack *nlt; - - /* sanity checks */ - if (adt == NULL) { - return NULL; - } - /* allocate new track */ - nlt = MEM_callocN(sizeof(NlaTrack), "NlaTrack"); + NlaTrack *nlt = MEM_callocN(sizeof(NlaTrack), "NlaTrack"); /* set settings requiring the track to not be part of the stack yet */ nlt->flag = NLATRACK_SELECTED | NLATRACK_OVERRIDELIBRARY_LOCAL; - nlt->index = BLI_listbase_count(&adt->nla_tracks); + + return nlt; +} + +void BKE_nlatrack_insert_before(ListBase *nla_tracks, + struct NlaTrack *next, + struct NlaTrack *new_track, + bool is_liboverride) +{ + if (is_liboverride) { + + /** Currently, all library override tracks are assumed to be grouped together at the start of + * the list. So we can only add the new track after the last library track. */ + if (next != NULL && (next->flag & NLATRACK_OVERRIDELIBRARY_LOCAL) == 0) { + BKE_nlatrack_insert_after(nla_tracks, next, new_track, is_liboverride); + return; + } + } + + BLI_insertlinkbefore(nla_tracks, next, new_track); + new_track->index = BLI_findindex(nla_tracks, new_track); + + /* Must have unique name, but we need to seed this. */ + strcpy(new_track->name, "NlaTrack"); + + BLI_uniquename(nla_tracks, + new_track, + DATA_("NlaTrack"), + '.', + offsetof(NlaTrack, name), + sizeof(new_track->name)); +} + +void BKE_nlatrack_insert_after(ListBase *nla_tracks, + struct NlaTrack *prev, + struct NlaTrack *new_track, + bool is_liboverride) +{ + BLI_assert(!ELEM(NULL, nla_tracks, new_track)); + + /** If NULL, then caller intends to insert a new head. But, tracks are not allowed to be placed + * before library overrides. So it must inserted after the last override. */ + if (prev == NULL) { + NlaTrack *first_track = (NlaTrack *)nla_tracks->first; + if (first_track != NULL && (first_track->flag & NLATRACK_OVERRIDELIBRARY_LOCAL) == 0) { + prev = first_track; + } + } /* In liboverride case, we only add local tracks after all those coming from the linked data, * so we need to find the first local track. */ @@ -361,22 +401,54 @@ NlaTrack *BKE_nlatrack_add(AnimData *adt, NlaTrack *prev, const bool is_liboverr } prev = first_local != NULL ? first_local->prev : NULL; } + /* Add track to stack, and make it the active one. */ - if (prev != NULL) { - BLI_insertlinkafter(&adt->nla_tracks, prev, nlt); - } - else { - BLI_addtail(&adt->nla_tracks, nlt); - } - BKE_nlatrack_set_active(&adt->nla_tracks, nlt); + BLI_insertlinkafter(nla_tracks, prev, new_track); + new_track->index = BLI_findindex(nla_tracks, new_track); /* must have unique name, but we need to seed this */ - strcpy(nlt->name, "NlaTrack"); - BLI_uniquename( - &adt->nla_tracks, nlt, DATA_("NlaTrack"), '.', offsetof(NlaTrack, name), sizeof(nlt->name)); + BLI_uniquename(nla_tracks, + new_track, + DATA_("NlaTrack"), + '.', + offsetof(NlaTrack, name), + sizeof(new_track->name)); +} - /* return the new track */ - return nlt; +NlaTrack *BKE_nlatrack_new_before_and_set_active(ListBase *nla_tracks, + struct NlaTrack *next, + bool is_liboverride) +{ + NlaTrack *new_track = BKE_nlatrack_new(); + + BKE_nlatrack_insert_before(nla_tracks, next, new_track, is_liboverride); + BKE_nlatrack_set_active(nla_tracks, new_track); + + return new_track; +} + +NlaTrack *BKE_nlatrack_new_after_and_set_active(ListBase *nla_tracks, + struct NlaTrack *prev, + bool is_liboverride) +{ + NlaTrack *new_track = BKE_nlatrack_new(); + + BKE_nlatrack_insert_after(nla_tracks, prev, new_track, is_liboverride); + BKE_nlatrack_set_active(nla_tracks, new_track); + + return new_track; +} + +NlaTrack *BKE_nlatrack_new_head_and_set_active(ListBase *nla_tracks, bool is_liboverride) +{ + return BKE_nlatrack_new_before_and_set_active( + nla_tracks, (NlaTrack *)nla_tracks->first, is_liboverride); +} + +NlaTrack *BKE_nlatrack_new_tail_and_set_active(ListBase *nla_tracks, const bool is_liboverride) +{ + return BKE_nlatrack_new_after_and_set_active( + nla_tracks, (NlaTrack *)nla_tracks->last, is_liboverride); } NlaStrip *BKE_nlastrip_new(bAction *act) @@ -448,7 +520,7 @@ NlaStrip *BKE_nlastack_add_strip(AnimData *adt, bAction *act, const bool is_libo /* trying to add to the last track failed (no track or no space), * so add a new track to the stack, and add to that... */ - nlt = BKE_nlatrack_add(adt, NULL, is_liboverride); + nlt = BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, is_liboverride); BKE_nlatrack_add_strip(nlt, strip, is_liboverride); BLI_strncpy(nlt->name, act->id.name + 2, sizeof(nlt->name)); } @@ -848,8 +920,8 @@ void BKE_nlastrips_make_metas(ListBase *strips, bool is_temp) mstrip->end = strip->end; } else { - /* current strip wasn't selected, so the end of 'island' of selected strips has been reached, - * so stop adding strips to the current meta + /* current strip wasn't selected, so the end of 'island' of selected strips has been + * reached, so stop adding strips to the current meta. */ mstrip = NULL; } @@ -1180,7 +1252,9 @@ bool BKE_nlatrack_add_strip(NlaTrack *nlt, NlaStrip *strip, const bool is_libove return false; } - /* Do not allow adding strips if this track is locked, or not a local one in liboverride case. */ + /* + * Do not allow adding strips if this track is locked, or not a local one in liboverride case. + */ if (nlt->flag & NLATRACK_PROTECTED || (is_liboverride && (nlt->flag & NLATRACK_OVERRIDELIBRARY_LOCAL) == 0)) { return false; @@ -1952,7 +2026,7 @@ bool BKE_nla_action_stash(AnimData *adt, const bool is_liboverride) } } - nlt = BKE_nlatrack_add(adt, prev_track, is_liboverride); + nlt = BKE_nlatrack_new_after_and_set_active(&adt->nla_tracks, prev_track, is_liboverride); BLI_assert(nlt != NULL); /* We need to ensure that if there wasn't any previous instance, @@ -2075,7 +2149,8 @@ static void nla_tweakmode_find_active(const ListBase /* NlaTrack */ *nla_tracks, /* There are situations where we may have multiple strips selected and we want to enter * tweak-mode on all of those at once. Usually in those cases, * it will usually just be a single strip per AnimData. - * In such cases, compromise and take the last selected track and/or last selected strip, #28468. + * In such cases, compromise and take the last selected track and/or last selected strip, + * #28468. */ if (activeTrack == NULL) { /* try last selected track for active strip */ @@ -2150,7 +2225,8 @@ bool BKE_nla_tweakmode_enter(AnimData *adt) activeStrip->flag &= ~NLASTRIP_FLAG_TWEAKUSER; /* go over all the tracks after AND INCLUDING the active one, tagging them as being disabled - * - the active track needs to also be tagged, otherwise, it'll overlap with the tweaks going on + * - the active track needs to also be tagged, otherwise, it'll overlap with the tweaks going + * on. */ activeTrack->flag |= NLATRACK_DISABLED; if ((adt->flag & ADT_NLA_EVAL_UPPER_TRACKS) == 0) { diff --git a/source/blender/blenkernel/intern/nla_test.cc b/source/blender/blenkernel/intern/nla_test.cc index 0520a3b270e..5fce99eb2ff 100644 --- a/source/blender/blenkernel/intern/nla_test.cc +++ b/source/blender/blenkernel/intern/nla_test.cc @@ -94,12 +94,10 @@ TEST(nla_track, BKE_nlatrack_remove_strip) TEST(nla_track, BKE_nlatrack_remove_and_free) { AnimData adt{}; - NlaTrack *track1; - NlaTrack *track2; /* Add NLA tracks to the Animation Data. */ - track1 = BKE_nlatrack_add(&adt, NULL, false); - track2 = BKE_nlatrack_add(&adt, track1, false); + NlaTrack *track1 = BKE_nlatrack_new_tail_and_set_active(&adt.nla_tracks, false); + NlaTrack *track2 = BKE_nlatrack_new_tail_and_set_active(&adt.nla_tracks, false); /* Ensure we have 2 tracks in the track. */ EXPECT_EQ(2, BLI_listbase_count(&adt.nla_tracks)); @@ -116,4 +114,38 @@ TEST(nla_track, BKE_nlatrack_remove_and_free) EXPECT_EQ(-1, BLI_findindex(&adt.nla_tracks, track1)); } +TEST(nla_track, BKE_nlatrack_new_tail_and_set_active) +{ + AnimData adt{}; + NlaTrack *trackB = BKE_nlatrack_new_tail_and_set_active(&adt.nla_tracks, false); + NlaTrack *trackA = BKE_nlatrack_new_tail_and_set_active(&adt.nla_tracks, false); + + // Expect that Track B was added before track A + EXPECT_EQ(1, BLI_findindex(&adt.nla_tracks, trackA)); + EXPECT_EQ(0, BLI_findindex(&adt.nla_tracks, trackB)); + + // Free the tracks + BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackA, false); + BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackB, false); +} + +TEST(nla_track, BKE_nlatrack_new_head_and_set_active) +{ + AnimData adt{}; + NlaTrack *trackB = BKE_nlatrack_new_head_and_set_active(&adt.nla_tracks, false); + NlaTrack *trackA = BKE_nlatrack_new_head_and_set_active(&adt.nla_tracks, false); + + // Expect that Track A was added before track B + EXPECT_EQ(0, BLI_findindex(&adt.nla_tracks, trackA)); + EXPECT_EQ(1, BLI_findindex(&adt.nla_tracks, trackB)); + + // Free the tracks + BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackA, false); + BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackB, false); +} + } // namespace blender::bke::tests + + + + diff --git a/source/blender/editors/object/object_add.cc b/source/blender/editors/object/object_add.cc index 3d24e09b53c..fa81e31ac0e 100644 --- a/source/blender/editors/object/object_add.cc +++ b/source/blender/editors/object/object_add.cc @@ -1993,7 +1993,7 @@ static int object_speaker_add_exec(bContext *C, wmOperator *op) { /* create new data for NLA hierarchy */ AnimData *adt = BKE_animdata_ensure_id(&ob->id); - NlaTrack *nlt = BKE_nlatrack_add(adt, nullptr, is_liboverride); + NlaTrack *nlt = BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, is_liboverride); NlaStrip *strip = BKE_nla_add_soundstrip(bmain, scene, static_cast(ob->data)); strip->start = scene->r.cfra; strip->end += strip->start; diff --git a/source/blender/editors/space_nla/nla_channels.c b/source/blender/editors/space_nla/nla_channels.c index 1d7645d4e67..2786cd7e187 100644 --- a/source/blender/editors/space_nla/nla_channels.c +++ b/source/blender/editors/space_nla/nla_channels.c @@ -581,14 +581,14 @@ bool nlaedit_add_tracks_existing(bAnimContext *ac, bool above_sel) */ if (above_sel) { /* just add a new one above this one */ - BKE_nlatrack_add(adt, nlt, is_liboverride); + BKE_nlatrack_new_after_and_set_active(&adt->nla_tracks, nlt, is_liboverride); ale->update = ANIM_UPDATE_DEPS; added = true; } else if ((lastAdt == NULL) || (adt != lastAdt)) { /* add one track to the top of the owning AnimData's stack, * then don't add anymore to this stack */ - BKE_nlatrack_add(adt, NULL, is_liboverride); + BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, is_liboverride); lastAdt = adt; ale->update = ANIM_UPDATE_DEPS; added = true; @@ -625,7 +625,7 @@ bool nlaedit_add_tracks_empty(bAnimContext *ac) /* ensure it is empty */ if (BLI_listbase_is_empty(&adt->nla_tracks)) { /* add new track to this AnimData block then */ - BKE_nlatrack_add(adt, NULL, ID_IS_OVERRIDE_LIBRARY(ale->id)); + BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, ID_IS_OVERRIDE_LIBRARY(ale->id)); ale->update = ANIM_UPDATE_DEPS; added = true; } diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c index b61b5d8e63b..2e61d12ad23 100644 --- a/source/blender/editors/space_nla/nla_edit.c +++ b/source/blender/editors/space_nla/nla_edit.c @@ -717,7 +717,7 @@ static int nlaedit_add_actionclip_exec(bContext *C, wmOperator *op) /* trying to add to the current failed (no space), * so add a new track to the stack, and add to that... */ - nlt = BKE_nlatrack_add(adt, NULL, is_liboverride); + nlt = BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, is_liboverride); BKE_nlatrack_add_strip(nlt, strip, is_liboverride); } @@ -955,7 +955,7 @@ static int nlaedit_add_sound_exec(bContext *C, wmOperator *UNUSED(op)) /* trying to add to the current failed (no space), * so add a new track to the stack, and add to that... */ - nlt = BKE_nlatrack_add(adt, NULL, is_liboverride); + nlt = BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, is_liboverride); BKE_nlatrack_add_strip(nlt, strip, is_liboverride); } @@ -1191,11 +1191,8 @@ static int nlaedit_duplicate_exec(bContext *C, wmOperator *op) /* in case there's no space in the track above, * or we haven't got a reference to it yet, try adding */ if (BKE_nlatrack_add_strip(nlt->next, nstrip, is_liboverride) == 0) { - /* need to add a new track above the one above the current one - * - if the current one is the last one, nlt->next will be NULL, which defaults to adding - * at the top of the stack anyway... - */ - track = BKE_nlatrack_add(adt, nlt->next, is_liboverride); + track = BKE_nlatrack_new_after_and_set_active( + &adt->nla_tracks, nlt->next, is_liboverride); BKE_nlatrack_add_strip(track, nstrip, is_liboverride); } @@ -2459,7 +2456,7 @@ static int nlaedit_snap_exec(bContext *C, wmOperator *op) /* in case there's no space in the current track, try adding */ if (BKE_nlatrack_add_strip(nlt, strip, is_liboverride) == 0) { /* need to add a new track above the current one */ - track = BKE_nlatrack_add(adt, nlt, is_liboverride); + track = BKE_nlatrack_new_after_and_set_active(&adt->nla_tracks, nlt, is_liboverride); BKE_nlatrack_add_strip(track, strip, is_liboverride); /* clear temp meta-strips on this new track, diff --git a/source/blender/makesrna/intern/rna_animation.c b/source/blender/makesrna/intern/rna_animation.c index dbef5d83778..0b51a633c21 100644 --- a/source/blender/makesrna/intern/rna_animation.c +++ b/source/blender/makesrna/intern/rna_animation.c @@ -586,7 +586,15 @@ static void rna_KeyingSet_paths_clear(KeyingSet *keyingset, ReportList *reports) /* needs wrapper function to push notifier */ static NlaTrack *rna_NlaTrack_new(ID *id, AnimData *adt, Main *bmain, bContext *C, NlaTrack *track) { - NlaTrack *new_track = BKE_nlatrack_add(adt, track, ID_IS_OVERRIDE_LIBRARY(id)); + NlaTrack *new_track; + + if (track != NULL) { + new_track = BKE_nlatrack_new_after_and_set_active( + &adt->nla_tracks, track, ID_IS_OVERRIDE_LIBRARY(id)); + } + else { + new_track = BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, ID_IS_OVERRIDE_LIBRARY(id)); + } WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_ADDED, NULL); -- 2.30.2 From 63909c45ccad9bc5b8f0d84540e0b907f4cf88bd Mon Sep 17 00:00:00 2001 From: Nate Rupsis Date: Thu, 23 Feb 2023 09:59:15 -0500 Subject: [PATCH 3/6] trying to make sense of the library override stuff --- source/blender/blenkernel/BKE_nla.h | 38 +++++---- source/blender/blenkernel/intern/ipo.c | 3 +- source/blender/blenkernel/intern/nla.c | 82 +++++++++++-------- source/blender/blenkernel/intern/nla_test.cc | 63 +++++++++++--- source/blender/editors/object/object_add.cc | 3 +- .../blender/editors/space_nla/nla_channels.c | 11 ++- source/blender/editors/space_nla/nla_edit.c | 13 +-- .../blender/makesrna/intern/rna_animation.c | 9 +- 8 files changed, 144 insertions(+), 78 deletions(-) diff --git a/source/blender/blenkernel/BKE_nla.h b/source/blender/blenkernel/BKE_nla.h index b7618bc6688..f5701253d16 100644 --- a/source/blender/blenkernel/BKE_nla.h +++ b/source/blender/blenkernel/BKE_nla.h @@ -37,8 +37,10 @@ struct PropertyRNA; /** * Create new NLA Track. + * + * The returned pointer is owned by the caller. */ -struct NlaTrack *BKE_nlatrack_new(void); +struct NlaTrack *BKE_nlatrack_new(bool is_liboverride); /** * Frees the given NLA strip, and calls #BKE_nlastrip_remove_and_free to @@ -98,8 +100,7 @@ void BKE_nla_tracks_copy_from_adt(struct Main *bmain, */ void BKE_nlatrack_insert_before(ListBase *nla_tracks, struct NlaTrack *next, - struct NlaTrack *new_track, - bool is_liboverride); + struct NlaTrack *new_track); /** * Inserts a given NLA track after a specified NLA track within the @@ -107,37 +108,35 @@ void BKE_nlatrack_insert_before(ListBase *nla_tracks, */ void BKE_nlatrack_insert_after(ListBase *nla_tracks, struct NlaTrack *prev, - struct NlaTrack *new_track, - bool is_liboverride); + struct NlaTrack *new_track); /** * Calls #BKE_nlatrack_new to create a new NLA track, inserts it before the * given NLA track with #BKE_nlatrack_insert_before, and sets it as active. */ -struct NlaTrack *BKE_nlatrack_new_before_and_set_active(ListBase *nla_tracks, - struct NlaTrack *next, - bool is_liboverride); +struct NlaTrack *BKE_nlatrack_new_before(ListBase *nla_tracks, + struct NlaTrack *next, + bool is_liboverride); /** * Calls #BKE_nlatrack_new to create a new NLA track, inserts it after the - * given NLA track with #BKE_nlatrack_insert_after, and sets it as active. + * given NLA track with #BKE_nlatrack_insert_after. */ -struct NlaTrack *BKE_nlatrack_new_after_and_set_active(ListBase *nla_tracks, - struct NlaTrack *prev, - bool is_liboverride); +struct NlaTrack *BKE_nlatrack_new_after(ListBase *nla_tracks, + struct NlaTrack *prev, + bool is_liboverride); /** * Calls #BKE_nlatrack_new to create a new NLA track, inserts it as the head of the - * NLA track list with #BKE_nlatrack_new_before_and_set_active, and sets it as active. + * NLA track list with #BKE_nlatrack_new_before. */ -struct NlaTrack *BKE_nlatrack_new_head_and_set_active(ListBase *nla_tracks, bool is_liboverride); +struct NlaTrack *BKE_nlatrack_new_head(ListBase *nla_tracks, bool is_liboverride); /** * Calls #BKE_nlatrack_new to create a new NLA track, inserts it as the tail of the - * NLA track list with #BKE_nlatrack_new_after_and_set_active, and sets it as active. + * NLA track list with #BKE_nlatrack_new_after. */ -struct NlaTrack *BKE_nlatrack_new_tail_and_set_active(ListBase *nla_tracks, - const bool is_liboverride); +struct NlaTrack *BKE_nlatrack_new_tail(ListBase *nla_tracks, const bool is_liboverride); /** * Removes the given NLA track from the list of tracks provided. @@ -301,6 +300,11 @@ bool BKE_nlatrack_get_bounds(struct NlaTrack *nlt, float bounds[2]); */ bool BKE_nlatrack_is_nonlocal_in_liboverride(const struct ID *id, const struct NlaTrack *nlt); +/** + * Check if the given NLA-Track has a library override. + */ +bool BKE_nlatrack_is_liboverride(const struct NlaTrack *nla_track); + /* ............ */ /** diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c index 6a1a24ea341..8ae5008b5aa 100644 --- a/source/blender/blenkernel/intern/ipo.c +++ b/source/blender/blenkernel/intern/ipo.c @@ -2005,7 +2005,8 @@ static void nlastrips_to_animdata(ID *id, ListBase *strips) /* trying to add to the current failed (no space), * so add a new track to the stack, and add to that... */ - nlt = BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, false); + nlt = BKE_nlatrack_new_tail(&adt->nla_tracks, false); + BKE_nlatrack_set_active(&adt->nla_tracks, nlt); BKE_nlatrack_add_strip(nlt, strip, false); } diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c index da32bc0b8d3..36f19c5e9ae 100644 --- a/source/blender/blenkernel/intern/nla.c +++ b/source/blender/blenkernel/intern/nla.c @@ -336,32 +336,36 @@ void BKE_nla_tracks_copy_from_adt(Main *bmain, /* Adding ------------------------------------------- */ -NlaTrack *BKE_nlatrack_new(void) +NlaTrack *BKE_nlatrack_new(bool is_liboverride) { /* allocate new track */ NlaTrack *nlt = MEM_callocN(sizeof(NlaTrack), "NlaTrack"); /* set settings requiring the track to not be part of the stack yet */ - nlt->flag = NLATRACK_SELECTED | NLATRACK_OVERRIDELIBRARY_LOCAL; + nlt->flag = is_liboverride ? NLATRACK_OVERRIDELIBRARY_LOCAL : NLATRACK_SELECTED; return nlt; } void BKE_nlatrack_insert_before(ListBase *nla_tracks, struct NlaTrack *next, - struct NlaTrack *new_track, - bool is_liboverride) + struct NlaTrack *new_track) { - if (is_liboverride) { - /** Currently, all library override tracks are assumed to be grouped together at the start of - * the list. So we can only add the new track after the last library track. */ - if (next != NULL && (next->flag & NLATRACK_OVERRIDELIBRARY_LOCAL) == 0) { - BKE_nlatrack_insert_after(nla_tracks, next, new_track, is_liboverride); + /* Currently, all library override tracks are assumed to be grouped together at the start of + * the list. Non overridden must be placed after last library track. */ + + // If the new track isn't library overriden, but the next track is, insert it after the next + // track + if (BKE_nlatrack_is_liboverride(new_track)) { + if (next != NULL && !BKE_nlatrack_is_liboverride(next)) { + BKE_nlatrack_insert_after(nla_tracks, next, new_track); return; } } + printf("Adding in the NLA track before target \n"); + BLI_insertlinkbefore(nla_tracks, next, new_track); new_track->index = BLI_findindex(nla_tracks, new_track); @@ -374,29 +378,35 @@ void BKE_nlatrack_insert_before(ListBase *nla_tracks, '.', offsetof(NlaTrack, name), sizeof(new_track->name)); + printf("insert_before: This created %s \n", new_track->name); + printf("new track index is: %d \n\n", new_track->index); } void BKE_nlatrack_insert_after(ListBase *nla_tracks, struct NlaTrack *prev, - struct NlaTrack *new_track, - bool is_liboverride) + struct NlaTrack *new_track) { - BLI_assert(!ELEM(NULL, nla_tracks, new_track)); + BLI_assert(nla_tracks); + BLI_assert(new_track); /** If NULL, then caller intends to insert a new head. But, tracks are not allowed to be placed * before library overrides. So it must inserted after the last override. */ if (prev == NULL) { + printf("Previous is Null \n"); NlaTrack *first_track = (NlaTrack *)nla_tracks->first; - if (first_track != NULL && (first_track->flag & NLATRACK_OVERRIDELIBRARY_LOCAL) == 0) { + if (first_track != NULL && !BKE_nlatrack_is_liboverride(first_track)) { + printf("First track in list has override. Setting Prev to first track \n"); prev = first_track; } } /* In liboverride case, we only add local tracks after all those coming from the linked data, * so we need to find the first local track. */ - if (is_liboverride && prev != NULL && (prev->flag & NLATRACK_OVERRIDELIBRARY_LOCAL) == 0) { + if (BKE_nlatrack_is_liboverride(new_track) && prev != NULL && + !BKE_nlatrack_is_liboverride(prev)) { + printf("new_track and Prev are liboverride \n"); NlaTrack *first_local = prev->next; - for (; first_local != NULL && (first_local->flag & NLATRACK_OVERRIDELIBRARY_LOCAL) == 0; + for (; first_local != NULL && BKE_nlatrack_is_liboverride(first_local); first_local = first_local->next) { } prev = first_local != NULL ? first_local->prev : NULL; @@ -413,42 +423,37 @@ void BKE_nlatrack_insert_after(ListBase *nla_tracks, '.', offsetof(NlaTrack, name), sizeof(new_track->name)); + + printf("insert_after: This created %s \n", new_track->name); + printf("new track index is: %d \n\n", new_track->index); } -NlaTrack *BKE_nlatrack_new_before_and_set_active(ListBase *nla_tracks, - struct NlaTrack *next, - bool is_liboverride) +NlaTrack *BKE_nlatrack_new_before(ListBase *nla_tracks, struct NlaTrack *next, bool is_liboverride) { - NlaTrack *new_track = BKE_nlatrack_new(); + NlaTrack *new_track = BKE_nlatrack_new(is_liboverride); - BKE_nlatrack_insert_before(nla_tracks, next, new_track, is_liboverride); - BKE_nlatrack_set_active(nla_tracks, new_track); + BKE_nlatrack_insert_before(nla_tracks, next, new_track); return new_track; } -NlaTrack *BKE_nlatrack_new_after_and_set_active(ListBase *nla_tracks, - struct NlaTrack *prev, - bool is_liboverride) +NlaTrack *BKE_nlatrack_new_after(ListBase *nla_tracks, struct NlaTrack *prev, bool is_liboverride) { - NlaTrack *new_track = BKE_nlatrack_new(); + NlaTrack *new_track = BKE_nlatrack_new(is_liboverride); - BKE_nlatrack_insert_after(nla_tracks, prev, new_track, is_liboverride); - BKE_nlatrack_set_active(nla_tracks, new_track); + BKE_nlatrack_insert_after(nla_tracks, prev, new_track); return new_track; } -NlaTrack *BKE_nlatrack_new_head_and_set_active(ListBase *nla_tracks, bool is_liboverride) +NlaTrack *BKE_nlatrack_new_head(ListBase *nla_tracks, bool is_liboverride) { - return BKE_nlatrack_new_before_and_set_active( - nla_tracks, (NlaTrack *)nla_tracks->first, is_liboverride); + return BKE_nlatrack_new_before(nla_tracks, (NlaTrack *)nla_tracks->first, is_liboverride); } -NlaTrack *BKE_nlatrack_new_tail_and_set_active(ListBase *nla_tracks, const bool is_liboverride) +NlaTrack *BKE_nlatrack_new_tail(ListBase *nla_tracks, const bool is_liboverride) { - return BKE_nlatrack_new_after_and_set_active( - nla_tracks, (NlaTrack *)nla_tracks->last, is_liboverride); + return BKE_nlatrack_new_after(nla_tracks, (NlaTrack *)nla_tracks->last, is_liboverride); } NlaStrip *BKE_nlastrip_new(bAction *act) @@ -520,7 +525,8 @@ NlaStrip *BKE_nlastack_add_strip(AnimData *adt, bAction *act, const bool is_libo /* trying to add to the last track failed (no track or no space), * so add a new track to the stack, and add to that... */ - nlt = BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, is_liboverride); + nlt = BKE_nlatrack_new_tail(&adt->nla_tracks, is_liboverride); + BKE_nlatrack_set_active(&adt->nla_tracks, nlt); BKE_nlatrack_add_strip(nlt, strip, is_liboverride); BLI_strncpy(nlt->name, act->id.name + 2, sizeof(nlt->name)); } @@ -1305,6 +1311,11 @@ bool BKE_nlatrack_is_nonlocal_in_liboverride(const ID *id, const NlaTrack *nlt) (nlt == NULL || (nlt->flag & NLATRACK_OVERRIDELIBRARY_LOCAL) == 0)); } +bool BKE_nlatrack_is_liboverride(const struct NlaTrack *nla_track) +{ + return (nla_track->flag & NLATRACK_OVERRIDELIBRARY_LOCAL) != 0; +} + /* NLA Strips -------------------------------------- */ static NlaStrip *nlastrip_find_active(ListBase /* NlaStrip */ *strips) @@ -2026,7 +2037,8 @@ bool BKE_nla_action_stash(AnimData *adt, const bool is_liboverride) } } - nlt = BKE_nlatrack_new_after_and_set_active(&adt->nla_tracks, prev_track, is_liboverride); + nlt = BKE_nlatrack_new_after(&adt->nla_tracks, prev_track, is_liboverride); + BKE_nlatrack_set_active(&adt->nla_tracks, nlt); BLI_assert(nlt != NULL); /* We need to ensure that if there wasn't any previous instance, diff --git a/source/blender/blenkernel/intern/nla_test.cc b/source/blender/blenkernel/intern/nla_test.cc index 5fce99eb2ff..b9f27f67603 100644 --- a/source/blender/blenkernel/intern/nla_test.cc +++ b/source/blender/blenkernel/intern/nla_test.cc @@ -96,8 +96,8 @@ TEST(nla_track, BKE_nlatrack_remove_and_free) AnimData adt{}; /* Add NLA tracks to the Animation Data. */ - NlaTrack *track1 = BKE_nlatrack_new_tail_and_set_active(&adt.nla_tracks, false); - NlaTrack *track2 = BKE_nlatrack_new_tail_and_set_active(&adt.nla_tracks, false); + NlaTrack *track1 = BKE_nlatrack_new_tail(&adt.nla_tracks, false); + NlaTrack *track2 = BKE_nlatrack_new_tail(&adt.nla_tracks, false); /* Ensure we have 2 tracks in the track. */ EXPECT_EQ(2, BLI_listbase_count(&adt.nla_tracks)); @@ -114,11 +114,11 @@ TEST(nla_track, BKE_nlatrack_remove_and_free) EXPECT_EQ(-1, BLI_findindex(&adt.nla_tracks, track1)); } -TEST(nla_track, BKE_nlatrack_new_tail_and_set_active) +TEST(nla_track, BKE_nlatrack_new_tail) { AnimData adt{}; - NlaTrack *trackB = BKE_nlatrack_new_tail_and_set_active(&adt.nla_tracks, false); - NlaTrack *trackA = BKE_nlatrack_new_tail_and_set_active(&adt.nla_tracks, false); + NlaTrack *trackB = BKE_nlatrack_new_tail(&adt.nla_tracks, false); + NlaTrack *trackA = BKE_nlatrack_new_tail(&adt.nla_tracks, false); // Expect that Track B was added before track A EXPECT_EQ(1, BLI_findindex(&adt.nla_tracks, trackA)); @@ -129,23 +129,62 @@ TEST(nla_track, BKE_nlatrack_new_tail_and_set_active) BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackB, false); } -TEST(nla_track, BKE_nlatrack_new_head_and_set_active) +TEST(nla_track, BKE_nlatrack_new_head) { AnimData adt{}; - NlaTrack *trackB = BKE_nlatrack_new_head_and_set_active(&adt.nla_tracks, false); - NlaTrack *trackA = BKE_nlatrack_new_head_and_set_active(&adt.nla_tracks, false); + NlaTrack *trackB = BKE_nlatrack_new_head(&adt.nla_tracks, false); + NlaTrack *trackA = BKE_nlatrack_new_head(&adt.nla_tracks, false); // Expect that Track A was added before track B EXPECT_EQ(0, BLI_findindex(&adt.nla_tracks, trackA)); EXPECT_EQ(1, BLI_findindex(&adt.nla_tracks, trackB)); + // Free the tracks + BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackA, false); + BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackB, false); + +} + +TEST(nla_track, BKE_nlatrack_insert_before) +{ + AnimData adt{}; + NlaTrack *trackA = BKE_nlatrack_new(true); + NlaTrack *trackB = BKE_nlatrack_new(true); + NlaTrack *trackC = BKE_nlatrack_new(false); + // NlaTrack *trackD = BKE_nlatrack_new(false); + + BKE_nlatrack_insert_before(&adt.nla_tracks, NULL, trackA); + BKE_nlatrack_insert_before(&adt.nla_tracks, trackA, trackB); + + // Since Track C isn't library override, it'll get inserted after A + BKE_nlatrack_insert_before(&adt.nla_tracks, trackA, trackC); + // BKE_nlatrack_insert_before(&adt.nla_tracks, trackC, trackD); + + // Expect B -> A -> C ordering. + EXPECT_EQ(0, BLI_findindex(&adt.nla_tracks, trackB)); + EXPECT_EQ(1, BLI_findindex(&adt.nla_tracks, trackA)); + EXPECT_EQ(2, BLI_findindex(&adt.nla_tracks, trackC)); + + // Free the tracks + BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackA, false); + BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackB, false); + BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackC, false); + // BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackD, false); +} + +TEST(nla_track, BKE_nlatrack_is_liboverride) +{ + AnimData adt{}; + NlaTrack *trackA = BKE_nlatrack_new_head(&adt.nla_tracks, true); + NlaTrack *trackB = BKE_nlatrack_new_after(&adt.nla_tracks, trackA, false); + + // Verify Track A has library override, and B doesn't + EXPECT_TRUE(BKE_nlatrack_is_liboverride(trackA)); + EXPECT_FALSE(BKE_nlatrack_is_liboverride(trackB)); + // Free the tracks BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackA, false); BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackB, false); } } // namespace blender::bke::tests - - - - diff --git a/source/blender/editors/object/object_add.cc b/source/blender/editors/object/object_add.cc index fa81e31ac0e..f2badb37624 100644 --- a/source/blender/editors/object/object_add.cc +++ b/source/blender/editors/object/object_add.cc @@ -1993,7 +1993,8 @@ static int object_speaker_add_exec(bContext *C, wmOperator *op) { /* create new data for NLA hierarchy */ AnimData *adt = BKE_animdata_ensure_id(&ob->id); - NlaTrack *nlt = BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, is_liboverride); + NlaTrack *nlt = BKE_nlatrack_new_tail(&adt->nla_tracks, is_liboverride); + BKE_nlatrack_set_active(&adt->nla_tracks, nlt); NlaStrip *strip = BKE_nla_add_soundstrip(bmain, scene, static_cast(ob->data)); strip->start = scene->r.cfra; strip->end += strip->start; diff --git a/source/blender/editors/space_nla/nla_channels.c b/source/blender/editors/space_nla/nla_channels.c index 2786cd7e187..0f664d20d58 100644 --- a/source/blender/editors/space_nla/nla_channels.c +++ b/source/blender/editors/space_nla/nla_channels.c @@ -573,6 +573,7 @@ bool nlaedit_add_tracks_existing(bAnimContext *ac, bool above_sel) if (ale->type == ANIMTYPE_NLATRACK) { NlaTrack *nlt = (NlaTrack *)ale->data; AnimData *adt = ale->adt; + NlaTrack *new_track = NULL; const bool is_liboverride = ID_IS_OVERRIDE_LIBRARY(ale->id); @@ -581,14 +582,16 @@ bool nlaedit_add_tracks_existing(bAnimContext *ac, bool above_sel) */ if (above_sel) { /* just add a new one above this one */ - BKE_nlatrack_new_after_and_set_active(&adt->nla_tracks, nlt, is_liboverride); + new_track = BKE_nlatrack_new_after(&adt->nla_tracks, nlt, is_liboverride); + BKE_nlatrack_set_active(&adt->nla_tracks, new_track); ale->update = ANIM_UPDATE_DEPS; added = true; } else if ((lastAdt == NULL) || (adt != lastAdt)) { /* add one track to the top of the owning AnimData's stack, * then don't add anymore to this stack */ - BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, is_liboverride); + new_track = BKE_nlatrack_new_tail(&adt->nla_tracks, is_liboverride); + BKE_nlatrack_set_active(&adt->nla_tracks, new_track); lastAdt = adt; ale->update = ANIM_UPDATE_DEPS; added = true; @@ -618,6 +621,7 @@ bool nlaedit_add_tracks_empty(bAnimContext *ac) /* check if selected AnimData blocks are empty, and add tracks if so... */ for (ale = anim_data.first; ale; ale = ale->next) { AnimData *adt = ale->adt; + NlaTrack *new_track; /* sanity check */ BLI_assert(adt->flag & ADT_UI_SELECTED); @@ -625,7 +629,8 @@ bool nlaedit_add_tracks_empty(bAnimContext *ac) /* ensure it is empty */ if (BLI_listbase_is_empty(&adt->nla_tracks)) { /* add new track to this AnimData block then */ - BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, ID_IS_OVERRIDE_LIBRARY(ale->id)); + new_track = BKE_nlatrack_new_tail(&adt->nla_tracks, ID_IS_OVERRIDE_LIBRARY(ale->id)); + BKE_nlatrack_set_active(&adt->nla_tracks, new_track); ale->update = ANIM_UPDATE_DEPS; added = true; } diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c index 2e61d12ad23..1904f86c69e 100644 --- a/source/blender/editors/space_nla/nla_edit.c +++ b/source/blender/editors/space_nla/nla_edit.c @@ -717,7 +717,8 @@ static int nlaedit_add_actionclip_exec(bContext *C, wmOperator *op) /* trying to add to the current failed (no space), * so add a new track to the stack, and add to that... */ - nlt = BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, is_liboverride); + nlt = BKE_nlatrack_new_tail(&adt->nla_tracks, is_liboverride); + BKE_nlatrack_set_active(&adt->nla_tracks, nlt); BKE_nlatrack_add_strip(nlt, strip, is_liboverride); } @@ -955,7 +956,8 @@ static int nlaedit_add_sound_exec(bContext *C, wmOperator *UNUSED(op)) /* trying to add to the current failed (no space), * so add a new track to the stack, and add to that... */ - nlt = BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, is_liboverride); + nlt = BKE_nlatrack_new_tail(&adt->nla_tracks, is_liboverride); + BKE_nlatrack_set_active(&adt->nla_tracks, nlt); BKE_nlatrack_add_strip(nlt, strip, is_liboverride); } @@ -1191,8 +1193,8 @@ static int nlaedit_duplicate_exec(bContext *C, wmOperator *op) /* in case there's no space in the track above, * or we haven't got a reference to it yet, try adding */ if (BKE_nlatrack_add_strip(nlt->next, nstrip, is_liboverride) == 0) { - track = BKE_nlatrack_new_after_and_set_active( - &adt->nla_tracks, nlt->next, is_liboverride); + track = BKE_nlatrack_new_after(&adt->nla_tracks, nlt->next, is_liboverride); + BKE_nlatrack_set_active(&adt->nla_tracks, track); BKE_nlatrack_add_strip(track, nstrip, is_liboverride); } @@ -2456,7 +2458,8 @@ static int nlaedit_snap_exec(bContext *C, wmOperator *op) /* in case there's no space in the current track, try adding */ if (BKE_nlatrack_add_strip(nlt, strip, is_liboverride) == 0) { /* need to add a new track above the current one */ - track = BKE_nlatrack_new_after_and_set_active(&adt->nla_tracks, nlt, is_liboverride); + track = BKE_nlatrack_new_after(&adt->nla_tracks, nlt, is_liboverride); + BKE_nlatrack_set_active(&adt->nla_tracks, track); BKE_nlatrack_add_strip(track, strip, is_liboverride); /* clear temp meta-strips on this new track, diff --git a/source/blender/makesrna/intern/rna_animation.c b/source/blender/makesrna/intern/rna_animation.c index 0b51a633c21..af484a85d00 100644 --- a/source/blender/makesrna/intern/rna_animation.c +++ b/source/blender/makesrna/intern/rna_animation.c @@ -588,14 +588,15 @@ static NlaTrack *rna_NlaTrack_new(ID *id, AnimData *adt, Main *bmain, bContext * { NlaTrack *new_track; - if (track != NULL) { - new_track = BKE_nlatrack_new_after_and_set_active( - &adt->nla_tracks, track, ID_IS_OVERRIDE_LIBRARY(id)); + if (track == NULL) { + new_track = BKE_nlatrack_new_tail(&adt->nla_tracks, ID_IS_OVERRIDE_LIBRARY(id)); } else { - new_track = BKE_nlatrack_new_tail_and_set_active(&adt->nla_tracks, ID_IS_OVERRIDE_LIBRARY(id)); + new_track = BKE_nlatrack_new_after(&adt->nla_tracks, track, ID_IS_OVERRIDE_LIBRARY(id)); } + BKE_nlatrack_set_active(&adt->nla_tracks, new_track); + WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_ADDED, NULL); DEG_relations_tag_update(bmain); -- 2.30.2 From d8729dbff3bacd399275560d8f36f502f01f4ffa Mon Sep 17 00:00:00 2001 From: Nate Rupsis Date: Wed, 1 Mar 2023 18:21:27 -0500 Subject: [PATCH 4/6] reverting is_liboverride for new NLA track method for now --- source/blender/blenkernel/BKE_nla.h | 13 ++--- source/blender/blenkernel/intern/nla.c | 53 +++++++------------- source/blender/blenkernel/intern/nla_test.cc | 26 +++------- 3 files changed, 29 insertions(+), 63 deletions(-) diff --git a/source/blender/blenkernel/BKE_nla.h b/source/blender/blenkernel/BKE_nla.h index f5701253d16..67ff3e361b7 100644 --- a/source/blender/blenkernel/BKE_nla.h +++ b/source/blender/blenkernel/BKE_nla.h @@ -40,7 +40,7 @@ struct PropertyRNA; * * The returned pointer is owned by the caller. */ -struct NlaTrack *BKE_nlatrack_new(bool is_liboverride); +struct NlaTrack *BKE_nlatrack_new(void); /** * Frees the given NLA strip, and calls #BKE_nlastrip_remove_and_free to @@ -100,7 +100,8 @@ void BKE_nla_tracks_copy_from_adt(struct Main *bmain, */ void BKE_nlatrack_insert_before(ListBase *nla_tracks, struct NlaTrack *next, - struct NlaTrack *new_track); + struct NlaTrack *new_track, + bool is_liboverride); /** * Inserts a given NLA track after a specified NLA track within the @@ -108,7 +109,8 @@ void BKE_nlatrack_insert_before(ListBase *nla_tracks, */ void BKE_nlatrack_insert_after(ListBase *nla_tracks, struct NlaTrack *prev, - struct NlaTrack *new_track); + struct NlaTrack *new_track, + bool is_liboverride); /** * Calls #BKE_nlatrack_new to create a new NLA track, inserts it before the @@ -300,11 +302,6 @@ bool BKE_nlatrack_get_bounds(struct NlaTrack *nlt, float bounds[2]); */ bool BKE_nlatrack_is_nonlocal_in_liboverride(const struct ID *id, const struct NlaTrack *nlt); -/** - * Check if the given NLA-Track has a library override. - */ -bool BKE_nlatrack_is_liboverride(const struct NlaTrack *nla_track); - /* ............ */ /** diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c index 36f19c5e9ae..c090dccf415 100644 --- a/source/blender/blenkernel/intern/nla.c +++ b/source/blender/blenkernel/intern/nla.c @@ -336,36 +336,32 @@ void BKE_nla_tracks_copy_from_adt(Main *bmain, /* Adding ------------------------------------------- */ -NlaTrack *BKE_nlatrack_new(bool is_liboverride) +NlaTrack *BKE_nlatrack_new() { /* allocate new track */ NlaTrack *nlt = MEM_callocN(sizeof(NlaTrack), "NlaTrack"); /* set settings requiring the track to not be part of the stack yet */ - nlt->flag = is_liboverride ? NLATRACK_OVERRIDELIBRARY_LOCAL : NLATRACK_SELECTED; + nlt->flag = NLATRACK_SELECTED | NLATRACK_OVERRIDELIBRARY_LOCAL; return nlt; } void BKE_nlatrack_insert_before(ListBase *nla_tracks, struct NlaTrack *next, - struct NlaTrack *new_track) + struct NlaTrack *new_track, + bool is_liboverride) { - /* Currently, all library override tracks are assumed to be grouped together at the start of - * the list. Non overridden must be placed after last library track. */ - - // If the new track isn't library overriden, but the next track is, insert it after the next - // track - if (BKE_nlatrack_is_liboverride(new_track)) { - if (next != NULL && !BKE_nlatrack_is_liboverride(next)) { - BKE_nlatrack_insert_after(nla_tracks, next, new_track); + if (is_liboverride) { + /* Currently, all library override tracks are assumed to be grouped together at the start of + * the list. Non overridden must be placed after last library track. */ + if (next != NULL && (next->flag & NLATRACK_OVERRIDELIBRARY_LOCAL) == 0) { + BKE_nlatrack_insert_after(nla_tracks, next, new_track, is_liboverride); return; } } - printf("Adding in the NLA track before target \n"); - BLI_insertlinkbefore(nla_tracks, next, new_track); new_track->index = BLI_findindex(nla_tracks, new_track); @@ -378,13 +374,12 @@ void BKE_nlatrack_insert_before(ListBase *nla_tracks, '.', offsetof(NlaTrack, name), sizeof(new_track->name)); - printf("insert_before: This created %s \n", new_track->name); - printf("new track index is: %d \n\n", new_track->index); } void BKE_nlatrack_insert_after(ListBase *nla_tracks, struct NlaTrack *prev, - struct NlaTrack *new_track) + struct NlaTrack *new_track, + const bool is_liboverride) { BLI_assert(nla_tracks); BLI_assert(new_track); @@ -392,21 +387,17 @@ void BKE_nlatrack_insert_after(ListBase *nla_tracks, /** If NULL, then caller intends to insert a new head. But, tracks are not allowed to be placed * before library overrides. So it must inserted after the last override. */ if (prev == NULL) { - printf("Previous is Null \n"); NlaTrack *first_track = (NlaTrack *)nla_tracks->first; - if (first_track != NULL && !BKE_nlatrack_is_liboverride(first_track)) { - printf("First track in list has override. Setting Prev to first track \n"); + if (first_track != NULL && (first_track->flag & NLATRACK_OVERRIDELIBRARY_LOCAL) == 0) { prev = first_track; } } /* In liboverride case, we only add local tracks after all those coming from the linked data, * so we need to find the first local track. */ - if (BKE_nlatrack_is_liboverride(new_track) && prev != NULL && - !BKE_nlatrack_is_liboverride(prev)) { - printf("new_track and Prev are liboverride \n"); + if (is_liboverride && prev != NULL && (prev->flag & NLATRACK_OVERRIDELIBRARY_LOCAL) == 0) { NlaTrack *first_local = prev->next; - for (; first_local != NULL && BKE_nlatrack_is_liboverride(first_local); + for (; first_local != NULL && (first_local->flag & NLATRACK_OVERRIDELIBRARY_LOCAL) == 0; first_local = first_local->next) { } prev = first_local != NULL ? first_local->prev : NULL; @@ -423,25 +414,22 @@ void BKE_nlatrack_insert_after(ListBase *nla_tracks, '.', offsetof(NlaTrack, name), sizeof(new_track->name)); - - printf("insert_after: This created %s \n", new_track->name); - printf("new track index is: %d \n\n", new_track->index); } NlaTrack *BKE_nlatrack_new_before(ListBase *nla_tracks, struct NlaTrack *next, bool is_liboverride) { - NlaTrack *new_track = BKE_nlatrack_new(is_liboverride); + NlaTrack *new_track = BKE_nlatrack_new(); - BKE_nlatrack_insert_before(nla_tracks, next, new_track); + BKE_nlatrack_insert_before(nla_tracks, next, new_track, is_liboverride); return new_track; } NlaTrack *BKE_nlatrack_new_after(ListBase *nla_tracks, struct NlaTrack *prev, bool is_liboverride) { - NlaTrack *new_track = BKE_nlatrack_new(is_liboverride); + NlaTrack *new_track = BKE_nlatrack_new(); - BKE_nlatrack_insert_after(nla_tracks, prev, new_track); + BKE_nlatrack_insert_after(nla_tracks, prev, is_liboverride); return new_track; } @@ -1311,11 +1299,6 @@ bool BKE_nlatrack_is_nonlocal_in_liboverride(const ID *id, const NlaTrack *nlt) (nlt == NULL || (nlt->flag & NLATRACK_OVERRIDELIBRARY_LOCAL) == 0)); } -bool BKE_nlatrack_is_liboverride(const struct NlaTrack *nla_track) -{ - return (nla_track->flag & NLATRACK_OVERRIDELIBRARY_LOCAL) != 0; -} - /* NLA Strips -------------------------------------- */ static NlaStrip *nlastrip_find_active(ListBase /* NlaStrip */ *strips) diff --git a/source/blender/blenkernel/intern/nla_test.cc b/source/blender/blenkernel/intern/nla_test.cc index b9f27f67603..ca23ac79ff5 100644 --- a/source/blender/blenkernel/intern/nla_test.cc +++ b/source/blender/blenkernel/intern/nla_test.cc @@ -148,16 +148,16 @@ TEST(nla_track, BKE_nlatrack_new_head) TEST(nla_track, BKE_nlatrack_insert_before) { AnimData adt{}; - NlaTrack *trackA = BKE_nlatrack_new(true); - NlaTrack *trackB = BKE_nlatrack_new(true); - NlaTrack *trackC = BKE_nlatrack_new(false); + NlaTrack *trackA = BKE_nlatrack_new(); + NlaTrack *trackB = BKE_nlatrack_new(); + NlaTrack *trackC = BKE_nlatrack_new(); // NlaTrack *trackD = BKE_nlatrack_new(false); - BKE_nlatrack_insert_before(&adt.nla_tracks, NULL, trackA); - BKE_nlatrack_insert_before(&adt.nla_tracks, trackA, trackB); + BKE_nlatrack_insert_before(&adt.nla_tracks, NULL, trackA, true); + BKE_nlatrack_insert_before(&adt.nla_tracks, trackA, trackB, true); // Since Track C isn't library override, it'll get inserted after A - BKE_nlatrack_insert_before(&adt.nla_tracks, trackA, trackC); + BKE_nlatrack_insert_before(&adt.nla_tracks, trackA, trackC, false); // BKE_nlatrack_insert_before(&adt.nla_tracks, trackC, trackD); // Expect B -> A -> C ordering. @@ -172,19 +172,5 @@ TEST(nla_track, BKE_nlatrack_insert_before) // BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackD, false); } -TEST(nla_track, BKE_nlatrack_is_liboverride) -{ - AnimData adt{}; - NlaTrack *trackA = BKE_nlatrack_new_head(&adt.nla_tracks, true); - NlaTrack *trackB = BKE_nlatrack_new_after(&adt.nla_tracks, trackA, false); - - // Verify Track A has library override, and B doesn't - EXPECT_TRUE(BKE_nlatrack_is_liboverride(trackA)); - EXPECT_FALSE(BKE_nlatrack_is_liboverride(trackB)); - - // Free the tracks - BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackA, false); - BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackB, false); -} } // namespace blender::bke::tests -- 2.30.2 From 07acf48e4926f2833ecd9a97f83078f7e21b430f Mon Sep 17 00:00:00 2001 From: Nate Rupsis Date: Wed, 1 Mar 2023 22:23:46 -0500 Subject: [PATCH 5/6] cleaning up --- source/blender/blenkernel/BKE_nla.h | 1 - source/blender/blenkernel/intern/nla.c | 2 +- source/blender/blenkernel/intern/nla_test.cc | 28 -------------------- 3 files changed, 1 insertion(+), 30 deletions(-) diff --git a/source/blender/blenkernel/BKE_nla.h b/source/blender/blenkernel/BKE_nla.h index 67ff3e361b7..719e169c3d7 100644 --- a/source/blender/blenkernel/BKE_nla.h +++ b/source/blender/blenkernel/BKE_nla.h @@ -37,7 +37,6 @@ struct PropertyRNA; /** * Create new NLA Track. - * * The returned pointer is owned by the caller. */ struct NlaTrack *BKE_nlatrack_new(void); diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c index c090dccf415..7cb85f4923c 100644 --- a/source/blender/blenkernel/intern/nla.c +++ b/source/blender/blenkernel/intern/nla.c @@ -429,7 +429,7 @@ NlaTrack *BKE_nlatrack_new_after(ListBase *nla_tracks, struct NlaTrack *prev, bo { NlaTrack *new_track = BKE_nlatrack_new(); - BKE_nlatrack_insert_after(nla_tracks, prev, is_liboverride); + BKE_nlatrack_insert_after(nla_tracks, prev, new_track, is_liboverride); return new_track; } diff --git a/source/blender/blenkernel/intern/nla_test.cc b/source/blender/blenkernel/intern/nla_test.cc index ca23ac79ff5..303a3cba1be 100644 --- a/source/blender/blenkernel/intern/nla_test.cc +++ b/source/blender/blenkernel/intern/nla_test.cc @@ -145,32 +145,4 @@ TEST(nla_track, BKE_nlatrack_new_head) } -TEST(nla_track, BKE_nlatrack_insert_before) -{ - AnimData adt{}; - NlaTrack *trackA = BKE_nlatrack_new(); - NlaTrack *trackB = BKE_nlatrack_new(); - NlaTrack *trackC = BKE_nlatrack_new(); - // NlaTrack *trackD = BKE_nlatrack_new(false); - - BKE_nlatrack_insert_before(&adt.nla_tracks, NULL, trackA, true); - BKE_nlatrack_insert_before(&adt.nla_tracks, trackA, trackB, true); - - // Since Track C isn't library override, it'll get inserted after A - BKE_nlatrack_insert_before(&adt.nla_tracks, trackA, trackC, false); - // BKE_nlatrack_insert_before(&adt.nla_tracks, trackC, trackD); - - // Expect B -> A -> C ordering. - EXPECT_EQ(0, BLI_findindex(&adt.nla_tracks, trackB)); - EXPECT_EQ(1, BLI_findindex(&adt.nla_tracks, trackA)); - EXPECT_EQ(2, BLI_findindex(&adt.nla_tracks, trackC)); - - // Free the tracks - BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackA, false); - BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackB, false); - BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackC, false); - // BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackD, false); -} - - } // namespace blender::bke::tests -- 2.30.2 From b612dd3aa2285085e8492008dd6a432830fbb0e5 Mon Sep 17 00:00:00 2001 From: Nate Rupsis Date: Thu, 2 Mar 2023 08:49:20 -0500 Subject: [PATCH 6/6] removing old documentation --- source/blender/blenkernel/BKE_nla.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/BKE_nla.h b/source/blender/blenkernel/BKE_nla.h index 719e169c3d7..56e5557b5bc 100644 --- a/source/blender/blenkernel/BKE_nla.h +++ b/source/blender/blenkernel/BKE_nla.h @@ -113,7 +113,7 @@ void BKE_nlatrack_insert_after(ListBase *nla_tracks, /** * Calls #BKE_nlatrack_new to create a new NLA track, inserts it before the - * given NLA track with #BKE_nlatrack_insert_before, and sets it as active. + * given NLA track with #BKE_nlatrack_insert_before. */ struct NlaTrack *BKE_nlatrack_new_before(ListBase *nla_tracks, struct NlaTrack *next, -- 2.30.2