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:
authorSergey Sharybin <sergey@blender.org>2020-08-05 17:49:20 +0300
committerSergey Sharybin <sergey@blender.org>2020-08-11 13:17:22 +0300
commitaa4fb22cac0c8b653cc9925700bfce74dcc08574 (patch)
tree9f1875eb1b46ddc78be85c04a6d4ed8c0ee508cf /source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_object.cc
parent6f99dfc0c6032fa5644031f6355ff59e8e10261d (diff)
Depsgraph: Use UUID to match modifiers
Solves possible pointer-based comparison fiasco. Another nice outcome of this is that topology cache will now be preserved throughout the undo system. For example, undo of object transform will not require topology cache to be re-created. Differential Revision: https://developer.blender.org/D8493
Diffstat (limited to 'source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_object.cc')
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_object.cc27
1 files changed, 12 insertions, 15 deletions
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_object.cc b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_object.cc
index 88334e41192..addee3dc539 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_object.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_object.cc
@@ -62,21 +62,18 @@ void ObjectRuntimeBackup::init_from_object(Object *object)
backup_pose_channel_runtime_data(object);
}
-inline ModifierDataBackupID create_modifier_data_id(const ModifierData *modifier_data)
-{
- return ModifierDataBackupID(modifier_data->orig_modifier_data,
- static_cast<ModifierType>(modifier_data->type));
-}
-
void ObjectRuntimeBackup::backup_modifier_runtime_data(Object *object)
{
LISTBASE_FOREACH (ModifierData *, modifier_data, &object->modifiers) {
if (modifier_data->runtime == nullptr) {
continue;
}
+
+ const SessionUUID &session_uuid = modifier_data->session_uuid;
+ BLI_assert(BLI_session_uuid_is_generated(&session_uuid));
+
BLI_assert(modifier_data->orig_modifier_data != nullptr);
- ModifierDataBackupID modifier_data_id = create_modifier_data_id(modifier_data);
- modifier_runtime_data.add(modifier_data_id, modifier_data->runtime);
+ modifier_runtime_data.add(session_uuid, ModifierDataBackup(modifier_data));
modifier_data->runtime = nullptr;
}
}
@@ -153,17 +150,17 @@ void ObjectRuntimeBackup::restore_modifier_runtime_data(Object *object)
{
LISTBASE_FOREACH (ModifierData *, modifier_data, &object->modifiers) {
BLI_assert(modifier_data->orig_modifier_data != nullptr);
- ModifierDataBackupID modifier_data_id = create_modifier_data_id(modifier_data);
- void *runtime = modifier_runtime_data.pop_default(modifier_data_id, nullptr);
- if (runtime != nullptr) {
- modifier_data->runtime = runtime;
+ const SessionUUID &session_uuid = modifier_data->session_uuid;
+ optional<ModifierDataBackup> backup = modifier_runtime_data.pop_try(session_uuid);
+ if (backup.has_value()) {
+ modifier_data->runtime = backup->runtime;
}
}
- for (ModifierRuntimeDataBackup::Item item : modifier_runtime_data.items()) {
- const ModifierTypeInfo *modifier_type_info = BKE_modifier_get_info(item.key.type);
+ for (ModifierDataBackup &backup : modifier_runtime_data.values()) {
+ const ModifierTypeInfo *modifier_type_info = BKE_modifier_get_info(backup.type);
BLI_assert(modifier_type_info != nullptr);
- modifier_type_info->freeRuntimeData(item.value);
+ modifier_type_info->freeRuntimeData(backup.runtime);
}
}