[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50105] trunk/blender/source/blender: node tree functions for copy/ free now support optional ID user count management,

Campbell Barton ideasman42 at gmail.com
Wed Aug 22 10:54:19 CEST 2012


Revision: 50105
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50105
Author:   campbellbarton
Date:     2012-08-22 08:54:18 +0000 (Wed, 22 Aug 2012)
Log Message:
-----------
node tree functions for copy/free now support optional ID user count management,
this is not used yet, so no functional changes.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/intern/lamp.c
    trunk/blender/source/blender/blenkernel/intern/library.c
    trunk/blender/source/blender/blenkernel/intern/material.c
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/blenkernel/intern/texture.c
    trunk/blender/source/blender/blenkernel/intern/world.c
    trunk/blender/source/blender/editors/space_node/node_group.c

Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h	2012-08-22 00:06:09 UTC (rev 50104)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2012-08-22 08:54:18 UTC (rev 50105)
@@ -301,21 +301,29 @@
 struct bNodeSocketType *ntreeGetSocketType(int type);
 
 struct bNodeTree *ntreeAddTree(const char *name, int type, int nodetype);
-void            ntreeInitTypes(struct bNodeTree *ntree);
+void              ntreeInitTypes(struct bNodeTree *ntree);
 
-void            ntreeFreeTree(struct bNodeTree *ntree);
+/* copy/free funcs, need to manage ID users */
+void              ntreeFreeTree_ex(struct bNodeTree *ntree, const short do_id_user);
+void              ntreeFreeTree(struct bNodeTree *ntree);
+struct bNodeTree *ntreeCopyTree_ex(struct bNodeTree *ntree, const short do_id_user);
 struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree);
-void            ntreeSwitchID(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to);
-void            ntreeMakeLocal(struct bNodeTree *ntree);
-int             ntreeHasType(struct bNodeTree *ntree, int type);
+void              ntreeSwitchID_ex(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to, const short do_id_user);
+void              ntreeSwitchID(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to);
+/* node->id user count */
+void              ntreeUserIncrefID(struct bNodeTree *ntree);
+void              ntreeUserDecrefID(struct bNodeTree *ntree);
 
-void            ntreeUpdateTree(struct bNodeTree *ntree);
+
+void              ntreeMakeLocal(struct bNodeTree *ntree);
+int               ntreeHasType(struct bNodeTree *ntree, int type);
+void              ntreeUpdateTree(struct bNodeTree *ntree);
 /* XXX Currently each tree update call does call to ntreeVerifyNodes too.
  * Some day this should be replaced by a decent depsgraph automatism!
  */
-void            ntreeVerifyNodes(struct Main *main, struct ID *id);
+void              ntreeVerifyNodes(struct Main *main, struct ID *id);
 
-void            ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes);
+void              ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes);
 
 /* XXX old trees handle output flags automatically based on special output node types and last active selection.
  * new tree types have a per-output socket flag to indicate the final output to use explicitly.

Modified: trunk/blender/source/blender/blenkernel/intern/lamp.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/lamp.c	2012-08-22 00:06:09 UTC (rev 50104)
+++ trunk/blender/source/blender/blenkernel/intern/lamp.c	2012-08-22 08:54:18 UTC (rev 50105)
@@ -120,7 +120,7 @@
 	lan->curfalloff = curvemapping_copy(la->curfalloff);
 
 	if (la->nodetree)
-		lan->nodetree = ntreeCopyTree(la->nodetree);
+		lan->nodetree = ntreeCopyTree_ex(la->nodetree, FALSE); /* TODO: do_id_user arg needs checking */
 	
 	if (la->preview)
 		lan->preview = BKE_previewimg_copy(la->preview);
@@ -223,7 +223,7 @@
 
 	/* is no lib link block, but lamp extension */
 	if (la->nodetree) {
-		ntreeFreeTree(la->nodetree);
+		ntreeFreeTree_ex(la->nodetree, FALSE); /* TODO: do_id_user arg needs checking */
 		MEM_freeN(la->nodetree);
 	}
 	

Modified: trunk/blender/source/blender/blenkernel/intern/library.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/library.c	2012-08-22 00:06:09 UTC (rev 50104)
+++ trunk/blender/source/blender/blenkernel/intern/library.c	2012-08-22 08:54:18 UTC (rev 50105)
@@ -348,7 +348,7 @@
 			if (!test) *newid = (ID *)BKE_action_copy((bAction *)id);
 			return 1;
 		case ID_NT:
-			if (!test) *newid = (ID *)ntreeCopyTree((bNodeTree *)id);
+			if (!test) *newid = (ID *)ntreeCopyTree_ex((bNodeTree *)id, FALSE); /* TODO: do_id_user arg needs checking */
 			return 1;
 		case ID_BR:
 			if (!test) *newid = (ID *)BKE_brush_copy((Brush *)id);
@@ -881,7 +881,7 @@
 			BKE_action_free((bAction *)id);
 			break;
 		case ID_NT:
-			ntreeFreeTree((bNodeTree *)id);
+			ntreeFreeTree_ex((bNodeTree *)id, FALSE); /* TODO: do_id_user arg needs checking */
 			break;
 		case ID_BR:
 			BKE_brush_free((Brush *)id);

Modified: trunk/blender/source/blender/blenkernel/intern/material.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/material.c	2012-08-22 00:06:09 UTC (rev 50104)
+++ trunk/blender/source/blender/blenkernel/intern/material.c	2012-08-22 08:54:18 UTC (rev 50105)
@@ -101,7 +101,7 @@
 	
 	/* is no lib link block, but material extension */
 	if (ma->nodetree) {
-		ntreeFreeTree(ma->nodetree);
+		ntreeFreeTree_ex(ma->nodetree, FALSE); /* TODO: do_id_user arg needs checking */
 		MEM_freeN(ma->nodetree);
 	}
 
@@ -235,7 +235,7 @@
 	if (ma->preview) man->preview = BKE_previewimg_copy(ma->preview);
 
 	if (ma->nodetree) {
-		man->nodetree = ntreeCopyTree(ma->nodetree); /* 0 == full new tree */
+		man->nodetree = ntreeCopyTree_ex(ma->nodetree, FALSE); /* TODO: do_id_user arg needs checking */
 	}
 
 	man->gpumaterial.first = man->gpumaterial.last = NULL;
@@ -1511,7 +1511,7 @@
 	matcopybuf.ramp_spec = NULL;
 
 	if (matcopybuf.nodetree) {
-		ntreeFreeTree(matcopybuf.nodetree);
+		ntreeFreeTree_ex(matcopybuf.nodetree, FALSE); /* TODO: do_id_user arg needs checking */
 		MEM_freeN(matcopybuf.nodetree);
 		matcopybuf.nodetree = NULL;
 	}
@@ -1537,7 +1537,7 @@
 			matcopybuf.mtex[a] = MEM_dupallocN(mtex);
 		}
 	}
-	matcopybuf.nodetree = ntreeCopyTree(ma->nodetree);
+	matcopybuf.nodetree = ntreeCopyTree_ex(ma->nodetree, FALSE); /* TODO: do_id_user arg needs checking */
 	matcopybuf.preview = NULL;
 	matcopybuf.gpumaterial.first = matcopybuf.gpumaterial.last = NULL;
 	matcopied = 1;
@@ -1561,7 +1561,7 @@
 	}
 
 	if (ma->nodetree) {
-		ntreeFreeTree(ma->nodetree);
+		ntreeFreeTree_ex(ma->nodetree, FALSE); /* TODO: do_id_user arg needs checking */
 		MEM_freeN(ma->nodetree);
 	}
 
@@ -1582,7 +1582,7 @@
 		}
 	}
 
-	ma->nodetree = ntreeCopyTree(matcopybuf.nodetree);
+	ma->nodetree = ntreeCopyTree_ex(matcopybuf.nodetree, FALSE); /* TODO: do_id_user arg needs checking */
 }
 
 

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2012-08-22 00:06:09 UTC (rev 50104)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2012-08-22 08:54:18 UTC (rev 50105)
@@ -671,7 +671,7 @@
  * copying for internal use (threads for eg), where you wont want it to modify the
  * scene data.
  */
-static bNodeTree *ntreeCopyTree_internal(bNodeTree *ntree, const short do_make_extern)
+static bNodeTree *ntreeCopyTree_internal(bNodeTree *ntree, const short do_id_user, const short do_make_extern)
 {
 	bNodeTree *newtree;
 	bNode *node /*, *nnode */ /* UNUSED */, *last;
@@ -702,6 +702,11 @@
 	last = ntree->nodes.last;
 	for (node = ntree->nodes.first; node; node = node->next) {
 
+		/* ntreeUserDecrefID inline */
+		if (do_id_user) {
+			id_us_min(node->id);
+		}
+
 		if (do_make_extern) {
 			id_lib_extern(node->id);
 		}
@@ -751,23 +756,57 @@
 	return newtree;
 }
 
+bNodeTree *ntreeCopyTree_ex(bNodeTree *ntree, const short do_id_user)
+{
+	return ntreeCopyTree_internal(ntree, do_id_user, TRUE);
+}
 bNodeTree *ntreeCopyTree(bNodeTree *ntree)
 {
-	return ntreeCopyTree_internal(ntree, TRUE);
+	return ntreeCopyTree_ex(ntree, TRUE);
 }
 
 /* use when duplicating scenes */
-void ntreeSwitchID(bNodeTree *ntree, ID *id_from, ID *id_to)
+void ntreeSwitchID_ex(bNodeTree *ntree, ID *id_from, ID *id_to, const short do_id_user)
 {
 	bNode *node;
+
+	if (id_from == id_to) {
+		/* should never happen but may as well skip if it does */
+		return;
+	}
+
 	/* for scene duplication only */
 	for (node = ntree->nodes.first; node; node = node->next) {
 		if (node->id == id_from) {
+			if (do_id_user) {
+				id_us_min(id_from);
+				id_us_plus(id_to);
+			}
+
 			node->id = id_to;
 		}
 	}
 }
+void ntreeSwitchID(bNodeTree *ntree, ID *id_from, ID *id_to)
+{
+	ntreeSwitchID_ex(ntree, id_from, id_to, TRUE);
+}
 
+void ntreeUserIncrefID(bNodeTree *ntree)
+{
+	bNode *node;
+	for (node = ntree->nodes.first; node; node = node->next) {
+		id_us_plus(node->id);
+	}
+}
+void ntreeUserDecrefID(bNodeTree *ntree)
+{
+	bNode *node;
+	for (node = ntree->nodes.first; node; node = node->next) {
+		id_us_min(node->id);
+	}
+}
+
 /* *************** preview *********** */
 /* if node->preview, then we assume the rect to exist */
 
@@ -913,6 +952,7 @@
 	}
 }
 
+/** \note caller needs to manage node->id user */
 void nodeFreeNode(bNodeTree *ntree, bNode *node)
 {
 	bNodeSocket *sock, *nextsock;
@@ -956,7 +996,7 @@
 }
 
 /* do not free ntree itself here, BKE_libblock_free calls this function too */
-void ntreeFreeTree(bNodeTree *ntree)
+void ntreeFreeTree_ex(bNodeTree *ntree, const short do_id_user)
 {
 	bNode *node, *next;
 	bNodeSocket *sock;
@@ -990,6 +1030,12 @@
 	
 	for (node = ntree->nodes.first; node; node = next) {
 		next = node->next;
+
+		/* ntreeUserIncrefID inline */
+		if (do_id_user) {
+			id_us_min(node->id);
+		}
+
 		nodeFreeNode(ntree, node);
 	}
 	
@@ -1000,6 +1046,11 @@
 		node_socket_free_default_value(sock->type, sock->default_value);
 	BLI_freelistN(&ntree->outputs);
 }
+/* same as ntreeFreeTree_ex but always manage users */
+void ntreeFreeTree(bNodeTree *ntree)
+{
+	ntreeFreeTree_ex(ntree, TRUE);
+}
 
 void ntreeFreeCache(bNodeTree *ntree)
 {
@@ -1137,7 +1188,7 @@
 	}
 	else if (cd.local && cd.lib) {
 		/* this is the mixed case, we copy the tree and assign it to local users */
-		bNodeTree *newtree = ntreeCopyTree(ntree);
+		bNodeTree *newtree = ntreeCopyTree_ex(ntree, FALSE); /* TODO: do_id_user arg needs checking */
 		
 		newtree->id.us = 0;
 		
@@ -1188,7 +1239,7 @@
 	}
 
 	/* node copy func */
-	ltree = ntreeCopyTree_internal(ntree, FALSE);
+	ltree = ntreeCopyTree_internal(ntree, FALSE, FALSE);
 
 	if (adt) {
 		AnimData *ladt = BKE_animdata_from_id(&ltree->id);
@@ -1248,7 +1299,7 @@
 	if (ntreetype->local_merge)
 		ntreetype->local_merge(localtree, ntree);
 
-	ntreeFreeTree(localtree);
+	ntreeFreeTree_ex(localtree, FALSE); /* TODO: do_id_user arg needs checking */
 	MEM_freeN(localtree);
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list