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
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2019-03-18 16:21:35 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2019-03-18 17:53:18 +0300
commit64906260771589ca6192547631b0c961c03af2bc (patch)
treef762368df80492203fd90aeac86e926d740c47e6
parent01c5335422a741b6847f082dad14389d3cb62201 (diff)
Depsgraph: Store original modifier pointer
Currently not needed that much, but will ease some further development which is related on preserving runtime modifier data.
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc54
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h4
2 files changed, 40 insertions, 18 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 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 {