diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2012-10-29 05:09:12 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2012-10-29 05:09:12 +0400 |
commit | 15ed8343437c6b304de72cd14591455da1d5b3ec (patch) | |
tree | cbe40f76668f5e8539744c4d2f8aeaa0ded72f52 /source/blender/nodes/intern | |
parent | 5acd5d14970c829c2873623716a67beeb6da5278 (diff) | |
parent | dd106b5c7a129e00bebe121c4da8cb90a16d48cb (diff) |
Merged changes in the trunk up to revision 51718.
Conflicts resolved:
source/blender/blenloader/intern/readfile.c
source/blender/makesrna/intern/rna_scene.c
release/datafiles/startup.blend
Diffstat (limited to 'source/blender/nodes/intern')
-rw-r--r-- | source/blender/nodes/intern/node_common.c | 179 | ||||
-rw-r--r-- | source/blender/nodes/intern/node_common.h | 12 | ||||
-rw-r--r-- | source/blender/nodes/intern/node_exec.c | 41 | ||||
-rw-r--r-- | source/blender/nodes/intern/node_exec.h | 2 | ||||
-rw-r--r-- | source/blender/nodes/intern/node_socket.c | 22 | ||||
-rw-r--r-- | source/blender/nodes/intern/node_util.c | 17 | ||||
-rw-r--r-- | source/blender/nodes/intern/node_util.h | 2 |
7 files changed, 57 insertions, 218 deletions
diff --git a/source/blender/nodes/intern/node_common.c b/source/blender/nodes/intern/node_common.c index 301dea22c17..86ef8a14c12 100644 --- a/source/blender/nodes/intern/node_common.c +++ b/source/blender/nodes/intern/node_common.c @@ -92,7 +92,7 @@ bNodeSocket *node_group_add_extern_socket(bNodeTree *UNUSED(ntree), ListBase *lb sock->new_sock = NULL; /* group sockets are dynamically added */ - sock->flag |= SOCK_DYNAMIC; + sock->flag |= SOCK_DYNAMIC|SOCK_COLLAPSED; sock->own_index = gsock->own_index; sock->groupsock = gsock; @@ -115,7 +115,7 @@ bNodeSocket *node_group_add_socket(bNodeTree *ngroup, const char *name, int type BLI_strncpy(gsock->name, name, sizeof(gsock->name)); gsock->type = type; /* group sockets are dynamically added */ - gsock->flag |= SOCK_DYNAMIC; + gsock->flag |= SOCK_DYNAMIC|SOCK_COLLAPSED; gsock->next = gsock->prev = NULL; gsock->new_sock = NULL; @@ -354,168 +354,6 @@ static void UNUSED_FUNCTION(node_group_link)(bNodeTree *ntree, bNodeSocket *sock node_group_expose_socket(ntree, sock, in_out); } -/**** For Loop ****/ - -/* Essentially a group node with slightly different behavior. - * The internal tree is executed several times, with each output being re-used - * as an input in the next iteration. For this purpose, input and output socket - * lists are kept identical! - */ - -bNodeTemplate node_forloop_template(bNode *node) -{ - bNodeTemplate ntemp; - ntemp.type = NODE_FORLOOP; - ntemp.ngroup = (bNodeTree*)node->id; - return ntemp; -} - -void node_forloop_init(bNodeTree *ntree, bNode *node, bNodeTemplate *ntemp) -{ - bNodeSocket *sock; - - node->id = (ID*)ntemp->ngroup; - - sock = nodeAddSocket(ntree, node, SOCK_IN, "Iterations", SOCK_FLOAT); - node_socket_set_default_value_float(sock->default_value, PROP_UNSIGNED, 1, 0, 10000); - - /* NB: group socket input/output roles are inverted internally! - * Group "inputs" work as outputs in links and vice versa. - */ - if (ntemp->ngroup) { - bNodeSocket *gsock; - for (gsock=ntemp->ngroup->inputs.first; gsock; gsock=gsock->next) - node_group_add_extern_socket(ntree, &node->inputs, SOCK_IN, gsock); - for (gsock=ntemp->ngroup->outputs.first; gsock; gsock=gsock->next) - node_group_add_extern_socket(ntree, &node->outputs, SOCK_OUT, gsock); - } -} - -void node_forloop_init_tree(bNodeTree *ntree) -{ - bNodeSocket *sock; - sock = node_group_add_socket(ntree, "Iteration", SOCK_FLOAT, SOCK_IN); - sock->flag |= SOCK_INTERNAL; -} - -static void loop_sync(bNodeTree *ntree, int sync_in_out) -{ - bNodeSocket *sock, *sync, *nsync, *mirror; - ListBase *sync_lb; - - if (sync_in_out==SOCK_IN) { - sock = ntree->outputs.first; - - sync = ntree->inputs.first; - sync_lb = &ntree->inputs; - } - else { - sock = ntree->inputs.first; - - sync = ntree->outputs.first; - sync_lb = &ntree->outputs; - } - - /* NB: the sock->storage pointer is used here directly to store the own_index int - * out the mirrored socket counterpart! - */ - - while (sock) { - /* skip static and internal sockets on the sync side (preserves socket order!) */ - while (sync && ((sync->flag & SOCK_INTERNAL) || !(sync->flag & SOCK_DYNAMIC))) - sync = sync->next; - - if (sync && !(sync->flag & SOCK_INTERNAL) && (sync->flag & SOCK_DYNAMIC)) { - if (sock->storage==NULL) { - /* if mirror index is 0, the sockets is newly added and a new mirror must be created. */ - mirror = node_group_expose_socket(ntree, sock, sync_in_out); - /* store the mirror index */ - sock->storage = SET_INT_IN_POINTER(mirror->own_index); - mirror->storage = SET_INT_IN_POINTER(sock->own_index); - /* move mirror to the right place */ - BLI_remlink(sync_lb, mirror); - if (sync) - BLI_insertlinkbefore(sync_lb, sync, mirror); - else - BLI_addtail(sync_lb, mirror); - } - else { - /* look up the mirror socket */ - for (mirror=sync; mirror; mirror=mirror->next) - if (mirror->own_index == GET_INT_FROM_POINTER(sock->storage)) - break; - /* make sure the name is the same (only for identification by user, no deeper meaning) */ - BLI_strncpy(mirror->name, sock->name, sizeof(mirror->name)); - /* fix the socket order if necessary */ - if (mirror != sync) { - BLI_remlink(sync_lb, mirror); - BLI_insertlinkbefore(sync_lb, sync, mirror); - } - else - sync = sync->next; - } - } - - sock = sock->next; - } - - /* remaining sockets in sync_lb are leftovers from deleted sockets, remove them */ - while (sync) { - nsync = sync->next; - if (!(sync->flag & SOCK_INTERNAL) && (sync->flag & SOCK_DYNAMIC)) - node_group_remove_socket(ntree, sync, sync_in_out); - sync = nsync; - } -} - -void node_loop_update_tree(bNodeTree *ngroup) -{ - /* make sure inputs & outputs are identical */ - if (ngroup->update & NTREE_UPDATE_GROUP_IN) - loop_sync(ngroup, SOCK_OUT); - if (ngroup->update & NTREE_UPDATE_GROUP_OUT) - loop_sync(ngroup, SOCK_IN); -} - -void node_whileloop_init(bNodeTree *ntree, bNode *node, bNodeTemplate *ntemp) -{ - bNodeSocket *sock; - - node->id = (ID*)ntemp->ngroup; - - sock = nodeAddSocket(ntree, node, SOCK_IN, "Condition", SOCK_FLOAT); - node_socket_set_default_value_float(sock->default_value, PROP_NONE, 1, 0, 1); - - /* max iterations */ - node->custom1 = 10000; - - /* NB: group socket input/output roles are inverted internally! - * Group "inputs" work as outputs in links and vice versa. - */ - if (ntemp->ngroup) { - bNodeSocket *gsock; - for (gsock=ntemp->ngroup->inputs.first; gsock; gsock=gsock->next) - node_group_add_extern_socket(ntree, &node->inputs, SOCK_IN, gsock); - for (gsock=ntemp->ngroup->outputs.first; gsock; gsock=gsock->next) - node_group_add_extern_socket(ntree, &node->outputs, SOCK_OUT, gsock); - } -} - -void node_whileloop_init_tree(bNodeTree *ntree) -{ - bNodeSocket *sock; - sock = node_group_add_socket(ntree, "Condition", SOCK_FLOAT, SOCK_OUT); - sock->flag |= SOCK_INTERNAL; -} - -bNodeTemplate node_whileloop_template(bNode *node) -{ - bNodeTemplate ntemp; - ntemp.type = NODE_WHILELOOP; - ntemp.ngroup = (bNodeTree*)node->id; - return ntemp; -} - /**** FRAME ****/ static void node_frame_init(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) @@ -547,16 +385,13 @@ void register_node_type_frame(bNodeTreeType *ttype) /* **************** REROUTE ******************** */ /* simple, only a single input and output here */ -static ListBase node_reroute_internal_connect(bNodeTree *ntree, bNode *node) +static void node_reroute_update_internal_links(bNodeTree *ntree, bNode *node) { bNodeLink *link; - ListBase ret; - - ret.first = ret.last = NULL; /* Security check! */ if (!ntree) - return ret; + return; link = MEM_callocN(sizeof(bNodeLink), "internal node link"); link->fromnode = node; @@ -565,9 +400,7 @@ static ListBase node_reroute_internal_connect(bNodeTree *ntree, bNode *node) link->tosock = node->outputs.first; /* internal link is always valid */ link->flag |= NODE_LINK_VALID; - BLI_addtail(&ret, link); - - return ret; + BLI_addtail(&node->internal_links, link); } static void node_reroute_init(bNodeTree *ntree, bNode *node, bNodeTemplate *UNUSED(ntemp)) @@ -586,7 +419,7 @@ void register_node_type_reroute(bNodeTreeType *ttype) node_type_base(ttype, ntype, NODE_REROUTE, "Reroute", NODE_CLASS_LAYOUT, 0); node_type_init(ntype, node_reroute_init); - node_type_internal_connect(ntype, node_reroute_internal_connect); + node_type_internal_links(ntype, node_reroute_update_internal_links); ntype->needs_free = 1; nodeRegisterType(ttype, ntype); diff --git a/source/blender/nodes/intern/node_common.h b/source/blender/nodes/intern/node_common.h index 00f72469b0f..9e04a9e05f8 100644 --- a/source/blender/nodes/intern/node_common.h +++ b/source/blender/nodes/intern/node_common.h @@ -38,18 +38,8 @@ struct bNodeTree; void node_group_init(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp); -void node_forloop_init(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp); -void node_whileloop_init(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp); - -void node_forloop_init_tree(struct bNodeTree *ntree); -void node_whileloop_init_tree(struct bNodeTree *ntree); - const char *node_group_label(struct bNode *node); - struct bNodeTemplate node_group_template(struct bNode *node); -struct bNodeTemplate node_forloop_template(struct bNode *node); -struct bNodeTemplate node_whileloop_template(struct bNode *node); - int node_group_valid(struct bNodeTree *ntree, struct bNodeTemplate *ntemp); void node_group_verify(struct bNodeTree *ntree, struct bNode *node, struct ID *id); @@ -57,8 +47,6 @@ struct bNodeTree *node_group_edit_get(struct bNode *node); struct bNodeTree *node_group_edit_set(struct bNode *node, int edit); void node_group_edit_clear(bNode *node); -void node_loop_update_tree(struct bNodeTree *ngroup); - void ntree_update_reroute_nodes(struct bNodeTree *ntree); #endif diff --git a/source/blender/nodes/intern/node_exec.c b/source/blender/nodes/intern/node_exec.c index d01ef2e2d52..3cc7ebf9337 100644 --- a/source/blender/nodes/intern/node_exec.c +++ b/source/blender/nodes/intern/node_exec.c @@ -69,7 +69,7 @@ void node_get_stack(bNode *node, bNodeStack *stack, bNodeStack **in, bNodeStack } } -void node_init_input_index(bNodeSocket *sock, int *index) +static void node_init_input_index(bNodeSocket *sock, int *index) { if (sock->link && sock->link->fromsock) { sock->stack_index = sock->link->fromsock->stack_index; @@ -79,16 +79,31 @@ void node_init_input_index(bNodeSocket *sock, int *index) } } -void node_init_output_index(bNodeSocket *sock, int *index) +static void node_init_output_index(bNodeSocket *sock, int *index, ListBase *internal_links) { - sock->stack_index = (*index)++; + if (internal_links) { + bNodeLink *link; + /* copy the stack index from internally connected input to skip the node */ + for (link = internal_links->first; link; link = link->next) { + if (link->tosock == sock) { + sock->stack_index = link->fromsock->stack_index; + break; + } + } + /* if not internally connected, assign a new stack index anyway to avoid bad stack access */ + if (!link) + sock->stack_index = (*index)++; + } + else { + sock->stack_index = (*index)++; + } } /* basic preparation of socket stacks */ static struct bNodeStack *setup_stack(bNodeStack *stack, bNodeSocket *sock) { bNodeStack *ns = node_get_socket_stack(stack, sock); - float null_value[4]= {0.0f, 0.0f, 0.0f, 0.0f}; + float null_value[4] = {0.0f, 0.0f, 0.0f, 0.0f}; /* don't mess with remote socket stacks, these are initialized by other nodes! */ if (sock->link) @@ -133,7 +148,7 @@ bNodeTreeExec *ntree_exec_begin(bNodeTree *ntree) bNodeExec *nodeexec; bNodeSocket *sock, *gsock; bNodeStack *ns; - int index= 0; + int index; bNode **nodelist; int totnodes, n; @@ -148,10 +163,11 @@ bNodeTreeExec *ntree_exec_begin(bNodeTree *ntree) /* backpointer to node tree */ exec->nodetree = ntree; + /* set stack indices */ + index = 0; /* group inputs essentially work as outputs */ for (gsock=ntree->inputs.first; gsock; gsock = gsock->next) - node_init_output_index(gsock, &index); - /* set stack indexes */ + node_init_output_index(gsock, &index, NULL); for (n=0; n < totnodes; ++n) { node = nodelist[n]; @@ -160,8 +176,15 @@ bNodeTreeExec *ntree_exec_begin(bNodeTree *ntree) /* init node socket stack indexes */ for (sock=node->inputs.first; sock; sock=sock->next) node_init_input_index(sock, &index); - for (sock=node->outputs.first; sock; sock=sock->next) - node_init_output_index(sock, &index); + + if (node->flag & NODE_MUTED || node->type == NODE_REROUTE) { + for (sock=node->outputs.first; sock; sock=sock->next) + node_init_output_index(sock, &index, &node->internal_links); + } + else { + for (sock=node->outputs.first; sock; sock=sock->next) + node_init_output_index(sock, &index, NULL); + } } /* group outputs essentially work as inputs */ for (gsock=ntree->outputs.first; gsock; gsock = gsock->next) diff --git a/source/blender/nodes/intern/node_exec.h b/source/blender/nodes/intern/node_exec.h index 1003206e96a..e985795de71 100644 --- a/source/blender/nodes/intern/node_exec.h +++ b/source/blender/nodes/intern/node_exec.h @@ -73,8 +73,6 @@ typedef struct bNodeThreadStack { struct bNodeStack *node_get_socket_stack(struct bNodeStack *stack, struct bNodeSocket *sock); void node_get_stack(struct bNode *node, struct bNodeStack *stack, struct bNodeStack **in, struct bNodeStack **out); -void node_init_input_index(struct bNodeSocket *sock, int *index); -void node_init_output_index(struct bNodeSocket *sock, int *index); struct bNodeTreeExec *ntree_exec_begin(struct bNodeTree *ntree); void ntree_exec_end(struct bNodeTreeExec *exec); diff --git a/source/blender/nodes/intern/node_socket.c b/source/blender/nodes/intern/node_socket.c index 8b393dd740a..8e49484d1eb 100644 --- a/source/blender/nodes/intern/node_socket.c +++ b/source/blender/nodes/intern/node_socket.c @@ -490,39 +490,39 @@ static bNodeSocket *verify_socket_template(bNodeTree *ntree, bNode *node, int in break; } if (sock) { - sock->type= stemp->type; /* in future, read this from tydefs! */ - if (stemp->limit==0) sock->limit= 0xFFF; - else sock->limit= stemp->limit; + sock->type = stemp->type; /* in future, read this from tydefs! */ + if (stemp->limit == 0) sock->limit= 0xFFF; + else sock->limit = stemp->limit; sock->flag |= stemp->flag; /* Copy the property range and subtype parameters in case the template changed. * NOT copying the actual value here, only button behavior changes! */ switch (sock->type) { - case SOCK_FLOAT: + case SOCK_FLOAT: { bNodeSocketValueFloat *dval= sock->default_value; dval->min = stemp->min; dval->max = stemp->max; dval->subtype = stemp->subtype; + break; } - break; - case SOCK_INT: + case SOCK_INT: { bNodeSocketValueInt *dval= sock->default_value; dval->min = stemp->min; dval->max = stemp->max; dval->subtype = stemp->subtype; + break; } - break; - case SOCK_VECTOR: + case SOCK_VECTOR: { bNodeSocketValueVector *dval= sock->default_value; dval->min = stemp->min; dval->max = stemp->max; dval->subtype = stemp->subtype; + break; } - break; } BLI_remlink(socklist, sock); @@ -600,7 +600,9 @@ void node_verify_socket_templates(bNodeTree *ntree, bNode *node) * This also prevents group node sockets from being removed, without the need to explicitly * check the node type here. */ - if (ntype && ((ntype->inputs && ntype->inputs[0].type>=0) || (ntype->outputs && ntype->outputs[0].type>=0))) { + if (ntype && ((ntype->inputs && ntype->inputs[0].type >= 0) || + (ntype->outputs && ntype->outputs[0].type >= 0))) + { verify_socket_template_list(ntree, node, SOCK_IN, &node->inputs, ntype->inputs); verify_socket_template_list(ntree, node, SOCK_OUT, &node->outputs, ntype->outputs); } diff --git a/source/blender/nodes/intern/node_util.c b/source/blender/nodes/intern/node_util.c index 27258c45fe5..09e6ddd18a5 100644 --- a/source/blender/nodes/intern/node_util.c +++ b/source/blender/nodes/intern/node_util.c @@ -65,12 +65,12 @@ void node_free_standard_storage(bNode *node) void node_copy_curves(bNode *orig_node, bNode *new_node) { - new_node->storage= curvemapping_copy(orig_node->storage); + new_node->storage = curvemapping_copy(orig_node->storage); } void node_copy_standard_storage(bNode *orig_node, bNode *new_node) { - new_node->storage= MEM_dupallocN(orig_node->storage); + new_node->storage = MEM_dupallocN(orig_node->storage); } void *node_initexec_curves(bNode *node) @@ -109,18 +109,15 @@ const char *node_filter_label(bNode *node) return IFACE_(name); } -ListBase node_internal_connect_default(bNodeTree *ntree, bNode *node) +void node_update_internal_links_default(bNodeTree *ntree, bNode *node) { - ListBase ret; bNodeSocket *fromsock_first=NULL, *tosock_first=NULL; /* used for fallback link if no other reconnections are found */ int datatype; int num_links_in = 0, num_links_out = 0, num_reconnect = 0; - ret.first = ret.last = NULL; - /* Security check! */ if (!ntree) - return ret; + return; for (datatype=0; datatype < NUM_SOCKET_TYPES; ++datatype) { bNodeSocket *fromsock, *tosock; @@ -170,7 +167,7 @@ ListBase node_internal_connect_default(bNodeTree *ntree, bNode *node) ilink->tosock = tosock; /* internal link is always valid */ ilink->flag |= NODE_LINK_VALID; - BLI_addtail(&ret, ilink); + BLI_addtail(&node->internal_links, ilink); ++num_reconnect; } @@ -188,8 +185,6 @@ ListBase node_internal_connect_default(bNodeTree *ntree, bNode *node) ilink->tosock = tosock_first; /* internal link is always valid */ ilink->flag |= NODE_LINK_VALID; - BLI_addtail(&ret, ilink); + BLI_addtail(&node->internal_links, ilink); } - - return ret; } diff --git a/source/blender/nodes/intern/node_util.h b/source/blender/nodes/intern/node_util.h index 95104df5fed..3134baa283c 100644 --- a/source/blender/nodes/intern/node_util.h +++ b/source/blender/nodes/intern/node_util.h @@ -62,7 +62,7 @@ const char *node_math_label(struct bNode *node); const char *node_vect_math_label(struct bNode *node); const char *node_filter_label(struct bNode *node); -ListBase node_internal_connect_default(struct bNodeTree *ntree, struct bNode *node); +void node_update_internal_links_default(struct bNodeTree *ntree, struct bNode *node); #endif |