예제 #1
0
/* 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;
		}
	}
}
예제 #2
0
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;
				}
			}
		}
	}
}
예제 #3
0
/* 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);
		}
	}
}
예제 #4
0
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;
				}
			}
		}
	}
}
예제 #5
0
/* 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);
		}
	}
}