diff options
-rw-r--r-- | source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.cc | 8 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.h | 11 |
2 files changed, 18 insertions, 1 deletions
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.cc b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.cc index 108f5f04879..e141925725b 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.cc @@ -32,7 +32,8 @@ namespace DEG { RuntimeBackup::RuntimeBackup(const Depsgraph *depsgraph) - : animation_backup(depsgraph), + : have_backup(nullptr), + animation_backup(depsgraph), scene_backup(depsgraph), sound_backup(depsgraph), object_backup(depsgraph), @@ -48,6 +49,7 @@ void RuntimeBackup::init_from_id(ID *id) if (!deg_copy_on_write_is_expanded(id)) { return; } + have_backup = true; animation_backup.init_from_id(id); @@ -83,6 +85,10 @@ void RuntimeBackup::init_from_id(ID *id) void RuntimeBackup::restore_to_id(ID *id) { + if (!have_backup) { + return; + } + animation_backup.restore_to_id(id); const ID_Type id_type = GS(id->name); diff --git a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.h b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.h index c818c1f7064..d1a30652b36 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.h +++ b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.h @@ -46,6 +46,17 @@ class RuntimeBackup { /* Restore fields to the given ID. */ void restore_to_id(ID *id); + /* Denotes whether init_from_id did put anything into the backup storage. + * This will not be the case when init_from_id() is called for an ID which has never been + * copied-on-write. In this case there is no need to backup or restore anything. + * + * It also allows to have restore() logic to be symmetrical to init() without need to worry + * that init() might not have happenned. + * + * In practice this is used by audio system to lock audio while scene is going through + * copy-on-write mechanism. */ + bool have_backup; + AnimationBackup animation_backup; SceneBackup scene_backup; SoundBackup sound_backup; |