[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55502] trunk/blender/source/blender: 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).

Lukas Toenne lukas.toenne at googlemail.com
Fri Mar 22 11:34:53 CET 2013


Revision: 55502
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55502
Author:   lukastoenne
Date:     2013-03-22 10:34:52 +0000 (Fri, 22 Mar 2013)
Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/nodes/composite/node_composite_tree.c
    trunk/blender/source/blender/nodes/shader/node_shader_tree.c
    trunk/blender/source/blender/nodes/texture/node_texture_tree.c

Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h	2013-03-22 10:10:21 UTC (rev 55501)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2013-03-22 10:34:52 UTC (rev 55502)
@@ -566,7 +566,7 @@
 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);
 

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2013-03-22 10:10:21 UTC (rev 55501)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2013-03-22 10:34:52 UTC (rev 55502)
@@ -1453,18 +1453,38 @@
 	}
 }
 
-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 @@
 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 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);
 		

Modified: trunk/blender/source/blender/nodes/composite/node_composite_tree.c
===================================================================
--- trunk/blender/source/blender/nodes/composite/node_composite_tree.c	2013-03-22 10:10:21 UTC (rev 55501)
+++ trunk/blender/source/blender/nodes/composite/node_composite_tree.c	2013-03-22 10:34:52 UTC (rev 55502)
@@ -162,8 +162,9 @@
 	}
 }
 
-static void local_sync(bNodeTree *UNUSED(localtree), bNodeTree *UNUSED(ntree))
+static void local_sync(bNodeTree *localtree, bNodeTree *ntree)
 {
+	BKE_node_preview_sync_tree(ntree, localtree);
 }
 
 static void local_merge(bNodeTree *localtree, bNodeTree *ntree)
@@ -172,6 +173,8 @@
 	bNodeSocket *lsock;
 	
 	/* move over the compbufs and previews */
+	BKE_node_preview_merge_tree(ntree, localtree, true);
+	
 	for (lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
 		if (ntreeNodeExists(ntree, lnode->new_node)) {
 			if (ELEM(lnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {

Modified: trunk/blender/source/blender/nodes/shader/node_shader_tree.c
===================================================================
--- trunk/blender/source/blender/nodes/shader/node_shader_tree.c	2013-03-22 10:10:21 UTC (rev 55501)
+++ trunk/blender/source/blender/nodes/shader/node_shader_tree.c	2013-03-22 10:34:52 UTC (rev 55502)
@@ -137,10 +137,16 @@
 	}
 }
 
-static void local_sync(bNodeTree *UNUSED(localtree), bNodeTree *UNUSED(ntree))
+static void local_sync(bNodeTree *localtree, bNodeTree *ntree)
 {
+	BKE_node_preview_sync_tree(ntree, localtree);
 }
 
+static void local_merge(bNodeTree *localtree, bNodeTree *ntree)
+{
+	BKE_node_preview_merge_tree(ntree, localtree, true);
+}
+
 static void update(bNodeTree *ntree)
 {
 	ntreeSetOutput(ntree);
@@ -168,6 +174,7 @@
 	tt->foreach_nodeclass = foreach_nodeclass;
 	tt->localize = localize;
 	tt->local_sync = local_sync;
+	tt->local_merge = local_merge;
 	tt->update = update;
 	tt->poll = shader_tree_poll;
 	tt->get_from_context = shader_get_from_context;

Modified: trunk/blender/source/blender/nodes/texture/node_texture_tree.c
===================================================================
--- trunk/blender/source/blender/nodes/texture/node_texture_tree.c	2013-03-22 10:10:21 UTC (rev 55501)
+++ trunk/blender/source/blender/nodes/texture/node_texture_tree.c	2013-03-22 10:34:52 UTC (rev 55502)
@@ -140,10 +140,16 @@
 	}
 }
 
-static void local_sync(bNodeTree *UNUSED(localtree), bNodeTree *UNUSED(ntree))
+static void local_sync(bNodeTree *localtree, bNodeTree *ntree)
 {
+	BKE_node_preview_sync_tree(ntree, localtree);
 }
 
+static void local_merge(bNodeTree *localtree, bNodeTree *ntree)
+{
+	BKE_node_preview_merge_tree(ntree, localtree, true);
+}
+
 static void update(bNodeTree *ntree)
 {
 	ntree_update_reroute_nodes(ntree);
@@ -170,6 +176,7 @@
 	tt->update = update;
 	tt->localize = localize;
 	tt->local_sync = local_sync;
+	tt->local_merge = local_merge;
 	tt->get_from_context = texture_get_from_context;
 	
 	tt->ext.srna = &RNA_TextureNodeTree;




More information about the Bf-blender-cvs mailing list