From 73e8d1096a65b492c040d63b6f52c8146940ba6a Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 30 Apr 2019 10:44:41 +0200 Subject: Depsgraph: Store pointer to original NLA strip Similar to modifier data and particle systems. --- .../intern/eval/deg_eval_copy_on_write.cc | 35 ++++++++++++++++++++++ source/blender/makesdna/DNA_anim_types.h | 5 ++++ 2 files changed, 40 insertions(+) (limited to 'source') diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc index b2ac103cc64..2f153e585d3 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc @@ -633,6 +633,40 @@ void update_modifiers_orig_pointers(const Object *object_orig, Object *object_co &object_orig->modifiers, &object_cow->modifiers, &ModifierData::orig_modifier_data); } +void update_nla_strips_orig_pointers(const ListBase *strips_orig, ListBase *strips_cow) +{ + NlaStrip *strip_orig = reinterpret_cast(strips_orig->first); + NlaStrip *strip_cow = reinterpret_cast(strips_cow->first); + while (strip_orig != NULL) { + strip_cow->orig_strip = strip_orig; + update_nla_strips_orig_pointers(&strip_orig->strips, &strip_cow->strips); + strip_cow = strip_cow->next; + strip_orig = strip_orig->next; + } +} + +void update_nla_tracks_orig_pointers(const ListBase *tracks_orig, ListBase *tracks_cow) +{ + NlaTrack *track_orig = reinterpret_cast(tracks_orig->first); + NlaTrack *track_cow = reinterpret_cast(tracks_cow->first); + while (track_orig != NULL) { + update_nla_strips_orig_pointers(&track_orig->strips, &track_cow->strips); + track_cow = track_cow->next; + track_orig = track_orig->next; + } +} + +void update_animation_data_after_copy(const ID *id_orig, ID *id_cow) +{ + const AnimData *anim_data_orig = BKE_animdata_from_id(const_cast(id_orig)); + if (anim_data_orig == NULL) { + return; + } + AnimData *anim_data_cow = BKE_animdata_from_id(id_cow); + BLI_assert(anim_data_cow != NULL); + update_nla_tracks_orig_pointers(&anim_data_orig->nla_tracks, &anim_data_cow->nla_tracks); +} + /* Do some special treatment of data transfer from original ID to it's * CoW complementary part. * @@ -643,6 +677,7 @@ void update_id_after_copy(const Depsgraph *depsgraph, ID *id_cow) { const ID_Type type = GS(id_orig->name); + update_animation_data_after_copy(id_orig, id_cow); switch (type) { case ID_OB: { /* Ensure we don't drag someone's else derived mesh to the diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h index 7e97ad387dc..1cd49330aa8 100644 --- a/source/blender/makesdna/DNA_anim_types.h +++ b/source/blender/makesdna/DNA_anim_types.h @@ -710,6 +710,11 @@ typedef struct NlaStrip { /** Settings. */ int flag; char _pad2[4]; + + /* Pointer to an original NLA strip. */ + struct NlaStrip *orig_strip; + + void *_pad3; } NlaStrip; /* NLA Strip Blending Mode */ -- cgit v1.2.3