[Bf-blender-cvs] [d1166dcf315] master: Depsgraph: Refactor, split runtime backup into smaller files

Sergey Sharybin noreply at git.blender.org
Fri Nov 29 15:13:56 CET 2019


Commit: d1166dcf315f264d514eb48ddceb13deecf01353
Author: Sergey Sharybin
Date:   Fri Nov 29 11:43:40 2019 +0100
Branches: master
https://developer.blender.org/rBd1166dcf315f264d514eb48ddceb13deecf01353

Depsgraph: Refactor, split runtime backup into smaller files

It started to be a long code of all various cases in a single file,
which started to be really confusing.

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

M	source/blender/depsgraph/CMakeLists.txt
M	source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
A	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.cc
A	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.h
A	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_modifier.cc
A	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_modifier.h
A	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_movieclip.cc
A	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_movieclip.h
A	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_object.cc
A	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_object.h
A	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_pose.cc
A	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_pose.h
A	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_scene.cc
A	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_scene.h
A	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_sequence.cc
A	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_sequence.h
A	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_sequencer.cc
A	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_sequencer.h
A	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_sound.cc
A	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_sound.h

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

diff --git a/source/blender/depsgraph/CMakeLists.txt b/source/blender/depsgraph/CMakeLists.txt
index 21ab148496c..4abeec19645 100644
--- a/source/blender/depsgraph/CMakeLists.txt
+++ b/source/blender/depsgraph/CMakeLists.txt
@@ -58,6 +58,15 @@ set(SRC
   intern/eval/deg_eval.cc
   intern/eval/deg_eval_copy_on_write.cc
   intern/eval/deg_eval_flush.cc
+  intern/eval/deg_eval_runtime_backup.cc
+  intern/eval/deg_eval_runtime_backup_modifier.cc
+  intern/eval/deg_eval_runtime_backup_movieclip.cc
+  intern/eval/deg_eval_runtime_backup_object.cc
+  intern/eval/deg_eval_runtime_backup_pose.cc
+  intern/eval/deg_eval_runtime_backup_scene.cc
+  intern/eval/deg_eval_runtime_backup_sequence.cc
+  intern/eval/deg_eval_runtime_backup_sequencer.cc
+  intern/eval/deg_eval_runtime_backup_sound.cc
   intern/eval/deg_eval_stats.cc
   intern/node/deg_node.cc
   intern/node/deg_node_component.cc
@@ -98,6 +107,15 @@ set(SRC
   intern/eval/deg_eval.h
   intern/eval/deg_eval_copy_on_write.h
   intern/eval/deg_eval_flush.h
+  intern/eval/deg_eval_runtime_backup.h
+  intern/eval/deg_eval_runtime_backup_modifier.h
+  intern/eval/deg_eval_runtime_backup_movieclip.h
+  intern/eval/deg_eval_runtime_backup_object.h
+  intern/eval/deg_eval_runtime_backup_pose.h
+  intern/eval/deg_eval_runtime_backup_scene.h
+  intern/eval/deg_eval_runtime_backup_sequence.h
+  intern/eval/deg_eval_runtime_backup_sequencer.h
+  intern/eval/deg_eval_runtime_backup_sound.h
   intern/eval/deg_eval_stats.h
   intern/node/deg_node.h
   intern/node/deg_node_component.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 8a33453b923..3a2cf35f4d5 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
@@ -21,7 +21,7 @@
  * \ingroup depsgraph
  */
 
-/* Enable special; trickery to treat nested owned IDs (such as nodetree of
+/* Enable special trickery to treat nested owned IDs (such as nodetree of
  * material) to be handled in same way as "real" data-blocks, even tho some
  * internal BKE routines doesn't treat them like that.
  *
@@ -95,6 +95,7 @@ extern "C" {
 #include "intern/depsgraph.h"
 #include "intern/builder/deg_builder.h"
 #include "intern/builder/deg_builder_nodes.h"
+#include "intern/eval/deg_eval_runtime_backup.h"
 #include "intern/node/deg_node.h"
 #include "intern/node/deg_node_id.h"
 
@@ -945,545 +946,6 @@ ID *deg_expand_copy_on_write_datablock(const Depsgraph *depsgraph,
   return deg_expand_copy_on_write_datablock(depsgraph, id_node, node_builder, create_placeholders);
 }
 
-namespace {
-
-/* Backup of sequencer strips runtime data. */
-
-/* Backup of a single strip. */
-class SequenceBackup {
- public:
-  SequenceBackup()
-  {
-    reset();
-  }
-
-  inline void reset()
-  {
-    scene_sound = NULL;
-  }
-
-  void init_from_sequence(Sequence *sequence)
-  {
-    scene_sound = sequence->scene_sound;
-
-    sequence->scene_sound = NULL;
-  }
-
-  void restore_to_sequence(Sequence *sequence)
-  {
-    sequence->scene_sound = scene_sound;
-    reset();
-  }
-
-  inline bool isEmpty() const
-  {
-    return (scene_sound == NULL);
-  }
-
-  void *scene_sound;
-};
-
-class SequencerBackup {
- public:
-  SequencerBackup();
-
-  void init_from_scene(Scene *scene);
-  void restore_to_scene(Scene *scene);
-
-  typedef map<Sequence *, SequenceBackup> SequencesBackupMap;
-  SequencesBackupMap sequences_backup;
-};
-
-SequencerBackup::SequencerBackup()
-{
-}
-
-void SequencerBackup::init_from_scene(Scene *scene)
-{
-  Sequence *sequence;
-  SEQ_BEGIN (scene->ed, sequence) {
-    SequenceBackup sequence_backup;
-    sequence_backup.init_from_sequence(sequence);
-    if (!sequence_backup.isEmpty()) {
-      sequences_backup.insert(make_pair(sequence->orig_sequence, sequence_backup));
-    }
-  }
-  SEQ_END;
-}
-
-void SequencerBackup::restore_to_scene(Scene *scene)
-{
-  Sequence *sequence;
-  SEQ_BEGIN (scene->ed, sequence) {
-    SequencesBackupMap::iterator it = sequences_backup.find(sequence->orig_sequence);
-    if (it == sequences_backup.end()) {
-      continue;
-    }
-    SequenceBackup &sequence_backup = it->second;
-    sequence_backup.restore_to_sequence(sequence);
-  }
-  SEQ_END;
-  /* Cleanup audio while the scene is still known. */
-  for (SequencesBackupMap::value_type &it : sequences_backup) {
-    SequenceBackup &sequence_backup = it.second;
-    if (sequence_backup.scene_sound != NULL) {
-      BKE_sound_remove_scene_sound(scene, sequence_backup.scene_sound);
-    }
-  }
-}
-
-/* Backup of scene runtime data. */
-
-class SceneBackup {
- public:
-  SceneBackup();
-
-  void reset();
-
-  void init_from_scene(Scene *scene);
-  void restore_to_scene(Scene *scene);
-
-  /* Sound/audio related pointers of the scene itself.
-   *
-   * NOTE: Scene can not disappear after relations update, because otherwise the entire dependency
-   * graph will be gone. This means we don't need to compare original scene pointer, or worry about
-   * freeing those if they cant' be restored: we just copy them over to a new scene. */
-  void *sound_scene;
-  void *playback_handle;
-  void *sound_scrub_handle;
-  void *speaker_handles;
-  float rigidbody_last_time;
-
-  SequencerBackup sequencer_backup;
-};
-
-SceneBackup::SceneBackup()
-{
-  reset();
-}
-
-void SceneBackup::reset()
-{
-  sound_scene = NULL;
-  playback_handle = NULL;
-  sound_scrub_handle = NULL;
-  speaker_handles = NULL;
-  rigidbody_last_time = -1;
-}
-
-void SceneBackup::init_from_scene(Scene *scene)
-{
-  sound_scene = scene->sound_scene;
-  playback_handle = scene->playback_handle;
-  sound_scrub_handle = scene->sound_scrub_handle;
-  speaker_handles = scene->speaker_handles;
-
-  if (scene->rigidbody_world != NULL) {
-    rigidbody_last_time = scene->rigidbody_world->ltime;
-  }
-
-  /* Clear pointers stored in the scene, so they are not freed when copied-on-written datablock
-   * is freed for re-allocation. */
-  scene->sound_scene = NULL;
-  scene->playback_handle = NULL;
-  scene->sound_scrub_handle = NULL;
-  scene->speaker_handles = NULL;
-
-  sequencer_backup.init_from_scene(scene);
-}
-
-void SceneBackup::restore_to_scene(Scene *scene)
-{
-  scene->sound_scene = sound_scene;
-  scene->playback_handle = playback_handle;
-  scene->sound_scrub_handle = sound_scrub_handle;
-  scene->speaker_handles = speaker_handles;
-
-  if (scene->rigidbody_world != NULL) {
-    scene->rigidbody_world->ltime = rigidbody_last_time;
-  }
-
-  sequencer_backup.restore_to_scene(scene);
-
-  reset();
-}
-
-/* Backup of sound datablocks runtime data. */
-
-class SoundBackup {
- public:
-  SoundBackup();
-
-  void reset();
-
-  void init_from_sound(bSound *sound);
-  void restore_to_sound(bSound *sound);
-
-  void *cache;
-  void *waveform;
-  void *playback_handle;
-};
-
-SoundBackup::SoundBackup()
-{
-  reset();
-}
-
-void SoundBackup::reset()
-{
-  cache = NULL;
-  waveform = NULL;
-  playback_handle = NULL;
-}
-
-void SoundBackup::init_from_sound(bSound *sound)
-{
-  cache = sound->cache;
-  waveform = sound->waveform;
-  playback_handle = sound->playback_handle;
-
-  sound->cache = NULL;
-  sound->waveform = NULL;
-  sound->playback_handle = NULL;
-}
-
-void SoundBackup::restore_to_sound(bSound *sound)
-{
-  sound->cache = cache;
-  sound->waveform = waveform;
-  sound->playback_handle = playback_handle;
-
-  reset();
-}
-
-/* Identifier used to match modifiers to backup/restore their runtime data.
- * Identification is happening using original modifier data pointer and the
- * modifier type.
- * It is not enough to only pointer, since it's possible to have a situation
- * when modifier is removed and a new one added, and due to memory allocation
- * policy they might have same pointer.
- * By adding type into matching we are at least ensuring that modifier will not
- * try to interpret runtime data created by another modifier type. */
-class ModifierDataBackupID {
- public:
-  ModifierDataBackupID() : ModifierDataBackupID(NULL, eModifierType_None)
-  {
-  }
-
-  ModifierDataBackupID(ModifierData *modifier_data, ModifierType type)
-      : modifier_data(modifier_data), type(type)
-  {
-  }
-
-  bool operator<(const ModifierDataBackupID &other) const
-  {
-    if (modifier_data < other.modifier_data) {
-      return true;
-    }
-    if (modifier_data == other.modifier_data) {
-      return static_cast<int>(type) < static_cast<int>(other.type);
-    }
-    return false;
-  }
-
-  ModifierData *modifier_data;
-  ModifierType type;
-};
-
-/* 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;
-
-class ObjectRuntimeBackup {
- public:
-  ObjectRuntimeBackup() : base_flag(0), base_local_view_bits(0)
-  {
-    /* TODO(sergey): Use something like BKE_object_runtime_reset(). */
-    memset(&runtime, 0, sizeof(runtime));
-  }
-
-  /* Make a backup of object's evaluation runtime data, additionally
-   * make object to be safe for free without invalidating backed up
-   * 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)
-{
-  /* Store evaluated mesh and curve_cache, and make sure we don't free it. */
-  Mesh *mesh_eval = object->runtime.mesh_eval;
-  runtime = object->runtime;
-  BKE_object_runtime_reset(object);
-  /* Keep bbox (for now at least). */
-  object->runtime.bb = runtime.bb;
-  /* Object update will override act

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list