/* local tree then owns all compbufs */ static void localize(bNodeTree *UNUSED(localtree), bNodeTree *ntree) { bNode *node; bNodeSocket *sock; for(node= ntree->nodes.first; node; node= node->next) { /* ensure new user input gets handled ok */ node->need_exec= 0; /* move over the compbufs */ /* right after ntreeCopyTree() oldsock pointers are valid */ if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) { if(node->id) { if(node->flag & NODE_DO_OUTPUT) node->new_node->id= (ID *)copy_image((Image *)node->id); else node->new_node->id= NULL; } } for(sock= node->outputs.first; sock; sock= sock->next) { sock->new_sock->cache= sock->cache; compbuf_set_node(sock->new_sock->cache, node->new_node); sock->cache= NULL; sock->new_sock->new_sock= sock; } } }
static void local_merge(bNodeTree *localtree, bNodeTree *ntree) { bNode *lnode; bNodeSocket *lsock; /* move over the compbufs and previews */ for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) { if(ntreeNodeExists(ntree, lnode->new_node)) { if(ELEM(lnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) { if(lnode->id && (lnode->flag & NODE_DO_OUTPUT)) { /* image_merge does sanity check for pointers */ BKE_image_merge((Image *)lnode->new_node->id, (Image *)lnode->id); } } for(lsock= lnode->outputs.first; lsock; lsock= lsock->next) { if(ntreeOutputExists(lnode->new_node, lsock->new_sock)) { lsock->new_sock->cache= lsock->cache; compbuf_set_node(lsock->new_sock->cache, lnode->new_node); lsock->cache= NULL; lsock->new_sock= NULL; } } } } }
/* local tree then owns all compbufs */ static void localize(bNodeTree *localtree, bNodeTree *ntree) { bNode *node, *node_next; bNodeSocket *sock; for (node= ntree->nodes.first; node; node= node->next) { /* ensure new user input gets handled ok */ node->need_exec= 0; /* move over the compbufs */ /* right after ntreeCopyTree() oldsock pointers are valid */ if (ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) { if (node->id) { if (node->flag & NODE_DO_OUTPUT) node->new_node->id= (ID *)BKE_image_copy((Image *)node->id); else node->new_node->id= NULL; } } for (sock= node->outputs.first; sock; sock= sock->next) { sock->new_sock->cache= sock->cache; compbuf_set_node(sock->new_sock->cache, node->new_node); sock->cache= NULL; sock->new_sock->new_sock= sock; } } /* replace muted nodes by internal links */ for (node= localtree->nodes.first; node; node= node_next) { node_next = node->next; if (node->flag & NODE_MUTED) { /* make sure the update tag isn't lost when removing the muted node. * propagate this to all downstream nodes. */ if (node->need_exec) { bNodeLink *link; for (link=localtree->links.first; link; link=link->next) if (link->fromnode==node && link->tonode) link->tonode->need_exec = 1; } nodeInternalRelink(localtree, node); nodeFreeNode(localtree, node); } } }
static void local_merge(bNodeTree *localtree, bNodeTree *ntree) { bNode *lnode; bNodeSocket *lsock; /* move over the compbufs and previews */ for (lnode= localtree->nodes.first; lnode; lnode= lnode->next) { if (ntreeNodeExists(ntree, lnode->new_node)) { if (ELEM(lnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) { if (lnode->id && (lnode->flag & NODE_DO_OUTPUT)) { /* image_merge does sanity check for pointers */ BKE_image_merge((Image *)lnode->new_node->id, (Image *)lnode->id); } } else if (lnode->type==CMP_NODE_MOVIEDISTORTION) { /* special case for distortion node: distortion context is allocating in exec function * and to achieve much better performance on further calls this context should be * copied back to original node */ if (lnode->storage) { if (lnode->new_node->storage) BKE_tracking_distortion_free(lnode->new_node->storage); lnode->new_node->storage= BKE_tracking_distortion_copy(lnode->storage); } } for (lsock= lnode->outputs.first; lsock; lsock= lsock->next) { if (ntreeOutputExists(lnode->new_node, lsock->new_sock)) { lsock->new_sock->cache= lsock->cache; #ifdef WITH_COMPOSITOR_LEGACY compbuf_set_node(lsock->new_sock->cache, lnode->new_node); #endif lsock->cache= NULL; lsock->new_sock= NULL; } } } } }
/* local tree then owns all compbufs */ static void localize(bNodeTree *localtree, bNodeTree *ntree) { bNode *node, *node_next; bNodeSocket *sock; for (node= ntree->nodes.first; node; node= node->next) { /* ensure new user input gets handled ok */ node->need_exec= 0; node->new_node->original = node; /* move over the compbufs */ /* right after ntreeCopyTree() oldsock pointers are valid */ if (ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) { if (node->id) { if (node->flag & NODE_DO_OUTPUT) node->new_node->id= (ID *)node->id; else node->new_node->id= NULL; } } /* copy over the preview buffers to update graduatly */ if (node->preview) { bNodePreview *preview = MEM_callocN(sizeof(bNodePreview), "Preview"); preview->pad = node->preview->pad; preview->xsize = node->preview->xsize; preview->ysize = node->preview->ysize; preview->rect = MEM_dupallocN(node->preview->rect); node->new_node->preview = preview; } for (sock= node->outputs.first; sock; sock= sock->next) { sock->new_sock->cache= sock->cache; #ifdef WITH_COMPOSITOR_LEGACY compbuf_set_node(sock->new_sock->cache, node->new_node); #endif sock->cache= NULL; sock->new_sock->new_sock= sock; } } /* replace muted nodes and reroute nodes by internal links */ for (node= localtree->nodes.first; node; node= node_next) { node_next = node->next; if (node->flag & NODE_MUTED || node->type == NODE_REROUTE) { /* make sure the update tag isn't lost when removing the muted node. * propagate this to all downstream nodes. */ if (node->need_exec) { bNodeLink *link; for (link=localtree->links.first; link; link=link->next) if (link->fromnode==node && link->tonode) link->tonode->need_exec = 1; } nodeInternalRelink(localtree, node); nodeFreeNode(localtree, node); } } }