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 | |
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')
-rw-r--r-- | source/blender/blenkernel/BKE_node.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 50 |
2 files changed, 32 insertions, 20 deletions
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 25b81ab3028..e62994576a3 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -566,7 +566,7 @@ void BKE_node_preview_clear(struct bNodePreview *preview); void BKE_node_preview_clear_tree(struct bNodeTree *ntree); void BKE_node_preview_sync_tree(struct bNodeTree *to_ntree, struct bNodeTree *from_ntree); -void BKE_node_preview_merge_tree(struct bNodeTree *to_ntree, struct bNodeTree *from_ntree); +void BKE_node_preview_merge_tree(struct bNodeTree *to_ntree, struct bNodeTree *from_ntree, bool remove_old); void BKE_node_preview_set_pixel(struct bNodePreview *preview, const float col[4], int x, int y, int do_manage); 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); |