[Bf-blender-cvs] [73e8d1096a6] master: Depsgraph: Store pointer to original NLA strip

Sergey Sharybin noreply at git.blender.org
Tue Apr 30 12:18:33 CEST 2019


Commit: 73e8d1096a65b492c040d63b6f52c8146940ba6a
Author: Sergey Sharybin
Date:   Tue Apr 30 10:44:41 2019 +0200
Branches: master
https://developer.blender.org/rB73e8d1096a65b492c040d63b6f52c8146940ba6a

Depsgraph: Store pointer to original NLA strip

Similar to modifier data and particle systems.

===================================================================

M	source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
M	source/blender/makesdna/DNA_anim_types.h

===================================================================

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 */



More information about the Bf-blender-cvs mailing list