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:
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.cc8
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.h11
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;