diff options
author | Alexander Gavrilov <angavrilov@gmail.com> | 2019-04-18 21:19:57 +0300 |
---|---|---|
committer | Alexander Gavrilov <angavrilov@gmail.com> | 2019-04-18 21:32:17 +0300 |
commit | 7ec6bca92fd0ee4a3b1dcdf90fdba1f9d0aec11a (patch) | |
tree | aaf24d40b196131cf62bfaa1ff3340e7c17e6bf5 /source/blender/depsgraph | |
parent | 64bcdd65bf0727c5e39ac2b3f32bf897bfbf07a1 (diff) |
Fix T63332: backup and restore bPoseChannel_Runtime data during COW.
Diffstat (limited to 'source/blender/depsgraph')
-rw-r--r-- | source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc | 42 |
1 files changed, 42 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 01b712fcd87..d134bc1ee2e 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 @@ -841,6 +841,9 @@ class ModifierDataBackupID { /* Storage for backed up runtime modifier data. */ typedef map<ModifierDataBackupID, void *> ModifierRuntimeDataBackup; +/* Storage for backed up pose channel runtime data. */ +typedef map<bPoseChannel *, bPoseChannel_Runtime> PoseChannelRuntimeDataBackup; + struct ObjectRuntimeBackup { ObjectRuntimeBackup() : base_flag(0), base_local_view_bits(0) { @@ -853,16 +856,19 @@ struct ObjectRuntimeBackup { * pointers. */ void init_from_object(Object *object); void backup_modifier_runtime_data(Object *object); + void backup_pose_channel_runtime_data(Object *object); /* Restore all fields to the given object. */ void restore_to_object(Object *object); /* NOTE: Will free all runtime data which has not been restored. */ void restore_modifier_runtime_data(Object *object); + void restore_pose_channel_runtime_data(Object *object); Object_Runtime runtime; short base_flag; unsigned short base_local_view_bits; ModifierRuntimeDataBackup modifier_runtime_data; + PoseChannelRuntimeDataBackup pose_channel_runtime_data; }; void ObjectRuntimeBackup::init_from_object(Object *object) @@ -884,6 +890,8 @@ void ObjectRuntimeBackup::init_from_object(Object *object) base_local_view_bits = object->base_local_view_bits; /* Backup tuntime data of all modifiers. */ backup_modifier_runtime_data(object); + /* Backup runtime data of all pose channels. */ + backup_pose_channel_runtime_data(object); } inline ModifierDataBackupID create_modifier_data_id(const ModifierData *modifier_data) @@ -905,6 +913,19 @@ void ObjectRuntimeBackup::backup_modifier_runtime_data(Object *object) } } +void ObjectRuntimeBackup::backup_pose_channel_runtime_data(Object *object) +{ + if (object->pose != NULL) { + LISTBASE_FOREACH (bPoseChannel *, pchan, &object->pose->chanbase) { + /* This is NULL in Edit mode. */ + if (pchan->orig_pchan != NULL) { + pose_channel_runtime_data[pchan->orig_pchan] = pchan->runtime; + BKE_pose_channel_runtime_reset(&pchan->runtime); + } + } + } +} + void ObjectRuntimeBackup::restore_to_object(Object *object) { Mesh *mesh_orig = object->runtime.mesh_orig; @@ -941,6 +962,7 @@ void ObjectRuntimeBackup::restore_to_object(Object *object) /* Restore modifier's runtime data. * NOTE: Data of unused modifiers will be freed there. */ restore_modifier_runtime_data(object); + restore_pose_channel_runtime_data(object); } void ObjectRuntimeBackup::restore_modifier_runtime_data(Object *object) @@ -967,6 +989,26 @@ void ObjectRuntimeBackup::restore_modifier_runtime_data(Object *object) } } +void ObjectRuntimeBackup::restore_pose_channel_runtime_data(Object *object) +{ + if (object->pose != NULL) { + LISTBASE_FOREACH (bPoseChannel *, pchan, &object->pose->chanbase) { + /* This is NULL in Edit mode. */ + if (pchan->orig_pchan != NULL) { + PoseChannelRuntimeDataBackup::iterator runtime_data_iterator = + pose_channel_runtime_data.find(pchan->orig_pchan); + if (runtime_data_iterator != pose_channel_runtime_data.end()) { + pchan->runtime = runtime_data_iterator->second; + pose_channel_runtime_data.erase(runtime_data_iterator); + } + } + } + } + for (PoseChannelRuntimeDataBackup::value_type &value : pose_channel_runtime_data) { + BKE_pose_channel_runtime_free(&value.second); + } +} + class RuntimeBackup { public: RuntimeBackup() : drawdata_ptr(NULL) |