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
path: root/source
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2019-04-30 11:44:41 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2019-04-30 13:10:18 +0300
commit73e8d1096a65b492c040d63b6f52c8146940ba6a (patch)
treeba1bae56a4b963207f9eea35cdfacc3b7ead899b /source
parent56fd032393f3cfbd8d648c43e88037fdcf481764 (diff)
Depsgraph: Store pointer to original NLA strip
Similar to modifier data and particle systems.
Diffstat (limited to 'source')
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc35
-rw-r--r--source/blender/makesdna/DNA_anim_types.h5
2 files changed, 40 insertions, 0 deletions
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<NlaStrip *>(strips_orig->first);
+ NlaStrip *strip_cow = reinterpret_cast<NlaStrip *>(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<NlaTrack *>(tracks_orig->first);
+ NlaTrack *track_cow = reinterpret_cast<NlaTrack *>(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 *>(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 */