[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33261] branches/particles-2010/source/ blender: Added restype variable to nodes.

Lukas Toenne lukas.toenne at googlemail.com
Tue Nov 23 16:27:53 CET 2010


Revision: 33261
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33261
Author:   lukastoenne
Date:     2010-11-23 16:27:53 +0100 (Tue, 23 Nov 2010)

Log Message:
-----------
Added restype variable to nodes. This is used by nodes with adaptable sockets to set a "fixed" type that the node is explicitly resolved to. This is useful when a node is supposed to use an implicit conversion, especially for providing sensible inputs to a group.

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenkernel/intern/node.c
    branches/particles-2010/source/blender/editors/space_node/node_buttons.c
    branches/particles-2010/source/blender/editors/space_node/node_draw.c
    branches/particles-2010/source/blender/makesdna/DNA_node_types.h
    branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_pass.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodetree.c

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-11-23 15:16:19 UTC (rev 33260)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-11-23 15:27:53 UTC (rev 33261)
@@ -1201,6 +1201,7 @@
 	node->flag= NODE_SELECT|ntype->flag;
 	node->width= ntype->width;
 	node->miniwidth= 42.0f;		/* small value only, allows print of first chars */
+	node->restype = SOCK_ANY;
 
 	if(type==NODE_GROUP)
 		node->id= (ID *)ngroup;

Modified: branches/particles-2010/source/blender/editors/space_node/node_buttons.c
===================================================================
--- branches/particles-2010/source/blender/editors/space_node/node_buttons.c	2010-11-23 15:16:19 UTC (rev 33260)
+++ branches/particles-2010/source/blender/editors/space_node/node_buttons.c	2010-11-23 15:27:53 UTC (rev 33261)
@@ -109,7 +109,11 @@
 	/* draw this node's name, etc. */
 	uiItemR(layout, &ptr, "name", 0, NULL, ICON_NODE);
 	// TODO: a separator would be nice...
-	
+
+	/* draw type selection for adaptable nodes */
+	if (node->typeinfo->adapt_types)
+		uiItemR(layout, &ptr, "restype", 0, "Type", 0);
+
 	/* draw this node's settings */
 	if (node->typeinfo && node->typeinfo->buttonfunc)
 		node->typeinfo->buttonfunc(layout, (bContext *)C, &ptr);

Modified: branches/particles-2010/source/blender/editors/space_node/node_draw.c
===================================================================
--- branches/particles-2010/source/blender/editors/space_node/node_draw.c	2010-11-23 15:16:19 UTC (rev 33260)
+++ branches/particles-2010/source/blender/editors/space_node/node_draw.c	2010-11-23 15:27:53 UTC (rev 33261)
@@ -301,6 +301,7 @@
 			node->locx+NODE_DYS, dy, node->butr.xmax, 20, U.uistyles.first);
 
 		node->typeinfo->uifunc(layout, (bContext *)C, &ptr);
+
 		uiBlockEndAlign(node->block);
 		uiBlockLayoutResolve(node->block, NULL, &buty);
 

Modified: branches/particles-2010/source/blender/makesdna/DNA_node_types.h
===================================================================
--- branches/particles-2010/source/blender/makesdna/DNA_node_types.h	2010-11-23 15:16:19 UTC (rev 33260)
+++ branches/particles-2010/source/blender/makesdna/DNA_node_types.h	2010-11-23 15:27:53 UTC (rev 33261)
@@ -163,7 +163,7 @@
 	short nr;				/* number of this node in list, used for UI exec events */
 	short updated;			/* non-persistent update flag, used in type adaptation */
 	short pad1;
-	int pad2;
+	int restype;			/* fixed type that adaptable sockets resolve to */
 	
 	ListBase inputs, outputs;
 	ListBase inpanels, outpanels;

Modified: branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c
===================================================================
--- branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c	2010-11-23 15:16:19 UTC (rev 33260)
+++ branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c	2010-11-23 15:27:53 UTC (rev 33261)
@@ -125,6 +125,31 @@
 	return sock->type;
 }
 
+static EnumPropertyItem *rna_Node_restype_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+	bNode *node= (bNode*)ptr->data;
+	EnumPropertyItem *item= NULL, tmp= { -1, NULL, 0, NULL, NULL };
+	int totitem= 0;
+	
+	tmp.value = SOCK_ANY;
+	ntreeSocketTypeInfo(tmp.value, &tmp.identifier, &tmp.icon, &tmp.name);
+	RNA_enum_item_add(&item, &totitem, &tmp);
+	if (node->typeinfo->adapt_types) {
+		int *type;
+		for (type=node->typeinfo->adapt_types; *type >= 0; ++type) {
+			tmp.value = *type;
+			ntreeSocketTypeInfo(tmp.value, &tmp.identifier, &tmp.icon, &tmp.name);
+			RNA_enum_item_add(&item, &totitem, &tmp);
+		}
+	}
+	
+	RNA_enum_item_end(&item, &totitem);
+	
+	*free= 1;
+	
+	return item;
+}
+
 EnumPropertyItem *rna_NodeSocket_type_itemf(bContext *C, PointerRNA *ptr, int *free)
 {
 	static EnumPropertyItem items[NUM_SOCKET_TYPES+1];
@@ -220,6 +245,15 @@
 	node_update(bmain, scene, ntree, node);
 }
 
+static void rna_NodeTree_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+	bNodeTree *ntree= (bNodeTree*)ptr->id.data;
+	bNode *node= (bNode*)ptr->data;
+
+	node_update(bmain, scene, ntree, node);
+	ntreeUpdateTree(ntree);
+}
+
 static void rna_NodeGroup_update(Main *bmain, Scene *scene, PointerRNA *ptr)
 {
 	bNodeTree *ntree= (bNodeTree*)ptr->id.data;
@@ -2780,6 +2814,10 @@
 
 static void rna_def_node(BlenderRNA *brna)
 {
+	static EnumPropertyItem placeholder_items[] = {
+	{ 0, "PLACEHOLDER",          0, "Placeholder",          ""},
+	{0, NULL, 0, NULL, NULL}};
+	
 	StructRNA *srna;
 	PropertyRNA *prop;
 	
@@ -2822,6 +2860,13 @@
 	RNA_def_property_collection_sdna(prop, NULL, "outpanels", NULL);
 	RNA_def_property_struct_type(prop, "NodeSocketPanel");
 	RNA_def_property_ui_text(prop, "Output Panels", "");
+
+	prop = RNA_def_property(srna, "restype", PROP_ENUM, PROP_NONE);
+	RNA_def_property_enum_sdna(prop, NULL, "restype");
+	RNA_def_property_enum_items(prop, placeholder_items);
+	RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Node_restype_itemf");
+	RNA_def_property_ui_text(prop, "Resolve Type", "Fixed type to resolve to");
+	RNA_def_property_update(prop, NC_NODE, "rna_NodeTree_update");
 }
 
 static void rna_def_nodetree(BlenderRNA *brna)

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c	2010-11-23 15:16:19 UTC (rev 33260)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c	2010-11-23 15:27:53 UTC (rev 33261)
@@ -254,6 +254,7 @@
 void nodeRegisterSimIf(ListBase *typelist)
 {
 	static bNodeType type;
+	static int adapt_types[] = { SOCK_OP, SOCK_FLOAT, SOCK_INT, SOCK_BOOL, SOCK_VECTOR, SOCK_RGBA, SOCK_QUAT, SOCK_MATRIX, SOCK_STRING, -1 };
 	memset(&type, 0, sizeof(bNodeType));
 	
 	/* required */
@@ -267,6 +268,7 @@
 	/* optional */
 	type.inputs = inputs;
 	type.outputs = outputs;
+	type.adapt_types = adapt_types;
 	type.enqueue_op = enqueue_op;
 	type.enqueue = enqueue;
 	type.generate_source = generate_source;

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_pass.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_pass.c	2010-11-23 15:16:19 UTC (rev 33260)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_pass.c	2010-11-23 15:27:53 UTC (rev 33261)
@@ -187,6 +187,7 @@
 void nodeRegisterSimPass(ListBase *typelist)
 {
 	static bNodeType type;
+	static int adapt_types[] = { SOCK_OP, SOCK_FLOAT, SOCK_INT, SOCK_BOOL, SOCK_VECTOR, SOCK_RGBA, SOCK_QUAT, SOCK_MATRIX, SOCK_STRING, -1 };
 	memset(&type, 0, sizeof(bNodeType));
 	
 	/* required */
@@ -200,6 +201,7 @@
 	/* optional */
 	type.inputs = inputs;
 	type.outputs = outputs;
+	type.adapt_types = adapt_types;
 	type.enqueue_op = enqueue_op;
 	type.enqueue = enqueue;
 	type.generate_source = generate_source;

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodetree.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodetree.c	2010-11-23 15:16:19 UTC (rev 33260)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodetree.c	2010-11-23 15:27:53 UTC (rev 33261)
@@ -104,7 +104,9 @@
 
 static int node_supports_type(bNode *node, int type)
 {
-	if (node->typeinfo->adapt_types) {
+	if (node->restype != SOCK_ANY)
+		return (type == node->restype);
+	else if (node->typeinfo->adapt_types) {
 		int *at;
 		for (at=node->typeinfo->adapt_types; *at >= 0; ++at)
 			if (*at == type)
@@ -127,31 +129,37 @@
 	int restype, resolved=0;
 	
 	/* find best resolution type */
-	restype = SOCK_ANY;
-	for (sock=node->inputs.first; sock; sock=sock->next) {
-		if (sock->flag & SOCK_ADAPT_TYPE) {
-//			if (!socket_types_compatible(sock->restype, restype))
-//				restype = -1;
-//			else
-			if (node_supports_type(node, sock->restype) && socket_type_priority(sock->restype) > socket_type_priority(restype))
-				restype = sock->restype;
-			if (sock->resolved)
-				resolved = 1;
-		}
+	if (node->restype != SOCK_ANY) {
+		restype = node->restype;
+		resolved = 1;
 	}
-	/* only use output socket types if type was not resolved by inputs */
-	if (!resolved) {
-		for (sock=node->outputs.first; sock; sock=sock->next) {
+	else {
+		restype = SOCK_ANY;
+		for (sock=node->inputs.first; sock; sock=sock->next) {
 			if (sock->flag & SOCK_ADAPT_TYPE) {
-//				if (!socket_types_compatible(sock->restype, restype))
-//					restype = -1;
-//				else
+				//			if (!socket_types_compatible(sock->restype, restype))
+				//				restype = -1;
+				//			else
 				if (node_supports_type(node, sock->restype) && socket_type_priority(sock->restype) > socket_type_priority(restype))
 					restype = sock->restype;
-//				if (sock->resolved)		/* never happens */
-//					resolved = 1;
+				if (sock->resolved)
+					resolved = 1;
 			}
 		}
+		/* only use output socket types if type was not resolved by inputs */
+		if (!resolved) {
+			for (sock=node->outputs.first; sock; sock=sock->next) {
+				if (sock->flag & SOCK_ADAPT_TYPE) {
+					//				if (!socket_types_compatible(sock->restype, restype))
+					//					restype = -1;
+					//				else
+					if (node_supports_type(node, sock->restype) && socket_type_priority(sock->restype) > socket_type_priority(restype))
+						restype = sock->restype;
+					//				if (sock->resolved)		/* never happens */
+					//					resolved = 1;
+				}
+			}
+		}
 	}
 	
 	/* update types */
@@ -176,11 +184,11 @@
 	for (node=ntree->nodes.first; node; node=node->next) {
 		node->updated = 0;
 		for (sock=node->inputs.first; sock; sock=sock->next) {
-			sock->restype = (sock->flag & SOCK_ADAPT_TYPE ? SOCK_ANY : sock->type);
+			sock->restype = (sock->flag & SOCK_ADAPT_TYPE ? node->restype : sock->type);
 			sock->resolved = 0;
 		}
 		for (sock=node->outputs.first; sock; sock=sock->next) {
-			sock->restype = (sock->flag & SOCK_ADAPT_TYPE ? SOCK_ANY : sock->type);
+			sock->restype = (sock->flag & SOCK_ADAPT_TYPE ? node->restype : sock->type);
 			sock->resolved = 0;
 		}
 	}





More information about the Bf-blender-cvs mailing list