diff options
author | Lukas Toenne <lukas.toenne@googlemail.com> | 2013-03-22 14:34:52 +0400 |
---|---|---|
committer | Lukas Toenne <lukas.toenne@googlemail.com> | 2013-03-22 14:34:52 +0400 |
commit | 70319509ba7bb8878114ee3047f1a92def7967d4 (patch) | |
tree | 00e3b7948869290ce9cafa7e47c6fd6dc6161c5c /source/blender/blenkernel/intern | |
parent | 19476cead446f372e99050be7a8e3e7b278547b0 (diff) |
Node preview merge function now has an additional option "remove_old", which could be used if previous previews should be retained after recalculating (not used currently, old previews are dropped entirely for now, because it could be confusing).
Also moved the sync and merge for previews into the respective tree callbacks for consistency. This way the handling of previews can be changed for each tree type individually if necessary.
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 4151120b12f..ee3cd174291 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -1453,18 +1453,38 @@ void BKE_node_preview_sync_tree(bNodeTree *to_ntree, bNodeTree *from_ntree) } } -void BKE_node_preview_merge_tree(bNodeTree *to_ntree, bNodeTree *from_ntree) +void BKE_node_preview_merge_tree(bNodeTree *to_ntree, bNodeTree *from_ntree, bool remove_old) { - /* free old previews */ - if (to_ntree->previews) - BKE_node_instance_hash_free(to_ntree->previews, (bNodeInstanceValueFP)BKE_node_preview_free); - - /* transfer previews */ - to_ntree->previews = from_ntree->previews; - from_ntree->previews = NULL; - - /* clean up, in case any to_ntree nodes have been removed */ - BKE_node_preview_remove_unused(to_ntree); + if (remove_old || !to_ntree->previews) { + /* free old previews */ + if (to_ntree->previews) + BKE_node_instance_hash_free(to_ntree->previews, (bNodeInstanceValueFP)BKE_node_preview_free); + + /* transfer previews */ + to_ntree->previews = from_ntree->previews; + from_ntree->previews = NULL; + + /* clean up, in case any to_ntree nodes have been removed */ + BKE_node_preview_remove_unused(to_ntree); + } + else { + bNodeInstanceHashIterator iter; + + if (from_ntree->previews) { + NODE_INSTANCE_HASH_ITER(iter, from_ntree->previews) { + bNodeInstanceKey key = BKE_node_instance_hash_iterator_get_key(&iter); + bNodePreview *preview = BKE_node_instance_hash_iterator_get_value(&iter); + + /* replace existing previews */ + BKE_node_instance_hash_remove(to_ntree->previews, key, (bNodeInstanceValueFP)BKE_node_preview_free); + BKE_node_instance_hash_insert(to_ntree->previews, key, preview); + } + + /* Note: NULL free function here, because pointers have already been moved over to to_ntree->previews! */ + BKE_node_instance_hash_free(from_ntree->previews, NULL); + from_ntree->previews = NULL; + } + } } /* hack warning! this function is only used for shader previews, and @@ -1965,12 +1985,6 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree) void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree) { if (localtree && ntree) { - /* XXX syncing was disabled for compositor nodes. - * It has to be ensured that there is no concurrent read/write access! - * Possibly needs a mutex lock or a flag to disable for certain tree types ... - */ - BKE_node_preview_sync_tree(ntree, localtree); - if (ntree->typeinfo->local_sync) ntree->typeinfo->local_sync(localtree, ntree); } @@ -1981,8 +1995,6 @@ void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree) void ntreeLocalMerge(bNodeTree *localtree, bNodeTree *ntree) { if (localtree && ntree) { - BKE_node_preview_merge_tree(ntree, localtree); - if (ntree->typeinfo->local_merge) ntree->typeinfo->local_merge(localtree, ntree); |