Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Toenne <lukas.toenne@googlemail.com>2011-02-22 23:24:06 +0300
committerLukas Toenne <lukas.toenne@googlemail.com>2011-02-22 23:24:06 +0300
commitb3c60ef3eae01b08eeb63cb574397f720fc2acbe (patch)
treef455068835de827635f78d70a9142a041e51ed5e /source/blender/makesrna
parent1f4fc992ef7840931439c161514bff710c6e6dca (diff)
Added RNA functions to group tree inputs/outputs for exposing internal sockets or adding custom sockets by name and type (fixes #26171). Changed a few function names for groups for consistency.
Diffstat (limited to 'source/blender/makesrna')
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c119
1 files changed, 106 insertions, 13 deletions
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 35374d07a5f..a20ced776e5 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -202,7 +202,7 @@ static char *rna_NodeSocket_path(PointerRNA *ptr)
return BLI_sprintfN("outputs[%d]", socketindex);
/* node sockets */
- if (!nodeFindNode(ntree, sock, &node, NULL)) return NULL;
+ if (!nodeFindNode(ntree, sock, &node, NULL, NULL)) return NULL;
socketindex = BLI_findindex(&node->inputs, sock);
if (socketindex != -1)
@@ -290,7 +290,7 @@ static void rna_NodeGroup_update(Main *bmain, Scene *scene, PointerRNA *ptr)
bNodeTree *ntree= (bNodeTree*)ptr->id.data;
bNode *node= (bNode*)ptr->data;
- nodeVerifyGroup((bNodeTree *)node->id);
+ nodeGroupVerify((bNodeTree *)node->id);
node_update(bmain, scene, ntree, node);
}
@@ -367,7 +367,7 @@ static void rna_NodeSocket_update(Main *bmain, Scene *scene, PointerRNA *ptr)
bNodeSocket *sock= (bNodeSocket*)ptr->data;
bNode *node;
- if (nodeFindNode(ntree, sock, &node, NULL))
+ if (nodeFindNode(ntree, sock, &node, NULL, NULL))
node_update(bmain, scene, ntree, node);
}
@@ -377,9 +377,9 @@ static void rna_NodeGroupSocket_update(Main *bmain, Scene *scene, PointerRNA *pt
bNodeSocket *sock= (bNodeSocket*)ptr->data;
bNode *node;
- nodeVerifyGroup(ntree);
+ nodeGroupVerify(ntree);
- if (nodeFindNode(ntree, sock, &node, NULL))
+ if (nodeFindNode(ntree, sock, &node, NULL, NULL))
node_update(bmain, scene, ntree, node);
}
@@ -529,7 +529,7 @@ static bNode *rna_NodeTree_node_new(bNodeTree *ntree, bContext *C, ReportList *r
BKE_reportf(reports, RPT_ERROR, "Unable to create node");
}
else {
- nodeVerifyGroup(ntree); /* update group node socket links*/
+ nodeGroupVerify(ntree); /* update group node socket links*/
NodeTagChanged(ntree, node);
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
@@ -587,7 +587,7 @@ static void rna_NodeTree_node_remove(bNodeTree *ntree, ReportList *reports, bNod
id_us_min(node->id);
nodeFreeNode(ntree, node);
- nodeVerifyGroup(ntree); /* update group node socket links*/
+ nodeGroupVerify(ntree); /* update group node socket links*/
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
}
@@ -598,12 +598,12 @@ static bNodeLink *rna_NodeTree_link_new(bNodeTree *ntree, ReportList *reports, b
bNodeLink *ret;
bNode *fromnode, *tonode;
- if (!nodeFindNode(ntree, in, &fromnode, NULL)) {
+ if (!nodeFindNode(ntree, in, &fromnode, NULL, NULL)) {
BKE_reportf(reports, RPT_ERROR, "Unable to locate input socket's node in nodetree");
return NULL;
}
- if (!nodeFindNode(ntree, out, &tonode, NULL)) {
+ if (!nodeFindNode(ntree, out, &tonode, NULL, NULL)) {
BKE_reportf(reports, RPT_ERROR, "Unable to locate output socket's node in nodetree");
return NULL;
}
@@ -616,7 +616,7 @@ static bNodeLink *rna_NodeTree_link_new(bNodeTree *ntree, ReportList *reports, b
if(ret) {
NodeTagChanged(ntree, tonode);
- nodeVerifyGroup(ntree); /* update group node socket links*/
+ nodeGroupVerify(ntree); /* update group node socket links*/
ntreeSolveOrder(ntree);
@@ -633,12 +633,76 @@ static void rna_NodeTree_link_remove(bNodeTree *ntree, ReportList *reports, bNod
else {
nodeRemLink(ntree, link);
ntreeSolveOrder(ntree);
- nodeVerifyGroup(ntree); /* update group node socket links*/
+ nodeGroupVerify(ntree); /* update group node socket links*/
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
}
}
+static bNodeSocket *rna_NodeTree_input_new(bNodeTree *ntree, ReportList *UNUSED(reports), const char *name, int type)
+{
+ /* XXX should check if tree is a group here! no good way to do this currently. */
+ bNodeSocket *gsock= nodeGroupAddSocket(ntree, name, type, SOCK_IN);
+
+ nodeGroupVerify(ntree); /* update group node socket links*/
+ WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
+ return gsock;
+}
+
+static bNodeSocket *rna_NodeTree_output_new(bNodeTree *ntree, ReportList *UNUSED(reports), const char *name, int type)
+{
+ /* XXX should check if tree is a group here! no good way to do this currently. */
+ bNodeSocket *gsock= nodeGroupAddSocket(ntree, name, type, SOCK_OUT);
+
+ nodeGroupVerify(ntree); /* update group node socket links*/
+ WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
+ return gsock;
+}
+
+static bNodeSocket *rna_NodeTree_input_expose(bNodeTree *ntree, ReportList *reports, bNodeSocket *sock)
+{
+ bNode *node;
+ bNodeSocket *gsock;
+ int index, in_out;
+
+ if (!nodeFindNode(ntree, sock, &node, &index, &in_out))
+ BKE_reportf(reports, RPT_ERROR, "Unable to locate socket in nodetree");
+ else if (in_out!=SOCK_IN)
+ BKE_reportf(reports, RPT_ERROR, "Socket is not an input");
+ else {
+ /* XXX should check if tree is a group here! no good way to do this currently. */
+ gsock = nodeGroupAddSocket(ntree, sock->name, sock->type, SOCK_IN);
+ nodeAddLink(ntree, NULL, gsock, node, sock);
+
+ nodeGroupVerify(ntree); /* update group node socket links*/
+ WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
+ return gsock;
+ }
+ return NULL;
+}
+
+static bNodeSocket *rna_NodeTree_output_expose(bNodeTree *ntree, ReportList *reports, bNodeSocket *sock)
+{
+ bNode *node;
+ bNodeSocket *gsock;
+ int index, in_out;
+
+ if (!nodeFindNode(ntree, sock, &node, &index, &in_out))
+ BKE_reportf(reports, RPT_ERROR, "Unable to locate socket in nodetree");
+ else if (in_out!=SOCK_OUT)
+ BKE_reportf(reports, RPT_ERROR, "Socket is not an output");
+ else {
+ /* XXX should check if tree is a group here! no good way to do this currently. */
+ gsock = nodeGroupAddSocket(ntree, sock->name, sock->type, SOCK_OUT);
+ nodeAddLink(ntree, node, sock, NULL, gsock);
+
+ nodeGroupVerify(ntree); /* update group node socket links*/
+ WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
+ return gsock;
+ }
+ return NULL;
+}
+
#else
static EnumPropertyItem prop_image_layer_items[] = {
@@ -2661,12 +2725,39 @@ static void rna_def_node_link(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "To socket", "");
}
+static void rna_def_group_sockets_api(BlenderRNA *brna, PropertyRNA *cprop, int in_out)
+{
+ StructRNA *srna;
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ RNA_def_property_srna(cprop, (in_out==SOCK_IN ? "GroupInputs" : "GroupOutputs"));
+ srna= RNA_def_struct(brna, (in_out==SOCK_IN ? "GroupInputs" : "GroupOutputs"), NULL);
+ RNA_def_struct_sdna(srna, "bNodeTree");
+ RNA_def_struct_ui_text(srna, "Group Sockets", "Collection of group sockets");
+
+ func= RNA_def_function(srna, "new", (in_out==SOCK_IN ? "rna_NodeTree_input_new" : "rna_NodeTree_output_new"));
+ RNA_def_function_ui_description(func, "Add a socket to the group tree.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ RNA_def_string(func, "name", "Socket", 32, "Name", "Name of the socket");
+ RNA_def_enum(func, "type", node_socket_type_items, SOCK_VALUE, "Type", "Type of socket");
+ /* return value */
+ parm= RNA_def_pointer(func, "socket", "NodeSocket", "", "New socket.");
+ RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "expose", (in_out==SOCK_IN ? "rna_NodeTree_input_expose" : "rna_NodeTree_output_expose"));
+ RNA_def_function_ui_description(func, "Expose an internal socket in the group tree.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ RNA_def_pointer(func, "sock", "NodeSocket", "Socket", "Internal node socket to expose");
+ /* return value */
+ parm= RNA_def_pointer(func, "socket", "NodeSocket", "", "New socket.");
+ RNA_def_function_return(func, parm);
+}
+
static void rna_def_nodetree(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
- /* FunctionRNA *func; */
- /* PropertyRNA *parm; */
static EnumPropertyItem nodetree_type_items[] = {
{NTREE_SHADER, "SHADER", 0, "Shader", ""},
@@ -2707,11 +2798,13 @@ static void rna_def_nodetree(BlenderRNA *brna)
RNA_def_property_collection_sdna(prop, NULL, "inputs", NULL);
RNA_def_property_struct_type(prop, "NodeSocket");
RNA_def_property_ui_text(prop, "Inputs", "");
+ rna_def_group_sockets_api(brna, prop, SOCK_IN);
prop = RNA_def_property(srna, "outputs", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "outputs", NULL);
RNA_def_property_struct_type(prop, "NodeSocket");
RNA_def_property_ui_text(prop, "Outputs", "");
+ rna_def_group_sockets_api(brna, prop, SOCK_OUT);
}
static void rna_def_composite_nodetree(BlenderRNA *brna)