[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