[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33005] branches/particles-2010/source/ blender: Fix for socket type adaptation in and node groups.
Lukas Toenne
lukas.toenne at googlemail.com
Thu Nov 11 12:16:02 CET 2010
Revision: 33005
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33005
Author: lukastoenne
Date: 2010-11-11 12:16:02 +0100 (Thu, 11 Nov 2010)
Log Message:
-----------
Fix for socket type adaptation in and node groups. During type adaptation the sockets now use a temporary type variable, so that the internal type resolution of node groups is not affected and the order of updates for node trees does not matter.
Modified Paths:
--------------
branches/particles-2010/source/blender/blenkernel/intern/node.c
branches/particles-2010/source/blender/makesdna/DNA_node_types.h
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-11 11:06:15 UTC (rev 33004)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c 2010-11-11 11:16:02 UTC (rev 33005)
@@ -695,6 +695,7 @@
*ngroup->owntype= node_group_typeinfo; /* copy data, for init */
/* counting stats */
+ totin = totout = 0;
for(node= ngroup->nodes.first; node; node= node->next) {
for(sock= node->inputs.first; sock; sock= sock->next)
if(sock->intern==0)
Modified: branches/particles-2010/source/blender/makesdna/DNA_node_types.h
===================================================================
--- branches/particles-2010/source/blender/makesdna/DNA_node_types.h 2010-11-11 11:06:15 UTC (rev 33004)
+++ branches/particles-2010/source/blender/makesdna/DNA_node_types.h 2010-11-11 11:16:02 UTC (rev 33005)
@@ -99,6 +99,8 @@
short need_exec;
short resolved; /* adaptable socket type has been resolved */
+ int restype; /* temporary type during updates */
+ int pad;
void *storage; /* custom storage */
Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodetree.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodetree.c 2010-11-11 11:06:15 UTC (rev 33004)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodetree.c 2010-11-11 11:16:02 UTC (rev 33005)
@@ -394,6 +394,12 @@
return 0;
}
+/* standard method of adapting socket types in a node:
+ * -find the best type from input sockets
+ * -if input sockets did not resolve types, look among outputs
+ * -set the resolved type to all adaptable sockets
+ * XXX this should take limited socket types into account.
+ */
static void adapt_socket_types_default(bNode *node)
{
bNodeSocket *sock;
@@ -403,11 +409,11 @@
restype = SOCK_ANY;
for (sock=node->inputs.first; sock; sock=sock->next) {
if (sock->flag & SOCK_ADAPT_TYPE) {
-// if (!socket_types_compatible(sock->type, restype))
+// if (!socket_types_compatible(sock->restype, restype))
// restype = -1;
// else
- if (socket_type_priority(sock->type) > socket_type_priority(restype))
- restype = sock->type;
+ if (socket_type_priority(sock->restype) > socket_type_priority(restype))
+ restype = sock->restype;
if (sock->resolved)
resolved = 1;
}
@@ -416,11 +422,11 @@
if (!resolved) {
for (sock=node->outputs.first; sock; sock=sock->next) {
if (sock->flag & SOCK_ADAPT_TYPE) {
-// if (!socket_types_compatible(sock->type, restype))
+// if (!socket_types_compatible(sock->restype, restype))
// restype = -1;
// else
- if (socket_type_priority(sock->type) > socket_type_priority(restype))
- restype = sock->type;
+ if (socket_type_priority(sock->restype) > socket_type_priority(restype))
+ restype = sock->restype;
// if (sock->resolved) /* never happens */
// resolved = 1;
}
@@ -430,36 +436,52 @@
/* update types */
for (sock=node->inputs.first; sock; sock=sock->next)
if (sock->flag & SOCK_ADAPT_TYPE) {
- sock->type = restype;
+ sock->restype = restype;
sock->resolved = resolved;
}
for (sock=node->outputs.first; sock; sock=sock->next)
if (sock->flag & SOCK_ADAPT_TYPE) {
- sock->type = restype;
+ sock->restype = restype;
sock->resolved = resolved;
}
}
-static void clear_socket_types(bNodeTree *ntree)
+/* reset the temporary socket resolution types */
+static void clear_socket_restypes(bNodeTree *ntree)
{
bNode *node;
bNodeSocket *sock;
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->resolved = 0;
+ }
+ for (sock=node->outputs.first; sock; sock=sock->next) {
+ sock->restype = (sock->flag & SOCK_ADAPT_TYPE ? SOCK_ANY : sock->type);
+ sock->resolved = 0;
+ }
+ }
+}
+
+/* set the socket resolution type to be the actual type */
+static void apply_socket_restypes(bNodeTree *ntree)
+{
+ bNode *node;
+ bNodeSocket *sock;
+
+ for (node=ntree->nodes.first; node; node=node->next) {
for (sock=node->inputs.first; sock; sock=sock->next)
- if (sock->flag & SOCK_ADAPT_TYPE) {
- sock->type = SOCK_ANY;
- sock->resolved = 0;
- }
+ if (sock->flag & SOCK_ADAPT_TYPE)
+ sock->type = sock->restype;
for (sock=node->outputs.first; sock; sock=sock->next)
- if (sock->flag & SOCK_ADAPT_TYPE) {
- sock->type = SOCK_ANY;
- sock->resolved = 0;
- }
+ if (sock->flag & SOCK_ADAPT_TYPE)
+ sock->type = sock->restype;
}
}
+/* initialise a group trees inner socket types from the instance node */
static void init_group_socket_types(bNode *groupnode)
{
bNodeSocket *sock;
@@ -467,20 +489,21 @@
/* initialize internal types from outer sockets */
for (sock=groupnode->inputs.first; sock; sock=sock->next) {
if (sock->tosock && (sock->tosock->flag & SOCK_ADAPT_TYPE)) {
- sock->tosock->type = sock->type;
+ sock->tosock->restype = sock->restype;
sock->tosock->resolved = sock->resolved;
sock->tonode->updated = 1;
}
}
for (sock=groupnode->outputs.first; sock; sock=sock->next) {
if (sock->tosock && (sock->tosock->flag & SOCK_ADAPT_TYPE)) {
- sock->tosock->type = sock->type;
+ sock->tosock->restype = sock->restype;
// sock->tosock->resolved = sock->resolved; /* output adaptation does not resolve (also internal nodes?) */
sock->tonode->updated = 1;
}
}
}
+/* update instance node sockets after node group instance has been resolved */
static void adapt_socket_types_group(bNode *groupnode)
{
bNodeSocket *sock;
@@ -488,34 +511,34 @@
/* update external types from internal sockets */
for (sock=groupnode->inputs.first; sock; sock=sock->next) {
if (sock->tosock && (sock->tosock->flag & SOCK_ADAPT_TYPE)) {
- sock->type = sock->tosock->type;
+ sock->restype = sock->tosock->restype;
sock->resolved = sock->tosock->resolved;
// if (sock->tosock->resolved) {
-// if (!sock->resolved || socket_type_priority(sock->tosock->type) > socket_type_priority(sock->type)) {
-// sock->type = sock->tosock->type;
+// if (!sock->resolved || socket_type_priority(sock->tosock->restype) > socket_type_priority(sock->restype)) {
+// sock->restype = sock->tosock->restype;
// sock->resolved = 1;
// groupnode->updated = 1;
// }
// }
-// else if (!sock->resolved && socket_type_priority(sock->tosock->type) > socket_type_priority(sock->type)) {
-// sock->type = sock->tosock->type;
+// else if (!sock->resolved && socket_type_priority(sock->tosock->restype) > socket_type_priority(sock->restype)) {
+// sock->restype = sock->tosock->restype;
// groupnode->updated = 1;
// }
}
}
for (sock=groupnode->outputs.first; sock; sock=sock->next) {
if (sock->tosock && (sock->tosock->flag & SOCK_ADAPT_TYPE)) {
- sock->type = sock->tosock->type;
+ sock->restype = sock->tosock->restype;
sock->resolved = sock->tosock->resolved;
// if (sock->tosock->resolved) {
-// if (!sock->resolved || socket_type_priority(sock->tosock->type) > socket_type_priority(sock->type)) {
-// sock->type = sock->tosock->type;
+// if (!sock->resolved || socket_type_priority(sock->tosock->restype) > socket_type_priority(sock->restype)) {
+// sock->restype = sock->tosock->restype;
// sock->resolved = 1;
// groupnode->updated = 1;
// }
// }
-// else if (!sock->resolved && socket_type_priority(sock->tosock->type) > socket_type_priority(sock->type)) {
-// sock->type = sock->tosock->type;
+// else if (!sock->resolved && socket_type_priority(sock->tosock->restype) > socket_type_priority(sock->restype)) {
+// sock->restype = sock->tosock->restype;
// groupnode->updated = 1;
// }
}
@@ -546,10 +569,10 @@
for (sock=node->inputs.first; sock; sock=sock->next) {
if (sock->link && sock->link->fromsock) {
fromsock = sock->link->fromsock;
- if ((sock->flag & SOCK_ADAPT_TYPE) && sock->type >= 0
+ if ((sock->flag & SOCK_ADAPT_TYPE) && sock->restype >= 0
&& (!sock->resolved || fromsock->resolved || !(fromsock->flag & SOCK_ADAPT_TYPE))
- && socket_type_priority(fromsock->type) > socket_type_priority(sock->type)) {
- sock->type = fromsock->type;
+ && socket_type_priority(fromsock->restype) > socket_type_priority(sock->restype)) {
+ sock->restype = fromsock->restype;
sock->resolved = (fromsock->resolved || !(fromsock->flag & SOCK_ADAPT_TYPE));
node->updated = 1;
}
@@ -559,7 +582,7 @@
if (node->updated) {
if (node->type == NODE_GROUP) {
if (node->id) {
- clear_socket_types((bNodeTree*)node->id);
+ clear_socket_restypes((bNodeTree*)node->id);
init_group_socket_types(node);
resolve_socket_types_recursive((bNodeTree*)node->id);
adapt_socket_types_group(node);
@@ -581,7 +604,7 @@
if (node->updated) {
if (node->type == NODE_GROUP) {
if (node->id) {
- clear_socket_types((bNodeTree*)node->id);
+ clear_socket_restypes((bNodeTree*)node->id);
init_group_socket_types(node);
resolve_socket_types_recursive((bNodeTree*)node->id);
adapt_socket_types_group(node);
@@ -602,10 +625,10 @@
if (sock->link && sock->link->fromsock) {
fromsock = sock->link->fromsock;
/* output resolution only takes place for unresolved sockets! */
- if ((fromsock->flag & SOCK_ADAPT_TYPE) && fromsock->type >= 0
+ if ((fromsock->flag & SOCK_ADAPT_TYPE) && fromsock->restype >= 0
&& (!fromsock->resolved)
- && socket_type_priority(sock->type) > socket_type_priority(fromsock->type)) {
- fromsock->type = sock->type;
+ && socket_type_priority(sock->restype) > socket_type_priority(fromsock->restype)) {
+ fromsock->restype = sock->restype;
sock->link->fromnode->updated = 1;
}
}
@@ -625,8 +648,9 @@
* The socket type resolution has to take each group node instance into account,
* which may be resolved differently to other instances of the same group.
*/
- clear_socket_types(ntree);
+ clear_socket_restypes(ntree);
resolve_socket_types_recursive(ntree);
+ apply_socket_restypes(ntree);
ntreeValidateLinks(ntree);
/* update nested trees recursively */
@@ -880,8 +904,9 @@
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list