Commit: 64906260771589ca6192547631b0c961c03af2bc
Author: Sergey Sharybin
Date:   Mon Mar 18 14:21:35 2019 +0100
Branches: master
https://developer.blender.org/rB64906260771589ca6192547631b0c961c03af2bc

Depsgraph: Store original modifier pointer

Currently not needed that much, but will ease some further
development which is related on preserving runtime modifier
data.

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

M       source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
M       source/blender/makesdna/DNA_modifier_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 c161d32a1f0..cae84c3e535 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
@@ -612,18 +612,26 @@ void update_edit_mode_pointers(const Depsgraph *depsgraph,
        }
 }
 
+template <typename T>
+void update_list_orig_pointers(const ListBase* listbase_orig,
+                               ListBase* listbase,
+                               T *T::*orig_field)
+{
+       T *element_orig = reinterpret_cast<T*>(listbase_orig->first);
+       T *element_cow = reinterpret_cast<T*>(listbase->first);
+       while (element_orig != NULL) {
+               element_cow->*orig_field = element_orig;
+               element_cow = element_cow->next;
+               element_orig = element_orig->next;
+       }
+}
+
 void update_particle_system_orig_pointers(const Object *object_orig,
                                           Object *object_cow)
 {
-       ParticleSystem *psys_cow =
-               (ParticleSystem *) object_cow->particlesystem.first;
-       ParticleSystem *psys_orig =
-               (ParticleSystem *) object_orig->particlesystem.first;
-       while (psys_orig != NULL) {
-               psys_cow->orig_psys = psys_orig;
-               psys_cow = psys_cow->next;
-               psys_orig = psys_orig->next;
-       }
+       update_list_orig_pointers(&object_orig->particlesystem,
+                                 &object_cow->particlesystem,
+                                 &ParticleSystem::orig_psys);
 }
 
 void set_particle_system_modifiers_loaded(Object *object_cow)
@@ -638,15 +646,25 @@ void set_particle_system_modifiers_loaded(Object 
*object_cow)
        }
 }
 
+void update_particles_after_copy(const Object *object_orig, Object *object_cow)
+{
+       update_particle_system_orig_pointers(object_orig, object_cow);
+       set_particle_system_modifiers_loaded(object_cow);
+}
+
 void update_pose_orig_pointers(const bPose *pose_orig, bPose *pose_cow)
 {
-       bPoseChannel *pchan_cow = (bPoseChannel *) pose_cow->chanbase.first;
-       bPoseChannel *pchan_orig = (bPoseChannel *) pose_orig->chanbase.first;
-       while (pchan_orig != NULL) {
-               pchan_cow->orig_pchan = pchan_orig;
-               pchan_cow = pchan_cow->next;
-               pchan_orig = pchan_orig->next;
-       }
+       update_list_orig_pointers(&pose_orig->chanbase,
+                                 &pose_cow->chanbase,
+                                 &bPoseChannel::orig_pchan);
+}
+
+void update_modifiers_orig_pointers(const Object *object_orig,
+                                    Object *object_cow)
+{
+       update_list_orig_pointers(&object_orig->modifiers,
+                                 &object_cow->modifiers,
+                                 &ModifierData::orig_modifier_data);
 }
 
 /* Do some special treatment of data transfer from original ID to it's
@@ -679,8 +697,8 @@ void update_id_after_copy(const Depsgraph *depsgraph,
                                                                  
object_cow->pose);
                                }
                        }
-                       update_particle_system_orig_pointers(object_orig, 
object_cow);
-                       set_particle_system_modifiers_loaded(object_cow);
+                       update_particles_after_copy(object_orig, object_cow);
+                       update_modifiers_orig_pointers(object_orig, object_cow);
                        break;
                }
                case ID_SCE:
diff --git a/source/blender/makesdna/DNA_modifier_types.h 
b/source/blender/makesdna/DNA_modifier_types.h
index 5aec9b95797..2719e324bda 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -113,6 +113,10 @@ typedef struct ModifierData {
        char name[64];
 
        char *error;
+
+       /* Pointer to a ModifierData in the original domain. */
+       struct ModifierData *orig_modifier_data;
+       void *_pad2;
 } ModifierData;
 
 typedef enum {

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to