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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs