diff options
author | Bastien Montagne <bastien@blender.org> | 2020-07-06 17:21:41 +0300 |
---|---|---|
committer | Bastien Montagne <bastien@blender.org> | 2020-07-06 17:55:38 +0300 |
commit | ee3eba902a0b5d5f44b1cb2ff52a3a42cc9e9670 (patch) | |
tree | 8e6e50a808e6e29a6bb3f44b953912764e1452e6 /source/blender/blenkernel/intern | |
parent | bfc644dcfb52b873ad7c356cf4b05208fba17bba (diff) |
Runtime cache preservation during undo: add support for nodes and embedded IDs.
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r-- | source/blender/blenkernel/intern/idtype.c | 33 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 28 |
2 files changed, 61 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/idtype.c b/source/blender/blenkernel/intern/idtype.c index 2684e964eb1..1166ad9ad2f 100644 --- a/source/blender/blenkernel/intern/idtype.c +++ b/source/blender/blenkernel/intern/idtype.c @@ -36,8 +36,11 @@ #include "BLT_translation.h" #include "DNA_ID.h" +#include "DNA_node_types.h" +#include "DNA_scene_types.h" #include "BKE_main.h" +#include "BKE_node.h" #include "BKE_idtype.h" @@ -470,3 +473,33 @@ short BKE_idtype_idcode_iter_step(int *index) { return (*index < ARRAY_SIZE(id_types)) ? BKE_idtype_idcode_from_index((*index)++) : 0; } + +/** Wrapper around IDTypeInfo foreach_cache that also handles embedded IDs. */ +void BKE_idtype_id_foreach_cache(struct ID *id, + IDTypeForeachCacheFunctionCallback function_callback, + void *user_data) +{ + const IDTypeInfo *type_info = BKE_idtype_get_info_from_id(id); + if (type_info->foreach_cache != NULL) { + type_info->foreach_cache(id, function_callback, user_data); + } + + /* Handle 'private IDs'. */ + bNodeTree *nodetree = ntreeFromID(id); + if (nodetree != NULL) { + type_info = BKE_idtype_get_info_from_id(&nodetree->id); + if (type_info->foreach_cache != NULL) { + type_info->foreach_cache(&nodetree->id, function_callback, user_data); + } + } + + if (GS(id->name) == ID_SCE) { + Scene *scene = (Scene *)id; + if (scene->master_collection != NULL) { + type_info = BKE_idtype_get_info_from_id(&scene->master_collection->id); + if (type_info->foreach_cache != NULL) { + type_info->foreach_cache(&scene->master_collection->id, function_callback, user_data); + } + } + } +} diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index b73f957535c..52f0d259058 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -315,6 +315,33 @@ static void node_foreach_id(ID *id, LibraryForeachIDData *data) } } +static void node_foreach_cache(ID *id, + IDTypeForeachCacheFunctionCallback function_callback, + void *user_data) +{ + bNodeTree *nodetree = (bNodeTree *)id; + IDCacheKey key = { + .id_session_uuid = id->session_uuid, + .offset_in_ID = offsetof(bNodeTree, previews), + .cache_v = nodetree->previews, + }; + + /* TODO, see also `direct_link_nodetree()` in readfile.c. */ +#if 0 + function_callback(id, &key, (void **)&nodetree->previews, 0, user_data); +#endif + + if (nodetree->type == NTREE_COMPOSIT) { + for (bNode *node = nodetree->nodes.first; node; node = node->next) { + if (node->type == CMP_NODE_MOVIEDISTORTION) { + key.offset_in_ID = (size_t)BLI_ghashutil_strhash_p(node->name); + key.cache_v = node->storage; + function_callback(id, &key, (void **)&node->storage, 0, user_data); + } + } + } +} + IDTypeInfo IDType_ID_NT = { .id_code = ID_NT, .id_filter = FILTER_ID_NT, @@ -330,6 +357,7 @@ IDTypeInfo IDType_ID_NT = { .free_data = ntree_free_data, .make_local = NULL, .foreach_id = node_foreach_id, + .foreach_cache = node_foreach_cache, }; static void node_add_sockets_from_type(bNodeTree *ntree, bNode *node, bNodeType *ntype) |